Skip to main content
GET
Three endpoints, sharing the Broken Link Checker’s crawl engine but never checking HTTP status — this tool only reports each link’s metadata (anchor text, rel, type) and counts by type. Use it to audit outbound links, find every mailto:/tel: on a site, or feed a link graph.
1 credit per call (single-page extract or crawl start)

Extract from a single page

GET /v1/link-extract?url=... extracts every link on one page and returns immediately.

Query parameters

string
required
The page to extract links from. https:// is assumed if the scheme is omitted.

Response

object
required

Extract from an entire site

Use the crawl API when you need links from multiple pages. It returns unique internal, external, mailto:, and tel: links, with the pages where each was found. It does not check whether link destinations work. The base URL is https://api.pocketutils.com. Replace {jobId} with data.jobId from the start response; do not include the braces.

Authentication and credits

Use Authorization: Bearer YOUR_API_KEY or X-API-Key: YOUR_API_KEY on API requests. API-key callers do not need a Turnstile token. Website callers using a session cookie or the anonymous allowance must provide X-Turnstile-Token when starting a crawl. Polling does not require Turnstile. The start request is billed when it returns 202. Polling costs 0 credits, but every poll counts against your requests-per-minute limit. A later background job failure does not automatically refund an accepted start request. See Authentication and Rate Limits & Credits.

Start request

Send Content-Type: application/json and a JSON object with the following field: The request supports only url. Page limits, timeouts, link caps, custom headers, and crawl depth are not configurable through this endpoint. Use the site root for a general audit. A URL under /docs does not restrict the crawl to that path. A successful start returns 202 Accepted with success: true and data.jobId, a UUID string. Save this ID and poll the matching tool’s status endpoint. The response contains no results yet. Each start creates a new job. Repeating the POST creates another job and can incur another charge; reuse the existing job ID to check progress.

Start example

202 Accepted

Get progress and results

GET /v1/link-extract/crawl/{jobId} takes one required path parameter: No request body or query parameters are required. The completed result is returned by this same endpoint; there is no separate result download or pagination endpoint.

Job response fields

Phases

There is no checking phase in Link Extractor.

Progress fields

These are counters, not a stable percentage or estimated completion time.
200 OK — running

Completed result fields

counts contains integer fields total, internal, external, mailto, and tel. The four type counts sum to total. Bare in-page anchors and other schemes are excluded; mailto: and tel: are included even though they are not HTTP links. The crawl result contains links and counts only. It does not include a pages array, page totals, HTTP status codes, or a health score. Read page counters from data.progress. Use Broken Link Checker to check destinations.
200 OK — completed example

How the site is crawled

The crawler looks for sitemap locations in robots.txt and at /sitemap.xml. It expands one level of sitemap indexes, then scans the entry page and follows discovered internal page links breadth-first. A missing sitemap does not prevent crawling. Internal links are classified by hostname, ignoring a leading www.. Other subdomains count as external. External destinations are collected but are not traversed to discover more pages. PDFs, images, archives, and other recognized asset extensions are not traversed as HTML pages. The crawler reads <a href="..."> elements from the fetched HTML. It does not execute page JavaScript, so links added only after client-side rendering may be absent. It does not forward your PocketUtils API key or browser session to the target website. Pages are deduplicated after removing URL fragments and trailing path slashes. Link records are deduplicated by scheme and resolved URL; different query strings or HTTP link fragments can remain separate records. Repeated occurrences on one page do not increase sourceCount. Link metadata represents one discovered occurrence, rather than every variation of its text or rel attribute.

Crawl and result limits

These limits are fixed by the service. The six-minute page budget is not a promise that the whole job finishes within six minutes. The returned link array is capped at 3,000. totalLinks and counts still cover all reported links discovered within the scanned pages. truncated: false does not prove the entire website was scanned: it describes only the link array cap. Link Extractor does not expose a separate page-truncation flag. Compare the page counters and treat results as an inventory of what this bounded crawl discovered.

Retention and polling behavior

Job state is held in memory. Jobs become eligible for removal 30 minutes after their last progress, result, or error update; cleanup runs every five minutes. Reading a job does not refresh retention. A server restart can also lose a job. Store the completed result in your application if you need it later. Poll about every two seconds for a single job, and use a longer interval when polling several jobs or sharing a small request allowance. Phases can change between polls, so you do not need to observe every phase. Stop on done or error. See Async Jobs & Polling for complete JavaScript and Python examples. A known job returns 200 OK even when data.status is error. The envelope’s success: true means the status lookup succeeded; inspect data.status to determine whether the crawl succeeded. result and error are omitted until applicable, rather than sent as null. Request fresh status snapshots and avoid caching them in your client. The current status handlers do not explicitly set Cache-Control: no-store.

Errors

Crawl validation and missing-job errors use a string error. Platform authentication, credit, and rate-limit errors use an error object with code and message. Handle both shapes; see Errors.
400 Bad Request — missing URL
404 Not Found
If the background crawl cannot obtain usable HTML from the entry page or encounters a fatal error, status polling can return a job failure with HTTP 200:
200 OK — failed job
Stop polling a failed job. Correct the target URL or resolve the target site’s access problem before starting a new crawl.