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

FeatureDetails
EndpointsAll 20 production endpoints are available with the same paths and parameters
Response formatIdentical JSON structure to production — same fields, same nesting
Value injectionThe domain or keyword you send is injected into the response. Send example.com and the fixture data will contain example.com
No rate limitsUnlimited requests, no credits consumed
Sandbox headerAll responses include X-Sandbox: true so you can detect sandbox mode
CORS enabledCross-origin requests allowed from any origin

Limitations

What won't workWhy
Real metricsTrustFlow, CitationFlow, backlink counts etc. are static fixture values — they don't reflect actual data
Different results per domainThe same fixture is returned for every query; only the injected domain/keyword changes
PaginationFixtures contain a fixed number of rows regardless of limit parameter
Date-sensitive dataAll dates in responses are frozen (no live crawl dates or history)
State persistenceNothing is stored between requests — serps/add won't appear in serps/index
Bulk itemsOnly 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

TypeFormulaDescription
FlatFixed amountSame cost regardless of data returned
Variablefactor × rowsScales with number of rows returned, subject to minimum
Mixedbase + factor × rowsFixed base cost plus variable component, subject to minimum
Free0No cost

Full Cost Table

EndpointTypeBaseFactorMin
backlinks/metricsVariable01
backlinks/metrics_archiveVariable05
backlinks/anchorsVariable0110
backlinks/topMixed40150
backlinks/refdomainsVariable0110
backlinks/pagesMixed40150
serps/addVariable02
indexeds/addVariable01
organic_keywords/metricsVariable01
organic_keywords/indexVariable01
organic_keywords/urlsVariable01
organic_keywords/visibility_historyMixed12

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_typeDescription
domainRoot domain (e.g. example.com)
subdomainSubdomain (e.g. blog.example.com)
siteSite-level query
urlExact URL
pathURL path with wildcard matching

Use Cases

Common workflows combining multiple endpoints to solve real SEO problems.

Backlinks Analysis

Audit your link profile quality

Assess your backlink health by combining overall metrics and anchor text analysis.

Bulk domain authority check

Check TrustFlow and CitationFlow for up to 100 domains at once.

Keywords Research

Content audit

Analyze which keywords and URLs drive organic visibility for your domain.

SERP Tracking

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.

Indexation Monitoring

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.

Subscription Endpoints

GET /api_users/subscription.json Free

Get your current API subscription status including remaining units.

Example Request
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 /api_users/costs.json Free

Get the full cost table for all API endpoints. Useful for building cost estimates in your integration.

ParameterTypeRequiredDefaultDescription
outputstringNostandardstandard (nested) or absolute (flat key-value)
Example Request
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.

POST /serps/add.json Variable: 2/keyword (low), 4/keyword (high)

Submit keywords for SERP checking. Each keyword+base pair creates a SERP job processed asynchronously. Studio & Agency plans get 50% off (1/keyword low, 2/keyword high).

ParameterTypeRequiredDefaultDescription
keywordstringYesSearch keyword
basestringYesSearch engine base (e.g. google.fr)
prioritystringNolowlow (2 units) or high (4 units)
typestringNoSERP type (+4 units if set)
batchstringNoBatch identifier for grouping
postback_urlstringNoURL to POST results to when ready
filtersobjectNoResult filters
Example Request
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 /serps/view/{id}.json Free

Get the status and results of a specific SERP job by its ID.

ParameterTypeRequiredDefaultDescription
idstringYesSERP job MongoDB ID (in URL path)
Example Request
curl https://api1.seobserver.com/serps/view/64a1b2c3d4e5f6a7b8c9d0e1.json \
  -H "X-SEObserver-key: YOUR_API_KEY"
GET /serps/index.json Free

List all your SERP jobs with pagination and filtering.

ParameterTypeRequiredDefaultDescription
limitintegerNo100Results per page (max 10,000)
pageintegerNo1Page number
keywordstringNoFilter by keyword
batchstringNoFilter by batch
Example Request
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.

POST /indexeds/add.json Variable: 1/URL

Submit URLs for indexation checking. Each URL creates an async job.

ParameterTypeRequiredDefaultDescription
urlstringYesURL to check
prioritystringNolowlow or high (high costs 2x)
levelstringNoexactexact match or broader
batchstringNoBatch identifier
postback_urlstringNoURL to POST results to
Example Request
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 /indexeds/view/{id}.json Free

