Developer Dashboard

Search API Reference

The Search API provides programmatic access to web search engine functionalities from leading providers. This is a dedicated search API that returns structured search results for integration into your applications.

Important

This is different from Web Search in Chat Completions, which enables LLMs to search the web during conversations. The v1/search endpoint is a standalone web search API that returns raw search results for programmatic use, while web search in chat completions augments AI responses with real-time web data.

Endpoint

POST https://api.avalai.ir/v1/search
POST https://api.avalai.ir/v1/search/{search_tool_name}

Supported Search Tools

AvalAI provides access to 10 search tools from 8 leading providers:

Search ToolProviderCost per QueryBest For
serper-searchSerper$0.001Lowest-cost Google-powered search
dataforseo-searchDataForSEO$0.003cost-sensitive applications
parallel_ai-searchParallel AI$0.004Fast parallel processing
perplexity-searchPerplexity$0.005AI-powered search with quality results
tavily-searchTavily$0.008General web search
firecrawl-searchFirecrawl$0.008Search with web scraping and content extraction
parallel_ai-search-proParallel AI$0.009Enhanced parallel search
tavily-search-advancedTavily$0.016Advanced search with filtering
exa_ai-searchExa AI$0.025Semantic neural search

Request Body

Standard Parameters

ParameterTypeRequiredDescription
querystring or arrayYesSearch query. Can be a single string or array of strings
search_tool_namestringConditionalRequired when using v1/search endpoint (not in URL)
max_resultsintegerNoMaximum number of results (1-20). Default: 10
search_domain_filterarrayNoList of domains to filter results (max 20 domains)
max_tokens_per_pageintegerNoMaximum tokens per page to process. Default: 1024
countrystringNoCountry filter. Format varies by provider (see below)

Provider-Specific Parameters

Each search provider supports additional parameters for advanced functionality:

Tavily (tavily-search, tavily-search-advanced)

ParameterTypeDescription
countrystringFull lowercase country name (e.g., "united states", "united kingdom"). See Tavily documentation for full list.
ParameterTypeDescription
glstringCountry/geolocation code for localized results (e.g., "uk", "us", "de")
hlstringLanguage code for result language (e.g., "en", "de", "fa")
autocorrectbooleanEnable or disable query autocorrection. Set to false to disable autocorrect
tbsstringTime-based search filter: "qdr:h" (past hour), "qdr:d" (past day), "qdr:w" (past week), "qdr:m" (past month), "qdr:y" (past year)
pageintegerPage number for paginated results
locationstringGeographic location for local results (e.g., "Berlin,Germany")
countrystringCountry code for geo-targeted results (e.g., "DE", "US")
ParameterTypeDescription
countrystringFull country name (e.g., "United States", "Germany")
language_codestringLanguage code (e.g., "en", "de")
depthintegerNumber of results to retrieve (max 700)
devicestringDevice type: "desktop", "mobile", "tablet"
osstringOperating system: "windows", "macos", "android", "ios"
ParameterTypeDescription
sourcesarraySearch sources: ["web", "news", "images"]
categoriesarrayCategory filters: [{"type": "github"}, {"type": "research"}, {"type": "pdf"}]
tbsstringTime-based search (e.g., "qdr:m" for past month)
locationstringGeographic location (e.g., "San Francisco,California,United States")
ignoreInvalidURLsbooleanExclude invalid URLs from results
scrapeOptionsobjectScraping configuration (see Firecrawl documentation)

Parallel AI (parallel_ai-search, parallel_ai-search-pro)

ParameterTypeDescription
processorstringProcessor type: "base" or "pro"
max_chars_per_resultintegerMaximum characters per result snippet

For complete parameter details, see the individual provider documentation pages.

Response Format

All search requests return a consistent response format:

json
{
  "object": "search",
  "results": [
    {
      "title": "Result Title",
      "url": "https://example.com/page",

      "snippet": "Brief excerpt from the page content...",
      "date": "2024-01-15"
    }
  ]
}

Response Fields

FieldTypeDescription
objectstringAlways "search" for search responses
resultsarrayList of search results
results[].titlestringTitle of the search result
results[].urlstringURL of the search result
results[].snippetstringText snippet from the result
results[].datestringOptional publication or last updated date

Examples

Option 1: Search Tool in URL

bash
curl https://api.avalai.ir/v1/search/perplexity-search \
  -H "Authorization: Bearer $AVALAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "latest AI developments 2024",
    "max_results": 5,
    "search_domain_filter": ["arxiv.org", "nature.com"],
    "country": "US"
  }'
python
import requests

response = requests.post(
    "https://api.avalai.ir/v1/search/perplexity-search",
    headers={"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"},
    json={
        "query": "latest AI developments 2024",
        "max_results": 5,
        "search_domain_filter": ["arxiv.org", "nature.com"],
        "country": "US",
    },
)

results = response.json()
for result in results["results"]:
    print(f"{result['title']}: {result['url']}")
javascript
const response = await fetch("https://api.avalai.ir/v1/search/perplexity-search", {
    method: "POST",
    headers: {
        "Authorization": `Bearer ${process.env.AVALAI_API_KEY}`,
        "Content-Type": "application/json"
    },
    body: JSON.stringify({
        query: "latest AI developments 2024",
        max_results: 5,
        search_domain_filter: ["arxiv.org", "nature.com"],
        country: "US"
    })
});

const data = await response.json();
data.results.forEach(result => {
    console.log(`${result.title}: ${result.url}`);
});

Option 2: Search Tool in Body

