seoscoreapi
Python client for SEO Score API — audit any URL for SEO issues with one function call.
Install
pip install seoscoreapi
Quick Start
from seoscoreapi import audit, signup
# Get a free API key (2 audits/day, no credit card)
key = signup("you@example.com")
# Run an audit
result = audit("https://example.com", api_key=key)
print(f"Score: {result['score']}/100 ({result['grade']})")
Functions
| Function | Description |
|---|---|
signup(email) |
Get a free API key |
audit(url, api_key) |
Run SEO audit on a URL |
batch_audit(urls, api_key) |
Audit up to 10 URLs in one call (paid) |
compare(urls, api_key) |
Compare 2–5 URLs with a structured diff (Basic+) |
competitive_audit(url, competitor_url, keyword, api_key) |
Head-to-head audit with gap score (Pro+) |
history(url, api_key, limit=100, since=None) |
Full audit timeseries + summary for a URL (Starter+) |
history_domains(api_key) |
Every domain audited by this key with latest score and 30-day trend (Starter+) |
usage(api_key) |
Check usage and limits |
add_monitor(url, api_key, frequency="daily", webhook_url=None, alert_threshold=5) |
Set up score monitoring with optional Slack/webhook alerts (paid) |
list_monitors(api_key) |
List active monitors |
scoreboard_opt_out(api_key, opt_out=True) |
Opt in or out of the public scoreboard |
report_url(domain) |
Get shareable report URL |
Historical tracking
Every audit on a paid plan returns a history block on the /audit response:
result = audit("https://example.com", api_key=key)
delta = result["history"].get("delta")
if delta:
print(f"Score change: {delta['score']:+.1f} ({delta.get('grade_change') or 'no grade change'})")
Pull the full timeseries with history() or a one-shot per-domain summary with history_domains(). Retention windows: Starter 30 days, Basic 90 days, Pro 1 year, Ultra unlimited.
Webhook alerts on score drops
add_monitor(
"https://example.com",
api_key=key,
frequency="daily",
webhook_url="https://hooks.slack.com/services/T0/B0/xxxx",
alert_threshold=5,
)
Slack incoming-webhook URLs are auto-formatted as Block Kit messages; any other https endpoint receives the raw event JSON.
Deep Site Audit (Pro/Ultra, or credits)
A deep, AI-assisted audit scoring a URL across 9 dimensions (thousands of catalog
checks plus up to 150 AI checks). It runs asynchronously, so start a job and poll it,
or use deep_audit to block for the result:
import seoscoreapi as seo
# One call, waits for the result (handles the queue + backpressure for you):
result = seo.deep_audit(
"https://yoursite.com", API_KEY,
business_type="saas", # tunes which checks apply
on_progress=lambda s: print(s["status"], s.get("queue_position", s.get("progress"))),
)
print(result["scores"]["lai_score"], result["scores"]["section_scores"])
# Or drive the job yourself:
job = seo.site_audit("https://yoursite.com", API_KEY) # POST /site-audit
status = seo.get_site_audit(job["job_id"], API_KEY) # GET /site-audit/{job_id}
# status["status"] -> queued | running | completed | failed
# queued -> {"queue_position", "eta_seconds"}
# completed -> {"result"}
result = seo.wait_for_site_audit(job["job_id"], API_KEY, timeout=600)
seo.deep_audit_usage(API_KEY) # GET /deep-audit/usage -> {"site_audit": {"used", "remaining"}, ...}
Deep audits are included on Pro ($39/mo, 20/mo) and Ultra ($99/mo, 100/mo); any other key can run them on purchased credits.
Since 1.5.0 the SDK calls the main host, https://seoscoreapi.com, like every other
endpoint. To point Deep Audit somewhere else (a proxy, staging, or the legacy
engine.seoscoreapi.com host, which still works), pass base_url= to any Deep Audit
function, assign seoscoreapi.DEEP_AUDIT_URL, or set SEOSCORE_DEEP_AUDIT_URL.
engine_usage() is kept as an alias of deep_audit_usage().
Docs: seoscoreapi.com/docs (Deep Site Audit section).
Full Documentation
Metadata
Release files for seoscoreapi 1.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| seoscoreapi-1.5.0.tar.gz | 7.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| seoscoreapi-1.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 13.8 kB
Release files / seoscoreapi-1.5.0.tar.gz
| Download URL | seoscoreapi-1.5.0.tar.gz |
|---|---|
| Size | 7.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6ccca99afa3784110a045da5f3215be6bb81e3637805bee3f91338304dc7b240
|
|
BLAKE2b-256 checksum How to use checksums |
2e75aefadf0a3c32076b7940e1713c5c6e626447e7ab2f5b68c28686a814df6f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / seoscoreapi-1.5.0-py3-none-any.whl
| Download URL | seoscoreapi-1.5.0-py3-none-any.whl |
|---|---|
| Size | 6.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5133c53f9b7b8451a183b1c12e749d277458339230726de0062777853c9d17ce
|
|
BLAKE2b-256 checksum How to use checksums |
c9e8305457707dbe8da9fe8c588a54d7b6ffac1c686b8093576803029489ddda
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|