Tavily API - Complete Developer Guide to Web Search, Extraction, Crawling, Mapping & Research
Tavily is a developer API designed to connect AI agents and applications to up-to-date web information. Instead of building your own search + scraping pipeline from scratch, Tavily provides a single API surface for (1) searching the web in an agent-friendly format, (2) extracting clean content from URLs, (3) crawling and mapping sites as a graph, and (4) running multi-step “research tasks” that produce a synthesized report with sources.
This page is a practical, developer-focused reference. It explains what each endpoint does, how authentication and rate limits work, how API credits are billed, and how to build a production architecture that stays fast, reliable, and cost-predictable.
Table of contents
Everything on this page is written to be readable on mobile and skimmable when you’re coding.
1) What is the Tavily API?
What Tavily gives you
Tavily is built around a simple promise: your application can ask the web for information, and get back results that are ready to use in an AI workflow (RAG, agents, research assistants, support bots, dashboards). Tavily’s endpoints cover the full pipeline:
When Tavily is a good fit
Tavily is especially useful when you’re building an AI product that needs current information and you want a single provider to handle the messy parts: selecting sources, extracting readable content, and returning data in a format that’s easy to feed into a model.
Common use cases include:
- Agent web search (tools in LangChain/LlamaIndex/CrewAI, etc.) with configurable depth and domain targeting.
- RAG augmentation: search → extract → chunk → embed → store in a vector DB, then retrieve for grounded answers.
- Research reports: multi-step research that produces a structured report and source list.
- Competitive intelligence and market monitoring (news, finance topics, recent updates).
- Data enrichment: enrich a dataset with verified facts and source URLs.
- Internal knowledge bootstrapping: crawl and extract documentation sites, help centers, or product wikis.
A helpful mental model: Tavily isn’t “just a search API.” It’s a web intelligence toolkit: search, extract, navigate site graphs, and synthesize research—then measure usage and cost as credits.
How Tavily differs from “traditional search APIs”
Traditional search APIs often return a SERP-style response (titles + links + maybe snippets). To use them in AI, you typically still need to fetch pages, clean HTML, remove navigation noise, handle paywalls, normalize encoding, and build a reranking strategy.
Tavily aims to reduce that extra work by returning AI-ready results: ranked sources plus useful content snippets and optional extracted content for each result. It also gives you explicit controls (search depth, time filtering, domain allow/deny lists, country boosting, etc.) so you can tune quality and cost instead of accepting a one-size SERP.
2) Quickstart: authentication and your first request
Authentication (API key)
All Tavily endpoints are authenticated using an API key. You pass your key via an
Authorization header using Bearer auth:
Authorization: Bearer tvly-YOUR_API_KEY
Tavily also supports an optional X-Project-ID header so you can track and organize usage by project
when one API key is shared across multiple apps or environments.
X-Project-ID: your-project-id
Monthly free credits (starter usage)
Tavily’s platform provides a free tier that includes a monthly credit allowance (commonly shown as
1,000 free API credits per month with no credit card required on the quickstart page). You can use the
/usage endpoint to monitor your key and account limits in real time.
Always treat credits as a budget: search depth, raw content, extraction depth, mapping/crawling scope, and research model selection all influence the cost.
Your first request (cURL): POST /search
The simplest Tavily call is a search. You POST JSON with a query.
curl -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer tvly-YOUR_API_KEY" \
-d '{
"query": "Who is Leo Messi?"
}'
A typical response includes the query, a list of ranked results, and optionally usage data (credits) if requested. Some fields appear only if you enable the related parameters (for example, answer generation or raw content).
3) Tavily API endpoints (what they do + how to use them)
Endpoint overview
| Endpoint | Method | Purpose | Common use |
|---|---|---|---|
/search |
POST | Search the web and return ranked results with configurable depth and optional answer/raw content. | Agent tool calls, “search-first” RAG, news monitoring |
/extract |
POST | Extract clean page content from one or more URLs (markdown/text), optionally images/favicon. | Fetch full content for indexing, citations, or fact verification |
/map |
POST | Traverse a website as a graph to produce a site map (URLs), with depth/breadth/limits. | Discover docs/help-center structure before extraction |
/crawl |
POST | Graph-based traversal with built-in extraction and discovery (map + extract combined). | Turn a domain into a knowledge base, large-scale ingestion |
/research |
POST | Create a research task: multiple searches + analysis + synthesized report (can stream). | Long-form research, multi-angle summaries with sources |
/research/{request_id} |
GET | Fetch the status and final result of a research task. | Polling flow for asynchronous research jobs |
/usage |
GET | Get API key usage and account plan usage details. | Budget dashboards, alerts, and safe throttling |
3.1) POST /search — Tavily Search
What Search returns
Search returns a ranked list of results for your query. Each result typically includes a title, URL, content snippet, and a relevance score. You can also request:
- Answer generation (quick or more detailed), controlled by
include_answer. - Raw content for each search result (
include_raw_content) for downstream RAG or citations. - Images and optional descriptions (
include_images,include_image_descriptions). - Favicons (
include_favicon) for UI polish. - Usage information (
include_usage) to see credits consumed per request.
Important nuance: parameters like include_answer, include_raw_content, and
max_results directly affect response size and cost, so they’re typically set explicitly
rather than left to automation.
Key Search parameters (practical explanation)
Tavily Search exposes a set of parameters that control quality, scope, and freshness. Here are the ones you’ll use most:
query (required)The search query to execute.search_depthLatency vs relevance tradeoff; options include advanced/basic/fast/ultra-fast. Advanced tends to cost more credits.max_resultsHow many results to return (commonly default 5; typically up to 20).topicGeneral vs news vs finance. News is useful for real-time events.time_rangeFilter by recency (day/week/month/year; also d/w/m/y aliases).start_date/end_dateDate range filters (YYYY-MM-DD), based on publish or last updated date.include_domains/exclude_domainsAllow/deny lists to steer sources (up to hundreds of domains).countryBoost results from a country (available when topic is general).auto_parametersLet Tavily infer certain settings; can add cost depending on behavior.Search examples (copy/paste ready)
Example A — general search with “advanced” depth and an answer
curl -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer tvly-YOUR_API_KEY" \
-d '{
"query": "What is Model Context Protocol (MCP)?",
"search_depth": "advanced",
"max_results": 8,
"include_answer": "advanced",
"include_favicon": true,
"include_usage": true
}'
Example B — news search, limited to recent results
curl -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer tvly-YOUR_API_KEY" \
-d '{
"query": "Sri Lanka inflation latest data",
"topic": "news",
"time_range": "month",
"max_results": 5,
"include_answer": "basic",
"include_usage": true
}'
Example C — domain-restricted research (documentation-only)
curl -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer tvly-YOUR_API_KEY" \
-d '{
"query": "rate limits",
"include_domains": ["docs.tavily.com"],
"search_depth": "basic",
"max_results": 5,
"include_raw_content": "markdown",
"include_usage": true
}'
Design tip: When building UIs, many teams show titles + favicons + short snippets first, then let the user expand to see raw extracted content only when needed. That pattern keeps responses small and costs predictable.
3.2) POST /extract — Tavily Extract
What Extract does
Extract pulls clean content from one or more specified URLs. Unlike Search (which finds sources), Extract assumes you already have the URL(s) and you want the actual content in a usable format.
It’s ideal for:
- Indexing pages into a RAG pipeline (vector DB or hybrid search).
- Building citation-grade summaries where you want the underlying text available.
- Validating facts found via Search by extracting the source.
- Converting a set of known URLs (docs pages, blog posts, KB articles) into structured content.
Extract parameters you’ll use most
urls (required)One URL or a list of URLs to extract.extract_depthbasic or advanced; advanced can retrieve more (tables/embedded data) and may cost more credits.formatmarkdown (default) or text (plain text; may increase latency).include_imagesInclude a list of image URLs found during extraction.include_faviconInclude the favicon URL per result for UI display.timeoutMax seconds to wait (1–60). Defaults depend on depth (basic ~10s; advanced ~30s).query + chunks_per_sourceOptional reranking of extracted chunks by intent; controls how much “raw_content” is returned (1–5 chunks).include_usageInclude credit usage details in the response.Extract examples
Example A — extract a single URL (markdown)
curl -X POST "https://api.tavily.com/extract" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer tvly-YOUR_API_KEY" \
-d '{
"urls": "https://en.wikipedia.org/wiki/Artificial_intelligence",
"extract_depth": "basic",
"format": "markdown",
"include_usage": true
}'
Example B — extract multiple URLs (advanced depth + images)
curl -X POST "https://api.tavily.com/extract" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer tvly-YOUR_API_KEY" \
-d '{
"urls": [
"https://docs.tavily.com/documentation/api-reference/endpoint/search",
"https://docs.tavily.com/documentation/api-credits"
],
"extract_depth": "advanced",
"include_images": true,
"include_favicon": true,
"format": "markdown",
"timeout": 45,
"include_usage": true
}'
Workflow pattern: In many production systems, you Search first (cheap and fast), then Extract only the top 1–3 URLs you actually need. That approach keeps you from “over-extracting” and burning credits on sources you won’t use.
3.3) POST /map — Tavily Map
What Map does
Map traverses a website like a graph and returns a list of URLs (a site map). It’s designed for “discovery”: find what pages exist and how a website is structured, then decide which pages to extract or crawl.
Mapping is useful for:
- Documentation sites (SDK refs, changelogs, best practice docs).
- Help centers and KBs (categories, articles, sub-paths).
- Product marketing sites (features, pricing, FAQ, blog sections).
- Pre-crawl scoping (choose depth/breadth/limits before you ingest content).
Map parameters
url (required)The base/root URL to begin mapping.max_depthHow far from the base URL the crawler can explore (commonly 1–5).max_breadthMax links to follow per level (can be large, but use with care).limitTotal number of links processed before stopping.select_pathsRegex patterns to include only certain URL paths (e.g., docs-only).exclude_pathsRegex patterns to exclude paths you don’t want.instructionsNatural language instructions can guide discovery (often costs more credits per pages mapped).include_usageInclude credit usage details in the response.Map examples
Example A — basic mapping with strict limits
curl -X POST "https://api.tavily.com/map" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer tvly-YOUR_API_KEY" \
-d '{
"url": "https://docs.tavily.com",
"max_depth": 2,
"max_breadth": 20,
"limit": 80,
"include_usage": true
}'
Example B — map only documentation paths (path selection)
curl -X POST "https://api.tavily.com/map" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer tvly-YOUR_API_KEY" \
-d '{
"url": "https://docs.tavily.com",
"max_depth": 3,
"select_paths": ["^/documentation/.*", "^/sdk/.*"],
"limit": 150,
"include_usage": true
}'
Practical tip: For large sites, always start with low depth and low limits, then expand only if the returned set is missing important sections. Mapping is discovery—don’t treat it as a “download the internet” button.
3.4) POST /crawl — Tavily Crawl
What Crawl does
Tavily Crawl is a graph-based site traversal tool that explores many paths in parallel with built-in extraction and intelligent discovery. It’s designed for ingesting a website into a usable dataset (for RAG, semantic search, or internal knowledge).
Crawl is appropriate when:
- You want many pages from a site (not just one page).
- You need content extraction as you traverse (not just a list of URLs).
- You want to guide the crawl using natural language instructions (e.g., “Find all pages about the Python SDK”).
- You need to control extraction depth, formats, and constraints to build an index.
Crawl parameters (high-level)
url (required)The root URL to begin the crawl.instructionsNatural language guidance; can increase cost per pages processed.chunks_per_sourceControls chunking in returned raw content when instructions are used (1–5).max_depthHow deep to traverse away from the root.max_breadthHow many links per level.limitTotal pages processed before stopping.allow_externalWhether to follow links that go to external domains (use carefully).include_imagesWhether to extract image URLs from crawled pages.extract_depth + formatBasic vs advanced extraction and markdown vs text content.Crawl has its own rate limit bucket (often lower than general search/extract), so plan ingestion jobs with throttling and resuming logic.
Crawl examples
Example A — guided crawl for a documentation section
curl -X POST "https://api.tavily.com/crawl" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer tvly-YOUR_API_KEY" \
-d '{
"url": "https://docs.tavily.com",
"instructions": "Find all pages on the JavaScript SDK and API reference",
"max_depth": 3,
"limit": 120,
"extract_depth": "basic",
"format": "markdown",
"include_usage": true
}'
Production hint: If you’re building a searchable knowledge base, many teams run crawls on a schedule (daily/weekly) and store results keyed by URL + last seen timestamp, so they can refresh only changed pages.
3.5) Research API — create, stream, and fetch research tasks
POST /research — Create Research Task
The Research endpoint creates a research task. Tavily runs multiple searches, analyzes sources, and produces a
detailed report. The initial response contains a request_id and status so you can poll later.
input (required)The research question or task to investigate.modelmini (targeted/efficient), pro (more comprehensive), or auto.streamWhen true, returns Server-Sent Events (SSE) for real-time progress and results.Research is typically the most expensive endpoint (credit-wise), but it can save engineering time when you want a well-structured synthesis rather than a set of links.
GET /research/{request_id} — Fetch status & final output
Once you have a request_id, you can retrieve status and results. If the job is completed, you’ll receive:
- content: the research report (string, or structured object depending on configuration).
- sources: a list of sources used (title, url, favicon).
- created_at and response_time for monitoring/analytics.
Research is a great match for “deep research” UX: show progress as it runs (streaming), then store the final report and sources so users can reopen and verify later.
Research examples
Example A — create a research task (non-streaming)
curl -X POST "https://api.tavily.com/research" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer tvly-YOUR_API_KEY" \
-d '{
"input": "What are the latest developments in AI?",
"model": "mini"
}'
Example B — fetch task status by request_id
curl -X GET "https://api.tavily.com/research/123e4567-e89b-12d3-a456-426614174111" \
-H "Authorization: Bearer tvly-YOUR_API_KEY"
Example C — enable streaming (SSE)
curl -X POST "https://api.tavily.com/research" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer tvly-YOUR_API_KEY" \
-d '{
"input": "Summarize the current state of edge AI devices and local LLM inference trends.",
"model": "pro",
"stream": true
}'
Streaming note: Tavily Research streaming uses Server-Sent Events that are compatible with an OpenAI-style “chat completion chunk” structure, letting you display tool calls, partial content, sources, and a final “done” event.
3.6) GET /usage — monitor credits and plan limits
Why /usage matters
If you’re building anything beyond a toy demo, you need visibility into consumption.
/usage returns usage and limits for both your API key and your account plan.
Typical “production safety” patterns:
- Display remaining credit budget in an admin panel.
- Stop expensive features (like Research Pro) when below a threshold.
- Throttle ingestion jobs when nearing daily or monthly limits.
- Alert ops if usage spikes unexpectedly (possible key leak or runaway loop).
Usage request example
curl --request GET \
--url "https://api.tavily.com/usage" \
--header "Authorization: Bearer tvly-YOUR_API_KEY"
The response commonly includes a key usage object and an account usage object
(fields like total usage, limits, and per-endpoint usage breakdown).
4) Credits, pricing model, and rate limits
Rate limits (RPM)
Tavily provides separate rate limits for development and production environments tied to your API key:
Access to production keys may require an active paid plan or PAYGO enabled (depending on your Tavily account configuration).
How credits are billed (the practical rules)
Tavily uses an API Credits system. Credits are consumed differently depending on endpoint and depth. Here is the most important mental model:
- Search: cost depends on
search_depth(basic/fast/ultra-fast commonly 1 credit; advanced commonly 2 credits). - Extract: billed per successful URL extraction in batches (e.g., every 5 successful URLs is 1 credit for basic, 2 credits for advanced).
- Map: billed per pages mapped (e.g., every 10 pages is 1 credit; mapping with instructions can cost more per 10 pages).
- Crawl: combines mapping + extraction costs (crawl cost = mapping cost + extraction cost).
- Research: dynamic pricing with min/max boundaries depending on
model=minivsmodel=pro.
“You never get charged if a URL extraction fails” is a key detail in Tavily’s credit model for Extract/Map. Still, failing URLs can increase latency and complexity, so handle failures gracefully.
Research credit boundaries (important for budgeting)
Tavily Research follows a dynamic pricing model with minimum and maximum credit boundaries per request. According to Tavily’s credits overview:
| Research model | Per-request minimum | Per-request maximum | When to use |
|---|---|---|---|
mini |
4 credits | 110 credits | Narrow, well-scoped questions; faster & more cost-controlled |
pro |
15 credits | 250 credits | Complex topics spanning multiple subdomains; multi-angle research |
Budget tip: Treat Research as an “expensive but powerful” feature. In many products, it’s gated behind a toggle, a paid tier, or a usage quota (e.g., “3 research runs per day”).
Cost control playbook
Rule #1: Don’t extract everything. Search first, extract only top URLs you need.
Rule #2: Start with basic depth. Use advanced only when your query needs higher precision.
Rule #3: Use domain allow/deny lists. It reduces noise, improves reliability, and makes results more predictable.
Rule #4: Use time filters for “freshness.” If you want recent data, set time_range or dates.
Rule #5: Monitor with /usage. Build guardrails when remaining credits drop.
Rule #6: Cache aggressively. Deduplicate repeated queries and store extracted pages keyed by URL + last updated.
5) SDKs and code examples (Python + JavaScript)
Python SDK (sync + async)
Tavily provides a Python SDK with both synchronous and asynchronous clients. Typical usage looks like:
from tavily import TavilyClient
client = TavilyClient(api_key="tvly-YOUR_API_KEY")
res = client.search("What is Tavily?")
print(res)
For async workflows (high concurrency, background jobs), use the async client:
from tavily import AsyncTavilyClient
client = AsyncTavilyClient("tvly-YOUR_API_KEY")
res = await client.search("Latest AI developments")
print(res)
Proxies can also be configured at client instantiation if your environment requires it.
JavaScript / TypeScript SDK
Tavily offers a JavaScript SDK that supports search and extract functionality directly from JS/TS programs.
A typical pattern is to instantiate a client with your API key, then call a method like search or extract.
const { tavily } = require("@tavily/core");
const client = tavily({ apiKey: "tvly-YOUR_API_KEY" });
async function run() {
const res = await client.search({
query: "What is Tavily?",
max_results: 5,
search_depth: "basic"
});
console.log(res);
}
run();
The JS client is commonly asynchronous by default, which fits serverless and modern Node runtimes nicely.
Full workflow example: Search → Extract → Build a mini RAG corpus
This pattern is one of the most common production uses of Tavily:
- Search for relevant URLs with domain and time filters.
- Extract content only from the top results (not everything).
- Chunk content into consistent sizes and embed it.
- Store in a vector DB or hybrid index with URL + title metadata.
- Retrieve during chat, and cite sources in your UI.
// PSEUDOCODE (language-agnostic)
// 1) Search
searchRes = tavily.search({
query: "Tavily rate limits development production",
search_depth: "basic",
max_results: 5,
include_answer: false,
include_raw_content: false
})
// 2) Pick top 2 URLs (or score threshold)
urls = top(searchRes.results, 2).map(r => r.url)
// 3) Extract only what you’ll index
extractRes = tavily.extract({
urls,
extract_depth: "basic",
format: "markdown"
})
// 4) Chunk + embed + store
for each page in extractRes.results:
chunks = chunk(page.content, 900..1400 chars)
embeddings = embed(chunks)
store(chunks, embeddings, metadata={url, title, fetched_at})
Why this works: You minimize credit usage, reduce latency, and still get high-quality content for retrieval. Most “runaway costs” happen when apps extract too much content too often without caching.
6) Best practices: better quality, faster responses, safer costs
Search quality best practices
- Keep queries concise. Short, direct queries generally search better than long prompts.
- Use
topicintentionally. Choosenewsfor current events;financefor market data;generalfor everything else. - Use time filters. If you care about freshness, set
time_rangeorstart_date/end_date. - Constrain sources. Use
include_domainsfor trusted sources or docs-only workflows. - Start with basic depth. Move to advanced depth only when you need higher precision.
Extract / Crawl best practices
- Extract only what you need. Prefer “top URLs only” rather than bulk extraction.
- Choose the right format. Markdown is often best for downstream chunking; text can be simpler but may increase latency.
- Use advanced extraction sparingly. Advanced is great for tables and embedded content, but budget for it.
- Set timeouts. Use
timeoutso slow pages don’t stall your pipeline. - Design for partial failure. Expect some URLs to fail; store failed URLs and retry later with backoff.
Research best practices (mini vs pro)
Research is powerful, but it can be credit-intensive. In production, teams often:
- Default to
model=minifor user-initiated questions. - Use
model=proonly for complex requests, paid tiers, or admin workflows. - Enable streaming to show progress and reduce “black box waiting” UX.
- Store final reports with sources so repeated requests don’t re-run expensive jobs.
A simple product pattern: let users start with “Quick research (mini)”, and offer “Deep research (pro)” as an upgrade, with clear credit or quota messaging.
Production architecture blueprint
Below is a typical “safe” architecture for Tavily-backed apps:
| Component | What it does | Key guardrail |
|---|---|---|
| API gateway | Routes requests to Tavily; injects auth header; handles retries. | Centralized rate limiting & request logging |
| Query cache | Deduplicates repeated searches and stores results for short TTL. | Avoids runaway loops and cuts costs |
| Extraction cache | Stores extracted content keyed by URL + last updated. | Prevents re-extracting unchanged pages |
| Indexer | Chunks content, embeds, stores metadata + vectors. | Batching and backpressure for ingestion jobs |
| Retriever | Retrieves top chunks for a user query. | Cite sources and limit context size |
| Budget monitor | Calls /usage; triggers alerts; enforces quotas. | Disable expensive features near limits |
This structure keeps Tavily usage predictable and makes your app resilient to transient web failures, timeouts, and source variability.
7) Errors, reliability, and operational tips
Common HTTP statuses you’ll see
- 400: invalid parameters, bad JSON, unsupported option, or constraints violated.
- 401/403: missing/invalid key, or lack of permission for a given feature/environment.
- 429: rate limited — implement retry with exponential backoff and jitter.
- 432/433: sometimes used for specialized error states (implementation-specific).
- 500: internal error — retry a small number of times; log request_id for support.
Always store the request_id returned by Tavily. It’s the fastest path to debugging when you need to contact support.
Retry + backoff (recommended)
The web is unreliable: sites time out, block requests, change HTML, or rate-limit aggressively. Your integration should assume some failures.
// PSEUDOCODE
maxAttempts = 4
baseDelayMs = 250
for attempt in 1..maxAttempts:
res = callTavily()
if res.status in [200, 201, 202]:
return res
if res.status == 429 or res.status >= 500:
sleep( baseDelayMs * 2^(attempt-1) + randomJitter() )
continue
// 400/401/403: do not retry; fix request or auth
throw error
Security basics (API key handling)
- Never ship your Tavily API key in client-side code for public apps. Use a server-side proxy.
- Rotate keys if you suspect leakage; treat unexpected usage spikes as an incident.
- Use
X-Project-ID(or separate keys) to isolate environments and track usage per app. - Log requests in a privacy-aware way (avoid storing user secrets in query strings).
8) Tavily API FAQ (developer-focused)
Is Tavily a search engine or an AI agent tool? +
What is the difference between Search and Extract? +
Search finds relevant sources for a query and returns ranked results with snippets (and optional answer/raw content). Extract takes a known URL (or list of URLs) and returns the cleaned page content. In production, many teams do Search → Extract only top URLs.
When should I use Map vs Crawl? +
Use Map when you want a list of URLs (discovery) with strict constraints before extracting content. Use Crawl when you want to traverse and extract content as you go (site ingestion). Often you Map first to understand structure, then Crawl or Extract selectively.
How do I keep Tavily costs predictable? +
Use basic search depth by default, limit max_results, apply time filters and domain filters, extract only top URLs, and cache aggressively. Monitor usage with GET /usage and apply guardrails when remaining credits drop.
What are Tavily’s rate limits? +
Tavily commonly provides different request-per-minute limits for development vs production keys, and Crawl has its own separate limit bucket. Always implement retry with backoff for 429 responses and keep ingestion jobs throttled.
Can I stream Research results? +
Yes. Set stream: true when creating a research task to receive Server-Sent Events (SSE) that can include progress updates,
tool calls, partial content, sources, and a final done event. Streaming is ideal for “deep research” UIs.
How do I track usage per project or app? +
You can attach an X-Project-ID header to your requests so usage can be organized by project in Tavily’s dashboards and logs.
Many teams also use separate keys for dev/staging/prod to isolate risk and simplify monitoring.
Is Tavily good for RAG? +
Yes. Tavily fits naturally into “search-first RAG”: search for sources, extract content, chunk, embed, store, retrieve. Its domain filters and time filters are especially useful when you need more control and predictable source selection.
What should I do if an extraction fails? +
Treat failures as normal. Record the failed URL, retry with backoff (or later), lower extraction depth if appropriate, adjust timeout, and consider excluding domains that consistently fail. Keep the pipeline resilient so partial success still produces useful output.
Can I restrict results to specific sources? +
Yes. Search supports include/exclude domain lists. Map and Crawl can use path selection/exclusion patterns. Source constraints improve reliability and make results more consistent for user-facing products.
9) Official links (documentation)
If you want to verify any parameter names, response fields, or credit rules, use these official Tavily resources:
- Docs home: docs.tavily.com
- API reference intro (auth + project tracking): API reference introduction
- Search endpoint: POST /search
- Extract endpoint: POST /extract
- Crawl endpoint: POST /crawl
- Map endpoint: POST /map
- Research create: POST /research
- Research get: GET /research/{request_id}
- Research streaming: Streaming (SSE)
- Usage endpoint: GET /usage
- Credits overview: Credits & pricing rules
- Rate limits: Rate limits
- JavaScript SDK: JS Quickstart
- Python SDK: Python Quickstart