Latest change: 2026-11-10 · System status · Contact
Changes people using the API and website can see, newest first: new endpoints and checks, integrations, plan and billing changes, and fixes that changed results. Each one is a change that shipped on the date shown. Release notes for the SDKs and the MCP server follow below.
Release notes as published with each package.
tools.json, which the hosted server at
https://seoscoreapi.com/mcp serves too, so both list identical tools.title, annotations (readOnlyHint, destructiveHint,
idempotentHint, openWorldHint) and an outputSchema; every input property has a
description (with enums, ranges and examples where they apply), and unknown arguments
are refused by the schema (additionalProperties: false).structuredContent (the JSON object) next to the text. report_url
returns {url} and llms_txt {llms_txt} there; the text is unchanged.instructions (where to start, how to get a free key) and a title.server.json lists the hosted endpoint under remotes (Streamable HTTP; API key as
Authorization: Bearer or OAuth sign-in).gemini-extension.json + GEMINI.md make the public mirror a Gemini CLI extension
(gemini extensions install https://github.com/SeoScoreAPI/seoscoreapi-mcp): it points
at the hosted server (httpUrl), and /mcp auth seoscoreapi signs in. No key in a file.create_citation_tracker, update_citation_tracker and citation_check now offer
every engine the API accepts: gpt (one of the API's defaults, previously not
selectable) and nova were missing. The engines field says which are the defaults and
that chatgpt needs an OpenAI key on the server.run_citation_tracker: a run over 45 seconds now comes back as {run_id, status: "running", poll} (the API answers 202 instead of timing out); poll get_citation_run until it is
completed.lib.js still said 1.4.0 in 1.4.1).Packaging only, no behaviour change: mcpName, server.json and glama.json for the MCP
registries, an MIT LICENSE file, and repository now points at the public mirror
(github.com/SeoScoreAPI/seoscoreapi-mcp).
Core Web Vitals are now opt-in on the API, so audits no longer wait on Google PageSpeed Insights unless asked:
audit and batch_audit take include_core_web_vitals (boolean, default false). When
true the audit also returns measured LCP, INP, CLS, FCP and TTFB under core_web_vitals;
the first measurement of a URL adds about 10 seconds and is cached for 24 hours.core_web_vitals.status is not_requested.Catches the server up with the API. New tools:
accessibility_audit, ai_readability, trackers, conversion, quick_wins, llms_txt.compare, competitive_audit, remove_monitor.geo_audit, geo_brand_probe, add_geo_monitor, list_geo_monitors,
geo_monitor_history, remove_geo_monitor.crawl_site (waits for the result), start_crawl, get_crawl.citation_starter_prompts, citation_suggest_prompts,
create_citation_tracker, list_citation_trackers, get_citation_tracker,
update_citation_tracker, delete_citation_tracker, run_citation_tracker,
get_citation_run, citation_tracker_history, citation_check, citation_topups,
citation_topup_checkout, citation_auto_reload (read-only)./audit/export returns a binary PDF) and any way to
turn auto-reload on (the API has none for API keys). See the README.test/endpoints.test.js).https://seoscoreapi.com
(POST /site-audit, GET /site-audit/{job_id}, GET /deep-audit/usage), instead of
engine.seoscoreapi.com. The old host still works.SEO_SCORE_DEEP_AUDIT_URL to override the Deep Audit host (defaults to
SEO_SCORE_BASE_URL; SEO_SCORE_ENGINE_URL is still honoured as a fallback).start_deep_audit, get_deep_audit, deep_audit_usage.deep_audit takes an optional timeout_seconds (default 600, was a fixed 5 minutes) and,
on timeout, returns the job_id so the agent can keep polling with get_deep_audit.User-Agent: seoscoreapi-mcp/<version> header.lib.js (no behaviour change for the other tools) with tests
(npm test, Node's built-in runner).deep_audit tool (engine host).Earlier releases: see the git history of sdks/mcp.
Package metadata only: the repository and issue links point at the public
SeoScoreAPI repositories. No code changes.
Core Web Vitals are now opt-in on the API, so audits no longer wait on Google PageSpeed Insights unless you ask:
audit(url, api_key, cwv=False): pass cwv=True to get measured LCP, INP, CLS, FCP
and TTFB under core_web_vitals in the same response. The first measurement of a URL
adds about 10 seconds; it is cached for 24 hours.batch_audit(urls, api_key, cwv=False): the same for every URL in the batch.cwv=True, core_web_vitals["status"] is "not_requested" (metrics None),
unless a measurement of that URL is already cached, which is returned as before.Fixes signup, which has been a two-step flow on the API for some time:
signup(email) no longer raises KeyError after the verification email is sent.
It returns the API's response ({"status": "verification_required", "message": ...})
instead of a key. POST /signup does not issue a key any more.verify(email, code): sends the emailed 6-digit code to POST /verify and
returns the API key. Raises requests.HTTPError (400) on a wrong or expired code.Catches the client up with the API. New functions, no changes to existing ones:
accessibility_audit (GET /audit/accessibility),
audit_export (GET /audit/export, returns the PDF / Markdown / CSV as bytes).ai_readability, trackers, conversion, quick_wins
(POST /quick-wins), backlinks, generate_llms_txt (returns str; key optional).geo_audit, geo_brand_probe, add_geo_monitor, remove_geo_monitor,
list_geo_monitors, geo_monitor_history.start_crawl, get_crawl, wait_for_crawl, crawl (start and wait).citation_starter_prompts, citation_suggest_prompts,
create_citation_tracker, list_citation_trackers, get_citation_tracker,
update_citation_tracker, delete_citation_tracker, run_citation_tracker,
get_citation_run, citation_tracker_history, citation_check, citation_topups,
citation_topup_checkout (returns the Stripe Checkout URL), citation_auto_reload
(read-only: the API has no way to turn auto-reload on, and neither does this client).remove_monitor (DELETE /monitors).tests/test_endpoints.py).https://seoscoreapi.com
(POST /site-audit, GET /site-audit/{job_id}, GET /deep-audit/usage), instead
of engine.seoscoreapi.com. The old host still works.base_url= on every Deep Audit function, the
module attribute DEEP_AUDIT_URL, or the SEOSCORE_DEEP_AUDIT_URL env var.wait_for_site_audit(job_id, api_key, ...): poll an existing job to completion.deep_audit_usage(api_key). engine_usage() stays as an alias (on the main host it
now calls /deep-audit/usage, since /usage there is the per-URL audit allowance).tests/, run with pytest).site_audit, get_site_audit, deep_audit, engine_usage (engine host).Earlier releases: see the git history of sdks/python.
Package metadata only: the repository and issue links point at the public
SeoScoreAPI repositories. No code changes.
Core Web Vitals are now opt-in on the API, so audits no longer wait on Google PageSpeed Insights unless you ask:
audit(url, apiKey, { cwv: true }): measured LCP, INP, CLS, FCP and TTFB under
core_web_vitals in the same response. The first measurement of a URL adds about
10 seconds; it is cached for 24 hours.batchAudit(urls, apiKey, { cwv: true }): the same for every URL in the batch.core_web_vitals.status is "not_requested" (metrics null), unless a
measurement of that URL is already cached, which is returned as before.AuditOptions and CoreWebVitals.Fixes signup, which has been a two-step flow on the API for some time:
signup(email) no longer resolves with undefined. It resolves with the API's
response ({ status: "verification_required", message: ... }) instead of a key.
POST /signup does not issue a key any more. Typed as SignupResult.verify(email, code): sends the emailed 6-digit code to POST /verify and
resolves with the API key. Rejects (status 400) on a wrong or expired code.Catches the client up with the API. New functions (all typed in index.d.ts):
accessibilityAudit (GET /audit/accessibility),
auditExport (GET /audit/export, resolves with the PDF / Markdown / CSV as a Buffer).aiReadability, trackers, conversion, quickWins
(POST /quick-wins), backlinks, generateLlmsTxt (resolves with text; key optional).geoAudit, geoBrandProbe, addGeoMonitor, removeGeoMonitor,
listGeoMonitors, geoMonitorHistory.startCrawl, getCrawl, waitForCrawl, crawl (start and wait).citationStarterPrompts, citationSuggestPrompts,
createCitationTracker, listCitationTrackers, getCitationTracker,
updateCitationTracker, deleteCitationTracker, runCitationTracker,
getCitationRun, citationTrackerHistory, citationCheck, citationTopups,
citationTopupCheckout (resolves with the Stripe Checkout URL), citationAutoReload
(read-only: the API has no way to turn auto-reload on, and neither does this client).listMonitors and removeMonitor (GET / DELETE /monitors).err.status (previously only the Deep Audit calls).test/endpoints.test.js).https://seoscoreapi.com
(POST /site-audit, GET /site-audit/{job_id}, GET /deep-audit/usage), instead
of engine.seoscoreapi.com. The old host still works.baseUrl in any Deep Audit call's options,
setDeepAuditBaseUrl(url) / getDeepAuditBaseUrl(), or the SEOSCORE_DEEP_AUDIT_URL
env var.waitForSiteAudit(jobId, apiKey, wait): poll an existing job to completion.deepAuditUsage(apiKey). engineUsage() stays as an alias (on the main host it
now calls /deep-audit/usage, since /usage there is the per-URL audit allowance).deepAudit now carry err.status.npm test, Node's built-in runner); the published package now ships only
index.js, index.d.ts, README.md and CHANGELOG.md.siteAudit, getSiteAudit, deepAudit, engineUsage (engine host).Earlier releases: see the git history of sdks/node.
Published from the public SeoScoreAPI/n8n-nodes-seoscoreapi repository with an npm
provenance statement, which n8n requires for verified community nodes. No code changes.
{run_id, status: "running", poll}
(the API answers 202 instead of timing out); use Get Citation Run with that id until it is
completed.Package metadata only: the repository and issue links point at the public
SeoScoreAPI repositories. No code changes.
Core Web Vitals are now opt-in on the API, so audits no longer wait on Google PageSpeed Insights unless asked:
core_web_vitals; the first measurement of a URL adds about 10 seconds and is cached
for 24 hours.core_web_vitals.status is not_requested.Catches the node up with the API. New operations:
test/endpoints.test.js).https://seoscoreapi.com
(POST /site-audit, GET /site-audit/{job_id}, GET /deep-audit/usage), instead of
engine.seoscoreapi.com. The old host still works.https://seoscoreapi.com) to
override the Deep Audit host.npm test, Node's built-in runner, no n8n install needed).Earlier releases: see the git history of sdks/n8n.
utm_source=apify&utm_medium=directory, so a sign-up that starts here is recorded as coming
from Apify. No behaviour change.demo: true with a note. Nothing changes
for runs with a key.includeCoreWebVitals (default off). When on, each SEO audit asks the API for
measured Core Web Vitals (cwv=true) and the row carries a core_web_vitals summary:
status, source, LCP, INP, CLS, FCP and TTFB. It uses no extra audits.core_web_vitals field (null when the option is off).First version. Audits a list of URLs with the user's own SEO Score API key: SEO audit on every
plan, optional accessibility (WCAG 2.1 AA) and GEO audits when the plan includes them. Reads the
plan from GET /usage, paces to the per-minute limit, stops at the allowance, one dataset row per URL.
python -m venv .venv && .venv/bin/pip install -r requirements.txt -r requirements-dev.txt
.venv/bin/python -m pytest tests -q # offline, HTTP mocked
apify run # local run; input in storage/key_value_stores/default/INPUT.json
apify push # upload to your Apify account (stays private until published)
The Store listing copy lives in the library repo under marketplaces/apify/.