Resposta rápida
Como faço uma consulta a uma API de SERP com curl?
Execute curl -sG "https://serpcrypto.com/api/v1/search" -H "Authorization: Bearer $KEY" --data-urlencode "q=your query" e canalize o JSON para jq. Com SerpCrypto, cada pesquisa bem-sucedida custa 1 crédito, a partir de US$ 0,30/1K pesquisas, e erros são gratuitos. -G transforma as flags de dados em uma query string. Os créditos são pagos com cripto, sem KYC.
Quais flags do curl importam aqui?
Defina a chave uma vez por shell com export SERPCRYPTO_API_KEY=…. Instale jq pelo seu gerenciador de pacotes caso não esteja disponível.
| Flag | Por quê |
|---|---|
-s | Silencioso: nenhuma barra de progresso misturada ao JSON. |
-G | Envia os valores de -d e --data-urlencode como query string em uma requisição GET. |
--data-urlencode | Codifica espaços, aspas e acentos em q e location. |
-H "Authorization: Bearer …" | Sua chave de API. Mantenha-a em uma variável de ambiente. |
-w '%{http_code}' | Exibe o status HTTP, útil quando uma chamada falha. |
Como faço para exibir os 10 principais links de uma palavra-chave?
Peça os resultados orgânicos e deixe o jq exibir a posição e o link de cada um, separados por tabulação. O formato []? não exibe nada em vez de falhar quando um bloco está ausente, o que mantém os scripts silenciosos em páginas incomuns.
# Top 10 organic links, one per line
curl -sG "https://serpcrypto.com/api/v1/search" \
-H "Authorization: Bearer $SERPCRYPTO_API_KEY" \
--data-urlencode "q=kubernetes cost monitoring" -d gl=us -d hl=en \
| jq -r '.organic_results[]? | "\(.position)\t\(.link)"'Como faço para listar as perguntas do People Also Ask?
Leia o people_also_ask[].question. As perguntas seguem o idioma definido em hl e mudam conforme o país em gl, então execute a mesma consulta em cada mercado para o qual você escreve. As equipes de conteúdo colam essa lista direto em um briefing.
# People Also Ask questions, ready for a content brief
curl -sG "https://serpcrypto.com/api/v1/search" \
-H "Authorization: Bearer $SERPCRYPTO_API_KEY" \
--data-urlencode "q=how to brew cold brew" -d gl=gb -d hl=en \
| jq -r '.people_also_ask[]?.question'Como faço para ver quais fontes um AI Overview cita?
Leia o ai_overview.references. O bloco só existe quando o Google exibe um AI Overview para essa consulta e local, então a receita exibe uma mensagem clara caso contrário. Acompanhar essas fontes ao longo do tempo mostra se suas páginas são citadas nas respostas geradas do Google.
# Sources cited by the AI Overview, if the page shows one
curl -sG "https://serpcrypto.com/api/v1/search" \
-H "Authorization: Bearer $SERPCRYPTO_API_KEY" \
--data-urlencode "q=what is a heat pump" -d gl=us -d hl=en \
| jq -r 'if .ai_overview then .ai_overview.references[] | "\(.index)\t\(.source)\t\(.link)" else "no AI Overview for this query" end'Como faço para obter o local pack e a lista do Maps?
Uma pesquisa na web com location retorna o local pack exibido na página de resultados, geralmente alguns negócios. O engine=google_maps retorna a lista mais longa do Maps com endereço, avaliação e número de avaliações, que o @tsv transforma em linhas para uma planilha. Ambos custam 1 crédito cada.
# Local pack in a city, then the full Maps list for the same query
curl -sG "https://serpcrypto.com/api/v1/search" \
-H "Authorization: Bearer $SERPCRYPTO_API_KEY" \
--data-urlencode "q=vegan restaurant" \
--data-urlencode "location=Toronto, Ontario, Canada" -d gl=ca -d hl=en \
| jq -r '.local_results[]? | "\(.position)\t\(.title)\t\(.rating // "-")"'
curl -sG "https://serpcrypto.com/api/v1/search" \
-H "Authorization: Bearer $SERPCRYPTO_API_KEY" \
-d engine=google_maps --data-urlencode "q=vegan restaurant Toronto" -d gl=ca -d hl=en \
| jq -r '.local_results[]? | [.title, .address, .rating, .reviews] | @tsv'Como faço para ver o erro quando uma chamada falha?
Adicione -w '\nHTTP %{http_code}\n' para exibir o status após o corpo. O corpo de erro é um JSON pequeno com code e message; a página de erros lista todos os seis códigos. O segundo comando consulta seus créditos, o que é gratuito.
# Print the body, then the HTTP status on its own line
curl -sG "https://serpcrypto.com/api/v1/search" \
-H "Authorization: Bearer $SERPCRYPTO_API_KEY" \
--data-urlencode "q=test" -w '\nHTTP %{http_code}\n'
# Credits left (free call)
curl -s "https://serpcrypto.com/api/v1/credits" -H "Authorization: Bearer $SERPCRYPTO_API_KEY" | jq .Qual é o equivalente em PowerShell no Windows?
Invoke-RestMethod envia a requisição e converte o JSON em objetos, então você não precisa de jq. Passe os parâmetros como hashtable em -Body: em uma requisição GET, o PowerShell os codifica na query string. O Format-Table então exibe posições, títulos e links.
# Windows PowerShell 5.1 or PowerShell 7
$headers = @{ Authorization = "Bearer $env:SERPCRYPTO_API_KEY" }
$query = @{ q = "kubernetes cost monitoring"; gl = "us"; hl = "en" }
$data = Invoke-RestMethod -Uri "https://serpcrypto.com/api/v1/search" -Headers $headers -Body $query -Method Get
$data.organic_results | Select-Object position, title, link | Format-Table -AutoSizeQuando devo passar do curl para o código?
Assim que você repetir um comando com uma lista de palavras-chave. Um loop de shell funciona para algumas dezenas de pesquisas, mas retries, paralelismo e armazenamento são mais fáceis em Python ou Node.js. As requisições são as mesmas, então uma receita testada aqui funciona sem alterações. Cada pesquisa continua custando 1 crédito, a partir de US$ 0,75/1K pesquisas no pacote 10.000 pesquisas.
Dúvidas sobre curl
Por que minha consulta retorna um erro 400 no curl?
Geralmente porque q foi enviado com -d e contém um caractere que precisa de codificação. Use --data-urlencode "q=…" para a consulta e para location; códigos simples como gl=us podem ficar com -d.
Posso salvar o JSON completo em um arquivo?
Sim: adicione -o result.json em vez de canalizar para jq. Salvar as respostas brutas permite reprocessá-las depois sem pagar pela pesquisa novamente.
O curl no Windows funciona da mesma forma?
O Windows 10 e 11 incluem curl.exe, e as flags são as mesmas. As aspas diferem no cmd.exe, então o PowerShell com Invoke-RestMethod costuma ser mais simples ali.