Skip to main content
RTILA Marketplace

Redirect Checker - output schema

Check a URL list for redirects: status codes, chains, final destinations and timing in one report.

SEO Beginner Stable v1.0.0 Updated Updated 2026-09-18 10 min read
Download
  • Windows x86_64

    BOT_redirect-checker.exe

    98.9 MB

    Download
  • macOS Apple Silicon chmod +x

    BOT_redirect-checker.sh

    87.5 MB

    Download
  • macOS Intel chmod +x

    BOT_redirect-checker.sh

    99.4 MB

    Download
  • Linux x86_64 chmod +x

    BOT_redirect-checker.sh

    122.5 MB

    Download

Do not rename the downloaded file - the filename carries the bot's configuration id.

This tab documents what a finished run produces: every dataset with its fields and transformations, sample rows, the files written to disk, and the destinations results are delivered to. Back to the overview tab.

The tables on this page are generated automatically from the published project configuration and therefore cannot disagree with it.

Datasets

One table per dataset: item selector, deduplication key, required fields, and per-field transformations.

Redirect_Report

Item selector: css=html - Required: Source_URL

Fields of dataset "Redirect_Report"
FieldProperty typeSelector / notesDefault
Source_URL variable=normalized_url text
Final_URL variable=last_final_url text
Status_Code variable=last_http_status text
Status_Text variable=last_http_status_text text
Redirect_Count variable=last_redirect_count text
Navigation_OK variable=last_navigation_ok text
Error variable=last_navigation_error text
Content_Type variable=last_content_type text
Server variable=last_server text
Protocol variable=last_protocol text
Response_Time_ms variable=last_response_time_ms text
X_Robots_Tag variable=last_x_robots_tag text
Cache_Control variable=last_cache_control text
Chain_Status_Codes text
Field details

Selector: variable=last_redirect_chain

Transformations:

  1. script (code: if(!Array.isArray(value)||value.length===0)return '';return value.map(function(h){return h.status||'?';}).join(' -> ');, default_value: )

Chain_Details text
Field details

Selector: variable=last_redirect_chain

Transformations:

  1. script (code: if(!Array.isArray(value)||value.length===0)return '';return value.map(function(h,i){return 'Hop '+(i+1)+': '+((h.status)||'?')+' '+(h.location||h.url||'');}).join(' | ');, default_value: )

Chain_Visual text
Field details

Selector: variable=last_redirect_chain

Transformations:

  1. script (code: if(!Array.isArray(value)||value.length===0)return '';var p=[];for(var i=0;i<value.length;i++){var h=value[i];p.push((h.url||'')+' --['+(h.status||'?')+']--> '+(h.location||''));}return p.join('\n');, default_value: )

Has_301 text
Field details

Selector: variable=last_redirect_chain

Transformations:

  1. script (code: return String(Array.isArray(value)&&value.some(function(h){return h.status===301;}));, default_value: false)

Has_302 text
Field details

Selector: variable=last_redirect_chain

Transformations:

  1. script (code: return String(Array.isArray(value)&&value.some(function(h){return h.status===302;}));, default_value: false)

Has_303 text
Field details

Selector: variable=last_redirect_chain

Transformations:

  1. script (code: return String(Array.isArray(value)&&value.some(function(h){return h.status===303;}));, default_value: false)

Has_307 text
Field details

Selector: variable=last_redirect_chain

Transformations:

  1. script (code: return String(Array.isArray(value)&&value.some(function(h){return h.status===307;}));, default_value: false)

Has_308 text
Field details

Selector: variable=last_redirect_chain

Transformations:

  1. script (code: return String(Array.isArray(value)&&value.some(function(h){return h.status===308;}));, default_value: false)

Redirect_Type text
Field details

Selector: variable=last_redirect_chain

Transformations:

  1. script (code: var c=Array.isArray(value)?value:[];if(c.length===0)return 'No HTTP Redirect';var s=c.map(function(h){return h.status;});if(s.indexOf(301)!==-1)return '301 Permanent';if(s.indexOf(308)!==-1)return '308 Permanent';if(s.indexOf(302)!==-1)return '302 Temporary';if(s.indexOf(303)!==-1)return '303 See Other';if(s.indexOf(307)!==-1)return '307 Temporary';return 'Redirect ('+s.join(',')+')';, default_value: Unknown)

Chain_Length_Verdict text
Field details

Selector: variable=last_redirect_count

Transformations:

  1. script (code: var n=Number(value);if(!isFinite(n)||n===0)return 'No Redirect';if(n<=2)return 'OK';if(n<=5)return 'Long Chain';return 'Redirect Loop Risk';, default_value: Unknown)

Errors

Item selector: css=html - Required: Source_URL

Fields of dataset "Errors"
FieldProperty typeSelector / notesDefault
Source_URL variable=normalized_url text
Status_Code variable=last_http_status text
Error variable=last_navigation_error text

