A query in, the parsed SERP out as JSON. Google, Bing, YouTube, Google Maps and more. No scraper to run.
→ requestPOST /v1/search
POST /v1/search HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"query": "best running shoes"
}
← response200 scrolls ↕
{
"id": "srch_7f34stnlffnsbalonq66dpuj",
"request_id": "req_7e5465ge5fjmziqx5dyueaqyvy",
"object": "search",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 1,
"balance": 9857
},
"data": {
"query": "best running shoes",
"engine": "google",
"location": 2840,
"language": "en",
"device": "desktop",
"total_results": 84900000,
"serp_url": "https://www.google.com/search?q=best+running+shoes",
"result_types": [
"organic"
],
"results_count": 10,
"items": [
{
"type": "organic",
"rank": 1,
"page": 1,
"domain": "example.com",
"title": "The 12 Best Running Shoes",
"url": "https://example.com/best-running-shoes",
"description": "Our team tested 40 pairs...",
"displayed_link": "example.com › reviews › shoes",
"date": null,
"site_name": "Example Running Co.",
"rating": {
"value": 4.6,
"votes": 1284,
"max": 5
},
"sitelinks": [
{
"title": "Best Trail Running Shoes",
"url": "https://example.com/best-running-shoes/trail",
"description": null
},
{
"title": "Best Budget Running Shoes",
"url": "https://example.com/best-running-shoes/budget",
"description": null
}
],
"price": null,
"highlighted_words": [
"running shoes"
]
}
]
}
}
200 OK1 credit
$ man search — full parameter reference in the docs →
Monthly search volume, competition and cost-per-click per keyword.
→ requestPOST /v1/keywords/volume
POST /v1/keywords/volume HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"keywords": [
"running shoes",
"trail running shoes"
],
"location": 2840,
"language": "en"
}
← response200 scrolls ↕
{
"id": "keyw_rpiva3tl5joh3bvfqxrxqfr5",
"request_id": "req_7gmesd2cijjfbe6outlsx7472m",
"object": "keyword_volume",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 20,
"balance": 9857
},
"data": {
"location": {
"code": 2840,
"name": "United States"
},
"language": {
"code": "en",
"name": "English"
},
"network": "google_search",
"items_count": 2,
"items": [
{
"keyword": "running shoes",
"avg_monthly_searches": 90500,
"competition": "HIGH",
"competition_index": 88,
"cpc": 1.24,
"low_bid": 0.42,
"high_bid": 2.1,
"monthly": [
{
"month": "2026-06",
"search_volume": 91000
},
"…"
]
},
{
"keyword": "trail running shoes",
"avg_monthly_searches": 8100,
"competition": "MEDIUM",
"competition_index": 54,
"cpc": 0.87,
"low_bid": 0.31,
"high_bid": 1.55,
"monthly": [
{
"month": "2026-06",
"search_volume": 8300
},
"…"
]
}
]
}
}
200 OK20 credits
$ man volume — full parameter reference in the docs →
How hard a keyword is to rank for, 0 to 100. A keyword we haven't scored yet comes back pending; ask again on a later call.
→ requestPOST /v1/keywords/difficulty
POST /v1/keywords/difficulty HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"keywords": [
"buy running shoes",
"cold keyword"
],
"location": 2840,
"language": "en"
}
← response200 scrolls ↕
{
"id": "keyw_y4zlhnwzb5oofgqslo64leja",
"request_id": "req_wtumkpqpubojpcq43dh5hehjja",
"object": "keyword_difficulty",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 110,
"balance": 9857
},
"data": {
"items_count": 2,
"items": [
{
"keyword": "buy running shoes",
"difficulty": 42,
"status": "available"
},
{
"keyword": "cold keyword",
"difficulty": null,
"status": "pending"
}
]
}
}
200 OK110 credits
$ man difficulty — full parameter reference in the docs →
The headline numbers for any domain in one call: authority, referring domains, spam score. Read this before pulling the full link list.
→ requestPOST /v1/backlinks/summary
POST /v1/backlinks/summary HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"target": "example.com"
}
← response200 scrolls ↕
{
"id": "back_qwjci5ujdbjgtezvjxjoewvl",
"request_id": "req_i5hg3dxrlbnh5p5kcqo2yeakti",
"object": "backlink_summary",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 20,
"balance": 9857
},
"data": {
"target": "example.com",
"authority": 33,
"backlinks": 617091,
"spam_score": 9,
"referring_domains": 3582,
"referring_root_domains": 3160,
"referring_pages": 210044,
"link_breakdown": {
"tlds": {
"com": 2891,
"net": 412,
"org": 279
},
"types": {
"anchor": 17226,
"image": 421,
"redirect": 12
},
"attributes": {
"nofollow": 1769,
"ugc": 340,
"external": 88,
"sponsored": 26
},
"platforms": {
"blogs": 3021,
"cms": 1104,
"news": 214
},
"page_sections": {
"article": 12904,
"footer": 2200,
"section": 1122
},
"countries": {
"US": 9821,
"GB": 2011,
"DE": 1502
}
}
}
}
200 OK20 credits
$ man summary — full parameter reference in the docs →
Every link pointing at a domain, with source page, anchor text and follow status.
→ requestPOST /v1/backlinks/list
POST /v1/backlinks/list HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"target": "example.com",
"limit": 100,
"offset": 0
}
← response200 scrolls ↕
{
"id": "back_pnpftnndmfomndevasbpmswz",
"request_id": "req_jg442yzblbli5nftxihpkp2e2e",
"object": "backlink_list",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 50,
"balance": 9857
},
"data": {
"target": "example.com",
"total_count": 355648,
"limit": 100,
"offset": 0,
"items": [
{
"source_url": "https://blog.example.net/best-shoes",
"target_url": "https://example.com/",
"source_domain": "blog.example.net",
"target_domain": "example.com",
"anchor": "running shoes guide",
"dofollow": true,
"first_seen": "2024-03-11",
"last_seen": "2026-06-02",
"authority": 54,
"spam_score": 0
},
"…"
]
}
}
200 OK50 credits
$ man list — full parameter reference in the docs →
The domains linking to a target, with backlink count and authority for each, and whether the link is still live or has been lost.
→ requestPOST /v1/backlinks/domains
POST /v1/backlinks/domains HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"target": "example.com",
"limit": 100,
"offset": 0
}
← response200 scrolls ↕
{
"id": "refe_yti4wnr77vkqpcysyt3ovgzw",
"request_id": "req_midtmzkn7nlydg3qkpbz7av3ha",
"object": "referring_domains",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 50,
"balance": 9857
},
"data": {
"target": "example.com",
"total_count": 3160,
"limit": 100,
"offset": 0,
"items": [
{
"domain": "caglrc.cc",
"backlinks": 526,
"first_seen": "2023-11-02",
"lost_at": null,
"authority": 27,
"spam_score": 0
},
"…"
]
}
}
200 OK50 credits
$ man domains — full parameter reference in the docs →
How anchor text is distributed across a domain's backlinks. Catch over-optimization before Google does.
→ requestPOST /v1/backlinks/anchors
POST /v1/backlinks/anchors HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"target": "example.com",
"limit": 100,
"offset": 0
}
← response200 scrolls ↕
{
"id": "back_caham23jenpchd6amc4xggen",
"request_id": "req_gfggucxwqbjaldgodriv4k76ra",
"object": "backlink_anchors",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 50,
"balance": 9857
},
"data": {
"target": "example.com",
"total_count": 3316,
"limit": 100,
"offset": 0,
"items": [
{
"anchor": "running shoes",
"backlinks": 597726,
"referring_domains": 247,
"first_seen": "2023-05-14"
},
{
"anchor": null,
"backlinks": 1201,
"referring_domains": 88,
"first_seen": "2024-01-09"
},
"…"
]
}
}
200 OK50 credits
$ man anchors — full parameter reference in the docs →
Organic and paid visibility for a domain in one market: keyword count, traffic estimate, ranking distribution.
→ requestPOST /v1/domains/overview
POST /v1/domains/overview HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"domain": "example.com",
"location": 2840,
"language": "en"
}
← response200 scrolls ↕
{
"id": "doma_l5sttkwwhbltpdaj4ocitm6l",
"request_id": "req_vglyeybggrlz7kagqfagvj4kiy",
"object": "domain_overview",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 10,
"balance": 9857
},
"data": {
"organic": {
"keywords_count": 101,
"traffic_estimate": 70.17,
"traffic_value": 704.38,
"positions": {
"top_3": 0,
"top_10": 3,
"top_20": 11,
"top_100": 101
}
},
"paid": {
"keywords_count": 0,
"traffic_estimate": 0,
"traffic_value": 0,
"positions": {
"top_3": 0,
"top_10": 0,
"top_20": 0,
"top_100": 0
}
}
}
}
200 OK10 credits
$ man overview — full parameter reference in the docs →
A Lighthouse run on any page. Core Web Vitals plus the four category scores: performance, accessibility, best practices, SEO.
→ requestPOST /v1/page/lighthouse
POST /v1/page/lighthouse HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"url": "https://example.com/",
"device": "mobile"
}
← response200 scrolls ↕
{
"id": "ligh_5et7ukoc4foy7aiqbdlnwm2b",
"request_id": "req_k4rjf4ql3rjrlfxbdyyt5nc67i",
"object": "lighthouse",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 2,
"balance": 9857
},
"data": {
"url": "https://example.com/",
"device": "mobile",
"scores": {
"performance": 100,
"accessibility": 96,
"best_practices": 96,
"seo": 80
},
"metrics": {
"lcp_ms": 762,
"fcp_ms": 611,
"cls": 0.02,
"tbt_ms": 40,
"si_ms": 900,
"tti_ms": 1100
},
"fetched_at": "2026-07-26T10:15:00Z",
"audits": {
"largest-contentful-paint": {
"id": "largest-contentful-paint",
"title": "Largest Contentful Paint",
"description": "Largest Contentful Paint marks the time at which the largest text or image is painted.",
"score": 1,
"scoreDisplayMode": "numeric",
"numericValue": 762.4,
"numericUnit": "millisecond",
"displayValue": "0.8 s",
"scoringOptions": {
"p10": 2500,
"median": 4000
}
},
"…": "…"
},
"screenshots": {
"full_page": {
"data": "data:image/webp;base64,…",
"width": 412,
"height": 6200
},
"final": {
"data": "data:image/webp;base64,…"
},
"thumbnails": [
{
"data": "data:image/webp;base64,…",
"timing": 375
},
"…"
]
}
}
}
200 OK2 credits
$ man lighthouse — full parameter reference in the docs →
Render one page and get its on-page signals back: title, meta description, headings, links, images.
→ requestPOST /v1/page/crawl
POST /v1/page/crawl HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"url": "https://example.com/"
}
← response200 scrolls ↕
{
"id": "craw_h5zw44vkkvjsdjvve6j66okl",
"request_id": "req_bjo6ki2fhvkazev6rucec7bk7y",
"object": "crawl",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 2,
"balance": 9857
},
"data": {
"url": "https://example.com/",
"final_url": "https://example.com/",
"http_status": 200,
"title": "Example Domain",
"meta_description": "An example page used for documentation.",
"canonical": "https://example.com/",
"headings": {
"h1_count": 1,
"h2_count": 2
},
"links": {
"internal": 2,
"external": 1
},
"images": {
"total": 2,
"missing_alt": 1
},
"is_html": true,
"load_ms": 812
}
}
200 OK2 credits
$ man crawl — full parameter reference in the docs →
An axe scan of one page. Violations, keyboard-navigation checks and the scan status, rather than a pass/fail badge.
→ requestPOST /v1/page/accessibility
POST /v1/page/accessibility HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"url": "https://seojuice.io/"
}
← response200 scrolls ↕
{
"id": "acce_so5g6hjoxflpndhunh5ohwsm",
"request_id": "req_mqpqvzxdkzne7kuevpdjdpe62q",
"object": "accessibility",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 2,
"balance": 9857
},
"data": {
"url": "https://seojuice.io/",
"status": "complete",
"violations": [
{
"id": "color-contrast",
"impact": "serious",
"help": "Elements must meet minimum color contrast ratio thresholds",
"help_url": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
"nodes_count": 77
}
],
"passes_count": 23,
"incomplete_count": 1,
"keyboard": {
"interactive_total": 100,
"reached": 95,
"focus_trap": false,
"has_skip_link": false
},
"engine": {
"axe_version": "4.10.3"
}
}
}
200 OK2 credits
$ man accessibility — full parameter reference in the docs →
Crawl a whole site and run the checks you pick (crawl, Lighthouse, accessibility) on every page. Billed per page delivered, never per page requested.
→ requestPOST /v1/site/audit
POST /v1/site/audit HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"domain": "example.com",
"max_pages": 5,
"checks": [
"crawl",
"lighthouse"
],
"device": "mobile"
}
← response200 scrolls ↕
{
"id": "site_pxhlq57rpvo3jkk6dd6m7puz",
"request_id": "req_phau3wp5o5mbvmrb5h2r2adniy",
"object": "site_audit",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 12,
"balance": 9857
},
"data": {
"domain": "example.com",
"pages_requested": 5,
"pages_crawled": 4,
"pages_delivered": 3,
"credits_charged": 12,
"pages": [
{
"url": "https://example.com/",
"status": "ok",
"crawl": {
"http_status": 200,
"links": {
"internal": 2,
"external": 0
}
},
"lighthouse": {
"device": "mobile",
"scores": {
"performance": 90,
"accessibility": 91,
"best_practices": 93,
"seo": 80
}
}
},
"…"
],
"summary": {
"score": {
"value": 82,
"band": "excellent",
"grade": "A"
},
"axes": [
{
"key": "speed",
"score": 73,
"band": "good"
}
],
"issues": {
"critical": 2,
"major": 1,
"minor": 1
},
"broken_links": 1,
"pages_with_errors": 1
}
}
}
200 OK12 credits
$ man audit — full parameter reference in the docs →
How a domain has ranked for a keyword over time, from our own SERP archive: every day we observed it, and the best rank reached.
→ requestPOST /v1/serp/history
POST /v1/serp/history HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"domain": "example.com",
"keyword": "best running shoes",
"engine": "google",
"location": 2840,
"language": "en",
"device": "desktop",
"date_from": "2026-05-20",
"date_to": "2026-07-28"
}
← response200 scrolls ↕
{
"id": "serp_dz66m7eqjbpfblkclv6jye2g",
"request_id": "req_id5g52qgwzmmnoafbmteiscgvi",
"object": "serp_history",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 5,
"balance": 9857
},
"data": {
"domain": "example.com",
"keyword": "best running shoes",
"engine": "google",
"location": 2840,
"language": "en",
"device": "desktop",
"points": [
{
"date": "2026-06-03",
"rank": 9,
"url": "https://example.com/best-running-shoes",
"type": "organic"
},
{
"date": "2026-06-17",
"rank": 6,
"url": "https://example.com/best-running-shoes",
"type": "organic"
}
],
"first_seen": "2026-06-03",
"best_rank": 6,
"coverage": {
"from": "2026-05-20",
"observations": 14
}
}
}
200 OK5 credits
$ man history — full parameter reference in the docs →
Tells you whether a ranking change was yours or the market's. A 30-day US reading, one 0-100 score per day for how much results moved, ranked against our own trailing 60 days of observations, plus how often SERP features like AI Overviews showed up. Optionally narrow the day's niche breakdown to one niche.
→ requestPOST /v1/serp/volatility
POST /v1/serp/volatility HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"niche": "health_wellness"
}
← response200 scrolls ↕
{
"id": "serp_srzdoi2uajltrgbn6rclc247",
"request_id": "req_vyep4vhzrrjxrdpjsdbumfam5i",
"object": "serp_volatility",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 1,
"balance": 9857
},
"data": {
"location": 2840,
"language": "en",
"window": "14d",
"basis_version": 1,
"days": [
{
"date": "2026-09-03",
"score": 74,
"change_pct": -4.2,
"status": "ok",
"niches": [
{
"niche": "health_wellness",
"vs_market": 1.52
}
],
"features": [
{
"feature": "ai_overview",
"presence": 0.49,
"delta": 0.02
}
]
},
{
"date": "2026-09-04",
"score": 83,
"change_pct": 12.5,
"status": "ok",
"niches": [
{
"niche": "health_wellness",
"vs_market": 1.44
}
],
"features": [
{
"feature": "ai_overview",
"presence": 0.51,
"delta": 0.04
}
]
},
"…"
],
"coverage": {
"days": 31,
"days_with_data": 28,
"days_insufficient": 2,
"days_not_computed": 1,
"data_through": "2026-09-04",
"updated_at": "2026-09-05T02:14:00Z"
}
}
}
200 OK1 credit
$ man volatility — full parameter reference in the docs →
A company card from our crawl of the domain: name, description, contacts, socials, tech stack. Anything we couldn't identify is null.
→ requestPOST /v1/domains/card
POST /v1/domains/card HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"domain": "example.com"
}
← response200 scrolls ↕
{
"id": "doma_nevyaeuiqnmgldc5xf6mmim4",
"request_id": "req_rh22lwbkxznpvbilipex4u4spm",
"object": "domain_card",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 10,
"balance": 9857
},
"data": {
"domain": "example.com",
"site_name": "Example Inc.",
"description": "Compression socks for trail runners.",
"logo_url": "https://example.com/logo.svg",
"emails": [
"hello@example.com"
],
"phones": [
"+1 415 555 0100"
],
"postal_address": "548 Market St, San Francisco, CA",
"social_profiles": {
"linkedin": "https://linkedin.com/company/example",
"x": "https://x.com/example"
},
"technology": {
"cms": "wordpress",
"framework": null,
"server": "nginx",
"hosting": "cloudflare"
},
"country": "US",
"language": "en",
"as_of": "2026-07-21"
}
}
200 OK10 credits
$ man card — full parameter reference in the docs →
Expand a few seed keywords into the related terms people search, each with monthly volume, CPC and competition.
→ requestPOST /v1/keywords/ideas
POST /v1/keywords/ideas HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"keywords": [
"running shoes"
],
"location": 2840,
"language": "en",
"limit": 50
}
← response200 scrolls ↕
{
"id": "keyw_vske6iutevl7pcftmjfdzqim",
"request_id": "req_jyn33sts2bkfbg7u6y3mzdeqn4",
"object": "keyword_ideas",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 110,
"balance": 9857
},
"data": {
"items_count": 3,
"items": [
{
"keyword": "best running shoes",
"search_volume": 74000,
"cpc": 0.91,
"competition": 0.42
},
{
"keyword": "trail running shoes",
"search_volume": 33100,
"cpc": 1.14,
"competition": 0.55
},
{
"keyword": "running shoes for flat feet",
"search_volume": 12100,
"cpc": 0.78,
"competition": 0.37
},
"…"
]
}
}
200 OK110 credits
$ man ideas — full parameter reference in the docs →
The questions people ask about a topic, deduplicated. Seed material for FAQ pages and briefs.
→ requestPOST /v1/keywords/questions
POST /v1/keywords/questions HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"keyword": "running shoes",
"location": 2840,
"language": "en",
"limit": 50
}
← response200 scrolls ↕
{
"id": "keyw_e2xp2us5fjowpovkxd3kg5ox",
"request_id": "req_klhjkyye3fn47cl5uvqmv2z3g4",
"object": "keyword_questions",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 20,
"balance": 9857
},
"data": {
"keyword": "running shoes",
"items": [
{
"question": "How often should you replace running shoes?",
"first_seen": "2026-06-11",
"last_seen": "2026-07-25",
"times_seen": 18
},
{
"question": "Are carbon plate shoes worth it?",
"first_seen": "2026-07-02",
"last_seen": "2026-07-27",
"times_seen": 7
},
"…"
],
"count": 42,
"coverage": {
"from": "2026-07-01",
"observations": 130
}
}
}
200 OK20 credits
$ man questions — full parameter reference in the docs →
How often ChatGPT, Perplexity, Gemini, Copilot and Le Chat mention a domain. Mentions and rank over time, plus a sentiment score per provider.
→ requestPOST /v1/ai/visibility
POST /v1/ai/visibility HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"domain": "example.com",
"providers": [
"chatgpt",
"perplexity"
],
"date_from": "2026-06-01",
"date_to": "2026-07-28",
"granularity": "week"
}
← response200 scrolls ↕
{
"id": "ai_v_yqm7ecfk2foopjvxycsw43v7",
"request_id": "req_j3sgj4jj4jp4rbpwct7bxhi4bq",
"object": "ai_visibility",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 10,
"balance": 9857
},
"data": {
"domain": "example.com",
"providers": {
"chatgpt": {
"mentions": 41,
"prompts_seen": 380,
"avg_rank": 2.6,
"avg_sentiment": 0.31,
"series": [
{
"period": "2026-07-14",
"mentions": 6,
"prompts_seen": 55,
"avg_rank": 2.2
},
{
"period": "2026-07-21",
"mentions": 9,
"prompts_seen": 61,
"avg_rank": 2.9
}
]
},
"perplexity": {
"mentions": 12,
"prompts_seen": 140,
"avg_rank": 3.4,
"avg_sentiment": 0.12,
"series": []
}
},
"coverage": {
"from": "2026-06-01",
"observations": 520,
"note": "mentions are drawn from prompts run through this API; not a census of all AI traffic"
}
}
}
200 OK10 credits
$ man visibility — full parameter reference in the docs →
The geotarget ID for any country, state, city or neighborhood. It's the value other endpoints take as location. Free.
→ requestGET /v1/locations
GET /v1/locations?q=austin+texas HTTP/1.1
Authorization: Bearer sof_live_your_key_here
← response200 scrolls ↕
{
"id": "loca_2szxjctavbmnxjwm7jgcqihz",
"request_id": "req_te66makxgjjkplcflquxmdnxu4",
"object": "location_list",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 0,
"balance": 9857
},
"data": {
"locations": [
{
"id": 1026201,
"name": "Austin,Texas,United States",
"type": "city",
"country": "US",
"parent_id": 21176
},
{
"id": 9198393,
"name": "Central Austin,Texas,United States",
"type": "neighborhood",
"country": "US",
"parent_id": 21176
},
{
"id": 9060225,
"name": "Downtown Austin,Texas,United States",
"type": "neighborhood",
"country": "US",
"parent_id": 21176
},
{
"id": 9198961,
"name": "East Austin,Texas,United States",
"type": "neighborhood",
"country": "US",
"parent_id": 21176
},
{
"id": 9194496,
"name": "Old West Austin,Texas,United States",
"type": "neighborhood",
"country": "US",
"parent_id": 21176
},
{
"id": 9197266,
"name": "South Austin,Texas,United States",
"type": "neighborhood",
"country": "US",
"parent_id": 21176
}
]
}
}
200 OKfree
$ man locations — full parameter reference in the docs →
The domains competing with yours in search, ranked by keyword overlap.
→ requestPOST /v1/domains/competitors
POST /v1/domains/competitors HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"domain": "semrush.com",
"engine": "google",
"location": 2840,
"language": "en",
"device": "desktop",
"limit": 25
}
← response200 scrolls ↕
{
"id": "doma_5vtgytujnbkbpbjdh2bklahb",
"request_id": "req_6wypstdm7rocfc4krjiidkdpym",
"object": "domain_competitors",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 30,
"balance": 9857
},
"data": {
"domain": "semrush.com",
"keywords_total": 2834,
"keywords_considered": 200,
"total_competitors": 1743,
"competitors": [
{
"domain": "reddit.com",
"shared_keywords": 106,
"keywords_total": 114768,
"avg_rank": 3.9,
"target_avg_rank": 1,
"overlap": 0.53,
"shared_volume": 370910,
"sample_keywords": [
{
"keyword": "google search console",
"volume": 368000
},
"…"
]
},
"…"
],
"coverage": {
"from": "2026-05-20",
"observations": 200
}
}
}
200 OK30 credits
$ man competitors — full parameter reference in the docs →
Two domains' rankings side by side: keywords in the gap, shared, or unique to one, with search volume attached.
→ requestPOST /v1/domains/gap
POST /v1/domains/gap HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"domains": [
"semrush.com",
"ahrefs.com"
],
"mode": "gap",
"engine": "google",
"location": 2840,
"language": "en",
"device": "desktop",
"limit": 100,
"offset": 0
}
← response200 scrolls ↕
{
"id": "doma_6ulpwpudmvigzhrj4wf4jm2k",
"request_id": "req_5xqa6h3lmbmv7d3zqj55xkrzlu",
"object": "domain_gap",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 15,
"balance": 9857
},
"data": {
"mode": "gap",
"domains": [
"semrush.com",
"ahrefs.com"
],
"items": [
{
"keyword": "search engine optimization",
"volume": 18100,
"ranks": [
null,
{
"rank": 2,
"url": "https://ahrefs.com/blog/what-is-seo/",
"date": "2026-06-28"
}
]
},
"…"
],
"totals": [
2834,
1315
],
"matched_count": 409,
"coverage": {
"from": "2026-06-28",
"observations": 409
},
"limit": 100,
"offset": 0
}
}
200 OK15 credits
$ man gap — full parameter reference in the docs →
Links a site gained and lost in a date window, with the anchor, whether it passes authority, and the strength of the linking page. A rankings drop gets a link-level explanation.
→ requestPOST /v1/backlinks/changes
POST /v1/backlinks/changes HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json
{
"target": "example.com",
"type": "both",
"limit": 100
}
← response200 scrolls ↕
{
"id": "back_5e7u2weihnknvgowb74h5yqb",
"request_id": "req_ofmvlhkleroyvhhgleotjusyta",
"object": "backlink_changes",
"created_at": "2026-07-29T12:00:00Z",
"elapsed_ms": 244,
"credits": {
"charged": 50,
"balance": 9857
},
"data": {
"target": "example.com",
"items": [
{
"event": "new",
"source": "https://blog.example.org/post",
"target": "https://example.com/pricing",
"occurred_at": "2026-08-19",
"anchor": "pricing page",
"dofollow": true,
"source_authority": 54,
"source_spam_score": 2
},
{
"event": "lost",
"source": "https://news.example.net/2025/roundup",
"target": "https://example.com/",
"occurred_at": "2026-08-11",
"anchor": "example",
"dofollow": true,
"source_authority": 61,
"source_spam_score": 0
},
"…"
],
"new_count": 34,
"lost_count": 9,
"coverage": {
"from": "2026-07-27",
"observations": 43
}
}
}
200 OK50 credits
$ man changes — full parameter reference in the docs →