AI Agents

DeepSeek Search API and Fetch API cost $0.75 per 1,000 successful requests

DeepSeek now sells web search and page fetch as raw JSON endpoints billed per successful call, which changes the build-or-buy math for agent and RAG retrieval.

Published
October 18, 2026
Read
7 min
Published by
Samir Sengupta
DeepSeek Search and Fetch APIs priced at $0.75 per 1,000 successful requests with a 5 QPS limit
Note 094 / 094Daily note · Written from 2 sources

How this was madeDrafted with Claude, Anthropic’s model, from 2 cited sources, then checked against them in a second editing pass. Editorial policy

the short version

  • Search and Fetch each cost $0.75 per 1,000 successful requests. Failed calls, empty results and timeouts are not billed.
  • The count parameter does not change the price, so asking for 50 results costs the same as asking for 1.
  • Each API is capped at 5 QPS per account, about 18,000 requests an hour, and Fetch also has a per-domain limit whose value the docs do not state.
  • The docs do not say how Fetch handles Cloudflare challenges, Anubis or robots.txt. A page blocked by site policy comes back as a 404, and a security-policy rejection as a 403.

The DeepSeek Search API and a companion Fetch API are billed at $0.75 per 1,000 successful requests each. Billing is per call, not by tokens and not by how many results come back. Search returns structured, scored results from DeepSeek's in-house search engine, and Fetch returns a single page as Markdown. Both are plain POST endpoints that you expose to a model as functions, and each is limited to 5 requests per second per account. That limit is the main line between using the hosted APIs and running your own stack.

Both are raw JSON endpoints under https://api.deepseek.com/v1/tools/, and they use the same bearer key as the DeepSeek model API. The API docs describing them are dated October 18, 2026. For teams that already call DeepSeek models, adding live web retrieval means one more endpoint and no new vendor. The APIs also arrive while major sites are tightening access for agents, which limits what any fetch service can return.

What the DeepSeek Search API returns

A search request needs a query of 1 to 128 Unicode characters that is not all whitespace. The optional fields are:

  • count: 1 to 50, default 10.
  • ori_question: the user's original question, 1 to 128 characters, used to improve query understanding.
  • localization: an IP address used to localize results.
  • need_content: default false.

Unknown request fields are ignored. The query passes through with its operators intact. Supported operators are site: (with OR for multiple sites), -site:, exact phrases, term and phrase exclusion, lang: with comma-separated codes, and after:/before: with a year or a full date. A successful call returns HTTP 200 with a results array, and a search with no matches returns an empty array. Each result carries these fields:

  • rerank_score: 0 to 3, combining relevance, authority and freshness. DeepSeek counts 1.5 or above as high quality.
  • snippet: 100 to 200 characters, meant for a UI.
  • summary: 600 to 800 characters, meant to be read by a model.
  • content: the page body. It is empty when need_content is false or when the content is unavailable.
  • authority: a tier from 0 to 4, where 3 or above means highly authoritative and -1 means unknown.
  • date: RFC 3339 UTC, or null. site_name and site_icon may also be null.

The split between snippet and summary is the practical design choice for agents. An agent loop can pass the 600 to 800 character summaries into context without a separate fetch call, or set need_content to get page bodies in the same search request. The docs do not say how summaries are generated or whether results are cached. One commenter on Hacker News speculated that DeepSeek has built its own index and returns cached results, but that is a guess, not something the docs state.

What Fetch returns when a site says no

Fetch takes one field, url. It must be HTTP or HTTPS, have a host, be at most 8192 characters and carry no username or password. The response contains a title, which is empty if unavailable, and the page content as Markdown. The docs state that fetching is subject to the target site's availability and access policies.

Commenters on Hacker News asked what happens with a page behind a Cloudflare checkbox or Anubis: an error, empty content, or the real page. The docs answer only through status codes. A 403 means DeepSeek's security policy rejected the Fetch request. A 404 covers an unavailable URL, a URL blocked by site policy, a target-site error, an unsupported content type, or a page with no extractable Markdown content.

The docs say nothing about solving challenges, rotating IPs, user agents or robots.txt. One commenter guessed that DeepSeek's crawler respects robots.txt and said they did not know. Treat that behavior as unknown.

That gap matters because sites are actively closing to agents. The Verge reports that Yelp told TechCrunch it only allows AI agents that pay for its data licensing program. Delta Air Lines is preventing agents from booking tickets for users, and JPMorgan Chase and Charles Schwab block agents from accessing accounts over security concerns. Cloudflare introduced a one-click block for AI crawlers in 2025, then began blocking crawlers that scrape for both search indexing and AI training.


These AI agents trigger those same safeguards.
Chris Canal, CEO of EquiStamp, to The Verge

Only successful requests are billed at $0.75

A call is billable only if it returns HTTP 200 and produces a result. For Search, that means a non-empty results array. For Fetch, it means page content. Failed requests, empty searches and timeouts are not billed, so a URL blocked by site policy returns a 404 and costs nothing.

Because count does not affect price, requesting 50 results per call is the cheapest way to buy breadth. The tradeoff is more summaries in your context window.

