{
  "apiVersion": 1,
  "generatedAt": "2026-09-14T00:00:00+00:00",
  "slug": "outbound-link-checker",
  "botId": "outbound-link-checker",
  "configEncoding": "plain",
  "configDigest": "5c8a3e1da357105f67cbe1d49a74c4de41c23f9252840e6e5f3b5a57d7ae04f6",
  "configBytes": 9611,
  "project": {
    "name": "Outbound Link Checker",
    "settings": {
      "urls": [
        "${urls_to_check}"
      ],
      "headless": false,
      "max_concurrent_workers": 5,
      "humanoidEnabled": false,
      "proxyEnabled": false,
      "captchaEnabled": false,
      "matchTimezoneAndLocale": false,
      "block_resources": false,
      "get_urls_from_sitemap": false,
      "respect_robots_txt": false,
      "skip_initial_navigation": false,
      "variables": [
        {
          "name": "urls_to_check",
          "value": "https://rtila.com/\nhttps://en.wikipedia.org/wiki/Web_scraper\nhttps://example.com",
          "required": true,
          "is_list": true
        },
        {
          "name": "max_outbound_links",
          "value": "100",
          "required": false,
          "is_list": false
        }
      ]
    },
    "datasets": {
      "Outbound_Links": {
        "item_selector": "css=html",
        "properties": [
          {
            "name": "Page_URL",
            "type": "page_url"
          },
          {
            "name": "Page_Title",
            "type": "text",
            "selector": "css=head title"
          },
          {
            "name": "Total_Links",
            "type": "count",
            "selector": "css=a[href]"
          },
          {
            "name": "Root_Relative_Links",
            "type": "count",
            "selector": "css=a[href^='/']"
          },
          {
            "name": "Protocol_Relative",
            "type": "count",
            "selector": "css=a[href^='//']"
          },
          {
            "name": "Absolute_HTTP_Links",
            "type": "count",
            "selector": "css=a[href^='http']"
          },
          {
            "name": "Fragment_Links",
            "type": "count",
            "selector": "css=a[href^='#']"
          },
          {
            "name": "Mailto_Links",
            "type": "count",
            "selector": "css=a[href^='mailto:']"
          },
          {
            "name": "Tel_Links",
            "type": "count",
            "selector": "css=a[href^='tel:']"
          },
          {
            "name": "Javascript_Links",
            "type": "count",
            "selector": "css=a[href^='javascript:']"
          },
          {
            "name": "No_Href_Anchors",
            "type": "count",
            "selector": "css=a:not([href])"
          },
          {
            "name": "HTTP_Status",
            "type": "text",
            "selector": "variable=last_http_status"
          },
          {
            "name": "Final_URL",
            "type": "text",
            "selector": "variable=last_final_url"
          },
          {
            "name": "Redirect_Count",
            "type": "text",
            "selector": "variable=last_redirect_count"
          },
          {
            "name": "Response_Time_ms",
            "type": "text",
            "selector": "variable=last_response_time_ms"
          },
          {
            "name": "Content_Type",
            "type": "text",
            "selector": "variable=last_content_type"
          },
          {
            "name": "Server",
            "type": "text",
            "selector": "variable=last_server"
          },
          {
            "name": "Protocol",
            "type": "text",
            "selector": "variable=last_protocol"
          },
          {
            "name": "Navigation_OK",
            "type": "text",
            "selector": "variable=last_navigation_ok"
          },
          {
            "name": "Error",
            "type": "text",
            "selector": "variable=last_navigation_error"
          }
        ],
        "required_fields": [
          "Page_URL"
        ]
      },
      "Link_Census": {
        "item_selector": "css=html",
        "properties": [
          {
            "name": "Page_URL",
            "type": "page_url"
          },
          {
            "name": "Link_Audit",
            "type": "list",
            "selector": "css=a[href]",
            "transformations": [
              {
                "type": "script",
                "code": "var rows=Array.isArray(value)?value:[];var origin='';for(var k=0;k<rows.length;k++){if(rows[k]&&rows[k].origin){origin=String(rows[k].origin);break;}}var hostname='';try{hostname=origin?new URL(origin).hostname:'';}catch(e){hostname='';}var total=rows.length,internal=0,external=0,fragment=0,mailto=0,tel=0,jsLinks=0,emptyHref=0,otherScheme=0,invalid=0;var internalSet={},externalSet={},hostCounts={},externalSamples=[];for(var i=0;i<rows.length;i++){var rawVal=rows[i]?rows[i].href:null;if(rawVal===null||rawVal===undefined){invalid++;continue;}var raw=String(rawVal).trim();if(raw===''){emptyHref++;continue;}if(raw.charAt(0)==='#'){fragment++;continue;}var lower=raw.toLowerCase();if(lower.indexOf('javascript:')===0){jsLinks++;continue;}if(lower.indexOf('mailto:')===0){mailto++;continue;}if(lower.indexOf('tel:')===0){tel++;continue;}if(lower.indexOf('data:')===0||lower.indexOf('blob:')===0){otherScheme++;continue;}var abs=null;try{abs=new URL(raw,origin||undefined);}catch(e){abs=null;}if(abs===null){invalid++;continue;}if(abs.protocol!=='http:'&&abs.protocol!=='https:'){otherScheme++;continue;}var key=abs.origin+abs.pathname+abs.search;var h=abs.hostname;var sameSite=hostname!==''&&(h===hostname||h==='www.'+hostname||hostname==='www.'+h);if(sameSite){internal++;internalSet[key]=true;}else{external++;externalSet[key]=true;hostCounts[h]=(hostCounts[h]||0)+1;if(externalSamples.length<8&&externalSamples.indexOf(key)===-1){externalSamples.push(key);}}}var pairs=Object.keys(hostCounts).map(function(h){return [h,hostCounts[h]];});pairs.sort(function(a,b){return b[1]-a[1];});var top=pairs.slice(0,10).map(function(p){return p[0]+' ('+p[1]+')';});return {origin:origin,href:externalSamples.join(' | '),total:total,internal:internal,external:external,unique_internal:Object.keys(internalSet).length,unique_external:Object.keys(externalSet).length,unique_external_domains:pairs.length,fragment_links:fragment,mailto_links:mailto,tel_links:tel,javascript_links:jsLinks,empty_href:emptyHref,other_scheme:otherScheme,invalid:invalid,top_external_domains:top.join(', ')};"
              }
            ],
            "properties": [
              {
                "name": "origin",
                "type": "page_url",
                "selector": ""
              },
              {
                "name": "href",
                "type": "attribute",
                "selector": "css=self",
                "attribute": "href"
              },
              {
                "name": "total",
                "type": "index"
              },
              {
                "name": "internal",
                "type": "index"
              },
              {
                "name": "external",
                "type": "index"
              },
              {
                "name": "unique_internal",
                "type": "index"
              },
              {
                "name": "unique_external",
                "type": "index"
              },
              {
                "name": "unique_external_domains",
                "type": "index"
              },
              {
                "name": "fragment_links",
                "type": "index"
              },
              {
                "name": "mailto_links",
                "type": "index"
              },
              {
                "name": "tel_links",
                "type": "index"
              },
              {
                "name": "javascript_links",
                "type": "index"
              },
              {
                "name": "empty_href",
                "type": "index"
              },
              {
                "name": "top_external_domains",
                "type": "index"
              }
            ]
          }
        ],
        "required_fields": [
          "Page_URL"
        ]
      },
      "High_Link_Pages": {
        "item_selector": "css=html",
        "properties": [
          {
            "name": "URL",
            "type": "page_url"
          },
          {
            "name": "Total_Links",
            "type": "count",
            "selector": "css=a[href]"
          },
          {
            "name": "Absolute_HTTP",
            "type": "count",
            "selector": "css=a[href^='http']"
          },
          {
            "name": "Root_Relative",
            "type": "count",
            "selector": "css=a[href^='/']"
          },
          {
            "name": "HTTP_Status",
            "type": "text",
            "selector": "variable=last_http_status"
          }
        ],
        "required_fields": [
          "URL"
        ]
      },
      "Good_Link_Partners": {
        "item_selector": "css=html",
        "properties": [
          {
            "name": "URL",
            "type": "page_url"
          },
          {
            "name": "Total_Links",
            "type": "count",
            "selector": "css=a[href]"
          },
          {
            "name": "Absolute_HTTP",
            "type": "count",
            "selector": "css=a[href^='http']"
          },
          {
            "name": "Root_Relative",
            "type": "count",
            "selector": "css=a[href^='/']"
          },
          {
            "name": "HTTP_Status",
            "type": "text",
            "selector": "variable=last_http_status"
          }
        ],
        "required_fields": [
          "URL"
        ]
      }
    },
    "commands": [
      {
        "command": "extract_data",
        "params": {
          "dataset": "Outbound_Links"
        }
      },
      {
        "command": "extract_data",
        "params": {
          "dataset": "Link_Census"
        }
      },
      {
        "command": "extract_data",
        "params": {
          "dataset": "High_Link_Pages",
          "filter_condition": "Number(item.Total_Links) > Number('${max_outbound_links}')"
        }
      },
      {
        "command": "extract_data",
        "params": {
          "dataset": "Good_Link_Partners",
          "filter_condition": "Number(item.Total_Links) <= Number('${max_outbound_links}')"
        }
      }
    ],
    "authors": []
  }
}