bash
curl https://api.avalai.ir/v1/search \
  -H "Authorization: Bearer $AVALAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "search_tool_name": "tavily-search",
    "query": "machine learning tutorials",
    "max_results": 10
  }'
python
import requests

response = requests.post(
    "https://api.avalai.ir/v1/search",
    headers={"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"},
    json={
        "search_tool_name": "tavily-search",
        "query": "machine learning tutorials",
        "max_results": 10,
    },
)

results = response.json()
javascript
const response = await fetch("https://api.avalai.ir/v1/search", {
    method: "POST",
    headers: {
        "Authorization": `Bearer ${process.env.AVALAI_API_KEY}`,
        "Content-Type": "application/json"
    },
    body: JSON.stringify({
        search_tool_name: "tavily-search",
        query: "machine learning tutorials",
        max_results: 10
    })
});

const data = await response.json();
bash
curl https://api.avalai.ir/v1/search/serper-search \
  -H "Authorization: Bearer $AVALAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "restaurants",
    "max_results": 10,
    "gl": "uk",
    "hl": "en",
    "autocorrect": false,
    "tbs": "qdr:d",
    "page": 1,
    "country": "DE",
    "location": "Berlin,Germany"
  }'
python
import requests

response = requests.post(
    "https://api.avalai.ir/v1/search/serper-search",
    headers={"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"},
    json={
        "query": "restaurants",
        "max_results": 10,
        # Serper-specific parameters
        "gl": "uk",  # Country/geolocation code
        "hl": "en",  # Language code
        "autocorrect": False,  # Disable autocorrect
        "tbs": "qdr:d",  # Time filter: past day
        "page": 1,  # Page number
        # Geo-targeting
        "country": "DE",
        "location": "Berlin,Germany",
    },
)

results = response.json()
javascript
const response = await fetch("https://api.avalai.ir/v1/search/serper-search", {
    method: "POST",
    headers: {
        "Authorization": `Bearer ${process.env.AVALAI_API_KEY}`,
        "Content-Type": "application/json"
    },
    body: JSON.stringify({
        query: "restaurants",
        max_results: 10,
        // Serper-specific parameters
        gl: "uk",              // Country/geolocation code
        hl: "en",              // Language code
        autocorrect: false,     // Disable autocorrect
        tbs: "qdr:d",          // Time filter: past day
        page: 1,                // Page number
        // Geo-targeting
        country: "DE",
        location: "Berlin,Germany"
    })
});

const data = await response.json();

Multiple Queries

Some search tools support searching for multiple queries simultaneously:

bash
curl https://api.avalai.ir/v1/search/parallel_ai-search-pro \
  -H "Authorization: Bearer $AVALAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": ["AI developments", "machine learning trends", "neural networks"],
    "max_results": 5
  }'
python
import requests

response = requests.post(
    "https://api.avalai.ir/v1/search/parallel_ai-search-pro",
    headers={"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"},
    json={
        "query": ["AI developments", "machine learning trends", "neural networks"],
        "max_results": 5,
    },
)

results = response.json()
javascript
const response = await fetch("https://api.avalai.ir/v1/search/parallel_ai-search-pro", {
    method: "POST",
    headers: {
        "Authorization": `Bearer ${process.env.AVALAI_API_KEY}`,
        "Content-Type": "application/json"
    },
    body: JSON.stringify({
        query: ["AI developments", "machine learning trends", "neural networks"],
        max_results: 5
    })
});

const data = await response.json();

Advanced Search with Domain Filtering

bash
curl https://api.avalai.ir/v1/search \
  -H "Authorization: Bearer $AVALAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "search_tool_name": "exa_ai-search",
    "query": "machine learning research papers",
    "max_results": 10,
    "search_domain_filter": ["arxiv.org", "paperswithcode.com", "scholar.google.com"],
    "country": "US"
  }'
python
import requests

response = requests.post(
    "https://api.avalai.ir/v1/search",
    headers={"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"},
    json={
        "search_tool_name": "exa_ai-search",
        "query": "machine learning research papers",
        "max_results": 10,
        "search_domain_filter": [
            "arxiv.org",
            "paperswithcode.com",
            "scholar.google.com",
        ],
        "country": "US",
    },
)

results = response.json()
javascript
const response = await fetch("https://api.avalai.ir/v1/search", {
    method: "POST",
    headers: {
        "Authorization": `Bearer ${process.env.AVALAI_API_KEY}`,
        "Content-Type": "application/json"
    },
    body: JSON.stringify({
        search_tool_name: "exa_ai-search",
        query: "machine learning research papers",
        max_results: 10,
        search_domain_filter: ["arxiv.org", "paperswithcode.com", "scholar.google.com"],
        country: "US"
    })
});

const data = await response.json();

Choosing a Search Tool

By Cost

By Use Case

Best Practices

  1. Choose the Right Tool: Select a search tool based on your specific needs (cost, quality, features)
  2. Use Domain Filtering: Narrow results to specific domains for more relevant searches
  3. Set Appropriate Limits: Use max_results to control the number of returned results
  4. Handle Errors: Implement proper error handling for API requests
  5. Rate Limiting: Be mindful of rate limits for your chosen search provider
  6. Cache Results: Consider caching search results to reduce costs and improve performance

Error Handling

The Search API returns standard HTTP status codes:

  • 200: Successful search
  • 400: Bad request (invalid parameters)
  • 401: Unauthorized (invalid API key)
  • 429: Rate limit exceeded
  • 500: Internal server error