SEObserver API v1
Comprehensive SEO data API covering backlinks (powered by Majestic), SERP tracking, indexation checking, and organic keyword monitoring.
Authentication
All API requests require an API key. Pass it via the X-SEObserver-key HTTP header (recommended) or as a api_key query parameter.
curl -H "X-SEObserver-key: YOUR_API_KEY" https://api1.seobserver.com/backlinks/metrics.json
Your API key is available in your SEObserver dashboard under Settings > API.
Base URL
All endpoints are relative to: https://api1.seobserver.com/
All responses are JSON. Append .json to the endpoint path.
Rate Limits & Billing
Each API call consumes SEObserver Units from your account balance. The cost depends on the endpoint and the amount of data returned.
Cost Types
| Type | Formula | Description |
|---|---|---|
| Flat | Fixed amount | Same cost regardless of data returned |
| Variable | factor × rows | Scales with number of rows returned, subject to minimum |
| Mixed | base + factor × rows | Fixed base cost plus variable component, subject to minimum |
| Free | 0 | No cost |
Full Cost Table
| Endpoint | Type | Base | Factor | Min |
|---|---|---|---|---|
backlinks/metrics | Variable | 0 | 1 | — |
backlinks/metrics_archive | Variable | 0 | 5 | — |
backlinks/anchors | Variable | 0 | 1 | 10 |
backlinks/top | Mixed | 40 | 1 | 50 |
backlinks/refdomains | Variable | 0 | 1 | 10 |
backlinks/pages | Mixed | 40 | 1 | 50 |
backlinks/history | Variable | 0 | 1 | 10 |
backlinks/newlost_calendar | Flat | 10 | — | — |
backlinks/refdomaininfo | Variable | 0 | 1 | 10 |
backlinks/linkprofile | Mixed | 20 | 1 | 30 |
backlinks/relatedsites | Mixed | 40 | 1 | 50 |
backlinks/queryestimate | Flat | 1 | — | — |
backlinks/searchbykeyword | Variable | 0 | 1 | 10 |
backlinks/keywordinfo | Variable | 0 | 1 | 10 |
backlinks/submitcrawl | Variable | 0 | 5 | 10 |
serps/add | Variable | 0 | 1 | — |
indexeds/add | Variable | 0 | 1 | — |
organic_keywords/metrics | Variable | 0 | 1 | — |
organic_keywords/index | Variable | 0 | 1 | — |
organic_keywords/urls | Variable | 0 | 1 | — |
organic_keywords/visibility_history | Mixed | 1 | 2 | — |
Check your current balance at any time using the subscription endpoint.
Input Format
Most Backlinks endpoints accept items as a JSON array in the request body, or as query parameters.
JSON Body (recommended)
[
{"item_type": "domain", "item_value": "example.com"},
{"item_type": "url", "item_value": "https://example.com/page"}
]
Query Parameters
?item_type=domain&item_value=example.com
Valid item_type values
| item_type | Description |
|---|---|
domain | Root domain (e.g. example.com) |
subdomain | Subdomain (e.g. blog.example.com) |
site | Site-level query |
url | Exact URL |
path | URL path with wildcard matching |
keyword | Keyword string (only for keywordinfo endpoint) |
Use Cases
Common workflows combining multiple endpoints to solve real SEO problems.
Monitor competitor backlink acquisition
Track how competitors gain links over time. Use history for trends and newlost_calendar for daily new/lost link activity.
Audit your link profile quality
Assess your backlink health by combining overall metrics, CF/TF distribution matrix, and anchor text analysis.
Find link building opportunities
Discover related sites in your niche and find domains ranking for your target keywords.
Bulk domain authority check
Check TrustFlow and CitationFlow for up to 100 domains at once. Use refdomaininfo for detailed referring domain data.
Detect negative SEO attacks
Spot sudden spikes in new backlinks or lost links that may indicate a negative SEO attack.
Find content gaps
Get keyword popularity data and discover which domains rank for terms you're missing.
Content audit
Analyze which keywords and URLs drive organic visibility for your domain.
Track rankings for key terms
Submit keywords for SERP tracking and retrieve results once processed.
Monitor local SERP
Track rankings for specific locations using custom base and UULE parameters.
Verify new pages are indexed
Submit recently published URLs and check their indexation status in Google.
Site-wide indexation audit
Submit URLs in batch to audit indexation coverage across your entire site.
Backlinks Endpoints
Get link metrics (TrustFlow, CitationFlow, backlinks count, referring domains, etc.) for up to 100 items in a single request. Powered by Majestic GetIndexItemInfo.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
items | JSON body | Yes | — | Array of items (max 100) |
datasource | string | No | fresh | fresh or historic |
curl -X POST https://api1.seobserver.com/backlinks/metrics.json \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[{"item_type":"domain","item_value":"example.com"}]'$ch = curl_init('https://api1.seobserver.com/backlinks/metrics.json');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'X-SEObserver-key: YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
['item_type' => 'domain', 'item_value' => 'example.com']
]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);import requests
response = requests.post(
"https://api1.seobserver.com/backlinks/metrics.json",
headers={"X-SEObserver-key": "YOUR_API_KEY"},
json=[{"item_type": "domain", "item_value": "example.com"}],
)
data = response.json()const response = await fetch("https://api1.seobserver.com/backlinks/metrics.json", {
method: "POST",
headers: {
"X-SEObserver-key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify([{ item_type: "domain", item_value: "example.com" }]),
});
const data = await response.json();body, _ := json.Marshal([]map[string]string{
{"item_type": "domain", "item_value": "example.com"},
})
req, _ := http.NewRequest("POST",
"https://api1.seobserver.com/backlinks/metrics.json",
bytes.NewBuffer(body))
req.Header.Set("X-SEObserver-key", "YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)Example Response
{
"status": "ok",
"message": "",
"data": [
{
"Item": "example.com",
"ResultCode": "OK",
"Status": "Found",
"TrustFlow": 72,
"CitationFlow": 65,
"ExtBackLinks": 285432,
"RefDomains": 12847,
"TopicalTrustFlow_Topic_0": "Computers/Internet",
"TopicalTrustFlow_Value_0": 48
}
],
"number_of_rows": 1
}
Get historical metrics snapshots for a single item, stored monthly in SEObserver archives. Up to 12 months of data.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
item | JSON body | Yes | — | Single item |
count | integer | No | 12 | Number of months (max 12) |
curl -X POST https://api1.seobserver.com/backlinks/metrics_archive.json?count=6 \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[{"item_type":"domain","item_value":"example.com"}]'
Example Response
{
"status": "ok",
"data": [
{
"date": "2025-01-15",
"TrustFlow": 72,
"CitationFlow": 65,
"ExtBackLinks": 285432
}
],
"number_of_rows": 6
}
Get the top backlinks pointing to a single item, ordered by link strength. Powered by Majestic GetBackLinkData.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
item | JSON body | Yes | — | Single item |
datasource | string | No | fresh | fresh or historic |
limit | integer | No | 10 | Number of results (max 50,000) |
curl "https://api1.seobserver.com/backlinks/top.json?datasource=fresh&limit=20&item_type=domain&item_value=example.com" \ -H "X-SEObserver-key: YOUR_API_KEY"
$url = 'https://api1.seobserver.com/backlinks/top.json?' . http_build_query([
'datasource' => 'fresh', 'limit' => 20,
'item_type' => 'domain', 'item_value' => 'example.com',
]);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['X-SEObserver-key: YOUR_API_KEY'],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);import requests
response = requests.get(
"https://api1.seobserver.com/backlinks/top.json",
headers={"X-SEObserver-key": "YOUR_API_KEY"},
params={"datasource": "fresh", "limit": 20,
"item_type": "domain", "item_value": "example.com"},
)
data = response.json()const params = new URLSearchParams({
datasource: "fresh", limit: 20,
item_type: "domain", item_value: "example.com",
});
const response = await fetch(
`https://api1.seobserver.com/backlinks/top.json?${params}`,
{ headers: { "X-SEObserver-key": "YOUR_API_KEY" } }
);
const data = await response.json();req, _ := http.NewRequest("GET",
"https://api1.seobserver.com/backlinks/top.json?datasource=fresh&limit=20&item_type=domain&item_value=example.com",
nil)
req.Header.Set("X-SEObserver-key", "YOUR_API_KEY")
resp, _ := http.DefaultClient.Do(req)Example Response
{
"status": "ok",
"data": [
{
"SourceURL": "https://referrer.com/page",
"SourceTrustFlow": 85,
"SourceCitationFlow": 71,
"AnchorText": "example link",
"TargetURL": "https://example.com",
"FlagRedirect": 0
}
],
"number_of_rows": 20
}
Get the anchor text distribution for a single item. Powered by Majestic GetAnchorText.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
item | JSON body | Yes | — | Single item |
datasource | string | No | fresh | fresh or historic |
limit | integer | No | 10 | Number of results (max 1,000) |
curl -X POST https://api1.seobserver.com/backlinks/anchors.json?limit=50 \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[{"item_type":"domain","item_value":"example.com"}]'
Example Response
{
"status": "ok",
"meta": {
"countAll": 5432,
"totalRefDomains": 892
},
"data": [
{
"AnchorText": "example",
"TotalLinks": 1234,
"DeletedLinks": 56,
"RefDomains": 320
}
],
"number_of_rows": 50
}
Get the list of referring domains linking to a single item. Powered by Majestic GetRefDomains.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
item | JSON body | Yes | — | Single item |
datasource | string | No | fresh | fresh or historic |
limit | integer | No | 10 | Number of results |
curl -X POST https://api1.seobserver.com/backlinks/refdomains.json?limit=20 \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[{"item_type":"domain","item_value":"example.com"}]'
Get the top pages of a domain by number of backlinks. Powered by Majestic GetTopPages.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
item | JSON body | Yes | — | Single item |
datasource | string | No | fresh | fresh or historic |
limit | integer | No | 10 | Number of results (max 10,000) |
curl -X POST https://api1.seobserver.com/backlinks/pages.json?limit=100 \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[{"item_type":"domain","item_value":"example.com"}]'
Get the backlinks count history over time for a single item. Returns monthly rows (historic index) or daily rows (fresh index). Powered by Majestic GetBackLinksHistory.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
item | JSON body | Yes | — | Single item |
datasource | string | No | fresh | fresh or historic |
curl -X POST https://api1.seobserver.com/backlinks/history.json \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[{"item_type":"domain","item_value":"example.com"}]'
Example Response
{
"status": "ok",
"data": [
{
"Date": "2025-01-15",
"ExtBackLinks": 285432,
"RefDomains": 12847,
"IndexedURLs": 54321,
"ExtBackLinksEDU": 23,
"ExtBackLinksGOV": 12,
"RefDomainsEDU": 5,
"RefDomainsGOV": 3
}
],
"number_of_rows": 365
}
Get a daily calendar of new and lost backlinks for a single item. Powered by Majestic GetNewLostBackLinkCalendar.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
item | JSON body | Yes | — | Single item |
datasource | string | No | fresh | fresh or historic |
curl -X POST https://api1.seobserver.com/backlinks/newlost_calendar.json \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[{"item_type":"domain","item_value":"example.com"}]'
Example Response
{
"status": "ok",
"data": [
{
"Date": "2025-01-15",
"NewLinks": 142,
"LostLinks": 38
}
],
"number_of_rows": 90
}
Get detailed information about referring domains (TF, CF, backlinks, refdomains, IPs, geolocation, TopicalTF). Accepts batch requests up to 100 root domains. Powered by Majestic GetRefDomainInfo.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
items | JSON body | Yes | — | Array of items (max 100, root domains) |
datasource | string | No | fresh | fresh or historic |
curl -X POST https://api1.seobserver.com/backlinks/refdomaininfo.json \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{"item_type":"domain","item_value":"referrer1.com"},
{"item_type":"domain","item_value":"referrer2.com"}
]'
Example Response
{
"status": "ok",
"data": [
{
"Domain": "referrer1.com",
"TrustFlow": 45,
"CitationFlow": 38,
"ExtBackLinks": 12500,
"RefDomains": 890,
"CountryCode": "US",
"TopicalTrustFlow_Topic_0": "Business"
}
],
"number_of_rows": 2
}
Get the link profile distribution matrix (CitationFlow × TrustFlow) for a single item. Returns a 2D matrix showing the count of backlinks in each CF/TF bucket. Powered by Majestic GetLinkProfile.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
item | JSON body | Yes | — | Single item |
datasource | string | No | fresh | fresh or historic |
curl -X POST https://api1.seobserver.com/backlinks/linkprofile.json \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[{"item_type":"domain","item_value":"example.com"}]'
Example Response
{
"status": "ok",
"data": [
{
"CitationFlow": 0,
"TrustFlow": 0,
"Count": 54321
},
{
"CitationFlow": 10,
"TrustFlow": 5,
"Count": 1234
}
],
"number_of_rows": 150
}
Quickly estimate the number of backlinks for an item before making a heavier query. Returns whether real-time query is allowed and estimated counts. Powered by Majestic GetPrefixQueryEstimate.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
item | JSON body | Yes | — | Single item |
curl -X POST https://api1.seobserver.com/backlinks/queryestimate.json \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[{"item_type":"domain","item_value":"example.com"}]'
Example Response
{
"status": "ok",
"data": {
"RealTimeQueryAllowed": "True",
"ActualExtBackLinks": 285432,
"EstimatedExtBacklinks": 290000
},
"number_of_rows": 1
}
Keywords Endpoints
Search for URLs or domains by keyword in Majestic's index. Returns results ranked by SearchScore with TF, CF and referring domain counts. Powered by Majestic SearchByKeyword.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | Yes | — | Keyword to search for |
datasource | string | No | fresh | fresh or historic |
limit | integer | No | 10 | Number of results (max 100) |
scope | integer | No | 2 | 0 = domains only, 2 = URLs |
Accepts parameters as query string or JSON body:
curl "https://api1.seobserver.com/backlinks/searchbykeyword.json?query=seo+tools&limit=20" \ -H "X-SEObserver-key: YOUR_API_KEY"
curl -X POST https://api1.seobserver.com/backlinks/searchbykeyword.json \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "seo tools", "limit": 50, "scope": 0}'
Example Response
{
"status": "ok",
"data": [
{
"Item": "https://example.com/seo-tools",
"SearchScore": 95.4,
"TrustFlow": 62,
"CitationFlow": 55,
"RefDomains": 3400
}
],
"number_of_rows": 20
}
Get Majestic keyword occurrence data (phrase match count, broad match count) for up to 100 keywords in batch. Powered by Majestic GetKeywordInfo.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
items | JSON body | Yes | — | Array of keyword items (max 100). Use item_type: "keyword" |
curl -X POST https://api1.seobserver.com/backlinks/keywordinfo.json \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{"item_type":"keyword","item_value":"seo"},
{"item_type":"keyword","item_value":"backlinks"},
{"item_type":"keyword","item_value":"link building"}
]'
Example Response
{
"status": "ok",
"data": [
{
"Keyword": "seo",
"PhraseMatchCount": 4523100,
"BroadMatchCount": 12500000
},
{
"Keyword": "backlinks",
"PhraseMatchCount": 892000,
"BroadMatchCount": 3200000
}
],
"number_of_rows": 3
}
Tools Endpoints
Submit URLs to Majestic's crawler for priority crawling. Use this to ensure fresh data is available for specific pages. POST only. Powered by Majestic SubmitURLsToCrawl.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
body | JSON array | Yes | — | Array of URL strings (max 100) |
datasource | string | No | fresh | fresh or historic |
curl -X POST https://api1.seobserver.com/backlinks/submitcrawl.json \ -H "X-SEObserver-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '["https://example.com/new-page","https://example.com/updated-page"]'
$ch = curl_init('https://api1.seobserver.com/backlinks/submitcrawl.json');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'X-SEObserver-key: YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'https://example.com/new-page',
'https://example.com/updated-page',
]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);import requests
response = requests.post(
"https://api1.seobserver.com/backlinks/submitcrawl.json",
headers={"X-SEObserver-key": "YOUR_API_KEY"},
json=["https://example.com/new-page", "https://example.com/updated-page"],
)
data = response.json()const response = await fetch("https://api1.seobserver.com/backlinks/submitcrawl.json", {
method: "POST",
headers: {
"X-SEObserver-key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify([
"https://example.com/new-page",
"https://example.com/updated-page",
]),
});
const data = await response.json();urls := []string{
"https://example.com/new-page",
"https://example.com/updated-page",
}
body, _ := json.Marshal(urls)
req, _ := http.NewRequest("POST",
"https://api1.seobserver.com/backlinks/submitcrawl.json",
bytes.NewBuffer(body))
req.Header.Set("X-SEObserver-key", "YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)Example Response
{
"status": "ok",
"data": {
"URLsAdded": 2,
"Code": "OK",
"ErrorMessage": ""
},
"number_of_rows": 2
}
Subscription Endpoints
Get your current API subscription status including remaining units.
curl https://api1.seobserver.com/api_users/subscription.json \ -H "X-SEObserver-key: YOUR_API_KEY"
Example Response
{
"status": "ok",
"data": {
"enabled": true,
"TotalUnits": 485000,
"MaxUnits": 500000
}
}
Get the full cost table for all API endpoints. Useful for building cost estimates in your integration.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
output | string | No | standard | standard (nested) or absolute (flat key-value) |
curl https://api1.seobserver.com/api_users/costs.json \ -H "X-SEObserver-key: YOUR_API_KEY"
SERP Endpoints
Submit keywords for SERP (Search Engine Results Page) tracking. Results are processed asynchronously.
Submit keywords for SERP checking. Each keyword+base pair creates a SERP job processed asynchronously.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
keyword | string | Yes | — | Search keyword |
base | string | Yes | — | Search engine base (e.g. google.fr) |
priority | string | No | low | low or high (high costs 2x) |
type | string | No | — | SERP type (+2 units if set) |
batch | string | No | — | Batch identifier for grouping |
postback_url | string | No | — | URL to POST results to when ready |
filters | object | No | — | Result filters |
curl -X POST https://api1.seobserver.com/serps/add.json \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[{"keyword":"seo tools","base":"google.fr","priority":"low"}]'
Example Response (201)
{
"status": "ok",
"data": [
{
"id": "64a1b2c3d4e5f6a7b8c9d0e1",
"keyword": "seo tools",
"base": "google.fr",
"status": -1,
"created": "2025-01-15T10:30:00+00:00"
}
]
}
Get the status and results of a specific SERP job by its ID.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
id | string | Yes | — | SERP job MongoDB ID (in URL path) |
curl https://api1.seobserver.com/serps/view/64a1b2c3d4e5f6a7b8c9d0e1.json \ -H "X-SEObserver-key: YOUR_API_KEY"
List all your SERP jobs with pagination and filtering.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
limit | integer | No | 100 | Results per page (max 10,000) |
page | integer | No | 1 | Page number |
keyword | string | No | — | Filter by keyword |
batch | string | No | — | Filter by batch |
curl "https://api1.seobserver.com/serps/index.json?limit=50&batch=campaign1" \ -H "X-SEObserver-key: YOUR_API_KEY"
Indexed Endpoints
Check if URLs are indexed in Google. Jobs are processed asynchronously.
Submit URLs for indexation checking. Each URL creates an async job.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
url | string | Yes | — | URL to check |
priority | string | No | low | low or high (high costs 2x) |
level | string | No | exact | exact match or broader |
batch | string | No | — | Batch identifier |
postback_url | string | No | — | URL to POST results to |
curl -X POST https://api1.seobserver.com/indexeds/add.json \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[{"url":"https://example.com/page","priority":"low"}]'
Get the status and result of a specific indexation check job.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
id | string | Yes | — | Job MongoDB ID (in URL path) |
curl https://api1.seobserver.com/indexeds/view/64a1b2c3d4e5f6a7b8c9d0e1.json \ -H "X-SEObserver-key: YOUR_API_KEY"
List all your indexation check jobs with pagination and filtering.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
limit | integer | No | 100 | Results per page (max 10,000) |
page | integer | No | 1 | Page number |
url | string | No | — | Filter by URL |
batch | string | No | — | Filter by batch |
code | integer | No | — | Filter by HTTP status code |
curl "https://api1.seobserver.com/indexeds/index.json?limit=50&batch=batch1" \ -H "X-SEObserver-key: YOUR_API_KEY"
Delete an indexation check job.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
id | string | Yes | — | Job MongoDB ID (in URL path) |
curl https://api1.seobserver.com/indexeds/delete/64a1b2c3d4e5f6a7b8c9d0e1.json \ -H "X-SEObserver-key: YOUR_API_KEY"
Organic Keywords Endpoints
Access SEObserver's organic keyword tracking data. Covers visibility metrics, keyword rankings, and historical trends.
Get organic visibility metrics for up to 100 domains. Returns aggregated SEO visibility scores.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
items | JSON body | Yes | — | Array of items (max 100) |
base | string | No | fr_fr | Market/locale code |
date | string | No | latest | Specific date |
curl -X POST https://api1.seobserver.com/organic_keywords/metrics.json?base=fr_fr \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[{"item_type":"domain","item_value":"example.com"}]'
List organic keyword rankings for a domain with advanced filtering and sorting.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
domain | string | Yes | — | Domain to query (query param) |
base | string | No | fr_fr | Market/locale code |
limit | integer | No | 100 | Results per page (max 10,000) |
offset | integer | No | 0 | Offset for pagination |
date | string | No | latest | Specific date |
conditions | object | No | — | Filter conditions (p, url, keyword_title, search_volume, visibility, branded, tags) |
order | object | No | — | Sort order (p, url, keyword_title, search_volume, cpc, competition, visibility, branded, tags) |
curl "https://api1.seobserver.com/organic_keywords/index.json?domain=example.com&base=fr_fr&limit=50" \ -H "X-SEObserver-key: YOUR_API_KEY"
Get URLs for a domain grouped by aggregated visibility and keyword count.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
domain | string | Yes | — | Domain to query |
base | string | No | fr_fr | Market/locale code |
limit | integer | No | 100 | Results per page (max 10,000) |
offset | integer | No | 0 | Offset for pagination |
curl -X POST "https://api1.seobserver.com/organic_keywords/urls.json?base=fr_fr&limit=100" \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[{"item_type":"domain","item_value":"example.com"}]'
Get month-by-month visibility history for domains.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
items | JSON body | Yes | — | Array of items or domain query param |
base | string | No | fr_fr | Market/locale code |
months | integer | No | 12 | Number of months |
start_date | string | No | — | Start date (YYYY-MM-DD) |
end_date | string | No | — | End date (YYYY-MM-DD) |
curl -X POST "https://api1.seobserver.com/organic_keywords/visibility_history.json?base=fr_fr&months=6" \
-H "X-SEObserver-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[{"item_type":"domain","item_value":"example.com"}]'
List all available data dates for a given market. Useful to know which dates you can query in the index endpoint.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
base | string | No | — | Market/locale code |
curl "https://api1.seobserver.com/organic_keywords/list_dates.json?base=fr_fr" \ -H "X-SEObserver-key: YOUR_API_KEY"