Get the status and result of a specific indexation check job.

ParameterTypeRequiredDefaultDescription
idstringYesJob MongoDB ID (in URL path)
Example Request
curl https://api1.seobserver.com/indexeds/view/64a1b2c3d4e5f6a7b8c9d0e1.json \
  -H "X-SEObserver-key: YOUR_API_KEY"
GET /indexeds/index.json Free

List all your indexation check jobs with pagination and filtering.

ParameterTypeRequiredDefaultDescription
limitintegerNo100Results per page (max 10,000)
pageintegerNo1Page number
urlstringNoFilter by URL
batchstringNoFilter by batch
codeintegerNoFilter by HTTP status code
Example Request
curl "https://api1.seobserver.com/indexeds/index.json?limit=50&batch=batch1" \
  -H "X-SEObserver-key: YOUR_API_KEY"
DELETE /indexeds/delete/{id}.json Free

Delete an indexation check job.

ParameterTypeRequiredDefaultDescription
idstringYesJob MongoDB ID (in URL path)
Example Request
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_keywords/metrics.json Variable: 1/item

Get organic visibility metrics for up to 100 domains. Returns aggregated SEO visibility scores.

ParameterTypeRequiredDefaultDescription
itemsJSON bodyYesArray of items (max 100)
basestringNofr_frMarket/locale code
datestringNolatestSpecific date
Example Request
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"}]'
GET /organic_keywords/index.json Variable: 1/row

List organic keyword rankings for a domain with advanced filtering and sorting.

ParameterTypeRequiredDefaultDescription
domainstringYesDomain to query (query param)
basestringNofr_frMarket/locale code
limitintegerNo100Results per page (max 10,000)
offsetintegerNo0Offset for pagination
datestringNolatestSpecific date
conditionsobjectNoFilter conditions (p, url, keyword_title, search_volume, visibility, branded, tags)
orderobjectNoSort order (p, url, keyword_title, search_volume, cpc, competition, visibility, branded, tags)
Example Request
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 /organic_keywords/urls.json Variable: 1/row

Get URLs for a domain grouped by aggregated visibility and keyword count.

ParameterTypeRequiredDefaultDescription
domainstringYesDomain to query
basestringNofr_frMarket/locale code
limitintegerNo100Results per page (max 10,000)
offsetintegerNo0Offset for pagination
Example Request
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 /organic_keywords/visibility_history.json Mixed: 1 + 2/month

Get month-by-month visibility history for domains.

ParameterTypeRequiredDefaultDescription
itemsJSON bodyYesArray of items or domain query param
basestringNofr_frMarket/locale code
monthsintegerNo12Number of months
start_datestringNoStart date (YYYY-MM-DD)
end_datestringNoEnd date (YYYY-MM-DD)
Example Request
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"}]'
GET /organic_keywords/list_dates.json Free

List all available data dates for a given market. Useful to know which dates you can query in the index endpoint.

ParameterTypeRequiredDefaultDescription
basestringNoMarket/locale code
Example Request
curl "https://api1.seobserver.com/organic_keywords/list_dates.json?base=fr_fr" \
  -H "X-SEObserver-key: YOUR_API_KEY"

Screenshots Endpoints

Generate screenshots of SEObserver views (backlink profiles, SERP comparisons, competition analysis) via an asynchronous API. Screenshots are taken by a headless browser and uploaded to cloud storage. Ideal for automated report generation (PPT, PDF).

Workflow: POST a screenshot request → receive a job_id → poll status until completed → download the PNG.

POST /screenshots.json Flat: 100 units

Request a screenshot. Returns immediately with a job_id to poll.

ParameterTypeRequiredDefaultDescription
typestringYesScreenshot type. See types endpoint.
itemstringYesDomain or keyword depending on type
highlightstringNoDomain to highlight (serpmachine and competition types only)
options.widthintegerNo1920Viewport width in pixels
options.languagestringNofr_frSEObserver locale (e.g. fr_fr, en_gb)

Available Types

