Canonical Tag Checker - Bulk Canonical URL Audit
Pricing
$4.00 / 1,000 url checkeds
Canonical Tag Checker - Bulk Canonical URL Audit
Check the canonical tag of one or many URLs: missing or relative canonicals, canonicals pointing to another page, redirected URLs and HTTP status. One row per URL.
Pricing
$4.00 / 1,000 url checkeds
Rating
0.0
(0)
Developer
Billy Zouz
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Canonical Tag Checker
Checks canonical link tags on a list of public URLs and flags missing, broken, or inconsistent canonicals. Returns a clean per-URL report ready for export.
What it does
SEOs and web developers often need to confirm, in bulk, that every important page carries a correct <link rel="canonical"> tag. This Actor fetches each URL you provide (following redirects up to a configurable limit), reads the resulting HTML, and reports whether a canonical tag exists, whether it is a well-formed absolute URL, and whether it points back to the page itself (self-referencing) or somewhere else.
Input
| Field | Type | Description |
|---|---|---|
urls | array of strings | Public page URLs to audit (max 200; URLs beyond the 200th are reported as errored rows, not silently dropped). Required. |
maxRedirects | integer | Maximum HTTP redirects followed per URL before giving up. Default 5, range 0-10. |
timeoutMs | integer | Total timeout in milliseconds for a URL, covering its whole redirect chain (the clock is not reset at each hop). Default 10000, range 1000-30000. |
Example input:
{"urls": ["https://example.com/", "https://example.com/page1"],"maxRedirects": 5,"timeoutMs": 10000}
Output
One dataset row per input URL:
| Field | Description |
|---|---|
url | Original URL provided as input. |
finalUrl | URL after following redirects, or null on error. |
statusCode | HTTP status code returned by the server, or null on error. |
canonicalUrl | Value of the canonical link tag found in the HTML, or null if missing. |
isMissing | true if no canonical tag was found on the page. |
isSelfReferencing | true if the canonical tag points to the final URL itself. |
isValid | true if the canonical value is a well-formed absolute URL. |
error | Error message if the URL could not be fetched or was invalid; otherwise null. |
For URLs that cannot be fetched (invalid format, timeout, too many redirects, network error, or beyond the 200-URL limit), the boolean/analysis fields are returned as null and error describes the failure.
Network access
This Actor only fetches the public HTTP(S) URLs you provide as input; it makes no other outbound calls.
Pricing
Pay per event: $0.004 per url checked. One URL fetched and its canonical tag fully validated (charged even when the canonical is correct).
You only pay for these events: the platform usage of the run is covered by the Actor. Failed fetches are not charged. You can cap the cost of a run with the maximum charge setting of your run.
Limits
- Up to 200 URLs per run.
- Public pages only — no login or authenticated content, no personal data collected.
- Redirects and timeout are bounded (0-10 redirects, 1-30 seconds) to keep runs predictable.
Use in your workflow
Replace <APIFY_TOKEN> with your token from Apify Console → Settings → API & Integrations.
HTTP API (curl) — run and get the results in one call:
curl -X POST "https://api.apify.com/v2/acts/devoted_laureate_r8f~canonical-tag-checker/run-sync-get-dataset-items" \-H "Authorization: Bearer <APIFY_TOKEN>" -H "Content-Type: application/json" \-d '{"urls": ["https://www.python.org/", "https://docs.python.org/3/"], "maxRedirects": 5, "timeoutMs": 10000}'
JavaScript (npm install apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('devoted_laureate_r8f/canonical-tag-checker').call({"urls": ["https://www.python.org/", "https://docs.python.org/3/"], "maxRedirects": 5, "timeoutMs": 10000});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python (pip install apify-client):
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("devoted_laureate_r8f/canonical-tag-checker").call(run_input={"urls": ["https://www.python.org/", "https://docs.python.org/3/"], "maxRedirects": 5, "timeoutMs": 10000})for item in client.dataset(run.default_dataset_id).iterate_items():print(item)
AI agents (MCP) — expose only this Actor as a tool through the Apify MCP server:
{"mcpServers": {"canonical-tag-check": {"url": "https://mcp.apify.com?tools=devoted_laureate_r8f/canonical-tag-checker","headers": {"Authorization": "Bearer <APIFY_TOKEN>"}}}}
For agents: call it when you need to validate the rel=canonical tag of one or many URLs. Input: urls (list of URLs); optional maxRedirects, timeoutMs. Output: one record per URL: canonical URL, missing/relative/self-referencing flags, final URL after redirects, status code. Cost: $0.004 per url checked; failures are not charged.
FAQ
Can I check many URLs at once?
Yes, pass a list of URLs; you get one row per URL.
Am I charged for a correct canonical?
Yes, one event per URL checked; failed fetches are not charged.
Related tools
- Hreflang Checker - Validate hreflang Tags — hreflang alternates should be the canonical URLs
- Broken Link Checker - Find Dead Links on a Page — find links that point to dead pages