SERP
Google organic results, People Also Ask and related searches for a keyword and country.
curl -X POST https://seonio.com/api/v1/serp/country \ -H "Content-Type: application/json" \ -H "X-API-Key: $SEONIO_API_KEY" \ -d '{"country": "us", "keyword": "seo tools"}'
{
"keyword": "seo tools",
"country": "us",
"organic": [
{
"position": 1,
"title": "24 best SEO tools I'm using in 2026 (free + paid) - Marketer Milk",
"link": "https://www.marketermilk.com/blog/best-seo-tools",
"snippet": "24 best SEO tools I've personally tested in 2026 · 1. Surfer · 2. Gumloop · 3. Ahrefs · 4. Semrush ...",
"date": "Jul 13, 2025"
},
{
"position": 4,
"title": "Semrush SEO Toolkit: Check Website SEO with Analysis Tools",
"link": "https://www.semrush.com/seo/",
"snippet": "From research to reporting, take your SEO to the next level with Semrush tools.",
"date": null
},
{
"position": 6,
"title": "Free SEO Tools by Moz | Try Premium SEO Checkers for Free",
"link": "https://moz.com/free-seo-tools",
"snippet": "Try the best free SEO tools for link building and analysis, keyword research ...",
"date": null
}
],
"people_also_ask": [
{
"question": "What are the SEO tools?",
"title": "Free SEO Tools for Beginners and Pros",
"link": "https://www.seo.com/tools/",
"snippet": "Online SEO tools are the essential software applications that provide the data and insights ..."
}
],
"related_searches": [
"seo tools free",
"seo tools YouTube",
"seo tools list",
"Best seo tools",
"seo tools AI"
]
}What to send and what comes back
Send a keyword and country code and get back the Google results page: ranked organic listings with title, link and snippet, plus People Also Ask and related searches. Ideal for rank tracking, SERP analysis and competitor monitoring.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
keyword |
string | required | The search query to look up. Billed per request. |
country |
string | required | Two-letter country code for the search locale, e.g. "us".
50 supported countriesdzAlgeriaarArgentinaauAustraliaatAustriabdBangladeshbeBelgiumbrBrazilbgBulgariacaCanadaczCzechiadkDenmarkegEgyptfiFinlandfrFrancedeGermanyghGhanagrGreecehuHungaryinIndiaidIndonesiaieIrelanditItalyjpJapankeKenyamyMalaysiamxMexicomaMorocconlNetherlandsnzNew ZealandngNigerianoNorwaypkPakistanphPhilippinesplPolandptPortugalroRomaniasaSaudi ArabiarsSerbiasgSingaporezaSouth AfricaesSpainlkSri LankaseSwedenchSwitzerlandthThailandtrTurkiyeaeUnited Arab EmiratesgbUnited Kingdom (also uk, returned as gb)usUnited StatesvnVietnam |
Response
| Field | Type | Description |
|---|---|---|
keyword |
string | The keyword that was searched. |
country |
string | The country locale used for the search. |
organic[] |
object[] | Ranked organic results, top to bottom, each as { position, title, link, snippet, date }. |
organic[].position |
integer | Rank on the results page (1 = top). |
people_also_ask[] |
object[] | { question, title, link, snippet }. |
related_searches[] |
string[] | Related query suggestions. |
Copy, paste, add your key
The same request in cURL, Python and Node.js.
curl -X POST https://seonio.com/api/v1/serp/country \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{"country": "us", "keyword": "seo tools"}'
import requests
resp = requests.post(
"https://seonio.com/api/v1/serp/country",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"country": "us", "keyword": "seo tools"},
)
print(resp.json())
const resp = await fetch("https://seonio.com/api/v1/serp/country", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-Key": "YOUR_API_KEY",
},
body: JSON.stringify({"country": "us", "keyword": "seo tools"}),
});
console.log(await resp.json());
Run a real request
Send this request from your browser with your API key, or leave the key empty to see the sample response.
A successful run costs $0.001 / request. With no key, you see the sample response and nothing is charged.
{
"country": "us",
"keyword": "seo tools",
"organic": [
{
"date": "Jul 13, 2025",
"link": "https://www.marketermilk.com/blog/best-seo-tools",
"position": 1,
"snippet": "24 best SEO tools I\u0027ve personally tested in 2026 \u00b7 1. Surfer \u00b7 2. Gumloop \u00b7 3. Ahrefs \u00b7 4. Semrush ...",
"title": "24 best SEO tools I\u0027m using in 2026 (free + paid) - Marketer Milk"
},
{
"date": null,
"link": "https://www.semrush.com/seo/",
"position": 4,
"snippet": "From research to reporting, take your SEO to the next level with Semrush tools.",
"title": "Semrush SEO Toolkit: Check Website SEO with Analysis Tools"
},
{
"date": null,
"link": "https://moz.com/free-seo-tools",
"position": 6,
"snippet": "Try the best free SEO tools for link building and analysis, keyword research ...",
"title": "Free SEO Tools by Moz | Try Premium SEO Checkers for Free"
}
],
"people_also_ask": [
{
"link": "https://www.seo.com/tools/",
"question": "What are the SEO tools?",
"snippet": "Online SEO tools are the essential software applications that provide the data and insights ...",
"title": "Free SEO Tools for Beginners and Pros"
}
],
"related_searches": [
"seo tools free",
"seo tools YouTube",
"seo tools list",
"Best seo tools",
"seo tools AI"
]
}
What developers build with it
- Rank tracking and SERP monitoring for target keywords.
- Competitor analysis of who owns the top positions.
- Mining People Also Ask and related searches for content ideas.
The same contract on every endpoint
Error responses are JSON with a "detail" field. It is a message string unless the row above says otherwise.
| Code | When |
|---|---|
200 | Success. The lookup completed and was charged, even if the response is empty. /keywords/global charges only the keywords it looked up. |
401 | Missing or unknown API key. |
402 | Not enough balance. "detail" is an object with "error", "message", "balance_required" and "balance_available". Requests still running hold their price until they finish, so a retry can succeed once they do. |
403 | The account is not verified yet, or it is locked. |
422 | Invalid request (wrong shape or types, a keyword over 200 characters, a URL the page checker cannot audit, a domain that does not exist, or a bare public suffix such as co.uk that groups many websites) — never charged. "detail" is usually a list of validation errors; an answer that retrying cannot change (such as a domain without a DNS record) is a message string with an X-Outcome header naming it: missing, unsupported, too_large or refused_input. |
429 | Rate limit exceeded, never charged. Requests per second per account by plan: 5 on a free account, 10 on Starter, 15 on Pro and 20 on Business; retry after the Retry-After header. Also the page checker's provider limit. |
503 | A data provider failed or timed out (X-Outcome: temporary). Nothing was charged; retry after the seconds in the Retry-After header. |
Questions, answered
Simple answers for developers using the API.
Every endpoint has a published USD price or formula. Requests draw from the same testing, included and Extra Usage balance as website and MCP actions: testing first, then included usage, then Extra Usage expiring soonest.
API actions require a verified account with a free $1 balance or an active subscription balance. Create and manage API keys from your account, then send the key in the X-API-Key header.
Yes. Your account shows API usage and remaining balance, so you can track costs while building and running automated workflows.
REST API and MCP requests per second depend on your plan: 5 on a free account, 10 on Starter, 15 on Pro and 20 on Business. Website data requests from the same account count toward the same second. Requests above the limit return HTTP 429 with a Retry-After header and are not charged; wait a second and retry.
Turn search insights into measurable growth
Start your SEO research in seconds.