ahrefs-python — Claude Code skill: what it does, how to install
Guides the coding agent on using the official Ahrefs Python SDK. Useful when querying backlinks, keyword rankings, domain ratings, and audit data.
npx skills add OpenClaudia/openclaudia-skills --skill ahrefs-python -a claude-code
npx skills add OpenClaudia/openclaudia-skills --skill ahrefs-research -a claude-codeWhat ahrefs-python does
This skill provides rules for integrating the ahrefs-python library, covering 52 methods across 7 API sections including Site Explorer, Keywords Explorer, and Site Audit. It ensures the assistant uses AhrefsClient or AsyncAhrefsClient, typed Pydantic models, and method discovery via python3 -m ahrefs.api_search.
The instructions explicitly forbid raw HTTP calls with httpx or requests because the SDK handles automatic retries on 429 and 5xx errors. For collection endpoints, the skill enforces using the select parameter to prevent wasting API units on unneeded columns. All date parameters must be formatted as YYYY-MM-DD strings.
The underlying library requires Python 3.11+ alongside httpx and pydantic. Authentication relies on an API token set in the AHREFS_API_KEY environment variable.
What it helps with
- fetch domain rating and backlink metrics via AhrefsClient
- query organic keywords with targeted columns using
select - run parallel API requests using AsyncAhrefsClient and asyncio
- discover SDK endpoints via the built-in api_search CLI tool
Example prompts for the agent
- Write an async script using ahrefs-python to get the Domain Rating for example.com
- Search for the right ahrefs-python method to pull backlinks for a domain
- Fetch top 10 keywords for a site with volume and position fields using AhrefsClient
How to install ahrefs-python
1Skills CLI (Vercel)
npx skills add OpenClaudia/openclaudia-skills --skill ahrefs-python -a claude-codenpx skills add OpenClaudia/openclaudia-skills --skill ahrefs-research -a claude-code2Manually: put the files in place
~/.claude/skills/ahrefs-research/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/ahrefs-research/
1Skills CLI (Vercel)
npx skills add OpenClaudia/openclaudia-skills --skill ahrefs-research -a codex2Manually: put the files in place
.agents/skills/ahrefs-research/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add OpenClaudia/openclaudia-skills --skill ahrefs-research -a cursor2Manually: put the files in place
.cursor/skills/ahrefs-research/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install OpenClaudia/openclaudia-skills ahrefs-research2Manually: put the files in place
.github/skills/ahrefs-research/SKILL.md1Skills CLI (Vercel)
npx skills add OpenClaudia/openclaudia-skills --skill ahrefs-research -a gemini-cli2Platform CLI
gemini skills install https://github.com/OpenClaudia/openclaudia-skills --path skills/ahrefs-researchManually: put the files in place
.devin/skills/ahrefs-research/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add OpenClaudia/openclaudia-skills --skill ahrefs-research -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about ahrefs-python
How to install ahrefs-python in Claude Code?
Run npx skills add OpenClaudia/openclaudia-skills --skill ahrefs-python -a claude-code in your terminal.
What does the ahrefs-python skill do?
It guides AI agents on proper usage of the official Ahrefs Python SDK, enforcing typed models, context managers, and efficient query limits.
What are the environment requirements for ahrefs-python?
You need Python 3.11 or newer, httpx, pydantic, and your API token stored under the AHREFS_API_KEY variable.
Source text
SKILL.md · MIT
---
name: ahrefs-python
description: 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.
---
# Ahrefs 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
```sh
pip3 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):
```python
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):
```sh
# Ensure python3 points to the interpreter where ahrefs-python is installed:
# which python3
# python3 -c "import ahrefs"
python3 -m ahrefs.api_search "domain rating"
python3 -m ahrefs.api_search "backlinks" --section site-explorer --limit 3
python3 -m ahrefs.api_search "batch" --json
python3 -m ahrefs.api_search --sections # list all API sections
```
## IMPORTANT RULES
- ALWAYS use the `ahrefs-python` SDK. DO NOT make raw `httpx`/`requests` calls to the Ahrefs API.
- ALWAYS pass dates as strings in `YYYY-MM-DD` format (e.g. `"2025-01-15"`).
- ALWAYS use `select` 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.
- USE context managers (`with` / `async with`) for client lifecycle management.
- NEVER hardcode API keys in source code. Use the `AHREFS_API_KEY` environment variable or your preferred secrets mechanism.
- The client handles retries (429, 5xx, connection errors) automatically. DO NOT implement your own retry logic on top of the SDK.
## Quick Start
```python
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
```python
import os
import ahrefs
with ahrefs.AhrefsClient(
api_key=os.environ["AHREFS_API_KEY"], # or any secrets source
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:
```python
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`:
```python
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:
```python
# 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`):
```python
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:
```python
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
```python
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 |
|-----------|------|-------------|
| `target` | `str` | Domain, URL, or path to analyze |
| `date` | `str` | Date in YYYY-MM-DD format |
| `date_from` / `date_to` | `str` | Date range for history endpoints |
| `country` | `str` | Two-letter country code (ISO 3166-1 alpha-2) |
| `select` | `str` | Comma-separated columns to return |
| `where` | `str` | Filter expression |
| `order_by` | `str` | Column and direction, e.g. `"volume:desc"` |
| `limit` | `int` | 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:
```python
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 `python3 -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.
© OpenClaudia · MIT · OpenClaudia/openclaudia-skills