Quick answer
What parameters does the SerpCrypto search endpoint take?
GET https://serpcrypto.com/api/v1/search takes one required parameter, q, and nine optional ones: engine, gl, hl, location, google_domain, device, page, safe and period. SerpCrypto returns JSON and charges 1 credit per successful search on all 6 engines; errors are free. Packs start at $7.50 for 10,000 searches, paid in crypto with no KYC.
How do I authenticate?
Send your key in one of two ways. The recommended way is the header Authorization: Bearer YOUR_KEY. The other is the query parameter api_key=YOUR_KEY, handy for a quick test in a browser tab.
A missing, wrong or revoked key gets 401 invalid_api_key and costs nothing. API keys you can create and revoke at any time from your dashboard, so you can give each script or server its own key and revoke one without touching the others.
Run a search
GET/api/v1/search
Runs one search on the chosen engine and returns the results page as JSON. A successful search uses 1 credit, whatever the engine; an error uses none. Parameters go in the query string, URL-encoded. The example asks Google for coffee roasters in Austin, Texas; IDs, counts and results are illustrative.
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
q | query | string | Yes | The search query, as a person would type it. Search operators such as quotes or site: are part of the query. |
engine | query | string | No | google (default), google_news, google_images, google_maps, google_shopping or bing. |
gl | query | string | No | Country of the results: ISO 3166-1 alpha-2 code in lower case, such as us, de or br. Default us. |
hl | query | string | No | Interface language, such as en, de or pt-BR. Default en. |
location | query | string | No | City-level place, written City, Region, Country, such as Austin, Texas, United States. See locations. |
google_domain | query | string | No | Google domain to search, such as google.de. Default: the domain of the gl country. Ignored when engine=bing. |
device | query | string | No | desktop (default) or mobile. |
page | query | integer | No | Results page from 1 (default) to 10. Each page is a separate search and uses 1 credit. |
safe | query | string | No | active filters explicit results; off (default) does not. |
period | query | string | No | Only results from the last hour (h), day (d), week (w), month (m) or year (y). |
api_key | query | string | No | Your key, if you do not send the Authorization header. |
Response 200
{
"search_metadata": {
"id": "srch_7f3a9c2e41b8",
"status": "success",
"engine": "google",
"created_at": "2026-10-22T09:14:05Z",
"credits_used": 1
},
"search_parameters": {
"engine": "google",
"q": "coffee roasters",
"gl": "us",
"hl": "en",
"location": "Austin, Texas, United States",
"google_domain": "google.com",
"device": "desktop",
"page": 1
},
"search_information": {
"total_results": 18600000,
"query_displayed": "coffee roasters"
},
"local_results": [
{
"position": 1,
"title": "Example Coffee Roasters",
"address": "123 Example St, Austin, TX",
"rating": 4.7,
"reviews": 312,
"type": "Coffee roasters"
}
],
"organic_results": [
{
"position": 1,
"title": "The 12 best coffee roasters in Austin",
"link": "https://www.example.com/austin/coffee-roasters",
"displayed_link": "www.example.com › austin › coffee",
"snippet": "From light Nordic roasts to dark espresso blends, these local roasters…",
"date": "Sep 30, 2026"
},
{
"position": 2,
"title": "Example Roasting Co. | Fresh beans, roasted in Austin",
"link": "https://www.example.org/",
"displayed_link": "www.example.org",
"snippet": "Small-batch coffee roasted every weekday and shipped the same day…"
}
],
"people_also_ask": [
{
"question": "What is the oldest coffee roaster in Austin?",
"snippet": "…",
"title": "Austin coffee history",
"link": "https://www.example.net/austin-coffee-history"
}
],
"related_searches": [
{
"query": "coffee roasters near me"
},
{
"query": "coffee roasters austin wholesale"
}
],
"pagination": {
"current": 1,
"next_page": 2
}
}Code examples
curl -sG "https://serpcrypto.com/api/v1/search" \
-H "Authorization: Bearer $SERPCRYPTO_API_KEY" \
--data-urlencode "q=coffee roasters" \
--data-urlencode "location=Austin, Texas, United States" \
-d gl=us -d hl=en -d device=desktopimport os
import requests
r = requests.get(
"https://serpcrypto.com/api/v1/search",
params={
"q": "coffee roasters",
"location": "Austin, Texas, United States",
"gl": "us",
"hl": "en",
},
headers={"Authorization": "Bearer " + os.environ["SERPCRYPTO_API_KEY"]},
timeout=60,
)
r.raise_for_status()
print(r.json()["organic_results"][0]["link"])const params = new URLSearchParams({
q: "coffee roasters",
location: "Austin, Texas, United States",
gl: "us",
hl: "en",
});
const res = await fetch("https://serpcrypto.com/api/v1/search?" + params, {
headers: { Authorization: "Bearer " + process.env.SERPCRYPTO_API_KEY },
});
const data = await res.json();
console.log(data.organic_results?.[0]?.link);Which engine values exist, and what does each return?
The frame (search_metadata, search_parameters, search_information) is the same on every engine. A block appears only when the page shows it.
engine | Source | Main blocks in the answer |
|---|---|---|
google | Google Search | ai_overview, organic_results, ads, people_also_ask, local_results, knowledge_graph, top_stories, inline_videos, shopping_results, related_searches, pagination |
google_news | Google News | news_results: title, link, source, date, snippet, thumbnail |
google_images | Google Images | images_results: original URL and size, thumbnail, source page |
google_maps | Google Maps | local_results: name, address, phone, website, rating, reviews, category, hours, coordinates |
google_shopping | Google Shopping | shopping_results: title, price, extracted price, currency, merchant, delivery, rating |
bing | Bing | organic_results, related_searches |
Read your credits
GET/api/v1/credits
Returns the credits left on your account, the credits used since midnight UTC and the number of searches your account may run at the same time. This call is free. Values below are examples.
Authentication: API key in the Authorization: Bearer API_KEY header.
Response 200
{
"credits_remaining": 84210,
"credits_used_today": 1290,
"concurrency_limit": 10
}Code examples
curl -s "https://serpcrypto.com/api/v1/credits" \
-H "Authorization: Bearer $SERPCRYPTO_API_KEY"import os
import requests
r = requests.get(
"https://serpcrypto.com/api/v1/credits",
headers={"Authorization": "Bearer " + os.environ["SERPCRYPTO_API_KEY"]},
timeout=30,
)
r.raise_for_status()
print(r.json()["credits_remaining"])const res = await fetch("https://serpcrypto.com/api/v1/credits", {
headers: { Authorization: "Bearer " + process.env.SERPCRYPTO_API_KEY },
});
const { credits_remaining } = await res.json();
console.log(credits_remaining);Which errors can the API return?
Every error has the body {"error": {"code": "…", "message": "…"}}. The errors page explains each one and shows retry code.
| HTTP | code | When it happens | Charged |
|---|---|---|---|
| 400 | invalid_parameter | A required parameter is missing or a value is outside the allowed list | No |
| 401 | invalid_api_key | The key is missing, wrong or revoked | No |
| 402 | insufficient_credits | Your account has no credits left | No |
| 429 | concurrency_limit | Too many searches are running at the same time on your account | No |
| 502 | search_failed | The engine or the collection failed for this request; retry it | No |
| 504 | search_timeout | No answer in time; retry it | No |
What is charged, exactly?
- One successful search = one credit, on every engine, including Google Maps and Google Shopping.
- Each results page is one search. About 10 organic results per page, as Google has served since it stopped honouring num=100 in September 2025; each extra page is one more credit.
- Errors are free: every answer with an HTTP status other than 200 uses no credit.
- Reading your credits is free.
Prepaid search credits never expire: unused searches stay on your account until you use them. Packs run from $7.50 for 10,000 searches to $0.30/1K searches on the largest one; see pricing.
How should I encode the query?
Send q URL-encoded, like any query-string value: a space becomes %20 or +, and accented letters are encoded as UTF-8. curl does this with --data-urlencode, Python requests and httpx do it with params=, and Node.js does it with URLSearchParams.
Write the query exactly as a person would type it in the search box. Quotes, a minus sign or site: stay inside q; the engine decides how to apply them, as it would for a visitor.
Is the API versioned?
Yes. The version is part of the path: /api/v1/. New fields or blocks can appear in version 1 answers, so your code should ignore keys it does not know. Removing or renaming a field would come with a new version in the path, not as a change to v1.
API reference questions
Can I send a POST request with a JSON body?
Not in version 1: both endpoints take GET requests with parameters in the query string. This keeps every call easy to reproduce with curl or a browser, and easy to log without the body.
How many results does one search return?
About 10 organic results per page, as Google has served since it stopped honouring num=100 in September 2025; each extra page is one more credit. To collect 30 results, request page=1, page=2 and page=3: three searches, three credits.
What happens when my credits run out?
The next search returns 402 insufficient_credits and uses nothing. Buy another pack from your balance on the pricing page; your key keeps working and searches resume at once.
Can I use the same key from several servers?
Yes. A key is not tied to an IP address. What is limited is the number of searches running at the same time on the account: concurrency_limit in GET /credits gives the figure.