Install the Docteur's audit checklist in Claude or ChatGPT: you ask for "an SEO audit of yoursite.com", it walks the 18 points and hands you back a report to open. Free, no account, no API key.
For Claude Desktop, drop the file into a skills folder; for ChatGPT, a custom GPT or a Gemini project, just copy the contents below into the instructions.
The whole skill
7 KB of markdown
Copy it into a SKILL.md file, or into your assistant's instructions. Raw version: skill/seo-audit/SKILL.md.
SKILL.md
---
name: seo-audit
description: Run an 18-point technical SEO audit on a website using the Docteur SEO checklist, and produce a shareable report. Use it when the user asks for an SEO audit, a technical audit, why their site is not showing up on Google, or a site check before a redesign.
---
# 18-point SEO audit
This skill runs a website through the **Docteur SEO technical audit checklist**:
18 points, in an order that matters, and a report to hand back to the user.
The checklist and the API are free, with no account and no key.
Documentation: <https://docteurseo.com/en/tools/claude-skill-seo-audit>
## The golden rule
**Only record a result for what you have actually checked.**
Leave an unchecked point empty: it does not count towards the score. A made-up
verdict, on the other hand, makes the report wrong — and the user will act on it.
A 10-out-of-18 audit that is true beats a complete one that is half guessed.
Three points **cannot** be established by a program. Ask the user, or leave them
empty:
| Point | What to ask for |
|---|---|
| `pages-indexees` | How many results Google shows for `site:theirdomain.com`, compared with the number of pages published |
| `vitesse`, `mobile`, `ordinateur`, `lcp`, `cls`, `core-web-vitals`, `temps-serveur`, `images`, `js-css` | The numbers from <https://pagespeed.web.dev/> (mobile score, LCP, CLS, server response time) |
| `erreurs-404` | Whether they know of broken links, or can run a free crawl |
## The flow
### 1. Open the audit
```
GET https://docteurseo.com/api/audit/nouveau?url=SITE&agent=YOUR-NAME&lang=en
```
- `url`: the domain or the full address (`yoursite.com` is enough).
- `agent`: **required** — an identifier for the calling assistant
(`claude-code`, `chatgpt`, `my-internal-agent`…). It appears on the report.
- `lang=en`: **required for English**. Without it the checklist, the report and
every message come back in French.
The response carries the audit `id`, the `rapport` (report) URL, and the 18
`points`, each with `label`, `quoi` (what it is), `comment` (how to check it),
`valide_si` (pass if), `non_valide_si` (fail if) and `critique`.
An audit already open on that site in the same language, less than two hours old,
is **resumed** (`"reprise": true`) instead of duplicated; `deja_remplis` lists
what is already recorded.
### 2. Collect the facts
```
GET https://docteurseo.com/api/audit/mesures?url=SITE&lang=en
```
Returns **raw facts**, not verdicts: HTTP status, where each of the four address
variants lands (http/https, with and without www), the contents of `robots.txt`,
whether `sitemap.xml` exists and how many addresses it lists, the `noindex` tag,
the security headers, the number of images without alt text, the number of
scripts.
You decide each point's result by holding those facts against `valide_si` and
`non_valide_si`.
If you have web access, check for yourself as well: does the home page load, is
the title present and meaningful, does the content match the business.
### 3. Record each result
```
GET https://docteurseo.com/api/audit/reponse?id=ID&point=POINT&resultat=RESULT¬e=NOTE
```
- `point`: the exact point identifier (see the list below).
- `resultat`: `ok` (pass), `warn` (needs work) or `fail`.
- `note`: what you found, in one sentence (400 characters max). Optional, but it
is what makes the report useful — prefer a fact to a judgement: "Disallow: /
found under User-agent: *" rather than "bad".
One call per point. The response returns the running `score_partiel` and the list
of `restants` (points left).
### 4. Close it and hand over the link
```
GET https://docteurseo.com/api/audit/terminer?id=ID
```
Returns the `score`, the `verdict`, `points_critiques_en_defaut` (failing
critical points) and the `rapport` URL. The audit's language is remembered, so
the report comes back in English.
**Always finish by giving the user the report link**: it is a readable page they
can keep, print, or send to their developer. Sum it up in three sentences: the
score, the blocking point(s), and the first thing to fix.
## The 18 points
Order matters: the first six decide whether Google can see the site. While one of
them is failing, improving speed or copy achieves nothing.
**Google and your site** — `redirections`, `robots` *(critical)*, `ssl`
*(critical)*, `pages-indexees` *(critical)*, `sitemap`, `erreurs-404`
**Site performance** — `temps-serveur`, `vitesse`, `responsive`,
`core-web-vitals`, `lcp`, `cls`, `mobile` *(critical)*, `ordinateur`, `images`,
`js-css`
**Web security** — `entetes-http`, `xss`
The four **critical** points turn the whole audit red as soon as they fail,
whatever the score: an expired certificate or a closed `robots.txt` makes
everything else invisible.
The full reference, with the checking instructions, is always available without
opening an audit:
```
GET https://docteurseo.com/api/audit/points?lang=en
```
## Identifiers and field names
The **point identifiers** are French words (`entetes-http`, `erreurs-404`) and are
**the same in both languages** — they are stable keys, not labels. Send them
exactly as listed above.
The **JSON field names** in every response stay in French too, on purpose, so a
single integration works against either language: `titre`, `resume`, `examines`,
`valides`, `a_ameliorer`, `non_valides`, `restants`, `score_partiel`,
`points_critiques_en_defaut`, `a_dire_a_l_utilisateur`. Only the VALUES are
translated — with `lang=en` you get "Site in good health", not "Site en bonne
santé".
## Scoring
- `ok` = full weight, `warn` = half, `fail` = zero.
- Critical points count double.
- **The score only covers the points you checked**: leaving a point empty costs
nothing, while a made-up verdict distorts everything.
- Verdict: green from 85% with nothing failing, red below 55% or as soon as a
critical point fails.
## Good manners
- **One audit per site.** Do not open a second audit to correct an answer: send
the point again, the last result recorded wins.
- **Do not promise rankings.** This audit checks the machinery of a site. It says
nothing about keywords, content or inbound links — tell the user, because those
are what decide their position once the technical side is sound.
- **Never invent speed numbers.** If the user does not provide them, those points
stay empty and the report shows that honestly.
- **Write for a small-business owner**, not for an SEO: plain words, short
sentences, no unexplained jargon.
## Full example
```
GET /api/audit/nouveau?url=martins-bakery.com&agent=claude-code&lang=en
→ { "id": "k7m2p9x4vq8n3b6s", "rapport": "https://docteurseo.com/audit/k7m2p9x4vq8n3b6s", … }
GET /api/audit/mesures?url=martins-bakery.com&lang=en
→ { "faits": { "robots_txt": { "present": true, "contenu": "User-agent: *\nDisallow: /wp-admin/" }, … } }
GET /api/audit/reponse?id=k7m2p9x4vq8n3b6s&point=robots&resultat=ok¬e=Only%20blocks%20/wp-admin/
GET /api/audit/reponse?id=k7m2p9x4vq8n3b6s&point=ssl&resultat=ok¬e=https%20everywhere,%20valid%20certificate
GET /api/audit/reponse?id=k7m2p9x4vq8n3b6s&point=sitemap&resultat=fail¬e=No%20sitemap.xml%20at%20the%20root
…
GET /api/audit/terminer?id=k7m2p9x4vq8n3b6s
→ { "score": 72, "verdict": "warn", "rapport": "https://docteurseo.com/audit/k7m2p9x4vq8n3b6s" }
```
## Going further
- The checklist to fill in by hand: <https://docteurseo.com/en/tools/seo-audit-checklist>
- The full method, thresholds included: <https://docteurseo.com/en/seo-audit-checklist>
- The automated check-up (speed, mobile, visibility): <https://docteurseo.com/en>
- French version of this skill: <https://docteurseo.com/skill/audit-seo/SKILL.md>
What the assistant does, and what it cannot do
The skill forces it to tell the two apart, because that is where automated audits start misleading people. It establishes what can genuinely be measured:
whether the four addresses of the site (http, https, with and without www) land in the same place;
the robots.txt — its actual contents, and whether it declares a sitemap;
the sitemap.xml: present, how many addresses, sitemap index or not;
the noindex tag and the X-Robots-Tag header;
the security headers (HSTS, CSP…), which the assistant would never see by reading the page;
the page title, the number of images without alt text, the number of scripts.
It cannot measure speed: PageSpeed needs a real page load, 20 to 60 seconds, which an assistant call will not hold. It cannot count the pages Google knows about either. So the skill tells it to ask you for those numbers — or to leave those points empty. An empty point does not count in the score; a made-up verdict makes the whole report wrong.
The API, in five addresses
Everything is GET, with no key, so it stays within reach of an assistant that can only open a URL.
API
GET /api/audit/points?lang=en
the reference: 18 points, each with how to check it
GET /api/audit/nouveau?url=yoursite.com&agent=claude-code&lang=en
opens an audit → identifier + report address
GET /api/audit/mesures?url=yoursite.com&lang=en
the facts our server can measure (raw, no verdict)
GET /api/audit/reponse?id=ID&point=robots&resultat=ok¬e=...
records one result: ok | warn | fail
GET /api/audit/terminer?id=ID
closes the audit → score, blocking points, report link
Base: https://docteurseo.com · An audit open on the same site in the same language is resumed for two hours instead of duplicated · Rate-limited per IP · Add lang=en or everything comes back in French.
Why GET everywhere?
Because it is the only verb an assistant uses without configuration. It is not canonical API design, and it is a deliberate trade: no sensitive data travels, the audit identifier is not guessable, writes are limited to a whitelist of 18 points, and at worst a prefetched link creates an empty audit.
And when the assistant gets it wrong?
It will. Every report carries the name of the assistant that filled it in and a note that it is not the Docteur's own finding. The answer is always the same: go through the checklist by hand, where each line tells you where to look. That is the whole point of the tool — you should be able to verify what you are told about your site, whether a human or a machine told you.
Questions about the skill
What is a Claude skill, in practice?
A folder containing a SKILL.md file: instructions the assistant loads when the task calls for it. Here, the file explains how to run an 18-point technical audit and how to record the results. You install it once, and from then on "run an SEO audit on yoursite.com" is enough.
Do I need an account or an API key?
Neither. The API is open, for reading and writing, and only asks for a free-text identifier for the calling assistant (the agent parameter) — it is shown on the report so you know who filled it in. A rate limit protects the service, that is all.
Can the AI really check everything on its own?
No, and the skill explicitly forbids pretending otherwise. It establishes what a program can measure: redirects, robots.txt, sitemap, noindex tag, security headers, images without alt text. It cannot measure speed (PageSpeed needs 20 to 60 seconds and a real page load) or count the pages Google knows about: it has to ask you for those numbers, or leave those points empty. An empty point costs nothing in the score — a made-up verdict makes the report wrong.
Does it work with ChatGPT, or only with Claude?
Both, and with any assistant that can open a web address. The "skill" format is Claude's, but the file is only text: paste it into a custom GPT, a Gemini project, or your own agent. The whole API is GET-only, precisely so it stays within reach of an assistant that can only browse.
Where does the audit data go?
The report is stored on our side, since the assistant has no browser to keep it in: we hold the audited address, the 18 results, the notes the assistant wrote and the identifier it declared. The report page is noindex and its address is not guessable. Nothing else is collected: no email, no account, no visitor identifier.
How reliable is the report?
It is worth exactly as much as the checking behind it — which is written on the report page itself. The technical facts (robots.txt, certificate, headers) are measured by our server and are solid. The judgements remain the assistant's. To settle a doubt, go through the checklist by hand: each line takes a few minutes.
Rather do it yourself?
The same checklist, in fill-in form: 18 questions asked one at a time, each with where to look and which free tool answers it.