# Parallel Search API clients against SpecStream

Date: 2026-11-10. Client: parallel-web (Python) 1.3.7.

## The one line a user changes

Before:

```
client = Parallel(api_key=PARALLEL_API_KEY)
```

After:

```
client = Parallel(api_key=SPECSTREAM_API_KEY, base_url="https://api.specstream.ai/parallel")
```

## Request parameters

Honoured means the check in the Measured column passed on the reply. Accepted, not applied means status 200 and the reply is the search the call runs without the parameter. Refused means the vendor's error status and body.

Counts: 15 honoured, 3 refused, 4 accepted, not applied.

| Parameter | Sent | Verdict | Measured |
|---|---|---|---|
| `search_queries (one)` | `["printing press history ..."]` | honoured | status 200; 10 results |
| `max_results (not sent)` | absent | honoured | status 200; 10 results |
| `mode (not sent, advanced)` | absent | honoured | status 200; longest excerpt 3499 characters |
| `search_queries (two)` | two queries | honoured | status 200; the search ran `printing press history China OR Gutenberg Bible` |
| `advanced_settings.max_results` | `3` | honoured | status 200; 3 results |
| `mode` | `turbo` | honoured | status 200; longest excerpt 207 characters |
| `mode` | `fast` | honoured | status 200; longest excerpt 207 characters |
| `mode` | `basic` | honoured | status 200; longest excerpt 3498 characters |
| `mode` | `advanced` | honoured | status 200; longest excerpt 3499 characters |
| `mode (not a value Parallel takes)` | `slow`, plain POST | refused | status 422; Parallel's 422 error body |
| `source_policy.include_domains` | `["wikipedia.org"]` | honoured | status 200; 10 of 10 on wikipedia.org |
| `source_policy.exclude_domains` | `["wikipedia.org"]` | honoured | status 200; 10 of 10 off wikipedia.org |
| `source_policy.after_date` | `2025-01-01` | honoured | status 200; the search ran `printing press history India after:2025-01-01` |
| `excerpt_settings.max_chars_per_result` | `120` | honoured | status 200; longest excerpt 120 characters |
| `max_chars_total` | `500` | honoured | status 200; 500 characters of excerpts in all |
| `session_id` | `proof-session-1` | honoured | status 200; session_id proof-session-1 |
| `objective` | `Find when printing reached this country.` | accepted, not applied | status 200; the search ran `printing press history Brazil` |
| `client_model` | `claude-opus-4-7` | accepted, not applied | status 200; the search ran `printing press history Poland` |
| `advanced_settings.location` | `gb` | accepted, not applied | status 200; the search ran `printing press history Greece` |
| `advanced_settings.fetch_policy` | `{'max_age_seconds': 600, 'timeout_seconds': 30, 'disable_cache_fallback': False}` | accepted, not applied | status 200; the search ran `printing press history Turkey` |
| `a field Parallel does not take` | `processor`, plain POST | refused | status 422; The search takes no field processor. |
| `x-api-key (no key)` | absent, plain POST | refused | status 401; Missing API key. Send your SpecStream API key in an x-api-key header. Get a key at https://specstream.ai/works |

## Response fields

Present means the field holds a value in every reply or result read; present in n of m counts the results that hold one; absent means the reply leaves it out or sends null.

Counts: 7 present, 2 absent.

| Field | State |
|---|---|
| `search_id` | present |
| `session_id` | present |
| `results` | present |
| `results[].url` | present |
| `results[].title` | present |
| `results[].publish_date` | present in 81 of 163 |
| `results[].excerpts` | present |
| `warnings` | absent |
| `usage` | absent |
