# Kagi Search API on SpecStream

Date: 2026-11-10

Client: kagi-openapi-python (openapi_client 1.0.0, commit a72bc8f) for v1; kagiapi 0.2.1 for v0

The one change:

```
openapi_client.Configuration(host="https://api.specstream.ai/kagi/api/v1", access_token=KEY)
KagiClient.BASE_URL = "https://api.specstream.ai/kagi/api/v0"   # kagiapi, v0
```

## Request parameters

| Parameter | Sent | Result | Measured |
|---|---|---|---|
| `query` | `query=python programming language` | honoured | query run: python programming language |
| `workflow` | `workflow=news` | refused | 400: This route returns web results. Send the request with workflow search. |
| `format` | `format=markdown` | accepted, not applied | 10 results |
| `lens_id` | `lens_id=programming` | accepted, not applied | 10 results |
| `lens.sites_included` | `lens={"sites_included": ["wikipedia.org"]}` | honoured | 10 of 10 on wikipedia.org |
| `lens.sites_excluded` | `lens={"sites_excluded": ["python.org"]}` | honoured | 0 of 7 on python.org |
| `lens.keywords_included` | `lens={"keywords_included": ["tutorial"]}` | honoured | query run: python programming language "tutorial" |
| `lens.keywords_excluded` | `lens={"keywords_excluded": ["snake"]}` | honoured | query run: python programming language -snake |
| `lens.file_type` | `lens={"file_type": "pdf"}` | honoured | query run: python programming language filetype:pdf |
| `lens.time_after` | `lens={"time_after": "2026-01-01"}` | honoured | query run: python programming language after:2026-01-01 |
| `lens.time_before` | `lens={"time_before": "2020-01-01"}` | honoured | query run: python programming language before:2020-01-01 |
| `lens.time_relative` | `lens={"time_relative": "month"}` | honoured | query run: python programming language after:2026-10-10 |
| `lens.search_region` | `lens={"search_region": "de"}` | accepted, not applied | 10 results |
| `timeout` | `timeout=2` | accepted, not applied | 10 results |
| `page` | `page=2` | honoured | 0 of 10 results also on base |
| `limit` | `limit=5` | honoured | 5 results |
| `filters.region` | `filters={"region": "de"}` | accepted, not applied | 10 results |
| `filters.after` | `filters={"after": "2026-01-01"}` | honoured | query run: python programming language after:2026-01-01 |
| `filters.before` | `filters={"before": "2020-01-01"}` | honoured | query run: python programming language before:2020-01-01 |
| `filters.safe_search` | `filters={"safe_search": false}` | accepted, not applied | 10 results |
| `safe_search` | `safe_search=false` | accepted, not applied | 10 results |
| `extract.count` | `extract={"count": 3}` | honoured | 9 results with longer text than base |
| `extract.timeout` | `extract={"count": 1, "timeout": 2}` | accepted, not applied | 10 results |
| `personalizations.domains (block)` | `personalizations={"domains": [{"domain": "python.org", "kind": "block"}]}` | honoured | 0 of 7 on python.org |
| `personalizations.domains (raise)` | `personalizations={"domains": [{"domain": "python.org", "kind": "raise"}]}` | accepted, not applied | 10 results |
| `personalizations.regexes` | `personalizations={"regexes": [{"regex": "^https://www\\.reddit\\.com", "replacement": "https://old.reddit.com"}]}` | accepted, not applied | 10 results |
| `q (v0)` | `q=python programming language` | honoured | query run: python programming language |
| `limit (v0)` | `q=python programming language, limit=5` | honoured | 5 results |

## Response fields

| Field | State |
|---|---|
| `meta.trace` | present |
| `meta.node` | absent |
| `meta.ms` | present |
| `data.search[].url` | present |
| `data.search[].title` | present |
| `data.search[].snippet` | present |
| `data.search[].time` | present |
| `data.search[].image` | absent |
| `data.search[].props` | absent |
| `data.related_search` | absent |
| `data.direct_answer` | absent |
| `data.infobox` | absent |
| `meta.id (v0)` | present |
| `meta.node (v0)` | absent |
| `meta.ms (v0)` | present |
| `meta.api_balance (v0)` | absent |
| `data[].t (v0)` | present |
| `data[].url (v0)` | present |
| `data[].title (v0)` | present |
| `data[].snippet (v0)` | present |
| `data[].published (v0)` | present |
| `data[].thumbnail (v0)` | absent |
| `data[t=1].list (v0)` | absent |
