Learn-skills.dev ahrefs-python
Manages Ahrefs API usage in Python using `ahrefs-python` library. Use when working with SEO / marketing related tasks or with data including backlinks, keywords, domain ratings, organic traffic, site audits, rank tracking, and brand monitoring. Covers `ahrefs-python` usage including AhrefsClient / AsyncAhrefsClient, typed request/response models, error handling, and all API sections.
git clone https://github.com/NeverSight/learn-skills.dev
T=$(mktemp -d) && git clone --depth=1 https://github.com/NeverSight/learn-skills.dev "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/skills-md/ahrefs/ahrefs-api-skills/ahrefs-python" ~/.claude/skills/neversight-learn-skills-dev-ahrefs-python && rm -rf "$T"
data/skills-md/ahrefs/ahrefs-api-skills/ahrefs-python/SKILL.mdAhrefs Python SDK Skill
Overview
The Ahrefs API provides programmatic access to Ahrefs SEO data. The official Python SDK (
ahrefs-python) provides typed request and response models for all endpoints, auto-generated from the OpenAPI spec.
Key capabilities:
- Site Explorer - Backlinks, organic keywords, domain rating, traffic, referring domains
- Keywords Explorer - Keyword research, volumes, difficulty, related terms
- Rank Tracker - SERP monitoring, competitor tracking
- Site Audit - Technical SEO issues, page content, page explorer
- Brand Radar - AI brand mentions, share of voice, impressions
- SERP Overview - Search result analysis
- Batch Analysis - Bulk domain/URL metrics via POST
Installation
pip install git+https://github.com/ahrefs/ahrefs-python.git
Requires Python 3.11+. Dependencies:
httpx, pydantic.
API Method Discovery
The SDK has 52 methods across 7 API sections. The built-in search tool is the fastest way to find the right method — it returns matching method signatures, parameters, and return types directly, so there's no need to scan through a large reference.
Python (preferred when already in a Python context):
from ahrefs.search import search_api_methods # Returns formatted text with method signatures, parameters, and return types print(search_api_methods("domain rating")) # Filter by API section and limit results print(search_api_methods("backlinks", section="site-explorer", limit=3))
CLI (preferred when exploring from the terminal):
python -m ahrefs.api_search "domain rating" python -m ahrefs.api_search "backlinks" --section site-explorer --limit 3 python -m ahrefs.api_search "batch" --json python -m ahrefs.api_search --sections # list all API sections
IMPORTANT RULES
- ALWAYS use the
SDK. DO NOT make rawahrefs-python
/httpx
calls to the Ahrefs API.requests - ALWAYS pass dates as strings in
format (e.g.YYYY-MM-DD
)."2025-01-15" - ALWAYS use
on list endpoints to request only the columns you need. List endpoints return all columns by default, which wastes API units and increases response size.select - USE context managers (
/with
) for client lifecycle management.async with - SET the
environment variable rather than hardcoding API keys.AHREFS_API_KEY - The client handles retries (429, 5xx, connection errors) automatically. DO NOT implement your own retry logic on top of the SDK.
Quick Start
import os from ahrefs import AhrefsClient with AhrefsClient(api_key=os.environ["AHREFS_API_KEY"]) as client: data = client.site_explorer_domain_rating(target="ahrefs.com", date="2025-01-15") print(data.domain_rating) # 91.0 print(data.ahrefs_rank) # 3
SDK Patterns
Client Setup
import os import ahrefs with ahrefs.AhrefsClient( api_key=os.environ["AHREFS_API_KEY"], base_url="...", # override API base URL (default: https://api.ahrefs.com/v3) timeout=30.0, # request timeout in seconds (default: 60) max_retries=3, # retries on transient errors (default: 2) ) as client: ...
Async client:
import os from ahrefs import AsyncAhrefsClient async with AsyncAhrefsClient(api_key=os.environ["AHREFS_API_KEY"]) as client: data = await client.site_explorer_domain_rating(target="ahrefs.com", date="2025-01-15")
For parallel calls, use
asyncio.gather:
import asyncio async with AsyncAhrefsClient(api_key=os.environ["AHREFS_API_KEY"]) as client: dr_ahrefs, dr_moz = await asyncio.gather( client.site_explorer_domain_rating(target="ahrefs.com", date="2025-01-15"), client.site_explorer_domain_rating(target="moz.com", date="2025-01-15"), )
Calling Methods
Two calling styles -- both are equivalent:
# Keyword arguments (recommended) data = client.site_explorer_domain_rating(target="ahrefs.com", date="2025-01-15") # Request objects (full type safety) from ahrefs.types import SiteExplorerDomainRatingRequest request = SiteExplorerDomainRatingRequest(target="ahrefs.com", date="2025-01-15") data = client.site_explorer_domain_rating(request)
Method names follow
{api_section}_{endpoint}, e.g. site_explorer_organic_keywords, keywords_explorer_overview.
Responses
Methods return typed Data objects directly.
Scalar endpoints return a single data object (or
None):
data = client.site_explorer_domain_rating(target="ahrefs.com", date="2025-01-15") print(data.domain_rating)
List endpoints return a list of data objects. There is no pagination — set
limit to the number of results you need. Use select to request only the columns you need:
items = client.site_explorer_organic_keywords( target="ahrefs.com", date="2025-01-15", select="keyword,volume,best_position", order_by="volume:desc", limit=10, ) for item in items: print(item.keyword, item.volume, item.best_position)
Error Handling
import ahrefs try: data = client.site_explorer_domain_rating(target="example.com", date="2025-01-15") except ahrefs.AuthenticationError: # 401 ... except ahrefs.RateLimitError as e: # 429 -- e.retry_after has the delay ... except ahrefs.NotFoundError: # 404 ... except ahrefs.APIError as e: # other 4xx/5xx -- e.status_code, e.response_body ... except ahrefs.APIConnectionError: # network / timeout ...
All exceptions inherit from
ahrefs.AhrefsError.
Common Parameters
Most list endpoints share these parameters:
| Parameter | Type | Description |
|---|---|---|
| | Domain, URL, or path to analyze |
| | Date in YYYY-MM-DD format |
/ | | Date range for history endpoints |
| | Two-letter country code (ISO 3166-1 alpha-2) |
| | Comma-separated columns to return |
| | Filter expression |
| | Column and direction, e.g. |
| | Max results to return |
Parameters typed as enums in the API reference (
CountryEnum, VolumeModeEnum, etc.) accept plain strings — pass country="us" not CountryEnum("us").
The
where parameter takes a JSON string. Use json.dumps() to build it:
import json where = json.dumps({"field": "volume", "is": ["gte", 1000]}) items = client.site_explorer_organic_keywords( target="ahrefs.com", date="2025-01-15", select="keyword,volume", where=where, )
For full filter syntax (boolean combinators, operators, nested fields), see
references/filter-syntax.md.
API Methods
Use
search_api_methods("query") or python -m ahrefs.api_search "query" to find methods by keyword. Search covers all 52 methods across 7 API sections and returns complete signatures, parameters, and response fields.