<!-- twin of https://specstream.ai/migrate/linkup -->
# Linkup compatible: change the address, every depth at $0.005

Compared on Nov 10, 2026. The page: https://specstream.ai/migrate/linkup

SpecStream answers Linkup's `POST /v1/search` in Linkup's own JSON, at $0.005 a search of up to 10 results at every depth, `deep` included. Every line below was measured on production on November 10, 2026 with the `linkup-sdk` Python client 0.24.0.

The switch is one line: `base_url="https://api.specstream.ai/linkup/v1"` in place of `https://api.linkup.so/v1`, and a SpecStream key as the Bearer token. Your code reads `results[].name`, `url` and `content` as before.

SpecStream scores 97.9 F-score on all 1,000 SimpleQA Verified questions and 64.0 item F1 on all 200 WideSearch tasks. A `sourcedAnswer` costs the same $0.005.

[Get an API key](https://specstream.ai/signup?src=alternatives-migrate-linkup&utm_source=alternatives-md&utm_campaign=migrate-linkup&returnTo=%2Fworkspace%2Fsearch%3Froute%3Dlinkup) New accounts get $10 of credit, no card. It covers 2,000 searches.

## Linkup search to SpecStream, parameter by parameter and field by field

| | SpecStream | Linkup |
|---|---|---|
| Address | `POST` or `GET https://api.specstream.ai/linkup/v1/search` | `POST https://api.linkup.so/v1/search` |
| The key | A SpecStream key as `Authorization: Bearer` | A Linkup key as a Bearer token in the Authorization header |
| `depth` | `flash` and `fast` return each result's search excerpt; `standard` and `deep` read each page and return up to about 3,500 characters of it. Every depth costs $0.005 | `flash`, `fast` or `standard` cost $0.005 with `searchResults`; `deep` costs $0.05 |
| `outputType` | `searchResults`, and `sourcedAnswer` with `answer` and `sources[]`, at the same price. `structured` gets `400` with the reason | `searchResults`; `sourcedAnswer` or `structured` cost $0.006, or $0.055 at `deep` |
| `maxResults` | 1 to 100, 10 when you send none | A minimum of 1, and the number of results is never above `maxResults` |
| Filters | `includeDomains`, `excludeDomains`, and `fromDate` and `toDate` as YYYY-MM-DD. A `fromDate` after the `toDate` gets `400` | The same domain and date filters |
| The reply | `results[]` with `type` `text`, `name`, `url`, `content`, and `favicon` as an empty string. With `sourcedAnswer`: `answer` and `sources[]` with `name`, `url` and `snippet` | `results[]` with `type`, `name`, `url`, `content` and `favicon`, or `answer` and `sources` |
| Errors | Linkup's `{"statusCode", "error": {"code", "message", "details"}}`. An empty balance answers `429` `INSUFFICIENT_FUNDS_CREDITS`, as Linkup does. A busy call answers `429` with `Retry-After` and charges nothing | No credit is subtracted when an error occurs. An empty balance answers `429` |
| Rate limit | Up to 8,800 searches a minute on one account | 10 queries per second per organization |
| Free to start | $10 of credit, no card, which covers 2,000 searches | $20 of credit at sign up with a professional email address |

## The Linkup search reference, on SpecStream

### The call, before and after

```
# Before
curl -X POST https://api.linkup.so/v1/search \
  -H "Authorization: Bearer $LINKUP_API_KEY" -H "Content-Type: application/json" \
  -d '{"q": "Who founded Mistral AI and when?", "depth": "fast", "outputType": "searchResults"}'

# After
curl -X POST https://api.specstream.ai/linkup/v1/search \
  -H "Authorization: Bearer $SPECSTREAM_API_KEY" -H "Content-Type: application/json" \
  -d '{"q": "Who founded Mistral AI and when?", "depth": "fast", "outputType": "searchResults"}'
```

In the `linkup-sdk` Python client the change is the client line:

```
# Before
client = LinkupClient(api_key=LINKUP_API_KEY)

# After
client = LinkupClient(api_key=SPECSTREAM_API_KEY, base_url="https://api.specstream.ai/linkup/v1")
```

Every parameter and field on this page is in the [pass table](https://specstream.ai/specstream/dialects/linkup.md), measured on production on November 10, 2026.

### Apps and SDKs that take the address as a setting

Each line was run on production on November 10, 2026 through that client's own request and reply code. Put your SpecStream key wherever the client takes its key.

Open WebUI: choose the web search engine `linkup` and put the address in its JSON setting `LINKUP_SEARCH_PARAMS`: `{"url": "https://api.specstream.ai/linkup/v1/search"}`.

LiteLLM 1.108.4: set `LINKUP_API_BASE` to `https://api.specstream.ai/linkup/v1` and put your SpecStream key in `LINKUP_API_KEY`. The call stays `litellm.search(search_provider="linkup")`.

### Every parameter the route uses

Used in the search: `q`, `depth` (`flash`, `fast`, `standard` or `deep`, required as on Linkup), `maxResults` (1 to 100), `includeDomains`, `excludeDomains`, `fromDate` and `toDate`. The same fields work as a `GET` with the query string.

Used to shape the reply: `outputType` `searchResults` returns `results[]`, and `sourcedAnswer` returns `answer` with its `sources[]`.

Refused with Linkup's `400` body: `outputType` `structured`, a call with no `depth` or no `outputType`, and a `fromDate` after the `toDate`. A call with no key gets `401`.

### Every field that comes back

With `searchResults`, each result has `type` `text`, `name`, `url`, `content` and `favicon`, which is an empty string. With `sourcedAnswer`, the reply has `answer` and `sources[]`, each with `name`, `url`, `snippet` and an empty `favicon`. The route returns no image results.

One field is added: `specstream`, with what the Search API returns beyond Linkup's fields, including the call's `price_usd`. A parser that reads Linkup's fields never sees it.

### $5 per 1,000 searches, at every depth

A call of up to 10 results costs $0.005 at `flash`, `fast`, `standard` and `deep`, with `searchResults` or `sourcedAnswer`. On Linkup a `deep` search costs $0.05, and $0.055 with an answer. Each started block of 10 more results adds $0.006 on SpecStream: 20 results cost $0.011. A call stopped by a `429` for a busy search charges nothing.

### The most accurate web search API, in about one second

On SimpleQA Verified the SpecStream Search API scores 97.9 F-score on all 1,000 official questions, 978 of them correct. On WideSearch it scores 64.0 item F1 and 43.4 row F1 on all 200 official tasks. The Extract API scores 0.908 F1 on WCXB. Every score and its method is on the [benchmarks](https://specstream.ai/benchmarks?utm_source=alternatives&utm_campaign=migrate-linkup) page.

A `searchResults` call at `flash` or `fast` runs the fast search. Measured on production on November 9, 2026, its median was 0.82 s at 1 search a second and 1.07 s at 20 a second, the 95th percentile stayed between 1.09 and 1.73 s, and it answered 718 of 720. It takes up to 8,800 searches a minute on one account. A call at `standard` or `deep`, or with `sourcedAnswer`, runs the default search, which reads the pages, at the same price.

### You decide what is kept, on each key

Create the key with `zero_retention` and a search made with it keeps no request text and no answer after the reply: it is not in the history, its answer is not reused for another call, and its log lines carry neither. `spend_cap_cents` is the most the key can spend.

```
curl -X POST https://api.specstream.ai/v1/account/keys \
  -H "Authorization: Bearer $SPECSTREAM_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "production", "scopes": ["account:read", "finds:spend"], "spend_cap_cents": 500000, "zero_retention": true}'
```

### Search, pages and rows on one key

The same key reads up to 20 pages or documents a call with the [Extract API](https://specstream.ai/extract-api?utm_source=alternatives&utm_campaign=migrate-linkup) at $0.80 per 1,000 pages, and a page with no text is not charged. [Deep Search](https://specstream.ai/deep-search?utm_source=alternatives&utm_campaign=migrate-linkup) returns every match for a request in plain words as structured rows, at 5¢, 15¢ or $1 a row, with a source URL on every value. The most a run can cost is approved before it starts. The full comparison is on the [Linkup alternative](https://specstream.ai/alternatives/linkup?utm_source=alternatives&utm_campaign=migrate-linkup) page.

## What else Linkup users price

### Tavily

A search API sold in credits at $0.008 each pay as you go: a basic search takes 1 credit and an advanced search 2. SpecStream answers Tavily's `POST /search` at `https://api.specstream.ai/tavily` for $0.005, basic or advanced.

### Exa

A search API on Exa's own index, at $7 per 1,000 requests on `auto` and $4 on `lite` for up to 10 results, with its own request and reply. SpecStream answers Exa's call as well, at `https://api.specstream.ai/exa`, for $0.005 a search.

### Parallel

A Search API that starts at $1 per 1,000 requests, with 600 Search calls a minute on the Developer plan. SpecStream answers Parallel's own call at `https://api.specstream.ai/parallel` and takes up to 8,800 searches a minute on one account.

## How to migrate, step by step

1. Create a key under Agents & API in the workspace. A new account gets $10 of credit, no card, which covers 2,000 searches.

2. Set the base address to `https://api.specstream.ai/linkup/v1` where your code has `https://api.linkup.so/v1`, and send the SpecStream key as the Bearer token. In Python:

```
import requests

BASE = "https://api.specstream.ai/linkup/v1"  # was https://api.linkup.so/v1

reply = requests.post(
    f"{BASE}/search",
    headers={"Authorization": f"Bearer {SPECSTREAM_KEY}"},
    json={"q": "Who founded Mistral AI and when?", "depth": "deep", "outputType": "searchResults", "maxResults": 10},
    timeout=60,
)
reply.raise_for_status()
for result in reply.json()["results"]:
    print(result["name"], result["url"], result["content"][:200])
```

3. In JavaScript:

```
const res = await fetch("https://api.specstream.ai/linkup/v1/search", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.SPECSTREAM_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ q: "Who founded Mistral AI and when?", depth: "fast", outputType: "sourcedAnswer" }),
});
const data = await res.json();
console.log(data.answer);
for (const source of data.sources) console.log(source.name, source.url);
```

4. Read `429` with `INSUFFICIENT_FUNDS_CREDITS` as an empty balance, and any other `429` as a call to send again after `Retry-After`; neither is charged.

5. When your product needs every match in place of a results page, write the request in plain words. SpecStream reads it back as the conditions every row must meet and the facts to bring back, quotes the most it can cost, and delivers the rows after you approve.

## Frequently asked questions

### Is there a Linkup compatible API?

Yes. SpecStream answers Linkup's `/v1/search` at `https://api.specstream.ai/linkup/v1` in Linkup's JSON, checked on production on November 10, 2026, for $0.005 a search of up to 10 results at every depth.

### How do I migrate from Linkup?

Change one line: set `base_url` to `https://api.specstream.ai/linkup/v1` and use a SpecStream key. The request body, with `q`, `depth` and `outputType`, and the code that reads `results[]` stay as they are.

### How much does Linkup cost?

Linkup charges $0.005 a search at `flash`, `fast` or `standard` with `searchResults`, $0.006 with an answer, and $0.05 to $0.055 at `deep`. SpecStream charges $0.005 for all of them.

### Which apps and SDKs take the SpecStream address for Linkup?

Open WebUI: choose the web search engine `linkup` and put the address in its JSON setting `LINKUP_SEARCH_PARAMS`: `{"url": "https://api.specstream.ai/linkup/v1/search"}`. LiteLLM 1.108.4: set `LINKUP_API_BASE` to `https://api.specstream.ai/linkup/v1` and put your SpecStream key in `LINKUP_API_KEY`. The call stays `litellm.search(search_provider="linkup")`.

### Does the linkup-sdk client work with SpecStream?

Yes. The `linkup-sdk` Python client 0.24.0 ran every check in the pass table with `base_url="https://api.specstream.ai/linkup/v1"` and a SpecStream key.

### Does SpecStream support outputType structured?

No. A call with `outputType` `structured` gets `400` with the reason; `searchResults` and `sourcedAnswer` both work, at $0.005 a call.

### Which Linkup fields does SpecStream not fill?

One: `favicon` is an empty string on every result and source. Each result has `type`, `name`, `url` and `content`, and a `sourcedAnswer` has `answer` and `sources`.

### What happens when search is busy?

The route answers `429` with a `Retry-After` header and charges nothing. One account can send up to 8,800 searches a minute.

## Sources

SpecStream wrote this page. Each Linkup figure comes from Linkup's own pages, and each other provider's figure from that company's own page. The route's behavior is taken from its code and from the pass table measured on production on November 10, 2026.

- [Linkup search reference](https://docs.linkup.so/pages/documentation/endpoints/search/reference.md), read Nov 10, 2026
- [Linkup authentication](https://docs.linkup.so/pages/documentation/platform/authentication.md), read Nov 10, 2026
- [Linkup API pricing](https://docs.linkup.so/pages/documentation/platform/pricing.md), read Nov 10, 2026
- [Linkup rate limits](https://docs.linkup.so/pages/documentation/platform/rate-limits.md), read Nov 10, 2026
- [Linkup pricing](https://www.linkup.so/pricing), read Nov 10, 2026
- [SpecStream pass table, Linkup route](https://specstream.ai/specstream/dialects/linkup.md), read Nov 10, 2026
- [Tavily API credits](https://docs.tavily.com/documentation/api-credits.md), read Nov 9, 2026
- [Exa pricing](https://exa.ai/docs/admin/pricing.md), read Nov 9, 2026
- [Parallel pricing](https://parallel.ai/pricing), read Nov 9, 2026
- [SpecStream benchmarks](https://specstream.ai/benchmarks), read Nov 10, 2026
- [SpecStream pricing](https://specstream.ai/pricing), read Nov 10, 2026
- [SpecStream for agents](https://specstream.ai/agents.md), read Nov 10, 2026
