An SEO report API is the same endpoint as an SEO audit API, but the response is structured to be rendered — not just acted on in code. The same GET /audit call that powers a CI gate also powers the PDF you send to a client on Monday morning. That's the whole point of designing the response as JSON instead of HTML: one call, many outputs.
This post walks through the three reporting outputs people build on top of SEO Score API most often: the shareable HTML report, the SVG score badge, and the weekly client digest. All three come out of the same endpoint.
Output 1: the shareable HTML report
The fastest win is the hosted report at /report/{domain}. We render the latest audit for any domain as a clean, brandable page you can link clients to without exposing your API key:
https://seoscoreapi.com/report/example.com
That URL is what most agencies drop into client emails. It updates automatically when the underlying audit re-runs, so the link you send in March still works in June with fresh data.
For agencies that want their own branding, the same JSON powers a self-hosted report. Grab /audit?url=..., hand it to a Jinja template, ship the HTML on your own subdomain. ~60 lines of Python and a CSS file.
Output 2: the SVG score badge
If you're a developer-facing product, the badge is the move. /badge/{domain} returns an SVG with the current score and grade, suitable for embedding in a README or a status page:

The badge renders server-side from the most recent audit. Re-run the audit, the badge updates next request. Open-source projects use this to publicly track their own SEO health the same way they track build status with Shields.io.
Output 3: the weekly client digest
This is the workflow that actually retains agency customers. Pick a sitemap, audit it weekly, and email the result as a one-page summary: overall score, week-over-week delta, top 5 regressions, top 3 wins. ~50 lines of Python end-to-end.
from seoscoreapi import audit
import os, smtplib
from email.message import EmailMessage
PAGES = ["https://client.com/", "https://client.com/pricing", ...]
results = [audit(url, api_key=os.environ["KEY"]) for url in PAGES]
avg = sum(r["score"] for r in results) / len(results)
worst = sorted(results, key=lambda r: r["score"])[:5]
msg = EmailMessage()
msg["Subject"] = f"Weekly SEO: avg score {avg:.0f}"
msg.set_content(
f"Avg score: {avg:.0f}\n\nLowest-scoring pages:\n" +
"\n".join(f" {r['url']}: {r['score']}" for r in worst)
)
# ... smtplib send ...
That script, plus a cron job and the agency's SMTP credentials, is a full client-facing reporting product. We have a longer walkthrough in Automated weekly client SEO reports.
Why the report-shaped response matters
The reason SEO Score API works for reporting and not just for auditing is the structure of the response. Three things in particular:
Stable category names. Every audit returns the same five top-level categories (meta_content, technical_seo, social, performance, accessibility). That stability means a Jinja template you write once renders correctly for every client, forever.
Plain-English check descriptions. Each check carries a why field — a one-sentence explanation a non-technical client can read. That's the difference between a report a developer can write and a report an agency can hand to a CMO.
Priorities sorted for you. The priorities array is the audit's top remediation suggestions, already ranked by impact. That's the section every executive scans first. You don't have to write the ranking logic — it's there in the response.
When you'd reach for the report API specifically
If your workflow is:
- Audit, then act in code — that's the SEO checker API workflow (CI gates, agents, monitoring).
- Audit, then show a human — that's the SEO report API workflow.
They're the same endpoint, but the second one cares about rendering. If you want JSON to render into something a client looks at, you're using the report API. The hosted /report/{domain} link and the SVG badge are both shortcuts so you can ship a reporting flow without building a frontend.
Getting started
The hosted report works for any domain that's been audited. Run an audit on the free tier, then link to /report/{your-domain} — that URL is live within seconds. If you want to skip straight to the embedded badge, point a README at /badge/{your-domain} and you're done.
For weekly digests and custom-branded reports, you'll want the Starter tier (200 audits/mo, $5) so you have budget for the recurring audits. The same SDKs that power CI gates power the digests — same key, same endpoint, same response shape.