AnyCrawl

Busca

API de SERP para consultar mecanismos de busca e obter resultados estruturados.

Introdução

A API Search do AnyCrawl permite acessar resultados de mecanismos de busca por programação. Pensada para LLMs, devolve dados limpos e estruturados para análise e processamento por IA.

A API responde de imediato, de forma síncrona — sem polling nem webhooks. Suporta vários mecanismos e várias páginas de resultados em uma única requisição.

Recursos principais

  • Vários motores: hoje Google; outros planejados
  • Otimizada para LLM: JSON estruturado
  • Idiomas e regiões: busca em diferentes locales
  • Várias páginas: um único request pode trazer várias páginas de resultados
  • Desempenho: alta concorrência nativa com processamento assíncrono
  • Resposta imediata: API síncrona
  • Resultados completos: itens de resultado e sugestões de busca

Endpoint da API

POST https://api.anycrawl.dev/v1/search

Exemplos de uso

Busca básica (Google, padrão)

curl -X POST "https://api.anycrawl.dev/v1/search" \
  -H "Authorization: Bearer <your-api-key>" \
  -H "Content-Type": "application/json" \
  -d '{
    "query": "OpenAI ChatGPT"
  }'

Busca com várias páginas

curl -X POST "https://api.anycrawl.dev/v1/search" \
  -H "Authorization: Bearer <your-api-key>" \
  -H "Content-Type": "application/json" \
  -d '{
    "query": "machine learning tutorials",
    "pages": 3,
    "limit": 10
  }'

Busca com idioma/região

curl -X POST "https://api.anycrawl.dev/v1/search" \
  -H "Authorization: Bearer <your-api-key>" \
  -H "Content-Type": "application/json" \
  -d '{
    "query": "AnyCrawl",
    "lang": "zh",
    "pages": 2
  }'

Busca com paginação

curl -X POST "https://api.anycrawl.dev/v1/search" \
  -H "Authorization: Bearer <your-api-key>" \
  -H "Content-Type": "application/json" \
  -d '{
    "query": "web scraping tools",
    "offset": 20,
    "limit": 10
  }'
curl -X POST "https://api.anycrawl.dev/v1/search" \
  -H "Authorization: Bearer <your-api-key>" \
  -H "Content-Type": "application/json" \
  -d '{
    "query": "educational content",
    "safe_search": 0
  }'

Parâmetros da requisição

ParâmetroTipoObrigatórioPadrãoDescrição
querystringSim-Consulta de busca
template_idstringNão-ID do template para esta busca
variablesobjectNão-Variáveis do template (com template_id)
engineenumNãogoogleMotor de busca. Hoje: google
limitnumberNão10Máximo de resultados por página
offsetnumberNão0Resultados a pular (paginação)
pagesnumberNão1Páginas de resultados (mín.: 1, máx.: 20)
langstringNãoenLocale (ex.: 'en', 'zh', 'es', 'fr')
countrystringNão-País (ex.: 'US', 'GB', 'CN')
timeRangeenumNão-Filtro de tempo: day, week, month, year
sourcesenumNão-Fontes: web, images, news (SearXNG)
safe_searchnumber | nullNãonullSafe Search no Google: 0 (off), 1 (médio), 2 (alto) ou null (padrão). Só Google.

Opcional: scrape_options nas URLs dos resultados

Se informado, cada URL de resultado pode ser raspada com as mesmas opções de /v1/scrape (sem url no topo). Opções só de navegador são ignoradas sem motor de navegador.

CampoTipoPadrãoObservações
engineenum-Motor de scrape: auto, cheerio, playwright, puppeteer
formatsarray of enum["markdown"]Formatos: markdown, html, text, screenshot, screenshot@fullPage, rawHtml, json, summary, links
timeoutnumber60000Timeout (ms)
wait_fornumber-Atraso (ms); navegadores; prioridade menor que wait_for_selector
wait_untilenum-Espera da navegação: load, domcontentloaded, networkidle, commit
wait_for_selectorstring, object, or array-Seletores (só navegadores). Mesma semântica que em /v1/scrape.
include_tagsarray of string-Incluir só elementos com seletores CSS
exclude_tagsarray of string-Excluir elementos com seletores CSS
only_main_contentbooleantrueSó conteúdo principal (include_tags tem precedência)
proxystring (URI)-Proxy opcional
json_optionsobject-Extração JSON (schema, user_prompt, schema_name, schema_description)
extract_sourceenummarkdownOrigem do JSON: markdown ou html
ocr_optionsbooleanfalseOCR só em imagens markdown; não altera html/rawHtml.
max_agenumber-Idade do cache (ms). 0 pula leitura; omita para o padrão
store_in_cachebooleantrueGravar Page Cache por resultado raspado