Destination_URLs

Item selector: css=html - Required: Destination_URL

Fields of dataset "Destination_URLs"
FieldProperty typeSelector / notesDefault
Destination_URL variable=last_final_url text

Sample output

Sample rows produced by this bot
Source_URLFinal_URLStatus_CodeStatus_TextRedirect_CountNavigation_OKErrorContent_TypeServerProtocolResponse_Time_msX_Robots_TagCache_ControlChain_Status_CodesChain_DetailsChain_VisualHas_301Has_302Has_303Has_307Has_308Redirect_TypeChain_Length_Verdict
https://shop.example.com/summer-sale https://shop.example.com/sale/summer 301 Moved Permanently 2 true text/html; charset=utf-8 nginx h2 486 max-age=3600 301 -> 302 Hop 1: 301 https://shop.example.com/promo | Hop 2: 302 https://shop.example.com/sale/summer https://shop.example.com/summer-sale --[301]--> https://shop.example.com/promo --[302]--> https://shop.example.com/sale/summer true true false false false 301 Permanent OK

File outputs

This bot writes no files.

Delivery destinations

Where finished results go once the run completes.

Results are stored locally; no external delivery is configured.

Export formats: csv, json, xlsx.

View the full project configuration on the Config tab.

Frequently asked questions

How do I check a list of URLs for redirects in bulk?
Paste your URLs into the list field, one per line, and start the run. The bot walks the list with up to three parallel workers, navigates each URL, and records the full redirect chain into the Redirect_Report dataset. A six-URL test list is pre-loaded so your very first run doubles as a self-test.
What is a redirect chain and why does its length matter?
A chain is the sequence of hops between the URL you submit and the URL the browser finally lands on. Each hop costs latency and can leak ranking signals if intermediate URLs are temporary. The Chain_Status_Codes, Chain_Details and Chain_Visual columns show every hop, and Chain_Length_Verdict grades it: OK at two hops or fewer, Long Chain up to five, Redirect Loop Risk beyond that.
How do I find 302 redirects that should be 301?
Filter the Redirect_Report output on the Has_302 column or on Redirect_Type showing 302 Temporary. A permanent move served as a temporary redirect tells crawlers the old URL may return, which is the most common migration mistake this bot surfaces.
What is the difference between 301 302 303 307 and 308 status codes?
301 is a permanent move that may rewrite the request method; 308 is permanent but preserves the method; 302 is temporary and may rewrite the method; 307 is temporary and preserves the method; 303 tells the client to fetch another resource with a GET. For SEO auditing the practical split is permanent (301, 308) versus temporary (302, 307), and the Redirect_Type column classifies each URL accordingly.
How do I audit redirects after a website migration?
Export your old URL list from the previous CMS, sitemap or server logs, paste it into the checker, and run it against the live site. Then review three things: URLs whose Final_URL is not the intended new page, rows where Redirect_Type says temporary, and rows where Chain_Length_Verdict flags Long Chain or Redirect Loop Risk. Re-run the same list weekly to catch regressions.
Why does the checker block images scripts and stylesheets?
The bot only needs the navigation itself, not the rendered page. Blocking images, media, fonts, styles, scripts and background requests makes each check dramatically faster and lighter on bandwidth. The trade-off is documented in the limits section: a redirect that only fires from client-side script will not be observed.
Can it detect redirect loops?
Yes, indirectly and honestly. A browser gives up on a loop and the navigation fails, so the URL lands in the Errors dataset with Navigation_OK false and the engine error text. Chains that are merely very long are graded Redirect Loop Risk by the Chain_Length_Verdict column before they become hard failures.
What do I do with a URL that returns no redirect?
Nothing is wrong - Redirect_Type reads No HTTP Redirect and Chain_Length_Verdict reads No Redirect, with Status_Code showing the direct response, usually 200. In a migration audit these rows deserve attention: an old URL still serving content directly instead of forwarding is a duplicate-content risk.
How many URLs can one run check?
There is no built-in cap; the list length governs the run. Three workers process URLs in parallel, so a few hundred typical URLs finish in minutes. Very large lists mainly need patience and proportionate request rates against the target server.
Does the bot follow redirects all the way to the final destination?
Yes. Navigation behaves exactly like a real browser session: the engine follows every hop, then records the final URL, the final status, the response headers of the last hop, and the full chain of intermediate statuses and locations.
Can I check redirects without a paid SEO tool?
That is the point of this bot. It is a free desktop launcher, your URL list never leaves your machine except as requests to the URLs themselves, and the report exports to CSV, JSON or XLSX for review in any spreadsheet.
Does the bot need an internet connection to run?
Yes on first run: the launcher fetches its configuration by id from the backend at launch, so an internet connection is required at least the first time it starts.
Can I rename the downloaded file?
No. The downloaded file must keep its exact name - the filename carries the per-bot configuration id, and renaming it breaks the configuration fetch at launch.