TypeItem typeHighlightDescription
identity_offsitedomainBacklink profile: TF, CF, TTF, RefDomains, anchor chart
identity_onsitedomainOnsite: title, indexed pages, traffic, technologies
identity_historydomainHistorical TF/CF chart and table
identity_fulldomainFull identity page (all sections)
serpmachinekeywordoptionalSERP comparison with domain highlight
competitionkeywordoptionalCompetition checker with TF, RD, KWs, Traffic
Example Request — Identity Offsite
curl -X POST "https://api1.seobserver.com/screenshots.json" \
  -H "X-SEObserver-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type":"identity_offsite","item":"seobserver.com","options":{"width":1920,"language":"fr_fr"}}'
Example Request — SERPMachine with Highlight
curl -X POST "https://api1.seobserver.com/screenshots.json" \
  -H "X-SEObserver-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type":"serpmachine","item":"outil seo","highlight":"seobserver.com"}'
Example Response (201)
{
  "status": "ok",
  "data": {
    "job_id": "550e8400e29b41d4a716446655440000",
    "type": "identity_offsite",
    "item": "seobserver.com",
    "status": "queued",
    "created": "2026-02-22T14:30:00+00:00"
  }
}
GET /screenshots/view/{job_id}.json Free

Check the status of a screenshot job. Poll this endpoint until status is completed or failed.

ParameterTypeRequiredDefaultDescription
job_idstringYesScreenshot job MongoDB ID (in URL path)
Example Request
curl "https://api1.seobserver.com/screenshots/view/550e8400e29b41d4a716446655440000.json" \
  -H "X-SEObserver-key: YOUR_API_KEY"
Example Response — Processing
{
  "status": "ok",
  "data": {
    "job_id": "550e8400e29b41d4a716446655440000",
    "type": "identity_offsite",
    "item": "seobserver.com",
    "status": "processing",
    "created": "2026-02-22T14:30:00+00:00"
  }
}
Example Response — Completed
{
  "status": "ok",
  "data": {
    "job_id": "550e8400e29b41d4a716446655440000",
    "type": "identity_offsite",
    "item": "seobserver.com",
    "status": "completed",
    "download_url": "https://api1.seobserver.com/screenshots/download/550e8400e29b41d4a716446655440000.png",
    "width": 1920,
    "height": 2340,
    "file_size": 482000,
    "created": "2026-02-22T14:30:00+00:00",
    "completed": "2026-02-22T14:30:12+00:00"
  }
}
GET /screenshots.json Free

List your screenshot jobs with optional filters.

ParameterTypeRequiredDefaultDescription
statusstringNoFilter: queued, processing, completed, failed
typestringNoFilter by screenshot type
limitintegerNo50Results per page (max 200)
pageintegerNo1Page number
Example Request
curl "https://api1.seobserver.com/screenshots.json?status=completed&limit=10" \
  -H "X-SEObserver-key: YOUR_API_KEY"
GET /screenshots/types.json Free

List all available screenshot types with their descriptions and parameters.

Example Request
curl "https://api1.seobserver.com/screenshots/types.json" \
  -H "X-SEObserver-key: YOUR_API_KEY"
Example Response
{
  "status": "ok",
  "data": [
    {"type": "identity_offsite", "description": "Backlink profile: TF, CF, TTF, RefDomains, backlinks, IPs, EDU/GOV", "item_type": "domain", "optional_params": []},
    {"type": "identity_onsite", "description": "Onsite identity: title, indexed pages, traffic, technologies", "item_type": "domain", "optional_params": []},
    {"type": "identity_history", "description": "Historical TF/CF chart and table", "item_type": "domain", "optional_params": []},
    {"type": "identity_full", "description": "Full identity page (all sections)", "item_type": "domain", "optional_params": []},
    {"type": "serpmachine", "description": "SERP comparison view with optional domain highlight", "item_type": "keyword", "optional_params": ["highlight"]},
    {"type": "competition", "description": "Competition checker with TF, RD, KWs, Traffic", "item_type": "keyword", "optional_params": ["highlight"]}
  ]
}
GET /screenshots/download/{job_id}.png Free

Download the screenshot PNG file. Requires API key authentication. Redirects (302) to the image URL.

The download_url returned in the view response points here.

ParameterTypeRequiredDefaultDescription
job_idstringYesScreenshot job ID (in URL path, with .png extension)
Example Request
curl -L -o screenshot.png "https://api1.seobserver.com/screenshots/download/550e8400e29b41d4a716446655440000.png" \
  -H "X-SEObserver-key: YOUR_API_KEY"