Skip to main content

Scenario

Compare domain ratings and backlink profiles across your competitors to understand authority gaps, then use Mavera to craft competitive positioning messaging and an authority-appropriate brand voice. The metrics endpoint returns domain rating, total backlinks, referring domains, and organic traffic estimates for any target.

Architecture

Code

import os, requests, time

AH = os.environ["AHREFS_API_TOKEN"]
MV = os.environ["MAVERA_API_KEY"]
MB = "https://app.mavera.io/api/v1"
AH_H = {"Authorization": f"Bearer {AH}", "Accept": "application/json"}
MH = {"Authorization": f"Bearer {MV}", "Content-Type": "application/json"}
DOMAINS = ["yourdomain.com", "competitor1.com", "competitor2.com", "competitor3.com"]

metrics = []
for domain in DOMAINS:
    resp = requests.get("https://api.ahrefs.com/v3/site-explorer/metrics", headers=AH_H,
        params={"target": domain, "select": "domain_rating,backlinks,referring_domains,"
                "organic_traffic,organic_keywords"})
    resp.raise_for_status()
    data = resp.json()
    data["domain"] = domain
    metrics.append(data)
    time.sleep(1)

metrics.sort(key=lambda m: m.get("domain_rating", 0), reverse=True)
landscape = "\n".join(
    f"- {m['domain']} | DR: {m.get('domain_rating', 0)} | backlinks: {m.get('backlinks', 0):,} | "
    f"ref domains: {m.get('referring_domains', 0):,} | traffic: {m.get('organic_traffic', 0):,}"
    for m in metrics)
our = next(m for m in metrics if m["domain"] == DOMAINS[0])
our_rank = next(i for i, m in enumerate(metrics) if m["domain"] == DOMAINS[0]) + 1
print(f"Your DR: {our.get('domain_rating', 0)} (#{our_rank}/{len(DOMAINS)})\n{landscape}")

positioning = requests.post(f"{MB}/mave/chat", headers=MH, json={
    "message": f"Competitive SEO positioning.\n\nLANDSCAPE:\n{landscape}\n\n"
               f"We are: {DOMAINS[0]} (#{our_rank}).\n\nProvide: 1) Authority gap "
               f"2) Backlink strategy 3) Differentiation 4) Messaging positioning "
               f"5) 3 positioning statements",
}).json()
print("\n=== Positioning ===")
print(positioning.get("content", "")[:1500])

bv = requests.post(f"{MB}/brand-voices", headers=MH, json={
    "name": f"Authority Voice — DR {our.get('domain_rating', 0)}",
    "description": f"Voice for DR {our.get('domain_rating', 0)}, #{our_rank} of "
                   f"{len(DOMAINS)}. Confident, data-led, not defensive.",
    "samples": [
        "We test content with real audiences before publishing — that's why it converts.",
        "3,000+ focus group responses shaped this. Others guess. We validate.",
    ],
}).json()
print(f"\nBrand voice: {bv.get('id')}")

Example Output

{
  "landscape": [
    { "domain": "competitor1.com", "domain_rating": 78, "backlinks": 245000 },
    { "domain": "competitor2.com", "domain_rating": 65, "backlinks": 89000 },
    { "domain": "yourdomain.com", "domain_rating": 52, "backlinks": 34000 },
    { "domain": "competitor3.com", "domain_rating": 41, "backlinks": 12000 }
  ],
  "authority_gap": "26 DR points behind leader — closable with focused link building",
  "brand_voice_id": "bv_a1b2c3d4"
}

Error Handling

Your Ahrefs plan may not include API access to Site Explorer. Verify your subscription tier supports API calls at Ahrefs → Subscription.
Domain Rating updates asynchronously in Ahrefs’ index. If comparing competitors, pull all metrics in the same session to ensure consistent snapshot timing.