REST API
Query Sensorhub over HTTPS with JSON. Every endpoint returns only data the authenticated account can access.
Authentication
There are two ways to authenticate:
- OAuth (Claude.ai, Claude Desktop, ChatGPT). Add Sensorhub as a connector, sign in, and pick one project or all projects to share. No key is needed.
- API key (Claude Code, Cursor, scripts). Create a key in the MCP section of a project, or an all-projects key on the workspace MCP page in Sensorhub, and send
Authorization: Bearer sk_sh_....
A project key or single-project connection covers one project. An all-projects key or connection is workspace-wide: it reaches every project in the workspace, including new ones, and only members with access to every project can create one. API access is not available on Trial or Basic plans. A key follows the current access of the person who created it: if their access to a project is removed, so is the key's.
Some collections and reports need Perception enabled on the project. They are marked Requires Perception in this reference.
The older /api/v1/products/... endpoints are deprecated and stop working on 10 April 2027. Use /api/v1/query and the named reads instead.
Quick start
curl -X POST "https://app.sensorhub.ai/api/v1/query" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
--data-binary @- <<'JSON'
{
"sql": "SELECT id, name, plan FROM workspaces ORDER BY id ASC LIMIT 25"
}
JSONResponses contain rows and meta. meta.hasMore tells you whether more rows exist; page with OFFSET or, where supported, the signed meta.nextCursor.
Endpoints
| Method | Path | Description |
|---|---|---|
| POST | /api/v1/query/preflight | Validate a query without reading rows |
| POST | /api/v1/query | Read a registered collection using SQL |
| GET | /api/v1/catalog | Browse capabilities available to your identity |
| GET | /api/v1/describe/{name} | Inspect a capability schema and examples |
| GET | /api/v1/skills | Discover available project skills |
| GET | /api/v1/skills/{name} | Read a project skill on demand |
| GET | /api/v1/skills/{name}/bundle | Download a skill for your agent |
| GET | /api/v1/skills/bundle | Download all skills available to your identity |
| GET | /api/v1/identity | Inspect your authenticated identity |
| GET | /api/v1/openapi.json | Download this OpenAPI document |
| GET | /api/v1/openapi.yaml | Download OpenAPI as YAML |
| GET | /api/v1/schema.json | Download capability JSON Schemas |
| GET | /api/v1/docs/{name}.md | Read capability documentation as Markdown |
| GET | /api/v1/llms.txt | Read the small LLM documentation index |
| POST | /api/v1/read/brand_snapshot | Thirty-day brand dossier from the dashboard snapshot builder. |
| POST | /api/v1/read/competitors_standings | Registry-backed own-brand and competitor mention standings for an anchored window. |
| POST | /api/v1/read/inbox | Unified six-source inbox with the dashboard counting, filtering and cursor rules. Evidence is redacted for outside use and metadata is compact. Personal drafts are not included. Text search is unavailable because source text can be masked. |
| POST | /api/v1/read/perception_item_groups | Grouped claims, questions, objections or problems with public-safe quotes. |
| POST | /api/v1/read/perception_part | One part of the Brand Perception page, with processing status and public-safe evidence. On overview, include_threads=negative lists ordinary complaint discussions even when none qualifies as critical. |
| POST | /api/v1/read/project_context | Brand context, keywords, competitors and ideal customer profiles. |
| POST | /api/v1/read/report_answer_gaps | Dashboard-identical answer gaps report. Read dataThrough before treating its anchored window as current. MCP text contains the row array; structuredContent contains rows and report window metadata. |
| POST | /api/v1/read/report_citation_changes | Dashboard-identical citation changes report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_competitors | Dashboard-identical competitors report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_movers | Dashboard-identical movers report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_perception_attribute_sources | Dashboard-identical perception attribute sources report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_perception_attributes | Dashboard-identical perception attributes report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_perception_claims | Dashboard-identical perception claims report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_perception_objections | Dashboard-identical perception objections report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_perception_problems | Dashboard-identical perception problems report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_perception_questions | Dashboard-identical perception questions report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_prompt_movement | Dashboard-identical prompt movement report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_pulse | Dashboard-identical pulse report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_ranking_changes | Dashboard-identical ranking changes report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_ranking_series | Dashboard-identical ranking series report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_share_of_voice | Dashboard-identical share of voice report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_signal_stats | Dashboard-identical signal stats report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_sources | Dashboard-identical sources report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_stability | Dashboard-identical stability report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_top_cited | Dashboard-identical top cited report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_topics | Dashboard-identical topics report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_trends | Dashboard-identical trends report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/report_visibility_overview | Dashboard-identical visibility overview report. Read dataThrough before treating its anchored window as current. |
| POST | /api/v1/read/source_domain_detail | Mention, citation and considered-source totals for a domain. |
| POST | /api/v1/read/url_detail | Citation, considered-source and mention appearances of one URL. |
Rate limits and quotas
Limits are per workspace and shared by MCP and the REST API.
- Queries: Pro 60/min, 3,000/day; Agency 120/min, 9,000/day; Enterprise 180/min, 15,000/day
- Reports and reads: Pro 60/min, 1,500/day; Agency 120/min, 4,500/day; Enterprise 180/min, 7,500/day
Other plans with API access have their own limits.
A query costs 1 unit when it is admitted, plus 1 unit for each started block of 100 rows it returns, so a 1-row result costs 2 units. A query over a view that computes aggregates (COUNT, SUM and similar) adds 2 units, grouped or not. Validating a query without running it (preflight) costs 1 unit. Each report lists its own cost. When a limit is reached the API returns 429; wait before retrying.
Collections
| Name | Description |
|---|---|
workspaces | The authenticated workspace and its effective plan. |
projects | Accessible workspace projects, excluding projects being deleted. |
keywords | Brand, competitor and topic keywords configured for accessible projects. |
topics | Prompt topic folders. |
prompts | Tracked AI prompts, their review state, topic folder and visible tags. |
ai_answers | AI answers scoped through their prompt. |
citations | Citations scoped through the answer and prompt. |
mentions | Mentions from accessible projects. |
actions | Read-only action board records with evidence links and the assignee display name. |
action_suggestions | Recommended next actions, recommendations and to-dos ranked by priority. |
search_queries | Tracked search-engine queries and collection settings. |
search_rankings | Captured search rankings with project-scoped indexed filtering. |
alert_rules | Alert conditions. |
alert_events | Historical alert occurrences and their observed metric values. |
competitors | The canonical reconciliation of competitor profiles and tracking keywords. |
considered_sources | Uncited source candidates associated with an AI answer. |
ai_answer_queries | Queries actually run by an answer engine, related searches and synthetic discovery queries. |
perception_statementsRequires Perception | Atomic statements extracted from mentions and AI answers. |
perception_cellsRequires Perception | Precomputed people-opinion snapshot cells by subject, lens, window and theme. |
perception_item_cellsRequires Perception | Precomputed item snapshots. |
perception_word_cellsRequires Perception | Precomputed words people use by subject, lens, window and theme. |
perception_threadsRequires Perception | Qualifying threads only: CRITICAL requires at least 10 counted people and at least 70% negative opinions; COMPLAINT is competitor-only. |
tags | Project tag configuration. |
themesRequires Perception | Project themes and their scope, status and display order. |
brand_factsRequires Perception | Versioned project brand facts. |
Views
| Name | Description |
|---|---|
competitor_suggestions | Competitor candidates discovered in AI answers, ordered by recurrence. |
signals | Lead signals are matched community posts. |
perception_itemsRequires Perception | Grouped Perception items with their latest claim check. |
visibility_daily | Answer-run counts by UTC day, engine and topic, using visibility overview counting rules. |
competitor_visibility_daily | Competitor answer visibility by UTC day and engine. |
prompt_latest | Latest observed answer for each prompt and engine, with prompt metadata and citation counts. |
mention_daily | Daily unarchived OWN and COMPETITOR mention-row counts, with each project's Share of Voice counting gate. |
cited_urls | All-time; not windowable (no day field). |
citation_facts | One row per stored visible citation event; a URL can repeat within an answer, with engine, prompt, time, ownership and provenance. |
citation_domains | All-time; not windowable (no day field). |
ranking_daily | Best observed search position by project, query, engine, UTC day and ownership. |
Reports and reads
| Name | Description |
|---|---|
report_visibility_overview | Dashboard-identical visibility overview report. |
report_pulse | Dashboard-identical pulse report. |
report_competitors | Dashboard-identical competitors report. |
report_answer_gaps | Dashboard-identical answer gaps report. |
report_topics | Dashboard-identical topics report. |
report_prompt_movement | Dashboard-identical prompt movement report. |
report_citation_changes | Dashboard-identical citation changes report. |
report_top_cited | Dashboard-identical top cited report. |
report_ranking_changes | Dashboard-identical ranking changes report. |
report_ranking_series | Dashboard-identical ranking series report. |
report_share_of_voice | Dashboard-identical share of voice report. |
report_trends | Dashboard-identical trends report. |
report_movers | Dashboard-identical movers report. |
report_sources | Dashboard-identical sources report. |
report_stability | Dashboard-identical stability report. |
report_signal_stats | Dashboard-identical signal stats report. |
report_perception_claimsRequires Perception | Dashboard-identical perception claims report. |
report_perception_questionsRequires Perception | Dashboard-identical perception questions report. |
report_perception_objectionsRequires Perception | Dashboard-identical perception objections report. |
report_perception_problemsRequires Perception | Dashboard-identical perception problems report. |
report_perception_attributesRequires Perception | Dashboard-identical perception attributes report. |
report_perception_attribute_sourcesRequires Perception | Dashboard-identical perception attribute sources report. |
inbox | Unified six-source inbox with the dashboard counting, filtering and cursor rules. |
project_context | Brand context, keywords, competitors and ideal customer profiles. |
competitors_standings | Registry-backed own-brand and competitor mention standings for an anchored window. |
brand_snapshot | Thirty-day brand dossier from the dashboard snapshot builder. |
source_domain_detail | Mention, citation and considered-source totals for a domain. |
url_detail | Citation, considered-source and mention appearances of one URL. |
perception_partRequires Perception | One part of the Brand Perception page, with processing status and public-safe evidence. |
perception_item_groupsRequires Perception | Grouped claims, questions, objections or problems with public-safe quotes. |
Errors
Errors return a JSON body with a stable code, a message and, where useful, details such as suggested field names.
| Code | Status | Meaning and fix |
|---|---|---|
ADAPTER_CONFIGURATION | 500 | Invalid adapter configuration. A trusted Prisma field mapping is not a supported model field name. The application operator must correct its field mapping and redeploy. Keep the request reference when contacting support; changing SQL cannot repair the server mapping. |
ADAPTER_LIMIT | 400 | Adapter workload limit. A memory-adapter LIKE value or pattern exceeds its evaluation budget. Shorten the search pattern or use a narrower query. If stored values exceed the adapter limit, ask the application to expose a database-backed search handler. |
ADAPTER_TYPE | 400 | Incompatible adapter values. The adapter received scalar values with incompatible comparison types. Match predicate values to the collection schema. If a correctly typed query still fails, report the request reference so the application can correct stored data or its adapter. |
BODY_TOO_LARGE | 413 | Request body too large. The incoming request body exceeds the configured byte budget. Reduce the request body, parameter list or submitted input. Use smaller separate reads or a documented bulk action; do not split a transactional write unless the application supports that workflow. |
CANCELLED | 499 | Request cancelled. The request was cancelled before completion, including a disconnected client. For a read, retry only if the result is still needed. For an action, inspect the operation or job status before resubmitting: cancellation does not prove that effects or an admission reservation were rolled back. A disconnected client may receive no HTTP response. |
CONFLICT | 409 | Concurrent change. The resource changed while the operation was being prepared. Reload the current key, session or saved-query metadata and reconcile the intended change with its latest revision. Do not repeat credential issuance without checking its outcome. |
CONTENT_TYPE | 415 | Unsupported content type. A JSON endpoint received a missing or unsupported Content-Type header. Send Content-Type: application/json with a JSON-encoded body. OAuth token endpoints instead require application/x-www-form-urlencoded and use the OAuth invalid_request code for that mismatch. |
CSRF_ORIGIN | 403 | Missing browser origin. A cookie-authenticated write did not include an allowed Origin header. Use the console from its configured browser origin. Custom browser clients must send credentials and any app CSRF header; operators must configure exact allowed origins. Do not disable origin checks to work around this error. |
ENTITLEMENT_REQUIRED | 403 | Transport entitlement required. The application denied access to this HTTP or MCP transport under its product policy. Check the current workspace, subscription and application-specific exception policy. Ask an authorized administrator to grant access or use a transport the account already includes; changing SQL or rotating credentials does not grant entitlement. |
FORBIDDEN | 403 | Operation not permitted. The current principal, delegated credential or application policy cannot perform the operation. Check the active account/workspace and required capability. Personal usage, key management and connected-agent management require an application session; Operations requires current host superadmin authorization. Ask an administrator for the specific permission; repeated identical requests cannot grant access. |
FORBIDDEN_FIELD | 403 | Field not permitted. Projection, filtering or sorting references a field outside the effective app/key permissions, or no readable fields remain. Describe the collection using the same credential, then use only its permitted fields in SELECT, WHERE and ORDER BY. Request an explicit permission change if the missing field is necessary. |
FORBIDDEN_FILTER | 400 | Filter unavailable. A large collection permits filtering only on declared indexed and filterable fields. Use one of the visible filterableFields returned in the error details or query a registered view. |
FORBIDDEN_SORT | 400 | Sort unavailable. A large collection permits sorting only on declared indexed fields. Use one of the visible sortableFields returned in the error details or the collection default ordering. |
HANDLER_CONTRACT | 500 | Handler result contract violated. The application handler returned data outside its declared output schema or collection row contract. Report the request reference to the application operator. For actions, check whether the change committed before resubmitting; a response validation failure happens after the handler ran. |
HOST_DENIED | 403 | Host not allowed. The request Host is not one of the configured service hosts. Use the published console/API origin. Operators should check reverse-proxy Host forwarding and the exact allowedHosts configuration. |
IDEMPOTENCY_CONFLICT | 409 | Idempotency key reused with different input. An existing submission has the same idempotency key and different input. Retrieve the original job or action outcome. Use the original input to retry it, or a new idempotency key for intentionally different work. |
INTERNAL_ERROR | 500 | Application could not complete the request. An unexpected error occurred; private implementation details are withheld. Keep the request reference and contact the application operator. Retry safe reads only with bounded backoff if the failure is transient. Before retrying an action or credential operation, inspect its outcome to avoid duplicate effects. |
INVALID_CURSOR | 400 | Invalid or expired cursor. The cursor is expired, malformed, tampered with, or belongs to another query, identity or permission scope. Restart the query with cursor set to null using the current identity and exact SQL/parameters. Do not edit cursor contents. |
INVALID_FILTER_TYPE | 400 | Incorrect filter value type. A filter value or operator does not match the declared field type. Describe the collection and use correctly typed positional parameters. Enum values must exactly match the declared case-sensitive list. LIKE requires strings, integer fields require whole numbers, and boolean fields do not support ordering comparisons. |
INVALID_FORMAT | 400 | Unknown export format. A requested skill/export format is not supported. Choose one of the formats advertised by this application, such as portable, codex, claude, openai-plugin or claude-plugin for skill bundles. |
INVALID_GEOMETRY | 400 | Invalid spatial coordinates. A memory-adapter point has invalid longitude/latitude coordinates. Use finite EPSG:4326 coordinates in longitude, latitude order, with longitude between -180 and 180 and latitude between -90 and 90. If the error comes from stored geometry, the application must correct that data. |
INVALID_INPUT | 400 | Input does not match this endpoint. The request has invalid fields, missing values, an unsupported value, or an invalid session/key/consent configuration input. Read the endpoint or capability schema and the safe error details, then correct the request. Use future ISO expiry timestamps, supported filter names and console-relative return paths where those fields are required. |
INVALID_JSON | 400 | Malformed JSON. The JSON request body could not be parsed. Encode the body using a JSON serializer, remove trailing commas or incomplete values, and send application/json. Do not place raw SQL directly in the HTTP body; wrap it in the documented sql property. |
INVALID_METERING | 400 | Invalid metering command. The app supplied invalid units, account identifiers or adjustment metadata. Use the documented app-defined metric/period, integer units, actor, reason and idempotency key. Only adjustment commands accept signed units. |
INVALID_PARAMETERS | 400 | Incorrect SQL parameters. The positional SQL parameter list is invalid, exceeds its limit, or omits a referenced parameter. Supply at most 100 scalar parameters. Each $1, $2 and subsequent placeholder must have a corresponding value in params; values must be strings, finite numbers, booleans or null. |
INVALID_PATTERN | 400 | Invalid LIKE pattern. A memory-adapter LIKE pattern ends with an incomplete escape. Remove the trailing escape or supply the escaped character, accounting for JSON and SQL string escaping. Use the adapter-supported pattern forms documented for the collection. |
INVALID_SQL | 400 | SQL could not be parsed. The SQL is empty, over the configured length budget, or syntactically invalid. Submit one bounded SELECT using the documented dialect and collection schema. Correct syntax or reduce query length. Bind values with $1, $2, etc. and supply params in that order; for example WHERE id = $1 with params=["value"]. Question-mark and named placeholders are unsupported. |
INVALID_USAGE_CONFIGURATION | 500 | Invalid application usage configuration. The application resolved invalid allowance rules, windows, scope identities or usage metadata. The application operator must correct its usage resolver or storage configuration. Check required tenant/key/custom subjects, integer limits/costs and the active billing window; caller-supplied roles or plan values cannot fix this. |
INVALID_USAGE_FILTER | 400 | Invalid usage query. A usage time range or page request is invalid. Use ISO timestamps with from before to and request at most 200 events per page. Use supported filters; from is inclusive and to is exclusive. |
JOB_EXPIRED | 410 | Queued job expired. The queued job exceeded its retention deadline before starting. Verify that no completed result exists, then submit fresh work with a new idempotency key if still needed. Operators should inspect worker availability. |
JOB_INTERRUPTED | 409 | Worker lease expired. The worker lost its lease; some application effects may have committed. The framework does not rerun that work automatically. Reconcile the job ID with the application service outcome. An operator may submit new work only after establishing whether effects already occurred. |
JOB_NOT_READY | 409 | Job result unavailable. The job has not completed successfully. Read the existing job status. Wait while queued/running; inspect the error and outcomeUnknown flag for failed or cancelled work before submitting anything again. |
METER_CONFLICT | 409 | Metering command conflict. A metering idempotency key or reservation conflicts with its recorded command. Read the original receipt and reservation state. Retry with identical inputs or use a new key for a separate authorized change; never blindly repeat a refund. |
METER_LIMIT | 409 | Business allowance exceeded. The requested reservation or reconciliation exceeds the application account allowance. Inspect the current committed and reserved balance and the application plan. Release unused reservations or request an authorized allowance adjustment; no automatic reset time is implied. |
METER_NOT_FOUND | 404 | Metering reservation unavailable. The referenced reservation does not exist in the selected account and period. Check the reservation ID, account subject, metric and period using the original receipt. Do not substitute another account to bypass its permissions. |
NOT_FOUND | 404 | Resource unavailable. The route, capability, key, skill, connection or optional subsystem is absent or not visible to this identity. Refresh the authorized catalog or console configuration and use a listed identifier. Confirm the service URL and enabled modules. A 404 intentionally does not establish whether an inaccessible resource exists. |
ORIGIN_DENIED | 403 | Browser origin not allowed. The request Origin is outside the configured browser-origin allowlist. Open the published console origin. For an authorized custom UI, have the operator allow its exact origin and configure CORS credentials/headers; browser code cannot override server origin policy. |
QUERY_LIMIT | 400 | Query pagination limit exceeded. LIMIT or OFFSET is invalid or exceeds the configured collection/query budget. Read the collection maximum, use a nonnegative whole-number LIMIT/OFFSET within the documented bounds, and paginate or narrow the filter. |
RATE_LIMITED | 429 | Usage allowance exhausted. An app-configured request, execution or other admission budget rejected the attempt. Wait at least the returned Retry-After or retryAfterSeconds, inspect all supplied allowance reset times, then retry with bounded backoff. Reduce concurrency or ask about a higher allowance. Do not repeatedly submit an operation whose cost exceeds its total allowance. |
REQUIRED_FILTER | 400 | Required filter missing. A collection requires a narrowing filter in every OR branch before its trusted scope is applied. Describe the collection and supply equality, IN or range conditions on a requiredFilter.anyOf field in every branch. |
RESULT_TOO_LARGE | 413 | Result exceeds the response budget. The serialized result is too large or cannot be represented by the configured result contract after the handler ran. For reads, select fewer fields, reduce LIMIT, narrow filters or use a documented export/job. For an action, check whether its effects committed before resubmitting; an oversized response does not undo the action. |
STORAGE_CAPABILITY | 503 | Repository operation unavailable. The configured repository lacks the atomic operation required by this management feature. Configure the matching durable repository adapter and its migrations. Retrying cannot add a missing repository capability. |
STORAGE_CAPACITY | 503 | Management storage capacity reached. The configured session, authorization or saved-query repository has reached its active record or per-owner capacity. Delete unneeded saved queries or ask the operator to restore storage capacity or raise the configured limit, then retry the relevant management flow. Check existing keys/connections before recreating credentials; do not run an unlimited retry loop. |
TIMEOUT | 504 | Execution deadline exceeded. The handler or admission step exceeded the framework deadline and received cancellation. For reads, reduce work or use an application job/export and retry only when appropriate. For actions, query the operation/job outcome before resubmitting: a timeout does not guarantee rollback. Include the request reference when contacting support. |
UNAUTHENTICATED | 401 | Authentication required. No acceptable current API key, MCP token or application session was resolved. Sign in through the application or present a current credential for this service and resource. Replace expired/revoked credentials; follow WWW-Authenticate metadata for supported MCP authorization. Never send tokens in query strings. |
UNAUTHORIZED | 401 | Login handoff unavailable. A console login handoff is invalid, expired, already used, or no longer belongs to an active application account. Start a fresh login handoff from the main application. Preserve the expected console audience and state, and do not reuse a one-time login code. |
UNKNOWN_FIELD | 400 | Unknown field. The query names a field that is not registered. Describe the collection and use a registered snake_case field name. Suggested didYouMean names include only visible fields. |
UNSUPPORTED_ADAPTER_FILTER | 400 | Filter unsupported by this adapter. The backing adapter cannot faithfully execute the requested filter or spatial operation. Use the advertised adapter subset. The Prisma adapter supports plain text LIKE with optional leading/trailing percent signs; internal wildcards, escapes and GIS need appropriate application handlers or adapters. |
UNSUPPORTED_AGGREGATE | 400 | Aggregate unavailable. The collection or adapter cannot implement the requested aggregate or grouping. Describe the collection for aggregate support and permitted numeric fields. Enum fields support COUNT and grouping when enabled, but not MIN/MAX or numeric aggregates. Use a named report for calculations outside its supported aggregate contract. |
UNSUPPORTED_FILTER | 400 | Field cannot use this filter. A field is not filterable or requires a specialized operator. Describe the collection, choose a filterable field and use an advertised operator. Enums support equality, IN and NULL predicates; patterns, ranges and full-text search are unsupported. JSON/geometry fields may only support explicitly registered specialized predicates. |
UNSUPPORTED_GEOMETRY | 400 | Geometry unsupported by the adapter. The geometry is malformed, uses an unsupported type, or exceeds the coordinate/vertex budget for this operation. Use valid GeoJSON or WKT with the advertised SRID and supported geometry type. Memory bbox reads remain point-only; database spatial collections advertise their own supported predicates and units. |
UNSUPPORTED_GIS | 400 | Spatial capability unavailable. The collection does not advertise the requested spatial predicate on a geometry field. Describe the collection and use only advertised GIS features. Ask the application to provide a suitable spatial handler/adapter when the operation is needed. |
UNSUPPORTED_ORDER | 400 | Field cannot be sorted. ORDER BY references a nonsortable field or unsupported geometry/JSON/enum ordering. Choose a sortable scalar field from the authorized collection schema or request a named read with application-defined ordering. |
UNSUPPORTED_PAGINATION | 400 | Cursor pagination unavailable. This collection or adapter cannot preserve the requested keyset ordering. Describe the collection for pagination keys. Use supported scalar ordering and a configured cursor signing key; aggregates use bounded offset pagination. |
UNSUPPORTED_SEARCH | 400 | Ranked search unavailable. The collection or adapter does not support the requested full-text field, ranking or search configuration. Use SEARCH and RANK only on advertised searchable fields with a supported adapter. Describe the collection or choose an application named search read. |
UNSUPPORTED_SQL | 400 | SQL feature outside the supported dialect. The statement uses unsupported syntax, functions, expression complexity, multiple statements, writes, joins or other unsupported SQL features. Use one SELECT over one registered collection with supported projection, filters, ordering and pagination. Describe that collection first. Use named computed reads for complex reports and explicit actions for writes; do not switch to arbitrary JavaScript. |
USAGE_STORE_UNAVAILABLE | 503 | Usage admission store unavailable. The framework could not obtain a valid atomic allowance decision and failed closed. Wait briefly and retry safe reads with bounded backoff while the operator restores the shared store. The rejected admission does not dispatch the handler. Report the request reference; never disable quotas as a client-side workaround. |