Motor de busca suportado

google (padrão)

  • Uso: busca geral na web
  • Vantagens: resultados amplos; vários idiomas e regiões
  • Recursos: resultados e sugestões; Safe Search (off/médio/alto)
  • Recomendado para: pesquisa, descoberta de conteúdo
  • Safe Search: safe_search 0, 1, 2 ou null (padrão)

Formato da resposta

Sucesso (HTTP 200)

Busca bem-sucedida

{
    "success": true,
    "data": [
        {
            "title": "AlsoAsked: People Also Ask keyword research tool",
            "url": "https://alsoasked.com/",
            "description": "Find the questions people also ask. Enter a question, brand or search query. e.g. 'keyword research'.",
            "source": "Google Search Result"
        },
        {
            "title": "OpenAI ChatGPT Features and Benefits",
            "url": "https://openai.com/chatgpt",
            "description": "ChatGPT is an AI assistant that can help with writing, research, and problem-solving.",
            "source": "Google Search Result"
        },
        {
            "title": "Keyword tool",
            "source": "Google Suggestions"
        }
    ]
}

Tipos de resultado

A API devolve:

  1. Resultados de busca: título, URL, descrição e fonte
  2. Sugestões: consultas relacionadas do mecanismo

Erros

400 — Validação

{
    "success": false,
    "error": "Validation error",
    "details": {
        "issues": [
            {
                "field": "engine",
                "message": "Invalid enum value. Expected 'google', received 'invalid'",
                "code": "invalid_enum_value"
            }
        ],
        "messages": ["Invalid enum value. Expected 'google', received 'invalid'"]
    }
}

401 — Autenticação

{
    "success": false,
    "error": "Invalid API key"
}

402 — Pagamento necessário

{
    "success": false,
    "error": "Insufficient credits. Please upgrade your plan or purchase more credits."
}

Boas práticas

Escolha do motor

  1. Busca geralgoogle (único suportado hoje)
  2. Vários idiomas → ajuste lang
  3. Mais cobertura → use várias páginas de resultados

Desempenho

  • Lotes: use pages para várias páginas em uma chamada
  • Idioma: localize resultados com lang
  • Consulta: termos específicos melhoram a qualidade

Tratamento de erros

try {
    const response = await fetch("/v1/search", {
        method: "POST",
        headers: {
            Authorization: "Bearer YOUR_API_KEY",
            "Content-Type": "application/json",
        },
        body: JSON.stringify({
            query: "artificial intelligence",
            pages: 2,
        }),
    });

    const result = await response.json();

    if (result.success) {
        // Handle successful result
        console.log("Found results:", result.data.length);

        // Separate search results from suggestions
        const searchResults = result.data.filter((item) => item.url);
        const suggestions = result.data.filter((item) => !item.url);

        console.log("Search Results:", searchResults.length);
        console.log("Suggestions:", suggestions.length);
    } else {
        // Handle search failure
        console.error("Search failed:", result.error);
    }
} catch (error) {
    // Handle network error
    console.error("Request failed:", error);
}

Alta concorrência

A API suporta alta concorrência nativamente. Várias buscas simultâneas sem limite artificial de taxa:

// Concurrent searching example
const queries = ["machine learning", "artificial intelligence", "data science"];

const searchPromises = queries.map((query) =>
    fetch("/v1/search", {
        method: "POST",
        headers: {
            Authorization: "Bearer YOUR_API_KEY",
            "Content-Type": "application/json",
        },
        body: JSON.stringify({ query, engine: "google", pages: 2 }),
    }).then((res) => res.json())
);

