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/searchExemplos 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
}'Busca com Safe Search
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âmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
query | string | Sim | - | Consulta de busca |
template_id | string | Não | - | ID do template para esta busca |
variables | object | Não | - | Variáveis do template (com template_id) |
engine | enum | Não | google | Motor de busca. Hoje: google |
limit | number | Não | 10 | Máximo de resultados por página |
offset | number | Não | 0 | Resultados a pular (paginação) |
pages | number | Não | 1 | Páginas de resultados (mín.: 1, máx.: 20) |
lang | string | Não | en | Locale (ex.: 'en', 'zh', 'es', 'fr') |
country | string | Não | - | País (ex.: 'US', 'GB', 'CN') |
timeRange | enum | Não | - | Filtro de tempo: day, week, month, year |
sources | enum | Não | - | Fontes: web, images, news (SearXNG) |
safe_search | number | null | Não | null | Safe 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.
| Campo | Tipo | Padrão | Observações |
|---|---|---|---|
engine | enum | - | Motor de scrape: auto, cheerio, playwright, puppeteer |
formats | array of enum | ["markdown"] | Formatos: markdown, html, text, screenshot, screenshot@fullPage, rawHtml, json, summary, links |
timeout | number | 60000 | Timeout (ms) |
wait_for | number | - | Atraso (ms); navegadores; prioridade menor que wait_for_selector |
wait_until | enum | - | Espera da navegação: load, domcontentloaded, networkidle, commit |
wait_for_selector | string, object, or array | - | Seletores (só navegadores). Mesma semântica que em /v1/scrape. |
include_tags | array of string | - | Incluir só elementos com seletores CSS |
exclude_tags | array of string | - | Excluir elementos com seletores CSS |
only_main_content | boolean | true | Só conteúdo principal (include_tags tem precedência) |
proxy | string (URI) | - | Proxy opcional |
json_options | object | - | Extração JSON (schema, user_prompt, schema_name, schema_description) |
extract_source | enum | markdown | Origem do JSON: markdown ou html |
ocr_options | boolean | false | OCR só em imagens markdown; não altera html/rawHtml. |
max_age | number | - | Idade do cache (ms). 0 pula leitura; omita para o padrão |
store_in_cache | boolean | true | Gravar 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_search0, 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:
- Resultados de busca: título, URL, descrição e fonte
- 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
- Busca geral →
google(único suportado hoje) - Vários idiomas → ajuste
lang - Mais cobertura → use várias páginas de resultados
Desempenho
- Lotes: use
pagespara 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-GBpara 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 globalen-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 globalzh-CN- Chinês (China) 🇨🇳zh-HK- Chinês (Hong Kong) 🇭🇰zh-TW- Chinês (Taiwan) 🇹🇼
Espanhol 🌐
es- Espanhol globales-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 globalfr-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 globalde-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 globalpt-BR- Português (Brasil) 🇧🇷pt-PT- Português (Portugal) 🇵🇹
Italiano 🌐
it- Italiano globalit-CH- Italiano (Suíça) 🇨🇭it-IT- Italiano (Itália) 🇮🇹
Japonês 🌐
ja- Japonês globalja-JP- Japonês (Japão) 🇯🇵
Coreano 🌐
ko- Coreano globalko-KR- Coreano (Coreia do Sul) 🇰🇷
Russo 🌐
ru- Russo globalru-RU- Russo (Rússia) 🇷🇺
Idiomas europeus
Holandês 🌐
nl- Holandês globalnl-BE- Holandês (Bélgica) 🇧🇪nl-NL- Holandês (Países Baixos) 🇳🇱
Polonês 🌐
pl- Polonês globalpl-PL- Polonês (Polônia) 🇵🇱
Tcheco 🌐
cs- Tcheco globalcs-CZ- Tcheco (República Tcheca) 🇨🇿
Húngaro 🌐
hu- Húngaro globalhu-HU- Húngaro (Hungria) 🇭🇺
Romeno 🌐
ro- Romeno globalro-RO- Romeno (Romênia) 🇷🇴
Grego 🌐
el- Grego globalel-GR- Grego (Grécia) 🇬🇷
Búlgaro 🌐
bg- Búlgaro globalbg-BG- Búlgaro (Bulgária) 🇧🇬
Croata 🌐
hr- Croata global
Eslovaco 🌐
sk- Eslovaco global
Esloveno 🌐
sl- Esloveno global
Estoniano 🌐
et- Estoniano globalet-EE- Estoniano (Estônia) 🇪🇪
Letão 🌐
lv- Letão global
Lituano 🌐
lt- Lituano global
Finlandês 🌐
fi- Finlandês globalfi-FI- Finlandês (Finlândia) 🇫🇮
Sueco 🌐
sv- Sueco globalsv-SE- Sueco (Suécia) 🇸🇪
Norueguês 🌐
nb- Norueguês (bokmål)nb-NO- Norueguês bokmål (Noruega) 🇳🇴
Dinamarquês 🌐
da- Dinamarquês globalda-DK- Dinamarquês (Dinamarca) 🇩🇰
Islandês 🌐
is- Islandês global
Outros idiomas
Árabe 🌐
ar- Árabe globalar-SA- Árabe (Arábia Saudita) 🇸🇦
Hebraico 🇮🇱
he- Hebraico
Turco 🌐
tr- Turco globaltr-TR- Turco (Turquia) 🇹🇷
Persa 🌐
fa- Persa
Hindi 🌐
hi- Hindi
Urdu 🌐
ur- Urdu
Tailandês 🌐
th- Tailandês globalth-TH- Tailandês (Tailândia) 🇹🇭
Vietnamita 🌐
vi- Vietnamita globalvi-VN- Vietnamita (Vietnã) 🇻🇳
Indonésio 🌐
id- Indonésio globalid-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
langao idioma da sua consulta