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.
Sandbox
A free sandbox environment is available for testing your integration without consuming API credits or using real data.
Base URL
https://api1-sandbox.seobserver.com
API Key
Use the public sandbox key:
sandbox_test_key_2026
Quick Example
curl -X POST "https://api1-sandbox.seobserver.com/backlinks/metrics.json" \
-H "X-SEObserver-key: sandbox_test_key_2026" \
-H "Content-Type: application/json" \
-d '[{"item_type":"domain","item_value":"example.com"}]'
How it works
| Feature | Details |
|---|---|
| Endpoints | All 29 production endpoints are available with the same paths and parameters |
| Response format | Identical JSON structure to production — same fields, same nesting |
| Value injection | The domain or keyword you send is injected into the response. Send example.com and the fixture data will contain example.com |
| No rate limits | Unlimited requests, no credits consumed |
| Sandbox header | All responses include X-Sandbox: true so you can detect sandbox mode |
| CORS enabled | Cross-origin requests allowed from any origin |
Limitations
| What won't work | Why |
|---|---|
| Real metrics | TrustFlow, CitationFlow, backlink counts etc. are static fixture values — they don't reflect actual data |
| Different results per domain | The same fixture is returned for every query; only the injected domain/keyword changes |
| Pagination | Fixtures contain a fixed number of rows regardless of limit parameter |
| Date-sensitive data | All dates in responses are frozen (no live crawl dates or history) |
| State persistence | Nothing is stored between requests — serps/add won't appear in serps/index |
| Bulk items | Only the first item in a batch is used for injection; multi-item responses are not generated |
The sandbox is designed for validating your integration code (parsing responses, error handling, authentication flow) before switching to the production API.
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": [
{
"ItemNum": 0,
"Item": "seobserver.com",
"ResultCode": "OK",
"Status": "Found",
"ExtBackLinks": 39293,
"RefDomains": 485,
"ACRank": -1,
"ItemType": 1,
"IndexedURLs": 40000,
"RefIPs": 297,
"RefSubNets": 223,
"RefDomainsEDU": 0,
"ExtBackLinksEDU": 0,
"RefDomainsGOV": 0,
"ExtBackLinksGOV": 0,
"RefDomainsEDU_Exact": 0,
"ExtBackLinksEDU_Exact": 0,
"RefDomainsGOV_Exact": 0,
"ExtBackLinksGOV_Exact": 0,
"CrawledFlag": "False",
"LastCrawlDate": "",
"LastCrawlResult": "",
"RedirectFlag": "True",
"FinalRedirectResult": "",
"OutDomainsExternal": "0",
"OutLinksExternal": "3",
"OutLinksInternal": "6",
"OutLinksPages": "259",
"LastSeen": "",
"AffectedByAntiSpamAlgo": 0,
"Title": "Outil référencement SEO, SEObserver surveille le positionnement",
"RedirectTo": "https://www.seobserver.com/",
"Language": "fr,en",
"LanguageDesc": "French,English",
"LanguageConfidence": "94,98",
"LanguagePageRatios": "56.4,43.5",
"LanguageTotalPages": 156,
"RefLanguage": "fr,en",
"RefLanguageDesc": "French,English",
"RefLanguageConfidence": "81,96",
"RefLanguagePageRatios": "69.8,29.8",
"RefLanguageTotalPages": 36408,
"CrawledURLs": 29447,
"RootDomainIPAddress": "188.114.96.2",
"TotalNonUniqueLinks": "39669",
"NonUniqueLinkTypeHomepages": "793",
"NonUniqueLinkTypeIndirect": "19482",
"NonUniqueLinkTypeDeleted": "9157",
"NonUniqueLinkTypeNoFollow": "7653",
"NonUniqueLinkTypeProtocolHTTPS": "38403",
"NonUniqueLinkTypeFrame": "0",
"NonUniqueLinkTypeImageLink": "24150",
"NonUniqueLinkTypeRedirect": "30",
"NonUniqueLinkTypeTextLink": "15489",
"RefDomainTypeLive": "445",
"RefDomainTypeFollow": "292",
"RefDomainTypeHomepageLink": "24",
"RefDomainTypeDirect": "483",
"RefDomainTypeProtocolHTTPS": "468",
"CanonicalURL": "https://www.seobserver.com/",
"CitationFlow": 41,
"TrustFlow": 24,
"TrustMetric": 24,
"TrustCategories": "Business/Financial Services=83.51%=24,Business=7.24%=19,...",
"TopicalTrustFlow_Topic_0": "Business/Financial Services",
"TopicalTrustFlow_Value_0": 24,
"TopicalTrustFlow_Topic_1": "Business",
"TopicalTrustFlow_Value_1": 19,
"TopicalTrustFlow_Topic_2": "Regional/Europe",
"TopicalTrustFlow_Value_2": 18,
"DL_DuplicationCode_CannotBeClassified_NonUnique": 5,
"DL_DuplicationCode_NonNotableDuplicate_NonUnique": 6343,
"DL_DuplicationCode_NotableDuplicate_NonUnique": 1383,
"DL_DuplicationCode_Redirect_NonUnique": 30,
"DL_DuplicationCode_Distinct_NonUnique": 31908,
"DL_DuplicationCode_PendingClassification_NonUnique": 0
}
],
"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"