// All requests execute concurrently and return immediately
const results = await Promise.all(searchPromises);
console.log(`Completed ${results.length} searches simultaneously`);

Limites de taxa e créditos

  • Cada busca consome créditos conforme o número de páginas solicitadas
  • Consumo = número de páginas (ex.: pages: 3 = 3 créditos)
  • Sem limite de taxa para concorrência — alta concorrência nativa
  • Monitore créditos pelos cabeçalhos da resposta

Perguntas frequentes

Quando usar configurações de idioma diferentes?

  • Inglês (en): resultados globais e conteúdo internacional
  • Chinês (zh): conteúdo em chinês e foco na China
  • Variantes regionais (ex.: en-GB, fr-CA): resultados por país

Por que algumas buscas retornam poucos resultados?

Possíveis causas:

  • Consulta muito específica ou termos raros
  • Descompasso entre idioma da query e lang
  • Limitações do mecanismo para certos tópicos ou regiões
  • Problemas de rede

Como buscar com região específica?

A API ajusta regiões com base em lang. Sugestões:

  • Códigos que combinem com a região alvo (ex.: en-GB para o Reino Unido)
  • Inclua termos regionais na query quando fizer sentido

Diferença entre resultados e sugestões?

  • Resultados: entradas com título, URL, descrição e fonte
  • Sugestões: consultas relacionadas, muitas vezes sem URL — úteis para expandir a query

Há limite de taxa para buscas concorrentes?

Não. Alta concorrência nativa; várias requisições simultâneas com resposta imediata.

Suporte a idiomas e regiões

A API de busca aceita o parâmetro lang para vários idiomas e regiões. Abaixo estão todos os locales suportados:

Principais idiomas

  • all - Todos os idiomas

Inglês 🌐

  • en - Inglês global
  • en-AU - Inglês (Austrália) 🇦🇺
  • en-CA - Inglês (Canadá) 🇨🇦
  • en-GB - Inglês (Reino Unido) 🇬🇧
  • en-IE - Inglês (Irlanda) 🇮🇪
  • en-IN - Inglês (Índia) 🇮🇳
  • en-NZ - Inglês (Nova Zelândia) 🇳🇿
  • en-PH - Inglês (Filipinas) 🇵🇭
  • en-PK - Inglês (Paquistão) 🇵🇰
  • en-SG - Inglês (Singapura) 🇸🇬
  • en-US - Inglês (Estados Unidos) 🇺🇸
  • en-ZA - Inglês (África do Sul) 🇿🇦

Chinês 🌐

  • zh - Chinês global
  • zh-CN - Chinês (China) 🇨🇳
  • zh-HK - Chinês (Hong Kong) 🇭🇰
  • zh-TW - Chinês (Taiwan) 🇹🇼

Espanhol 🌐

  • es - Espanhol global
  • es-AR - Espanhol (Argentina) 🇦🇷
  • es-CL - Espanhol (Chile) 🇨🇱
  • es-CO - Espanhol (Colômbia) 🇨🇴
  • es-ES - Espanhol (Espanha) 🇪🇸
  • es-MX - Espanhol (México) 🇲🇽
  • es-PE - Espanhol (Peru) 🇵🇪

Francês 🌐

  • fr - Francês global
  • fr-BE - Francês (Bélgica) 🇧🇪
  • fr-CA - Francês (Canadá) 🇨🇦
  • fr-CH - Francês (Suíça) 🇨🇭
  • fr-FR - Francês (França) 🇫🇷

Alemão 🌐

  • de - Alemão global
  • de-AT - Alemão (Áustria) 🇦🇹
  • de-BE - Alemão (Bélgica) 🇧🇪
  • de-CH - Alemão (Suíça) 🇨🇭
  • de-DE - Alemão (Alemanha) 🇩🇪

Português 🌐

  • pt - Português global
  • pt-BR - Português (Brasil) 🇧🇷
  • pt-PT - Português (Portugal) 🇵🇹

Italiano 🌐

  • it - Italiano global
  • it-CH - Italiano (Suíça) 🇨🇭
  • it-IT - Italiano (Itália) 🇮🇹