One date matters for teams already using the DeepSeek API through DeepSeek Harness, Claude Code or Codex. Server-side tool calls from those harnesses already hit Search and Fetch, and those calls are currently free. Per-request billing starts at 00:00 Beijing time on November 1, 2026. Agents that search heavily through those harnesses will start costing money on that date without any code change.

Commenters on Hacker News cited other prices for comparison:

  • Kagi's API: $12 per 1,000 searches.
  • Mojeek: £2 per 1,000.
  • Ceramic.ai: $0.25 per 1,000. The commenter said they had not benchmarked it against Exa or Tavily.

One commenter said their own search-and-fetch MCP tools, built on third-party scraping providers, were about 15 to 20x more cost-effective than the integrated web search and fetch tools from OpenAI and Anthropic. Another said looking only at cost neglects differences in quality. None of the sources benchmark DeepSeek's search quality against these alternatives.

Wiring Search and Fetch into tool calling

The docs describe Search and Fetch as raw JSON APIs and do not document a tool schema for using them through the chat API. Outside the harnesses that already call them server-side, you define the function schemas yourself and execute the HTTP calls from your agent loop. Errors use the OpenAI-compatible format, with param always null. A 400 means invalid headers or body, a 413 means the body is too large, and a 504 means a downstream request timed out. The docs give a retry policy:

  • Retry 408, 429 and 5xx after waiting.
  • For 402, top up the account before retrying.
  • Do not retry any other 4xx without changing the request.
python
import time
import requests

API = "https://api.deepseek.com/v1/tools"
HEADERS = {
    "Authorization": "Bearer <DeepSeek API Key>",
    "Content-Type": "application/json",
}

def call_tool(name, payload, attempts=3):
    for i in range(attempts):
        r = requests.post(f"{API}/{name}", headers=HEADERS, json=payload)
        if r.status_code == 200:
            return r.json()
        if r.status_code in (408, 429) or r.status_code >= 500:
            time.sleep(2 ** i)  # docs: wait and retry
            continue
        # 400, 401, 402, 403, 404, 413: change the request or top up first
        return {"error": r.json()["error"]["message"], "status": r.status_code}
    return {"error": "retries exhausted"}

def web_search(query, count=10):
    data = call_tool("search", {"query": query, "count": count})
    if "results" not in data:
        return data
    return [
        {"title": x["title"], "url": x["url"], "summary": x["summary"], "date": x["date"]}
        for x in data["results"]
        if x["rerank_score"] >= 1.5
    ]

def web_fetch(url):
    return call_tool("fetch", {"url": url})

Filtering on a rerank_score of 1.5 trims context, but a non-empty search is billed either way. Return the 404 or 403 message to the model rather than raising an exception. The model can then choose another URL, and the docs advise against retrying those statuses unchanged.

At 5 QPS, bulk crawling needs your own stack

Search and Fetch are each limited to 5 requests per second per account, regardless of which API key is used. The two limits are independent of each other and separate from model concurrency limits. Fetch is also subject to a per-domain QPS limit whose value the docs do not state. Requests over either limit receive HTTP 429.

At 5 QPS, one account tops out at about 18,000 calls an hour per API. That fits interactive agents and RAG lookups that make a few calls per turn. It does not fit bulk crawling, index backfills, or fanning out across many pages on one domain.

One commenter explained why fetch costs money at all. Most local requests from Python or curl fail unless you drive a remote-controlled browser, and captchas still make that basically unusable for mass requests. Another said you can bypass most protections easily, except Google Captcha v3, but need your own proxy swarm to do it at scale. The docs do not claim that Fetch solves either problem. What they do offer is a fixed per-request price, with failed requests not billed.

The hosted APIs fit low-to-moderate volume agent retrieval, especially for teams already on a DeepSeek key. For them, operator syntax and model-oriented summaries replace glue code. Your own stack still wins in three cases:

  • Throughput above 5 QPS per account.
  • Pages behind logins, since Fetch accepts no credentials and URLs cannot contain a username or password.
  • Requirements the docs do not address, such as robots.txt behavior, data retention, or whether results are censored, a question one commenter raised. Neither the docs nor the thread answers these.

Questions this raises

Does DeepSeek charge for failed or blocked Fetch requests?

No. A call is billable only if it returns HTTP 200 and produces a result. A URL blocked by site policy returns a 404 and costs nothing, and empty searches and timeouts are also free.

What rate limit applies to the DeepSeek Search API and Fetch API?

Each is limited to 5 requests per second per account, regardless of which API key is used. Fetch also has a per-domain QPS limit whose value the docs do not state, so bulk crawling needs your own stack.

Will agents using DeepSeek through Claude Code or Codex start costing more?

Yes. Server-side Search and Fetch calls from DeepSeek Harness, Claude Code and Codex are currently free. Per-request billing starts at 00:00 Beijing time on November 1, 2026, without any code change.

Spotted an error? Email samir.s.sengupta@gmail.com and I will correct it and date the change at the top of the note. How these notes are researched, drafted and checked is in the editorial policy.

More notes

Building something on this?

I ship production LLM, RAG and agentic systems for a living - the infrastructure behind the things these notes are about. Open to roles, contract work and research collaboration.