Respuesta rápida
¿Cómo consulto una SERP API con curl?
Ejecuta curl -sG "https://serpcrypto.com/api/v1/search" -H "Authorization: Bearer $KEY" --data-urlencode "q=your query" y pasa el JSON a jq. Con SerpCrypto, cada búsqueda correcta cuesta 1 crédito, desde 0,30 US$/1K búsquedas, y los errores son gratis. -G convierte los data flags en una query string. Los créditos se pagan con criptomonedas, sin KYC.
¿Qué flags de curl importan aquí?
Define la clave una vez por shell con export SERPCRYPTO_API_KEY=…. Instala jq desde tu gestor de paquetes si no lo tienes.
| Flag | Por qué |
|---|---|
-s | Silencioso: ninguna barra de progreso mezclada con el JSON. |
-G | Envía los valores de -d y --data-urlencode como query string en una petición GET. |
--data-urlencode | Codifica espacios, comillas y acentos en q y location. |
-H "Authorization: Bearer …" | Tu clave API. Guárdala en una variable de entorno. |
-w '%{http_code}' | Imprime el código de estado HTTP; es útil cuando falla una llamada. |
¿Cómo imprimo los 10 primeros enlaces de una palabra clave?
Pide los resultados orgánicos y deja que jq imprima la posición y el enlace de cada uno, separados por un tabulador. La forma []? no imprime nada en lugar de fallar cuando falta un bloque, lo que mantiene los scripts silenciosos en páginas poco habituales.
# 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)"'¿Cómo listo las preguntas de People Also Ask?
Lee people_also_ask[].question. Las preguntas siguen el idioma de hl y cambian según el país de gl, así que ejecuta la misma consulta en cada mercado para el que escribes. Los equipos de contenido pegan esta lista directamente en un brief.
# 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'¿Cómo veo qué fuentes cita un AI Overview?
Lee ai_overview.references. El bloque solo existe cuando Google muestra un AI Overview para esa consulta y ese lugar, así que la receta imprime un mensaje claro en caso contrario. Seguir estas fuentes a lo largo del tiempo muestra si tus páginas se citan en las respuestas generadas de 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'¿Cómo obtengo el local pack y la lista de Maps?
Una búsqueda web con location devuelve el local pack que aparece en la página de resultados, normalmente unos pocos negocios. engine=google_maps devuelve la lista más larga de Maps con dirección, valoración y número de reseñas, que @tsv convierte en filas para una hoja de cálculo. Ambas cuestan 1 crédito cada una.
# 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'¿Cómo veo el error cuando falla una llamada?
Añade -w '\nHTTP %{http_code}\n' para imprimir el estado después del cuerpo. El cuerpo de un error es un JSON pequeño con code y message; la página de errores] lista los seis códigos. El segundo comando lee tus créditos, lo cual es gratis.
# 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 .¿Cuál es el equivalente en PowerShell para Windows?
Invoke-RestMethod envía la solicitud y convierte el JSON en objetos, así que no necesitas jq. Pasa los parámetros como una tabla hash en -Body: con una solicitud GET, PowerShell los codifica en la cadena de consulta. Después, Format-Table imprime posiciones, títulos y enlaces.
# 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 -AutoSize¿Cuándo debería pasar de curl a código?
En cuanto repites un comando con una lista de palabras clave. Un bucle de shell sirve para unas cuantas docenas de búsquedas, pero los reintentos, el paralelismo y el almacenamiento son más fáciles en Python o Node.js. Las solicitudes son las mismas, así que una receta probada aquí se traslada sin cambios. Cada búsqueda sigue costando 1 crédito, a 0,75 US$/1K búsquedas en el pack de 10.000 búsquedas.
Preguntas sobre curl
¿Por qué mi consulta devuelve un error 400 en curl?
Normalmente porque q se envió con -d y contiene un carácter que necesita codificación. Usa --data-urlencode "q=…" para la consulta y para location; los códigos simples como gl=us pueden quedarse con -d.
¿Puedo guardar el JSON completo en un archivo?
Sí: añade -o result.json en lugar de canalizar a jq. Guardar las respuestas sin procesar te permite volver a analizarlas más tarde sin pagar de nuevo la búsqueda.
¿curl en Windows funciona igual?
Windows 10 y 11 incluyen curl.exe, y los flags son los mismos. Las comillas cambian en cmd.exe, así que PowerShell con Invoke-RestMethod suele ser más sencillo ahí.