Redirect Chain Tracer – Bulk Redirect Checker
Pricing
from $0.50 / 1,000 results
Redirect Chain Tracer – Bulk Redirect Checker
Trace HTTP and meta-refresh redirects in bulk. Export visited URLs, status codes, loop detection and explicit incomplete-chain reasons for SEO migrations and link audits.
Pricing
from $0.50 / 1,000 results
Rating
0.0
(0)
Developer
ninhothedev
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
18 days ago
Last modified
Categories
Security
Limited permissionsShare
Redirect Chain Tracer – Bulk 301/302 Redirect Checker & Final URL Finder
Trace HTTP redirects and HTML meta-refresh links in bulk. Export each visited URL, status code, redirect target and the last observed response to JSON, CSV or Excel. Use the report for SEO migrations, HTTP-to-HTTPS checks and recurring link audits. Unresolved chains are explicitly marked, so a hop limit or failed request cannot be mistaken for a verified final destination.
What data can you extract?
| Field | Meaning |
|---|---|
url | Normalized starting URL; bare domains use HTTP so HTTPS redirects remain visible |
final_url | Last URL requested; a verified terminal destination only when is_complete is true |
final_status | Last HTTP status, or null when the request failed |
hop_count | Transitions actually followed: number of visited chain entries minus one |
redirect_count | Redirect targets observed, including an unfollowed target at the limit |
redirected | At least one redirect target was observed |
chain | Ordered entries with url, status_code, absolute location, and type |
is_loop | A target returns to an equivalent URL already visited |
is_complete | A terminal response was observed and the applicable HTML inspection completed |
stop_reason | Why tracing stopped; see below |
next_url | Unfollowed target at a loop, hop limit or unsupported redirect; otherwise null |
source, scraped_at | Source label and UTC observation timestamp |
A resolved chain can end at 404, 403 or 500. is_complete describes tracing coverage, not whether the destination is healthy or correct for your migration.
How to use
- Paste HTTP/HTTPS links into URLs to trace, or enter bare domains.
- Set Maximum requests per URL (default 15, up to 50) and Max URLs per run (default 200, up to 2,000).
- Start the Actor. Inspect Run coverage report and the
is_completecolumn before using the exported destinations.
{"urls": ["http://github.com", "http://docs.apify.com"],"maxHops": 15,"maxItems": 200}
Scheme/host case, default ports, empty root paths and fragments are normalized before deduplication. example.com, http://EXAMPLE.com:80/ and http://example.com/#section produce one trace. HTTP and HTTPS remain distinct; path case, query order and query values are preserved. Invalid values fail validation before requests start. Embedded URL credentials and non-HTTP redirects are unsupported.
Output example
Illustrative successful HTTP-to-HTTPS trace; destinations and responses can change:
{"url": "http://example.com/","final_url": "https://example.com/","final_status": 200,"hop_count": 1,"redirected": true,"chain": [{"url":"http://example.com/","status_code":301,"location":"https://example.com/","type":"http-301"},{"url":"https://example.com/","status_code":200,"location":null,"type":"http-200"}],"is_loop": false,"source": "redirect-tracer","scraped_at": "2026-10-20T00:00:00Z","is_complete": true,"stop_reason": "terminal_response","next_url": null,"redirect_count": 1}
Distinguish complete traces from partial evidence
stop_reason | Meaning |
|---|---|
terminal_response | Reached a response without another supported redirect; inspect its status code |
hop_limit | The request limit was reached while another target remained |
loop | A previously visited normalized URL appeared again |
request_error | DNS, connection, TLS or request failure; earlier hops remain in the row |
missing_location | A 301/302/303/307/308 response supplied no usable Location |
invalid_redirect | Target URL is malformed, uses an unsupported scheme or embeds credentials |
body_limit / body_error | HTML inspection stopped at 2 MB or failed before completion |
Only terminal_response sets is_complete: true. A failed URL still produces a billable diagnostic row; a trace is not a guarantee of a healthy destination. JavaScript redirects are not executed. HTML responses are inspected for meta refresh; other content types are not scanned as HTML. A per-request timeout applies and upstream access can fail.
RUN_SUMMARY reports stored rows, unresolved chains, skipped work due to the budget, and the stop reason. status: complete means the selected work within the item cap finished with resolved chains; partial means some chains are unresolved or the budget left selected URLs unprocessed. incomplete means execution failed. A run can show Apify's SUCCEEDED while its report is partial.
Budget allowance is checked before each group of at most ten traces and again before storing results. Only rows accepted by the SDK count as delivered. A running group may already have started when the allowance changes. Resurrection uses the existing dataset to skip stored URLs and respects the same global item cap; earlier rows without completion fields remain unverified. Across separate runs, the same URL is a fresh billable trace.
Pricing
Current base pricing is $0.50 per 1,000 stored trace rows, plus $0.00005 per start event (one per GB of configured memory, minimum one). A 512 MB run storing 100 traces therefore costs $0.05005 before any applicable discounts. Unresolved/error traces count as stored rows. No additional per-hop charge is added. Check the Pricing tab for current terms; a usage budget may stop the run before all supplied URLs are processed.
Migration checks and integrations
- Compare resolved
final_urlvalues with your migration mapping. - Flag
is_complete: false,final_status >= 400, unexpected 302s or excessivehop_count. - Recheck important inbound and campaign links with saved tasks and schedules.
- Export to Google Sheets, Make, Zapier, n8n or your own API workflow. The Actor does not create schedules or send alerts itself.
Python example for apify-client==3.2.0; set APIFY_TOKEN in the environment. Each call starts a billable run:
import osfrom datetime import timedeltafrom decimal import Decimalfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("ninhothedev/redirect-chain-tracer").call(run_input={"urls": ["http://github.com", "http://docs.apify.com"], "maxHops": 15, "maxItems": 2},memory_mbytes=512, run_timeout=timedelta(seconds=180),max_total_charge_usd=Decimal("0.01"),)if run is None or run.status != "SUCCEEDED":raise RuntimeError("Inspect the failed run and any retained partial output.")record = client.key_value_store(run.default_key_value_store_id).get_record("RUN_SUMMARY")summary = record["value"] if record else {}if summary.get("status") != "complete":raise RuntimeError(f"Unresolved or incomplete redirect audit: {summary}")for row in client.dataset(run.default_dataset_id).iterate_items():print(row["url"], row["final_url"], row["final_status"], row["is_complete"])
FAQ
Does this prove that a link is safe? No. It reports HTTP responses and HTML meta-refresh targets. It does not inspect malware, validate a site's trustworthiness or execute JavaScript. Send requests only to links you are authorized to check.
Do I need a proxy or login? Neither is required or configured. Datacenter blocking, authentication requirements and rate limits can affect results. A 403/429 is reported, not bypassed.
Why is a one-request chain marked as redirected? A redirect target was observed but the limit prevented following it: redirect_count is 1, hop_count is 0 and is_complete is false.
How do I report a problem? Open an Actor issue with a run URL, sanitized input and expected behavior. Do not include tokens, URL credentials or private links.
Related actors
- Website Uptime & Status Checker — status, response time and health checks.
- HTTP Security Headers Checker — inspect response security headers.
- Website Link Extractor — collect links for a redirect audit.