---
title: "search.fabric-request@1 · OpenVibe.Services"
canonical: "https://openvibe.services/docs/contracts/search.fabric-request"
updated: null
---

# search.fabric-request@1 · OpenVibe.Services

HTML: [search.fabric-request@1 · OpenVibe.Services](https://openvibe.services/docs/contracts/search.fabric-request)

# SearchFabricRequest `search.fabric-request@1`

Generated at 2026-11-13 06:25:48 UTC from [`openvibe-contracts v0.419.0`](https://github.com/OpenVibers/OpenVibe.Contracts/tree/v0.419.0) and [`openvibe-sdk v0.161.0`](https://github.com/OpenVibers/OpenVibe.SDK/tree/v0.161.0).

- Version: 1.0.0
- Owner: search
- Visibility: public
- Status: active
- Compatibility: backward
- Schema: [`https://openvibe.network/contracts/search/fabric-request.v1.json`](/docs/contracts/search.fabric-request.json)

search.fabric-request@1: the body of POST /api/v1/query (or the query string of GET /api/v1/query, scopes comma-separated), capability search.fabric.query. One search over several scopes, routed the cheapest way that answers (plan 2026-10-28 §4.5). network: Search's own index, permission-aware exactly as search.query.run; mine: the caller's own private documents (a signed-in person, or a service with X-OV-Subject); web: OpenVibe's open index first, then paid providers in a ladder, each result keeping its provider, date and URL. Providers never receive an account identifier. A scope the caller may not use (mine without a person; web's paid providers for an anonymous caller, who gets cached and open-index results only) is reported in route.explain, never an error. The other scopes are facets of the same indexes and are accepted for forward compatibility; v1 answers them as network results filtered by kind.

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `q` | string | yes | What to find. | - `minLength 1`<br>- `maxLength 200` |
| `scopes` | array of enum |  | Where to look; results are grouped by scope. Default: network. | - `minItems 1`<br>- `maxItems 10`<br>- `unique items`<br>- `default ["network"]`<br>- `items: one of "network", "mine", "web", "news", "images", "video", "products", "people", "places", "code"` |
| `filters` | object |  | Narrow the network and mine scopes (never widen what the caller may see). | - `no other fields` |
| `filters.owner` | string |  |  | - `pattern ^[a-z][a-z0-9_-]{0,31}$` |
| `filters.type` | string |  |  | - `pattern ^[a-z][a-z0-9_-]{0,31}$` |
| `filters.lang` | string |  |  | - `pattern ^[a-zA-Z]{2,3}(-[A-Za-z0-9]{2,8})*$` |
| `filters.site` | string |  | web: results from this host only. | - `pattern ^[a-z0-9.-]+$`<br>- `maxLength 253` |
| `freshness` | enum |  | How recent results must be, where the source dates them. | - `one of "any", "day", "week", "month", "year"`<br>- `default "any"` |
| `depth` | enum |  | quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged. | - `one of "quick", "standard", "deep"`<br>- `default "standard"` |
| `answer` | boolean |  | Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain). | - `default false` |
| `limit` | integer |  |  | - `minimum 1`<br>- `maximum 50`<br>- `default 20` |
| `cursor` | string |  | next\_cursor of the previous page (network and mine only). | - `maxLength 512` |

## Examples

From the contract's own test fixtures: valid ones validate, rejected ones must fail.

 Valid: mine-filtered

~~~~
{
  "q": "notes",
  "scopes": [
    "mine"
  ],
  "filters": {
    "owner": "community",
    "type": "paste"
  },
  "answer": false,
  "depth": "quick"
}
~~~~

Valid: minimal

~~~~
{
  "q": "lofi streams"
}
~~~~

Valid: network-and-web

~~~~
{
  "q": "surf_utopia world record",
  "scopes": [
    "network",
    "web"
  ],
  "freshness": "month",
  "depth": "standard",
  "limit": 10
}
~~~~

Rejected: empty-q

~~~~
{
  "q": ""
}
~~~~

Rejected: limit-too-big

~~~~
{
  "q": "x",
  "limit": 500
}
~~~~

Rejected: unknown-scope

~~~~
{
  "q": "x",
  "scopes": [
    "everything"
  ]
}
~~~~

## Validate

~~~~
const contracts = require('openvibe-contracts');
contracts.validate('search.fabric-request@1', value);   // { valid, errors: [{ path, message }] }
~~~~
