Privacy policy
Last updated: 9 August 2026
This policy covers the official seo command-line tool, library, MCP server,
and the seoskill.dev website.
The current software runs on your machine. It does not create an SEO account, upload reports to a hosted SEO service, or send reports or connected account data to the project maintainer.
Local first describes where the software runs and stores its data. It does not mean every command works offline. A command can make a direct request from your machine to Google, a research provider, a site, or another service needed for the work you requested. The sections below explain what each request can send.
Google data the software can access
Google access is optional. If you connect an account, the software asks for read-only access to:
- your Google account email address, so the local app can identify the account you connected;
- Search Console properties, performance data, and URL Inspection data you can already access; and
- Google Analytics accounts, properties, and report data you can already access.
The software uses this data to list properties, run the report you requested, join search or analytics evidence to crawl findings, and save local report history when a command supports it. It does not use Google data for advertising or to train general-purpose AI models.
The shared desktop OAuth client identifies the seo app to Google. OAuth
tokens and API responses are returned to your machine, not to the project
maintainer.
The use of information received from Google APIs follows the Google API Services User Data Policy, including its Limited Use requirements.
Clicky data the software can access
Clicky access is optional. If you connect a site, the software sends its numeric site ID, sitekey, requested report type, date range, and row limit directly to Clicky over HTTPS. It can read the traffic data that sitekey permits. The project maintainer does not receive the request or response.
The site ID is saved in the project profile. The sitekey uses the operating
system keychain when available, with a private local file fallback. Agents and
CI can use SEO_CLICKY_SITEKEY without saving it. Clicky responses are cached
locally for up to 24 hours, and cache keys and cached responses do not contain
the sitekey.
When Search Console query text can leave your machine
External enrichment is off by default. Three reports can send selected Search Console search terms to the connected research provider when you explicitly enable it:
keyword-opportunitiescan send selected query text for keyword metrics whenincludeExternalistrue;local-search-demandcan send selected local-intent query text for live results whenincludeSerpsistrue; andpseo-opportunitiescan send research seeds derived from Search Console searches and existing page patterns whenincludeExternalistrue.
These requests do not send Google OAuth tokens, Google account identity, Search Console property IDs, clicks, impressions, click-through rate, positions, or Google Analytics rows. The selected query or seed text is processed by the research provider under its own privacy policy. The report shows that outside research was requested and keeps it separate from Search Console metrics.
How Google data is protected
The software stores project profiles, settings, OAuth tokens, cached API responses, logs, and saved reports in local user directories. It does not upload Google API responses to a hosted SEO account or project database. Google API requests go directly from your machine to Google over HTTPS. The only external research-provider use of selected query or seed text is the explicit enrichment described above.
OAuth tokens use the operating system keychain when that option is enabled.
The fallback token file and any bring-your-own OAuth client file are written
with user-only file permissions. Config, cache, and log directories are also
created with user-only permissions on supported systems. seo privacy prints
the relevant local paths and file permissions so you can inspect them.
The local cache is not a substitute for device security or disk encryption. A person or process with access to your operating system account may be able to read local reports and caches. You are responsible for the security of your device, backups, shell history, exported reports, and any environment variables you create.
How long Google data is kept
OAuth tokens remain on your machine until you run seo auth logout or
seo reset --yes. Revoking SEO Skill from your Google Account invalidates the
grant. You should still run seo auth logout if you also want to remove the
local token record.
Google Analytics and Search Console API responses are cached locally so repeat commands do not make the same request unnecessarily. A cached response is eligible for reuse for up to 24 hours. Expired cache rows are removed during automatic cache maintenance, which also removes cache rows older than 30 days and enforces local size limits. On a machine where the command is no longer run, expired rows may remain in the local cache file until you delete them.
Run seo cache clear --provider google-analytics to remove cached Google
Analytics responses immediately. Run seo cache clear --provider gsc to do
the same for Search Console. Run seo cache clear --provider clicky to remove
cached Clicky responses. Project profiles and reports that you deliberately
save remain until you delete them with the relevant command or run
seo reset --yes. The reset command removes Google tokens, local
configuration, caches, logs, histories, saved reports, and saved provider
credentials. It removes active keychain credentials before deleting local
files. If the keychain refuses a deletion, reset stops and tells you to unlock
it before trying again.
Optional research provider requests
Research-provider requests send only the inputs needed for the selected operation. Depending on the provider and report, these can include:
- keywords, research seeds, domains, URLs, filters, result limits, country, language, location, and device;
- target names and aliases used for indexed AI mention research; and
- the full fixed prompt, selected model, country, web search setting, and output limit used for an AI prompt observation.
DataForSEO requests use your login and API password. Semrush requests use your Version 3 API key and can include the regional database, selected columns, and report limits. Ahrefs requests use your API v3 bearer key and can include the target mode and country filter. Each provider also receives ordinary network metadata.
The project maintainer does not receive these credentials, inputs, or responses. DataForSEO processes them under its privacy policy. As of the date of this policy, DataForSEO says it stores API task data for 365 days. Its policy and retention can change independently of this project. Semrush and Ahrefs process requests under their respective Semrush privacy policy and Ahrefs privacy policy.
Importing a local DataForSEO, Semrush, or Ahrefs file does not upload it to the provider or the project maintainer.
Bing Webmaster requests
Bing Webmaster is optional. If you connect it, the software sends your API key or OAuth bearer token, verified site URL, and the parameters needed for the report directly to Bing over HTTPS. Bing can return verified-site, traffic, crawl, query, page, and link data. The current report does not cache Bing responses. Microsoft processes the request under its privacy statement.
Other network requests
Other commands can make these direct requests:
- Crawls request the public pages, sitemaps, robots files, and agent files you select. External-link checks can request linked third-party pages. Browser rendering can also load scripts, images, fonts, and other resources embedded by a page.
- Chrome UX Report requests send the requested URL or origin, form factor, metrics, and your API key to Google.
- Search status checks request Google’s public incident feed without sending a site or property.
- A live IndexNow submission sends the host, changed URLs, key, and public key location to IndexNow. A dry run does not submit them. IndexNow handles the request under its terms.
- Package update checks can request current package information from the npm registry.
- Anonymous usage events can be sent to seoskill.dev as described in the next section.
The remote service receives ordinary network metadata in addition to the listed inputs and handles it under its own terms and privacy policy.
When an agent or MCP client runs the software, that client may send tool
inputs, report output, or conversation context to its chosen model provider.
That transfer is controlled by the client and model service, not by the local
seo process. Check the privacy settings and policy of the agent you use.
How long research data is kept locally
DataForSEO responses are cached locally for up to 24 hours or seven days, depending on the operation. Semrush responses are cached for up to seven days. Ahrefs Domain Rating responses are cached for up to 24 hours, and other Ahrefs responses are cached for up to seven days. Cache maintenance removes provider cache entries older than 30 days and enforces a 32 MiB provider-cache limit. On a machine where the command is no longer run, expired rows can remain until you clear the cache or reset the software.
Fixed AI prompt observations are saved locally so repeated runs can show compatible changes over time. The software keeps up to 90 observations for one exact configuration, 10,000 observations in total, and 128 MiB of logical storage. The local provider spend ledger is kept for up to 730 days, 50,000 rows, or 32 MiB.
Run seo cache clear --provider dataforseo,
seo cache clear --provider semrush, or
seo cache clear --provider ahrefs to remove one provider’s cached responses.
Run the matching seo providers <provider> disconnect command to remove its
saved credential. These commands do not delete data already processed by an
external provider. Run seo reset --yes to remove every saved provider
credential along with local configuration, caches, histories, spend records,
logs, and saved reports.
Anonymous tool usage
Anonymous usage telemetry is enabled by default with a one-time first-run notice. It describes use of the tool, not the site or Google data being analysed. Events can contain only a fixed event name, public report identifier or top-level command name, package version, detected agent category, operating system, architecture, Node major version, first-run ISO week, wire schema version, and fixed failure classification for failed runs. The classification can include a category, reason, and one allowlisted code context. It never contains the underlying error text or a user-supplied value.
Telemetry never contains a user ID, machine ID, UUID, fingerprint, audited domain, URL, hostname, page content, report content, Search Console or Google Analytics response, Google property ID, token, secret, file path, username, local hostname, raw error message, command argument, IP address, or location. The complete event and field catalogue is published at seoskill.dev/telemetry.
Once-only event state stays in a private local file in the existing SEO config
directory. The telemetry endpoint accepts only the published fixed schema and
writes those fields to a dedicated Cloudflare D1 table. The server adds only
the UTC receipt month, such as 2026-07, so it can publish monthly totals
without storing an exact request time. The table has no account or identity
column. It does not use KV, R2, or Analytics Engine. Worker request logging is
disabled. The ingest code does not read request IP or Cloudflare location
fields, and neither is written to D1. Cloudflare still handles the ordinary
network request at its edge.
Disable all telemetry network calls with seo telemetry disable,
DO_NOT_TRACK=1, SEOSKILL_TELEMETRY_DISABLED=1, or
SEO_TELEMETRY_DISABLED=1. It is automatically disabled in common CI
environments. Use seo telemetry status to inspect the effective setting and
seo telemetry enable to turn the local setting back on. Environment and CI
overrides always win.
An unexpected CLI error can print a prefilled GitHub issue link. The link contains only the package version, Node major, operating system, architecture, fixed report or command name, and fixed failure classification. It does not contain the raw error or command arguments. Nothing is sent to GitHub unless you open the link, and you can review the form before submitting it.
Aggregate event counts are public at seoskill.dev/stats. They are described as installs, active machines, and audits, never users. One person can have several installs, and clearing local state creates a new install.
Installing the package through npm or using GitHub is covered by the policies of those services.
The seoskill.dev website uses Clicky to count visits and see which pages people use. Tracking cookies are disabled in the website code. Clicky receives normal browser and request information such as the page, referrer, device, and IP address.
The website host and security provider may also process normal web request data such as an IP address, user agent, requested path, and timestamp. Website analytics and logs do not include the reports, tokens, or Google API responses stored by the local software.
Website tool requests
Most browser tool input stays in the browser. The log file analyzer, word combiner, and pasted or uploaded validator modes do not upload their input to seoskill.dev. A tool that fetches a public URL must send that URL to the seoskill.dev Cloudflare Worker because normal browser cross-origin rules often prevent a direct request. This includes live llms.txt, sitemap, robots.txt, and favicon checks. The target server receives an ordinary request from Cloudflare and can record it in its own logs.
Three provider-backed website tools send a target and the inputs needed for the selected check from the Worker to an outside provider:
- Spam Score sends the domain or page to DataForSEO.
- Website traffic estimates send the domain, country, and language to DataForSEO.
- Domain Rating sends the domain to Ahrefs.
The provider credentials remain in encrypted Cloudflare Worker secrets. The Worker returns a small normalized result and does not save submitted targets or provider responses in a product database or public recent-search list. DataForSEO and Ahrefs process these requests under the provider privacy policies linked in the research-provider section above.
Provider-backed forms use Cloudflare Turnstile to limit automated use. The browser sends challenge information to Cloudflare and the Worker validates the single-use token before calling a provider. Every tool that reaches the Worker also creates a daily HMAC from the Cloudflare-provided connecting IP address. Only the HMAC, tool, date, and counters are stored in a Durable Object. The raw IP is not stored in the counter, the HMAC changes each UTC day, and the object deletes its stored data after 48 hours. People on one shared network can share the same daily allowance.
Sharing and sale
The project maintainer does not receive or sell the reports, connected account data, or provider request data processed by the local software. A service you choose receives only the request inputs needed for the operation you start, as described above.
No local report is shared with another person or service unless you export, copy, publish, transmit, or pass it to an agent or application yourself.
Removing access and local data
Use seo auth logout to remove local Google tokens. Use
seo providers dataforseo disconnect,
seo providers semrush disconnect, seo providers ahrefs disconnect, or
seo providers bing disconnect to remove the corresponding saved provider
credential. Use seo indexnow remove --site https://example.com to remove a
saved IndexNow key for one site. Environment variables are controlled by your
shell or runtime and are not changed by these commands. Use seo privacy to
inspect local paths and seo reset --yes to remove every saved credential and
local file managed by the software.
You can also revoke the app from your Google Account connections. Deleting local files does not delete data already held by Google, a research provider, Bing, IndexNow, npm, GitHub, a site you crawled, an agent or model provider, or your operating system backups.
Changes to this policy
This policy will change when a collection, storage, retention, network, or hosted-service boundary changes materially. The date at the top will be updated when that happens. Earlier versions remain available in the public Git history.
Privacy questions
Open an issue in the public GitHub repository. Do not include OAuth tokens, private reports, personal data, or other secrets in a public issue.