Japonês 🌐

  • ja - Japonês global
  • ja-JP - Japonês (Japão) 🇯🇵

Coreano 🌐

  • ko - Coreano global
  • ko-KR - Coreano (Coreia do Sul) 🇰🇷

Russo 🌐

  • ru - Russo global
  • ru-RU - Russo (Rússia) 🇷🇺

Idiomas europeus

Holandês 🌐

  • nl - Holandês global
  • nl-BE - Holandês (Bélgica) 🇧🇪
  • nl-NL - Holandês (Países Baixos) 🇳🇱

Polonês 🌐

  • pl - Polonês global
  • pl-PL - Polonês (Polônia) 🇵🇱

Tcheco 🌐

  • cs - Tcheco global
  • cs-CZ - Tcheco (República Tcheca) 🇨🇿

Húngaro 🌐

  • hu - Húngaro global
  • hu-HU - Húngaro (Hungria) 🇭🇺

Romeno 🌐

  • ro - Romeno global
  • ro-RO - Romeno (Romênia) 🇷🇴

Grego 🌐

  • el - Grego global
  • el-GR - Grego (Grécia) 🇬🇷

Búlgaro 🌐

  • bg - Búlgaro global
  • bg-BG - Búlgaro (Bulgária) 🇧🇬

Croata 🌐

  • hr - Croata global

Eslovaco 🌐

  • sk - Eslovaco global

Esloveno 🌐

  • sl - Esloveno global

Estoniano 🌐

  • et - Estoniano global
  • et-EE - Estoniano (Estônia) 🇪🇪

Letão 🌐

  • lv - Letão global

Lituano 🌐

  • lt - Lituano global

Finlandês 🌐

  • fi - Finlandês global
  • fi-FI - Finlandês (Finlândia) 🇫🇮

Sueco 🌐

  • sv - Sueco global
  • sv-SE - Sueco (Suécia) 🇸🇪

Norueguês 🌐

  • nb - Norueguês (bokmål)
  • nb-NO - Norueguês bokmål (Noruega) 🇳🇴

Dinamarquês 🌐

  • da - Dinamarquês global
  • da-DK - Dinamarquês (Dinamarca) 🇩🇰

Islandês 🌐

  • is - Islandês global

Outros idiomas

Árabe 🌐

  • ar - Árabe global
  • ar-SA - Árabe (Arábia Saudita) 🇸🇦

Hebraico 🇮🇱

  • he - Hebraico

Turco 🌐

  • tr - Turco global
  • tr-TR - Turco (Turquia) 🇹🇷

Persa 🌐

  • fa - Persa

Hindi 🌐

  • hi - Hindi

Urdu 🌐

  • ur - Urdu

Tailandês 🌐

  • th - Tailandês global
  • th-TH - Tailandês (Tailândia) 🇹🇭

Vietnamita 🌐

  • vi - Vietnamita global
  • vi-VN - Vietnamita (Vietnã) 🇻🇳

Indonésio 🌐

  • id - Indonésio global
  • id-ID - Indonésio (Indonésia) 🇮🇩

Idiomas da Índia

  • kn - Canará 🌐
  • ml - Malaiala 🌐
  • mr - Marata 🌐
  • ta - Tâmil 🌐
  • te - Telugu 🌐

Outros idiomas europeus

  • af - Africâner 🌐
  • be - Bielorrusso 🌐
  • ca - Catalão 🌐
  • cy - Galês 🌐
  • eu - Basco 🌐
  • ga - Irlandês 🌐
  • gd - Gaélico escocês 🌐
  • gl - Galego 🌐
  • sq - Albanês 🌐
  • uk - Ucraniano 🌐

Notas de uso

  • Códigos globais (ex.: en, zh, es) ampliam os resultados sem restrição de país
  • Códigos com país (ex.: en-US, zh-CN, es-MX) retornam resultados localizados para a região
  • A API escolhe automaticamente o domínio Google e as definições de idioma adequadas ao locale
  • Para melhores resultados, alinhe o parâmetro lang ao idioma da sua consulta