API Documentation
Scan is open now. Integrate, Publish and Monitor will be documented here when they open.
Scan a page
One public page per request, no key needed. nectr reads the site's robots.txt, then fetches the page twice: as plain HTML, and in a headless browser that runs its JavaScript. It also checks up to 3 PDFs the page links to on the same site. nectr keeps neither the page nor the result: it goes back to you only.
curl -X POST https://nectr.ch/api/v1/scans \
-H "Content-Type: application/json" \
-d '{"url": "https://yoursite.ch/pricing"}'The body has one field, url: any public http(s) page, up to 2048 characters. A scan takes a few seconds.
Response
| Field | Type | Meaning |
|---|---|---|
| url | string | The page that was scanned. |
| title | string | null | The page's title. |
| rendered_words | integer | Words in the page as markdown, with JavaScript. |
| plain_words | integer | Words in the page as markdown, without JavaScript. |
| rendered_markdown | string | The page with JavaScript, as markdown. |
| plain_markdown | string | The page without JavaScript (its HTML), as markdown. |
| only_with_javascript | string[] | Blocks of the rendered page whose words are nowhere in the plain HTML. At most 50, each cut at 300 characters. |
| missing_word_share | number | Words in those blocks over words in the rendered page, from 0 to 1. |
| robots_found | boolean | false when the site has no robots.txt. Every crawler is then allowed. |
| robots | object[] | {agent, allowed} for GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot, Google-Extended and CCBot: whether the site's robots.txt lets each one fetch this page. |
| pdfs | object[] | Up to 3 PDFs the page links to on its own site, in page order. Each one is described in the next table. |
| pdfs_not_checked | integer | Linked PDFs left out: past the first 3, or on another site. |
| scanned_at | string | When the scan ran, in ISO 8601. |
Each entry in pdfs:
| Field | Type | Meaning |
|---|---|---|
| url | string | The PDF's address. |
| pages | integer | null | Its page count. |
| words | integer | null | Words in its first 5 pages at most. |
| has_text | boolean | null | false when it has no text layer (fewer than 5 words a page): probably a scanned image. null when it wasn't checked. |
| note | string | null | Why it wasn't checked, when it wasn't. |
Example
example.com, shortened. Its HTML holds one English paragraph, and a script adds five translations, so 85% of the text only appears with JavaScript.
{
"url": "https://example.com/",
"title": "Example Domain",
"rendered_words": 133,
"plain_words": 25,
"rendered_markdown": "This domain is for use in documentation examples …",
"plain_markdown": "This domain is for use in documentation examples …",
"only_with_javascript": [
"L’usage de ce domaine est réservé à des exemples de documentation …",
"…"
],
"missing_word_share": 0.85,
"robots_found": false,
"robots": [
{ "agent": "GPTBot", "allowed": true },
{ "agent": "ClaudeBot", "allowed": true },
"…"
],
"pdfs": [],
"pdfs_not_checked": 0,
"scanned_at": "2026-10-09T20:31:12Z"
}Errors
Errors are JSON with a detail message you can show as it is. Two exceptions: a malformed body gets a 422 whose detail is a list of problems, and a 429 has an error message instead.
| Status | When |
|---|---|
| 403 | The site's robots.txt asks Nectrbot not to fetch this page. |
| 422 | The URL isn't a public http(s) address, it's a document such as a PDF, the page answered with an HTTP error or couldn't be loaded, or the site's robots.txt couldn't be read. |
| 429 | More than 10 scans in a minute from one address. |
| 503 | nectr is busy. Try again in a minute. |
robots.txt
- nectr's crawler is Nectrbot. A page your robots.txt disallows for it isn't fetched, and neither are PDFs it disallows.
- A missing robots.txt (a 4xx answer) allows everything.
- A robots.txt that can't be read (a 5xx answer, or none) stops the scan, as RFC 9309 asks.
Accounts and API keys
- Scans need no account or key.
- New accounts are paused, so new API keys can't be created.
- Existing API keys keep working for now. The latest update gives the dates.
The MCP server
nectr-mcp keeps working with existing API keys. When the new tools open, it will move to them: checking how AI reads your own site, and serving it.
Questions? Get in touch.