Skip to main content
RTILA Marketplace

On-Page SEO Auditor - project configuration

Audit any URL list for indexability, metadata, readability, links, structured data and accessibility - on your own machine.

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

    BOT_on-page-seo-auditor.exe

    98.9 MB

    Download
  • macOS Apple Silicon chmod +x

    BOT_on-page-seo-auditor.sh

    87.5 MB

    Download
  • macOS Intel chmod +x

    BOT_on-page-seo-auditor.sh

    99.4 MB

    Download
  • Linux x86_64 chmod +x

    BOT_on-page-seo-auditor.sh

    122.5 MB

    Download

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

This tab presents the complete project configuration exactly as published - the same JSON the launcher fetches at launch - ready to read, copy, or import into the desktop product. Back to the overview tab.

Project configuration

Full project JSON for on-page-seo-auditor

Canonical byte length: 146,424 - the length of the canonical form the digest covers.

Canonical digest: fcba8379586e34cd2b9564a664ae92917d9529ba32604229dabe23f9c0d6e430

About the delivered configuration encoding

At launch the backend delivers this configuration to the launcher as plain JSON. The block below is the complete project definition the launcher receives.

What you are reading has machine-readable equivalents, and the JSON at those routes is the same document as the JSON rendered on this page: the listing overview, the per-listing detail document and the configuration document. The digest and byte count shown in the panel header are computed over that document's canonical JSON form - recursively sorted keys, two-space indentation, no trailing newline - which is the form the provisioning pipeline signs and the reconcile control re-digests; it differs from the highlighted block above in key order and by that trailing newline, so hashing the visible text will not reproduce the digest.

Download this JSON
{
  "name": "On-Page SEO Auditor",
  "settings": {
    "urls": [
      "${urls_to_audit}"
    ],
    "headless": false,
    "max_concurrent_workers": 4,
    "humanoidEnabled": false,
    "proxyEnabled": false,
    "captchaEnabled": false,
    "matchTimezoneAndLocale": false,
    "block_resources": false,
    "get_urls_from_sitemap": false,
    "respect_robots_txt": false,
    "skip_initial_navigation": true,
    "variables": [
      {
        "name": "urls_to_audit",
        "value": "https://rtila.com/\nhttps://example.com/",
        "required": true,
        "is_list": true
      },
      {
        "name": "title_pixel_limit",
        "value": "580",
        "required": false,
        "is_list": false
      },
      {
        "name": "desc_pixel_limit",
        "value": "990",
        "required": false,
        "is_list": false
      },
      {
        "name": "low_content_words",
        "value": "300",
        "required": false,
        "is_list": false
      },
      {
        "name": "max_outbound_links",
        "value": "100",
        "required": false,
        "is_list": false
      }
    ]
  },
  "datasets": {
    "Response_Indexability": {
      "item_selector": "css=html",
      "properties": [
        {
          "name": "Page_URL",
          "type": "page_url",
          "selector": ""
        },
        {
          "name": "Final_URL",
          "type": "text",
          "selector": "variable=last_final_url"
        },
        {
          "name": "Status_Code",
          "type": "text",
          "selector": "variable=last_http_status"
        },
        {
          "name": "Status_Text",
          "type": "text",
          "selector": "variable=last_http_status_text"
        },
        {
          "name": "Navigation_OK",
          "type": "text",
          "selector": "variable=last_navigation_ok"
        },
        {
          "name": "Navigation_Error",
          "type": "text",
          "selector": "variable=last_navigation_error"
        },
        {
          "name": "Response_Time_ms",
          "type": "text",
          "selector": "variable=last_response_time_ms"
        },
        {
          "name": "HTTP_Protocol",
          "type": "text",
          "selector": "variable=last_protocol"
        },
        {
          "name": "Server_Header",
          "type": "text",
          "selector": "variable=last_server"
        },
        {
          "name": "Content_Type",
          "type": "text",
          "selector": "variable=last_content_type"
        },
        {
          "name": "Charset_Header",
          "type": "text",
          "selector": "variable=last_charset"
        },
        {
          "name": "Content_Length",
          "type": "text",
          "selector": "variable=last_content_length"
        },
        {
          "name": "Cache_Control",
          "type": "text",
          "selector": "variable=last_cache_control"
        },
        {
          "name": "ETag",
          "type": "text",
          "selector": "variable=last_etag"
        },
        {
          "name": "Last_Modified",
          "type": "text",
          "selector": "variable=last_last_modified"
        },
        {
          "name": "X_Robots_Tag",
          "type": "text",
          "selector": "variable=last_x_robots_tag"
        },
        {
          "name": "Redirect_Count",
          "type": "text",
          "selector": "variable=last_redirect_count"
        },
        {
          "name": "Set_Cookie_Names",
          "type": "text",
          "selector": "variable=last_set_cookie_names",
          "transformations": [
            {
              "type": "script",
              "code": "if(!value)return '';if(Array.isArray(value))return value.join(', ');if(typeof value==='object')return Object.keys(value).join(', ');return String(value);",
              "default_value": ""
            }
          ]
        },
        {
          "name": "Redirect_Chain",
          "type": "text",
          "selector": "variable=last_redirect_chain",
          "transformations": [
            {
              "type": "script",
              "code": "if(!Array.isArray(value)||!value.length)return '';return value.map(function(h){return (h&&h.status?h.status:'?')+' '+(h&&h.url?h.url:'')+(h&&h.location?' -> '+h.location:'');}).join(' | ');",
              "default_value": ""
            }
          ]
        },
        {
          "name": "All_Response_Headers",
          "type": "text",
          "selector": "variable=last_response_headers",
          "transformations": [
            {
              "type": "script",
              "code": "if(!value)return '';try{return JSON.stringify(value);}catch(e){return String(value);}",
              "default_value": ""
            }
          ]
        },
        {
          "name": "Status_Class",
          "type": "text",
          "selector": "variable=last_http_status",
          "transformations": [
            {
              "type": "script",
              "code": "var n=Number(value);if(!isFinite(n)||n===0)return '0xx No Response';if(n<200)return '1xx Informational';if(n<300)return '2xx Success';if(n<400)return '3xx Redirect';if(n<500)return '4xx Client Error';return '5xx Server Error';",
              "default_value": "0xx No Response"
            }
          ]
        },
        {
          "name": "Is_Success",
          "type": "text",
          "selector": "variable=last_http_status",
          "transformations": [
            {
              "type": "script",
              "code": "var n=Number(value);return String(isFinite(n)&&n>=200&&n<300);",
              "default_value": "false"
            }
          ]
        },
        {
          "name": "Is_Redirect",
          "type": "text",
          "selector": "variable=last_http_status",
          "transformations": [
            {
              "type": "script",
              "code": "var n=Number(value);return String(isFinite(n)&&n>=300&&n<400);",
              "default_value": "false"
            }
          ]
        },
        {
          "name": "Is_Client_Error",
          "type": "text",
          "selector": "variable=last_http_status",
          "transformations": [
            {
              "type": "script",
              "code": "var n=Number(value);return String(isFinite(n)&&n>=400&&n<500);",
              "default_value": "false"
            }
          ]
        },
        {
          "name": "Is_Server_Error",
          "type": "text",
          "selector": "variable=last_http_status",
          "transformations": [
            {
              "type": "script",
              "code": "var n=Number(value);return String(isFinite(n)&&n>=500);",
              "default_value": "false"
            }
          ]
        },
        {
          "name": "URL_Length",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "return String(String(value).length);",
              "default_value": "0"
            }
          ]
        },
        {
          "name": "URL_Depth",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "try{return String(new URL(String(value)).pathname.split('/').filter(function(s){return s.length>0;}).length);}catch(e){return '0';}",
              "default_value": "0"
            }
          ]
        },
        {
          "name": "URL_Protocol",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "try{return new URL(String(value)).protocol.replace(':','');}catch(e){return '';}",
              "default_value": ""
            }
          ]
        },
        {
          "name": "URL_Host",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "try{return new URL(String(value)).hostname;}catch(e){return '';}",
              "default_value": ""
            }
          ]
        },
        {
          "name": "URL_Path",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "try{return new URL(String(value)).pathname;}catch(e){return '';}",
              "default_value": ""
            }
          ]
        },
        {
          "name": "URL_Query_String",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "try{return new URL(String(value)).search.replace(/^\\?/,'');}catch(e){return '';}",
              "default_value": ""
            }
          ]
        },
        {
          "name": "URL_Fragment",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "try{return new URL(String(value)).hash.replace(/^#/,'');}catch(e){return '';}",
              "default_value": ""
            }
          ]
        },
        {
          "name": "URL_Param_Count",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "try{return String(Array.from(new URL(String(value)).searchParams.keys()).length);}catch(e){return '0';}",
              "default_value": "0"
            }
          ]
        },
        {
          "name": "URL_Param_Names",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "try{return Array.from(new URL(String(value)).searchParams.keys()).join(', ');}catch(e){return '';}",
              "default_value": ""
            }
          ]
        },
        {
          "name": "URL_Has_Parameters",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "try{return String(new URL(String(value)).search.length>1);}catch(e){return 'false';}",
              "default_value": "false"
            }
          ]
        },
        {
          "name": "URL_Has_Fragment",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "try{return String(new URL(String(value)).hash.length>1);}catch(e){return 'false';}",
              "default_value": "false"
            }
          ]
        },
        {
          "name": "URL_Has_Session_ID",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "return String(/(?:^|[?&;/])(phpsessid|jsessionid|aspsessionid[a-z]*|sid|sessionid|session_id|cfid|cftoken)(?:=|;|$)/i.test(String(value)));",
              "default_value": "false"
            }
          ]
        },
        {
          "name": "URL_Tracking_Params",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "var m=String(value).match(/[?&](utm_[a-z]+|gclid|fbclid|msclkid|dclid|gbraid|wbraid|twclid|igshid|mc_[a-z]+|yclid|_ga|_hs[a-z]+|vero_[a-z]+|ref|source|medium|campaign)(?==|&|$)/gi);if(!m)return '';var out=[];for(var i=0;i<m.length;i++){var k=m[i].replace(/^[?&]/,'');if(out.indexOf(k)===-1)out.push(k);}return out.join(', ');",
              "default_value": ""
            }
          ]
        },
        {
          "name": "URL_File_Extension",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "try{var p=new URL(String(value)).pathname;var m=p.match(/\\.([a-z0-9]{1,5})$/i);return m?m[1].toLowerCase():'';}catch(e){return '';}",
              "default_value": ""
            }
          ]
        },
        {
          "name": "URL_Is_Non_HTML",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "return String(/\\.(pdf|docx?|xlsx?|pptx?|zip|rar|gz|tar|7z|exe|dmg|csv|txt|rtf|epub|mp[34]|avi|mov|wmv|flv|webm|png|jpe?g|gif|svg|webp|ico|css|js|json|xml)(?:$|\\?)/i.test(String(value)));",
              "default_value": "false"
            }
          ]
        },
        {
          "name": "URL_Word_Count",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "try{var p=new URL(String(value)).pathname;return String(p.split(/[\\/_\\-\\.]+/).filter(function(s){return s.length>1;}).length);}catch(e){return '0';}",
              "default_value": "0"
            }
          ]
        },
        {
          "name": "URL_Uses_Underscores",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "try{return String(new URL(String(value)).pathname.indexOf('_')!==-1);}catch(e){return 'false';}",
              "default_value": "false"
            }
          ]
        },
        {
          "name": "URL_Has_Uppercase",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "try{var p=new URL(String(value)).pathname;return String(p!==p.toLowerCase());}catch(e){return 'false';}",
              "default_value": "false"
            }
          ]
        },
        {
          "name": "URL_Is_Secure",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "try{return String(new URL(String(value)).protocol==='https:');}catch(e){return 'false';}",
              "default_value": "false"
            }
          ]
        },
        {
          "name": "URL_Is_Pretty",
          "type": "page_url",
          "selector": "",
          "transformations": [
            {
              "type": "script",
              "code": "try{var u=new URL(String(value));return String(u.search.length<=1 && !/\\.[a-z0-9]{2,5}$/i.test(u.pathname) && u.pathname===u.pathname.toLowerCase());}catch(e){return 'false';}",
              "default_value": "false"
            }
          ]
        },
        {
          "name": "Meta_Robots",
          "type": "attribute",
          "selector": "css=meta[name='robots']",
          "attribute": "content"
        },
        {
          "name": "Meta_Robots_Count",
          "type": "count",
          "selector": "css=meta[name='robots']"
        },
        {
          "name": "Meta_Robots_All",
          "type": "text",
          "selector": "css=meta[name='robots']"
        },
        {
          "name": "Canonical_URL",
          "type": "attribute",
          "selector": "css=link[rel='canonical']",
          "attribute": "href"
        },
        {
          "name": "Canonical_Count",
          "type": "count",
          "selector": "css=link[rel='canonical']"
        },
        {
          "name": "Meta_Refresh",
          "type": "attribute",
          "selector": "css=meta[http-equiv='refresh' i]",
          "attribute": "content"
        },
        {
          "name": "Base_Href",
          "type": "attribute",
          "selector": "css=base[href]",
          "attribute": "href"
        },
        {
          "name": "HTML_Lang",
          "type": "attribute",
          "selector": "css=html",
          "attribute": "lang"
        },
        {
          "name": "Charset_Meta",
          "type": "attribute",
          "selector": "css=meta[charset]",
          "attribute": "charset"
        },
        {
          "name": "Viewport_Content",
          "type": "attribute",
          "selector": "css=meta[name='viewport']",
          "attribute": "content"
        },
        {
          "name": "Indexability",
          "type": "list",
          "selector": "css=self",
          "transformations": [
            {
              "type": "script",
              "code": "var it=(Array.isArray(value)&&value.length)?value[0]:{};function s(x){return (x===null||x===undefined)?\"\":String(x);}function lo(x){return s(x).toLowerCase();}function n(x){var v=parseInt(x,10);return isFinite(v)?v:0;}var pageUrl=s(it.page_url),finalUrl=s(it.final_url)||pageUrl;var statusNum=(it.status===null||it.status===undefined||it.status===\"\")?0:Number(it.status);if(!isFinite(statusNum))statusNum=0;var pu=null,fu=null;try{pu=new URL(pageUrl);}catch(e){}try{fu=new URL(finalUrl);}catch(e){}var metaRaw=s(it.metarobots),xRaw=s(it.xrobots);var combined=(metaRaw+\", \"+xRaw).toLowerCase();var has=function(d){return combined.indexOf(d)!==-1;};var directives=[];combined.split(\",\").forEach(function(d){d=d.trim();if(d)directives.push(d);});function dv(name){for(var i=0;i<directives.length;i++){var p=directives[i].split(\":\");if(p[0].trim()===name)return p.slice(1).join(\":\").trim();}return \"\";}var noindex=has(\"noindex\")||has(\"none\");var nofollow=has(\"nofollow\")||has(\"none\");var noindexSources=[];if(lo(metaRaw).indexOf(\"noindex\")!==-1||lo(metaRaw).indexOf(\"none\")!==-1)noindexSources.push(\"meta robots\");if(lo(xRaw).indexOf(\"noindex\")!==-1||lo(xRaw).indexOf(\"none\")!==-1)noindexSources.push(\"X-Robots-Tag\");var ct=lo(it.content_type);var isHtml=ct.indexOf(\"html\")!==-1||ct===\"\";var isPdf=ct.indexOf(\"pdf\")!==-1;var isDoc=!isHtml&&ct!==\"\";var blockers=[];if(statusNum===0)blockers.push(\"No HTTP response\");else if(statusNum>=400)blockers.push(\"HTTP \"+statusNum);if(noindexSources.length)blockers.push(\"noindex (\"+noindexSources.join(\" + \")+\")\");if(s(it.metarefresh).trim()!==\"\")blockers.push(\"meta refresh\");if(!isHtml)blockers.push(\"Non-HTML content type: \"+ct);var indexable=blockers.length===0;var canonRaw=s(it.canonical).trim(),canonCount=n(it.canonical_n);var canonAbs=/^https?:\\/\\//i.test(canonRaw),canonUrl=\"\",cu=null;if(canonRaw){try{cu=new URL(canonRaw,pageUrl);canonUrl=cu.href;}catch(e){canonUrl=canonRaw;}}var canonSelf=(cu&&pu)?(cu.origin===pu.origin&&cu.pathname===pu.pathname&&cu.search===pu.search):false;var canonFinal=(cu&&fu)?(cu.origin===fu.origin&&cu.pathname===fu.pathname&&cu.search===fu.search):false;var canonIssues=[];if(!canonRaw)canonIssues.push(\"Missing\");if(canonCount>1)canonIssues.push(\"Multiple (\"+canonCount+\")\");if(canonRaw&&!canonAbs)canonIssues.push(\"Relative\");if(canonRaw&&cu&&pu&&cu.protocol!==pu.protocol)canonIssues.push(\"Scheme mismatch\");if(canonRaw&&cu&&pu&&cu.hostname!==pu.hostname)canonIssues.push(\"Cross-host\");if(canonRaw&&cu&&cu.search.indexOf(\"=\")!==-1)canonIssues.push(\"Has parameters\");if(canonRaw&&!canonSelf&&!canonFinal)canonIssues.push(\"Points elsewhere\");var mr=s(it.metarefresh).trim(),mrDelay=null,mrTarget=\"\";if(mr){var m1=mr.match(/^\\s*(\\d+)\\s*;\\s*url\\s*=\\s*(.+)$/i);if(m1){mrDelay=parseInt(m1[1],10);mrTarget=m1[2].trim().replace(/^['\"]|['\"]$/g,\"\");}else{var m2=mr.match(/^\\s*(\\d+)/);if(m2)mrDelay=parseInt(m2[1],10);}}var hostChanged=(pu&&fu)?(pu.hostname!==fu.hostname):false;var protoUp=(pu&&fu)?(pu.protocol!==fu.protocol):false;var wwwChanged=(pu&&fu)?(pu.hostname.replace(/^www\\./,\"\")!==fu.hostname.replace(/^www\\./,\"\")):false;var slashChanged=(pu&&fu)?((pu.pathname.slice(-1)===\"/\")!==(fu.pathname.slice(-1)===\"/\")):false;var caseChanged=(pu&&fu)?(pu.pathname!==fu.pathname&&pu.pathname.toLowerCase()===fu.pathname.toLowerCase()):false;var pathChanged=(pu&&fu)?(pu.pathname!==fu.pathname):false;var paramsChanged=(pu&&fu)?(pu.search!==fu.search):false;var metaCharset=lo(it.charset_meta),hdrCharset=lo(it.charset_hdr);var charsetMatch=(!metaCharset||!hdrCharset)?null:(metaCharset===hdrCharset);var vp=s(it.viewport).trim();var vpPresent=vp!==\"\";var vpBlocks=vpPresent&&(vp.indexOf(\"user-scalable=no\")!==-1||/maximum-scale\\s*=\\s*1(\\.0)?\\b/.test(vp));var cookies=Array.isArray(it.cookies)?it.cookies:[];var cookieStr=cookies.join(\",\").toLowerCase();return {indexable:String(indexable),indexability_verdict:indexable?\"Indexable\":\"Non-Indexable\",indexability_blockers:blockers.join(\"; \"),noindex:String(noindex),noindex_sources:noindexSources.join(\", \"),nofollow:String(nofollow),noarchive:String(has(\"noarchive\")),nosnippet:String(has(\"nosnippet\")),noimageindex:String(has(\"noimageindex\")),max_snippet:dv(\"max-snippet\"),max_image_preview:dv(\"max-image-preview\"),max_video_preview:dv(\"max-video-preview\"),unavailable_after:dv(\"unavailable_after\"),robots_directives_all:directives.join(\", \"),canonical_is_self:String(canonSelf),canonical_is_absolute:String(canonAbs),canonical_resolved:canonUrl,canonical_issues:canonIssues.join(\"; \"),canonical_verdict:canonIssues.length===0?\"OK\":canonIssues.join(\"; \"),host_changed:String(hostChanged),protocol_upgraded:String(protoUp),www_changed:String(wwwChanged),trailing_slash_changed:String(slashChanged),case_changed:String(caseChanged),path_changed:String(pathChanged),params_changed:String(paramsChanged),meta_refresh_present:String(mr!==\"\"),meta_refresh_delay:mrDelay===null?\"\":String(mrDelay),meta_refresh_target:mrTarget,content_type_is_html:String(isHtml),is_pdf:String(isPdf),is_document_resource:String(isDoc),charset_matches_header:charsetMatch===null?\"\":String(charsetMatch),charset_declared:String(metaCharset!==\"\"||hdrCharset!==\"\"),viewport_present:String(vpPresent),viewport_blocks_scaling:String(vpBlocks),is_mobile_friendly:String(vpPresent&&!vpBlocks),html_lang_present:String(s(it.html_lang).trim()!==\"\"),cookie_count:String(cookies.length),has_analytics_cookie:String(/_ga|ga_|_gid|_utm|_fbp|_fbc|_hj/.test(cookieStr)),has_session_cookie:String(/sess|jsessionid|phpsessid|sid|cfid|cftoken|asp\\.net_sessionid/.test(cookieStr))};"
            }
          ],
          "properties": [
            {
              "name": "page_url",
              "type": "page_url",
              "selector": ""
            },
            {
              "name": "final_url",
              "type": "text",
              "selector": "variable=last_final_url"
            },
            {
              "name": "status",
              "type": "text",
              "selector": "variable=last_http_status"
            },
            {
              "name": "xrobots",
              "type": "text",
              "selector": "variable=last_x_robots_tag"
            },
            {
              "name": "content_type",
              "type": "text",
              "selector": "variable=last_content_type"
            },
            {
              "name": "charset_hdr",
              "type": "text",
              "selector": "variable=last_charset"
            },
            {
              "name": "protocol",
              "type": "text",
              "selector": "variable=last_protocol"
            },
            {
              "name": "metarobots",
              "type": "text",
              "selector": "css=meta[name='robots']"
            },
            {
              "name": "canonical",
              "type": "attribute",
              "selector": "css=link[rel='canonical']",
              "attribute": "href"
            },
            {
              "name": "canonical_n",
              "type": "count",
              "selector": "css=link[rel='canonical']"
            },
            {
              "name": "metarefresh",
              "type": "attribute",
              "selector": "css=meta[http-equiv='refresh' i]",
              "attribute": "content"
            },
            {
              "name": "charset_meta",
              "type": "attribute",
              "selector": "css=meta[charset]",
              "attribute": "charset"
            },
            {
              "name": "viewport",
              "type": "attribute",
              "selector": "css=meta[name='viewport']",
              "attribute": "content"
            },
            {
              "name": "html_lang",
              "type": "attribute",
              "selector": "css=html",
              "attribute": "lang"
            },
            {
              "name": "cookies",
              "type": "text",
              "selector": "variable=last_set_cookie_names"
            },
            {
              "name": "indexable",
              "type": "index"
            },
            {
              "name": "indexability_verdict",
              "type": "index"
            },
            {
              "name": "indexability_blockers",
              "type": "index"
            },
            {
              "name": "noindex",
              "type": "index"
            },
            {
              "name": "noindex_sources",
              "type": "index"
            },
            {
              "name": "nofollow",
              "type": "index"
            },
            {
              "name": "noarchive",
              "type": "index"
            },
            {
              "name": "nosnippet",
              "type": "index"
            },
            {
              "name": "noimageindex",
              "type": "index"
            },
            {
              "name": "max_snippet",
              "type": "index"
            },
            {
              "name": "max_image_preview",
              "type": "index"
            },
            {
              "name": "max_video_preview",
              "type": "index"
            },
            {
              "name": "unavailable_after",
              "type": "index"
            },
            {
              "name": "robots_directives_all",
              "type": "index"
            },
            {
              "name": "canonical_is_self",
              "type": "index"
            },
            {
              "name": "canonical_is_absolute",
              "type": "index"
            },
            {
              "name": "canonical_resolved",
              "type": "index"
            },
            {
              "name": "canonical_issues",
              "type": "index"
            },
            {
              "name": "canonical_verdict",
              "type": "index"
            },
            {
              "name": "host_changed",
              "type": "index"
            },
            {
              "name": "protocol_upgraded",
              "type": "index"
            },
            {
              "name": "www_changed",
              "type": "index"
            },
            {
              "name": "trailing_slash_changed",
              "type": "index"
            },
            {
              "name": "case_changed",
              "type": "index"
            },
            {
              "name": "path_changed",
              "type": "index"
            },
            {
              "name": "params_changed",
              "type": "index"
            },
            {
              "name": "meta_refresh_present",
              "type": "index"
            },
            {
              "name": "meta_refresh_delay",
              "type": "index"
            },
            {
              "name": "meta_refresh_target",
              "type": "index"
            },
            {
              "name": "content_type_is_html",
              "type": "index"
            },
            {
              "name": "is_pdf",
              "type": "index"
            },
            {
              "name": "is_document_resource",
              "type": "index"
            },
            {
              "name": "charset_matches_header",
              "type": "index"
            },
            {
              "name": "charset_declared",
              "type": "index"
            },
            {
              "name": "viewport_present",
              "type": "index"
            },
            {
              "name": "viewport_blocks_scaling",
              "type": "index"
            },
            {
              "name": "is_mobile_friendly",
              "type": "index"
            },
            {
              "name": "html_lang_present",
              "type": "index"
            },
            {
              "name": "cookie_count",
              "type": "index"
            },
            {
              "name": "has_analytics_cookie",
              "type": "index"
            },
            {
              "name": "has_session_cookie",
              "type": "index"
            }
          ]
        },
        {
          "name": "Security",
          "type": "list",
          "selector": "css=self",
          "transformations": [
            {
              "type": "script",
              "code": "var it=(Array.isArray(value)&&value.length)?value[0]:{};var h=(it.headers&&typeof it.headers===\"object\")?it.headers:{};function g(n){var v=h[n];return (typeof v===\"string\")?v:\"\";}function lo(x){return String(x).toLowerCase();}var hsts=g(\"strict-transport-security\");var hm=hsts.match(/max-age\\s*=\\s*(\\d+)/i);var hstsDays=hm?Math.round(parseInt(hm[1],10)/86400):0;var csp=g(\"content-security-policy\")||g(\"content-security-policy-report-only\");var xfo=g(\"x-frame-options\");var xcto=g(\"x-content-type-options\");var rp=g(\"referrer-policy\");var pp=g(\"permissions-policy\")||g(\"feature-policy\");var xxp=g(\"x-xss-protection\");var coop=g(\"cross-origin-opener-policy\");var coep=g(\"cross-origin-embedder-policy\");var corp=g(\"cross-origin-resource-policy\");var srv=g(\"server\");var leak=/\\d+\\.\\d+/.test(srv)?srv:\"\";var powered=g(\"x-powered-by\")||g(\"x-aspnet-version\")||g(\"x-aspnetmvc-version\");var present=[],missing=[];if(hsts)present.push(\"HSTS\");else missing.push(\"Strict-Transport-Security\");if(csp)present.push(\"CSP\");else missing.push(\"Content-Security-Policy\");if(xfo)present.push(\"X-Frame-Options\");else missing.push(\"X-Frame-Options\");if(lo(xcto)===\"nosniff\")present.push(\"X-Content-Type-Options\");else missing.push(\"X-Content-Type-Options\");if(rp)present.push(\"Referrer-Policy\");else missing.push(\"Referrer-Policy\");if(pp)present.push(\"Permissions-Policy\");else missing.push(\"Permissions-Policy\");if(coop)present.push(\"COOP\");else missing.push(\"Cross-Origin-Opener-Policy\");var score=Math.round((present.length/7)*100);var grade=score>=90?\"A\":score>=75?\"B\":score>=55?\"C\":score>=35?\"D\":\"F\";var pageUrl=String(it.page_url||\"\");var isHttps=/^https:/i.test(pageUrl);return {hsts:hsts,hsts_max_age_days:String(hstsDays),hsts_includesubdomains:String(hsts.toLowerCase().indexOf(\"includesubdomains\")!==-1),hsts_preload:String(hsts.toLowerCase().indexOf(\"preload\")!==-1),csp:csp,csp_unsafe_inline:String(csp.indexOf(\"unsafe-inline\")!==-1),csp_unsafe_eval:String(csp.indexOf(\"unsafe-eval\")!==-1),x_frame_options:xfo,x_content_type_options:xcto,referrer_policy:rp,permissions_policy:pp,x_xss_protection:xxp,coop:coop,coep:coep,corp:corp,server_version_leak:leak,powered_by_leak:powered,headers_present:present.join(\", \"),headers_missing:missing.join(\", \"),security_score:String(score),security_grade:grade,mixed_content_risk:String(isHttps?\"Check outlinks for http:// resources\":\"Page served over HTTP\"),header_count:String(Object.keys(h).length)};"
            }
          ],
          "properties": [
            {
              "name": "headers",
              "type": "text",
              "selector": "variable=last_response_headers"
            },
            {
              "name": "page_url",
              "type": "page_url",
              "selector": ""
            },
            {
              "name": "hsts",
              "type": "index"
            },
            {
              "name": "hsts_max_age_days",
              "type": "index"
            },
            {
              "name": "hsts_includesubdomains",
              "type": "index"
            },
            {
              "name": "hsts_preload",
              "type": "index"
            },
            {
              "name": "csp",
              "type": "index"
            },
            {
              "name": "csp_unsafe_inline",
              "type": "index"
            },
            {
              "name": "csp_unsafe_eval",
              "type": "index"
            },
            {
              "name": "x_frame_options",
              "type": "index"
            },
            {
              "name": "x_content_type_options",
              "type": "index"
            },
            {
              "name": "referrer_policy",
              "type": "index"
            },
            {
              "name": "permissions_policy",
              "type": "index"
            },
            {
              "name": "x_xss_protection",
              "type": "index"
            },
            {
              "name": "coop",
              "type": "index"
            },
            {
              "name": "coep",
              "type": "index"
            },
            {
              "name": "corp",
              "type": "index"
            },
            {
              "name": "server_version_leak",
              "type": "index"
            },
            {
              "name": "powered_by_leak",
              "type": "index"
            },
            {
              "name": "headers_present",
              "type": "index"
            },
            {
              "name": "headers_missing",
              "type": "index"
            },
            {
              "name": "security_score",
              "type": "index"
            },
            {
              "name": "security_grade",
              "type": "index"
            },
            {
              "name": "mixed_content_risk",
              "type": "index"
            },
            {
              "name": "header_count",
              "type": "index"
            }
          ]
        }
      ],
      "required_fields": [
        "Page_URL"
      ]
    },
    "OnPage_Elements": {
      "item_selector": "css=html",
      "properties": [
        {
          "name": "Page_URL",
          "type": "page_url",
          "selector": ""
        },
        {
          "name": "Title",
          "type": "text",
          "selector": "css=head title",
          "transformations": [
            {
              "type": "trim"
            }
          ]
        },
        {
          "name": "Title_Count",
          "type": "count",
          "selector": "css=head title"
        },
        {
          "name": "Meta_Description",
          "type": "attribute",
          "selector": "css=meta[name='description']",
          "attribute": "content"
        },
        {
          "name": "Meta_Description_Count",
          "type": "count",
          "selector": "css=meta[name='description']"
        },
        {
          "name": "Meta_Keywords",
          "type": "attribute",
          "selector": "css=meta[name='keywords']",
          "attribute": "content"
        },
        {
          "name": "Meta_Author",
          "type": "attribute",
          "selector": "css=meta[name='author']",
          "attribute": "content"
        },
        {
          "name": "Meta_Robots",
          "type": "text",
          "selector": "css=meta[name='robots']"
        },
        {
          "name": "Meta_Google_Site_Verification",
          "type": "attribute",
          "selector": "css=meta[name='google-site-verification']",
          "attribute": "content"
        },
        {
          "name": "Generator",
          "type": "attribute",
          "selector": "css=meta[name='generator']",
          "attribute": "content"
        },
        {
          "name": "Favicon",
          "type": "attribute",
          "selector": "css=link[rel='icon'],link[rel='shortcut icon'],link[rel='apple-touch-icon']",
          "attribute": "href"
        },
        {
          "name": "Favicon_Count",
          "type": "count",
          "selector": "css=link[rel='icon'],link[rel='shortcut icon'],link[rel='apple-touch-icon']"
        },
        {
          "name": "Theme_Color",
          "type": "attribute",
          "selector": "css=meta[name='theme-color']",
          "attribute": "content"
        },
        {
          "name": "Manifest",
          "type": "attribute",
          "selector": "css=link[rel='manifest']",
          "attribute": "href"
        },
        {
          "name": "AMP_Link",
          "type": "attribute",
          "selector": "css=link[rel='amphtml']",
          "attribute": "href"
        },
        {
          "name": "Is_AMP_Page",
          "type": "count",
          "selector": "css=html[amp],html[âš¡]"
        },
        {
          "name": "Rel_Next",
          "type": "attribute",
          "selector": "css=link[rel='next']",
          "attribute": "href"
        },
        {
          "name": "Rel_Prev",
          "type": "attribute",
          "selector": "css=link[rel='prev']",
          "attribute": "href"
        },
        {
          "name": "Total_Meta_Tags",
          "type": "count",
          "selector": "css=head meta:not([name^='rtila-'])"
        },
        {
          "name": "Total_Link_Tags",
          "type": "count",
          "selector": "css=head link"
        },
        {
          "name": "Title_Chars",
          "type": "text",
          "selector": "css=head title",
          "transformations": [
            {
              "type": "script",
              "code": "return String(String(value==null?'':value).trim().length);",
              "default_value": "0"
            }
          ]
        },
        {
          "name": "Title_Words",
          "type": "text",
          "selector": "css=head title",
          "transformations": [
            {
              "type": "script",
              "code": "var t=String(value==null?'':value).trim();return String(t?t.split(/\\s+/).length:0);",
              "default_value": "0"
            }
          ]
        },
        {
          "name": "Title_Pixels",
          "type": "text",
          "selector": "css=head title",
          "transformations": [
            {
              "type": "script",
              "code": "var W={\" \":278,\"!\":278,\"\\\"\":355,\"#\":556,\"$\":556,\"%\":889,\"&\":667,\"'\":191,\"(\":333,\")\":333,\"*\":389,\"+\":584,\",\":278,\"-\":333,\".\":278,\"/\":278,\":\":278,\";\":278,\"<\":584,\"=\":584,\">\":584,\"?\":556,\"@\":1015,\"[\":278,\"\\\\\":278,\"]\":278,\"^\":469,\"_\":556,\"`\":333,\"{\":334,\"|\":260,\"}\":334,\"~\":584,\"A\":667,\"B\":667,\"C\":722,\"D\":722,\"E\":667,\"F\":611,\"G\":778,\"H\":722,\"I\":278,\"J\":500,\"K\":667,\"L\":556,\"M\":833,\"N\":722,\"O\":778,\"P\":667,\"Q\":778,\"R\":722,\"S\":667,\"T\":611,\"U\":722,\"V\":667,\"W\":944,\"X\":667,\"Y\":667,\"Z\":611,\"a\":556,\"b\":556,\"c\":500,\"d\":556,\"e\":556,\"f\":278,\"g\":556,\"h\":556,\"i\":222,\"j\":222,\"k\":500,\"l\":222,\"m\":833,\"n\":556,\"o\":556,\"p\":556,\"q\":556,\"r\":333,\"s\":500,\"t\":278,\"u\":556,\"v\":500,\"w\":722,\"x\":500,\"y\":500,\"z\":500}; for(var d=0;d<=9;d++){W[String(d)]=556;} var t=String(value==null?\"\":value).trim(); var u=0; for(var i=0;i<t.length;i++){u+=(W[t.charAt(i)]||600);} return String(Math.round(u*20/1000));",
              "default_value": "0"
            }
          ]
        },
        {
          "name": "Title_SERP_Truncated",
          "type": "text",
          "selector": "css=head title",
          "transformations": [
            {
              "type": "script",
              "code": "var W={\" \":278,\"!\":278,\"\\\"\":355,\"#\":556,\"$\":556,\"%\":889,\"&\":667,\"'\":191,\"(\":333,\")\":333,\"*\":389,\"+\":584,\",\":278,\"-\":333,\".\":278,\"/\":278,\":\":278,\";\":278,\"<\":584,\"=\":584,\">\":584,\"?\":556,\"@\":1015,\"[\":278,\"\\\\\":278,\"]\":278,\"^\":469,\"_\":556,\"`\":333,\"{\":334,\"|\":260,\"}\":334,\"~\":584,\"A\":667,\"B\":667,\"C\":722,\"D\":722,\"E\":667,\"F\":611,\"G\":778,\"H\":722,\"I\":278,\"J\":500,\"K\":667,\"L\":556,\"M\":833,\"N\":722,\"O\":778,\"P\":667,\"Q\":778,\"R\":722,\"S\":667,\"T\":611,\"U\":722,\"V\":667,\"W\":944,\"X\":667,\"Y\":667,\"Z\":611,\"a\":556,\"b\":556,\"c\":500,\"d\":556,\"e\":556,\"f\":278,\"g\":556,\"h\":556,\"i\":222,\"j\":222,\"k\":500,\"l\":222,\"m\":833,\"n\":556,\"o\":556,\"p\":556,\"q\":556,\"r\":333,\"s\":500,\"t\":278,\"u\":556,\"v\":500,\"w\":722,\"x\":500,\"y\":500,\"z\":500}; for(var d=0;d<=9;d++){W[String(d)]=556;} var t=String(value==null?\"\":value).trim(); var u=0; for(var i=0;i<t.length;i++){u+=(W[t.charAt(i)]||600);} return String(Math.round(u*20/1000) > 580);",
              "default_value": "false"
            }
          ]
        },
        {
          "name": "Title_Verdict",
          "type": "text",
          "selector": "css=head title",
          "transformations": [
            {
              "type": "script",
              "code": "var t=String(value==null?'':value).trim();if(!t)return 'MISSING';var L=t.length;if(L<10)return 'TOO SHORT';if(L>60)return 'TOO LONG';return 'OK';",
              "default_value": "MISSING"
            }
          ]
        },
        {
          "name": "Description_Chars",
          "type": "attribute",
          "selector": "css=meta[name='description']",
          "attribute": "content",
          "transformations": [
            {
              "type": "script",
              "code": "return String(String(value==null?'':value).trim().length);",
              "default_value": "0"
            }
          ]
        },
        {
          "name": "Description_Words",
          "type": "attribute",
          "selector": "css=meta[name='description']",
          "attribute": "content",
          "transformations": [
            {
              "type": "script",
              "code": "var t=String(value==null?'':value).trim();return String(t?t.split(/\\s+/).length:0);",
              "default_value": "0"
            }
          ]
        },
        {
          "name": "Description_Pixels",
          "type": "attribute",
          "selector": "css=meta[name='description']",
          "attribute": "content",
          "transformations": [
            {
              "type": "script",
              "code": "var W={\" \":278,\"!\":278,\"\\\"\":355,\"#\":556,\"$\":556,\"%\":889,\"&\":667,\"'\":191,\"(\":333,\")\":333,\"*\":389,\"+\":584,\",\":278,\"-\":333,\".\":278,\"/\":278,\":\":278,\";\":278,\"<\":584,\"=\":584,\">\":584,\"?\":556,\"@\":1015,\"[\":278,\"\\\\\":278,\"]\":278,\"^\":469,\"_\":556,\"`\":333,\"{\":334,\"|\":260,\"}\":334,\"~\":584,\"A\":667,\"B\":667,\"C\":722,\"D\":722,\"E\":667,\"F\":611,\"G\":778,\"H\":722,\"I\":278,\"J\":500,\"K\":667,\"L\":556,\"M\":833,\"N\":722,\"O\":778,\"P\":667,\"Q\":778,\"R\":722,\"S\":667,\"T\":611,\"U\":722,\"V\":667,\"W\":944,\"X\":667,\"Y\":667,\"Z\":611,\"a\":556,\"b\":556,\"c\":500,\"d\":556,\"e\":556,\"f\":278,\"g\":556,\"h\":556,\"i\":222,\"j\":222,\"k\":500,\"l\":222,\"m\":833,\"n\":556,\"o\":556,\"p\":556,\"q\":556,\"r\":333,\"s\":500,\"t\":278,\"u\":556,\"v\":500,\"w\":722,\"x\":500,\"y\":500,\"z\":500}; for(var d=0;d<=9;d++){W[String(d)]=556;} var t=String(value==null?\"\":value).trim(); var u=0; for(var i=0;i<t.length;i++){u+=(W[t.charAt(i)]||600);} return String(Math.round(u*14/1000));",
              "default_value": "0"
            }
          ]
        },
        {
          "name": "Description_SERP_Truncated",
          "type": "attribute",
          "selector": "css=meta[name='description']",
          "attribute": "content",
          "transformations": [
            {
              "type": "script",
              "code": "var W={\" \":278,\"!\":278,\"\\\"\":355,\"#\":556,\"$\":556,\"%\":889,\"&\":667,\"'\":191,\"(\":333,\")\":333,\"*\":389,\"+\":584,\",\":278,\"-\":333,\".\":278,\"/\":278,\":\":278,\";\":278,\"<\":584,\"=\":584,\">\":584,\"?\":556,\"@\":1015,\"[\":278,\"\\\\\":278,\"]\":278,\"^\":469,\"_\":556,\"`\":333,\"{\":334,\"|\":260,\"}\":334,\"~\":584,\"A\":667,\"B\":667,\"C\":722,\"D\":722,\"E\":667,\"F\":611,\"G\":778,\"H\":722,\"I\":278,\"J\":500,\"K\":667,\"L\":556,\"M\":833,\"N\":722,\"O\":778,\"P\":667,\"Q\":778,\"R\":722,\"S\":667,\"T\":611,\"U\":722,\"V\":667,\"W\":944,\"X\":667,\"Y\":667,\"Z\":611,\"a\":556,\"b\":556,\"c\":500,\"d\":556,\"e\":556,\"f\":278,\"g\":556,\"h\":556,\"i\":222,\"j\":222,\"k\":500,\"l\":222,\"m\":833,\"n\":556,\"o\":556,\"p\":556,\"q\":556,\"r\":333,\"s\":500,\"t\":278,\"u\":556,\"v\":500,\"w\":722,\"x\":500,\"y\":500,\"z\":500}; for(var d=0;d<=9;d++){W[String(d)]=556;} var t=String(value==null?\"\":value).trim(); var u=0; for(var i=0;i<t.length;i++){u+=(W[t.charAt(i)]||600);} return String(Math.round(u*14/1000) > 990);",
              "default_value": "false"
            }
          ]
        },
        {
          "name": "Description_Verdict",
          "type": "attribute",
          "selector": "css=meta[name='description']",
          "attribute": "content",
          "transformations": [
            {
              "type": "script",
              "code": "var t=String(value==null?'':value).trim();if(!t)return 'MISSING';var L=t.length;if(L<50)return 'TOO SHORT';if(L>160)return 'TOO LONG';return 'OK';",
              "default_value": "MISSING"
            }
          ]
        },
        {
          "name": "H1_Count",
          "type": "count",
          "selector": "css=h1"
        },
        {
          "name": "H1_Text",
          "type": "text",
          "selector": "css=h1",
          "transformations": [
            {
              "type": "trim"
            }
          ]
        },
        {
          "name": "H2_Count",
          "type": "count",
          "selector": "css=h2"
        },
        {
          "name": "H3_Count",
          "type": "count",
          "selector": "css=h3"
        },
        {
          "name": "H4_Count",
          "type": "count",
          "selector": "css=h4"
        },
        {
          "name": "H5_Count",
          "type": "count",
          "selector": "css=h5"
        },
        {
          "name": "H6_Count",
          "type": "count",
          "selector": "css=h6"
        },
        {
          "name": "Heading_Count_Total",
          "type": "count",
          "selector": "css=h1,h2,h3,h4,h5,h6"
        },
        {
          "name": "Hreflang_Count",
          "type": "count",
          "selector": "css=link[rel='alternate'][hreflang]"
        },
        {
          "name": "Hreflang_Raw",
          "type": "attribute",
          "selector": "css=link[rel='alternate'][hreflang]",
          "attribute": "hreflang"
        },
        {
          "name": "Heading_Structure",
          "type": "list",
          "selector": "css=h1,h2,h3,h4,h5,h6",
          "transformations": [
            {
              "type": "script",
              "code": "var rows=Array.isArray(value)?value:[];var counts={1:0,2:0,3:0,4:0,5:0,6:0};var outline=[],orderIssues=[],emptyCount=0,longCount=0,seen={},dupes=[];var h1First=\"\",headingWords=0,firstLevel=0,maxLevel=0;for(var i=0;i<rows.length;i++){var tag=String(rows[i].tag||\"\").toLowerCase();var lvl=parseInt(tag.replace(\"h\",\"\"),10);if(!isFinite(lvl)||lvl<1||lvl>6)continue;counts[lvl]++;if(!firstLevel)firstLevel=lvl;if(lvl>maxLevel)maxLevel=lvl;var txt=String(rows[i].text||\"\").replace(/\\s+/g,\" \").trim();if(txt===\"\")emptyCount++;if(txt.length>120)longCount++;headingWords+=txt?txt.split(/\\s+/).length:0;outline.push(tag.toUpperCase()+\": \"+(txt.substring(0,90)||(txt?\"\":\"(empty)\")));if(seen[txt]&&txt!==\"\")dupes.push(txt.substring(0,60));else seen[txt]=1;if(i>0){var prev=parseInt(String(rows[i-1].tag||\"h0\").toLowerCase().replace(\"h\",\"\"),10);if(isFinite(prev)&&lvl-prev>1)orderIssues.push(\"H\"+prev+\" -> H\"+lvl+\" at #\"+(i+1));}}var h1Texts=[];for(var j=0;j<rows.length;j++){if(String(rows[j].tag||\"\").toLowerCase()===\"h1\"){var t2=String(rows[j].text||\"\").replace(/\\s+/g,\" \").trim();if(t2)h1Texts.push(t2);}}h1First=h1Texts[0]||\"\";var verdict=[];if(counts[1]===0)verdict.push(\"Missing H1\");if(counts[1]>1)verdict.push(\"Multiple H1 (\"+counts[1]+\")\");if(orderIssues.length)verdict.push(orderIssues.length+\" order violation(s)\");if(emptyCount)verdict.push(emptyCount+\" empty heading(s)\");if(dupes.length)verdict.push(dupes.length+\" duplicate heading(s)\");return {outline:outline.join(\" | \").substring(0,8000),h1_count:String(counts[1]),h1_missing:String(counts[1]===0),h1_multiple:String(counts[1]>1),h1_first_text:h1First,h1_chars:String(h1First.length),h2_texts:\"\",order_violations:String(orderIssues.length),order_violation_list:orderIssues.join(\"; \"),empty_headings:String(emptyCount),duplicate_headings:String(dupes.length),long_headings:String(longCount),heading_word_total:String(headingWords),first_heading_level:firstLevel?String(firstLevel):\"\",max_heading_level:String(maxLevel),headings_verdict:verdict.length?verdict.join(\"; \"):\"OK\"};"
            }
          ],
          "properties": [
            {
              "name": "tag",
              "type": "property",
              "selector": "css=self"
            },
            {
              "name": "text",
              "type": "text",
              "selector": "css=self"
            },
            {
              "name": "outline",
              "type": "index"
            },
            {
              "name": "h1_count",
              "type": "index"
            },
            {
              "name": "h1_missing",
              "type": "index"
            },
            {
              "name": "h1_multiple",
              "type": "index"
            },
            {
              "name": "h1_first_text",
              "type": "index"
            },
            {
              "name": "h1_chars",
              "type": "index"
            },
            {
              "name": "h2_texts",
              "type": "index"
            },
            {
              "name": "order_violations",
              "type": "index"
            },
            {
              "name": "order_violation_list",
              "type": "index"
            },
            {
              "name": "empty_headings",
              "type": "index"
            },
            {
              "name": "duplicate_headings",
              "type": "index"
            },
            {
              "name": "long_headings",
              "type": "index"
            },
            {
              "name": "heading_word_total",
              "type": "index"
            },
            {
              "name": "first_heading_level",
              "type": "index"
            },
            {
              "name": "max_heading_level",
              "type": "index"
            },
            {
              "name": "headings_verdict",
              "type": "index"
            }
          ]
        },
        {
          "name": "Hreflang_Audit",
          "type": "list",
          "selector": "css=link[rel='alternate'][hreflang]",
          "transformations": [
            {
              "type": "script",
              "code": "var rows=Array.isArray(value)?value:[];var pageUrl=rows.length?String(rows[0].page_url||\"\"):\";var pu=null;try{pu=new URL(pageUrl);}catch(e){}var vals=[],langs=[],regions=[],relative=0,dupes={},dupeList=[],selfRef=false,hasDefault=false;for(var i=0;i<rows.length;i++){var l=String(rows[i].lang||\"\").trim();var hr=String(rows[i].href||\"\").trim();if(l)vals.push(l+\":\"+hr);if(l.toLowerCase()===\"x-default\")hasDefault=true;var lp=l.split(\"-\")[0].toLowerCase();if(lp&&langs.indexOf(lp)===-1)langs.push(lp);if(l.indexOf(\"-\")!==-1){var rg=l.split(\"-\")[1].toUpperCase();if(regions.indexOf(rg)===-1)regions.push(rg);}if(hr&&!/^https?:\\/\\//i.test(hr))relative++;if(dupes[l])dupeList.push(l);else dupes[l]=1;if(hr&&pu){try{var hu=new URL(hr,pageUrl);if(hu.origin===pu.origin&&hu.pathname===pu.pathname&&hu.search===pu.search)selfRef=true;}catch(e){}}}var issues=[];if(rows.length===0)issues.push(\"No hreflang annotations\");else{if(!selfRef)issues.push(\"Missing self-referencing hreflang\");if(!hasDefault)issues.push(\"Missing x-default\");if(relative>0)issues.push(relative+\" relative hreflang URL(s)\");if(dupeList.length)issues.push(\"Duplicate hreflang values: \"+dupeList.join(\", \"));}return {count:String(rows.length),values:vals.join(\" | \").substring(0,4000),languages:langs.join(\", \"),regions:regions.join(\", \"),has_x_default:String(hasDefault),self_referencing:String(selfRef),relative_urls:String(relative),duplicate_langs:dupeList.join(\", \"),issues:issues.join(\"; \")};"
            }
          ],
          "properties": [
            {
              "name": "lang",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "hreflang"
            },
            {
              "name": "href",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "href"
            },
            {
              "name": "page_url",
              "type": "page_url",
              "selector": ""
            },
            {
              "name": "count",
              "type": "index"
            },
            {
              "name": "values",
              "type": "index"
            },
            {
              "name": "languages",
              "type": "index"
            },
            {
              "name": "regions",
              "type": "index"
            },
            {
              "name": "has_x_default",
              "type": "index"
            },
            {
              "name": "self_referencing",
              "type": "index"
            },
            {
              "name": "relative_urls",
              "type": "index"
            },
            {
              "name": "duplicate_langs",
              "type": "index"
            },
            {
              "name": "issues",
              "type": "index"
            }
          ]
        },
        {
          "name": "Social_Meta",
          "type": "list",
          "selector": "css=self",
          "transformations": [
            {
              "type": "script",
              "code": "var it=(Array.isArray(value)&&value.length)?value[0]:{};var head=String(it.head_html||\"\");var pageUrl=String(it.page_url||\"\");function grab(re){var m=head.match(re);return m?m[1].replace(/&amp;/g,\"&\").trim():\"\";}var ogTitle=grab(/property=[\"']og:title[\"'][^>]*content=[\"']([^\"']*)[\"']/i)||grab(/content=[\"']([^\"']*)[\"'][^>]*property=[\"']og:title[\"']/i);var ogDesc=grab(/property=[\"']og:description[\"'][^>]*content=[\"']([^\"']*)[\"']/i)||grab(/content=[\"']([^\"']*)[\"'][^>]*property=[\"']og:description[\"']/i);var ogImage=grab(/property=[\"']og:image[\"'][^>]*content=[\"']([^\"']*)[\"']/i)||grab(/content=[\"']([^\"']*)[\"'][^>]*property=[\"']og:image[\"']/i);var ogImageSecure=grab(/property=[\"']og:image:secure_url[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var ogW=grab(/property=[\"']og:image:width[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var ogH=grab(/property=[\"']og:image:height[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var ogAlt=grab(/property=[\"']og:image:alt[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var ogUrl=grab(/property=[\"']og:url[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var ogType=grab(/property=[\"']og:type[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var ogSite=grab(/property=[\"']og:site_name[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var ogLocale=grab(/property=[\"']og:locale[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var twCard=grab(/name=[\"']twitter:card[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var twTitle=grab(/name=[\"']twitter:title[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var twDesc=grab(/name=[\"']twitter:description[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var twImage=grab(/name=[\"']twitter:image[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var twSite=grab(/name=[\"']twitter:site[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var twCreator=grab(/name=[\"']twitter:creator[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var artPub=grab(/property=[\"']article:published_time[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var artMod=grab(/property=[\"']article:modified_time[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var artAuthor=grab(/property=[\"']article:author[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var artSection=grab(/property=[\"']article:section[\"'][^>]*content=[\"']([^\"']*)[\"']/i);var ogCount=(head.match(/property=[\"']og:/gi)||[]).length;var twCount=(head.match(/name=[\"']twitter:/gi)||[]).length;var artTags=[];var re=/property=[\"']article:tag[\"'][^>]*content=[\"']([^\"']*)[\"']/gi;var mm;while((mm=re.exec(head))!==null){artTags.push(mm[1]);}var ogMissing=[];if(!ogTitle)ogMissing.push(\"og:title\");if(!ogDesc)ogMissing.push(\"og:description\");if(!ogImage)ogMissing.push(\"og:image\");if(!ogUrl)ogMissing.push(\"og:url\");if(!ogType)ogMissing.push(\"og:type\");var twMissing=[];if(!twCard)twMissing.push(\"twitter:card\");if(!twTitle)twMissing.push(\"twitter:title\");if(!twDesc)twMissing.push(\"twitter:description\");if(!twImage)twMissing.push(\"twitter:image\");var ogUrlMatch=false;if(ogUrl&&pageUrl){try{var a=new URL(ogUrl),b=new URL(pageUrl);ogUrlMatch=(a.origin===b.origin&&a.pathname===b.pathname);}catch(e){}}var ogImgAbs=/^https?:\\/\\//i.test(ogImage);var score=0,total=9;if(ogTitle)score++;if(ogDesc)score++;if(ogImage)score++;if(ogUrl)score++;if(ogType)score++;if(twCard)score++;if(twTitle)score++;if(twDesc)score++;if(twImage)score++;var pct=Math.round((score/total)*100);var verdict=pct>=90?\"Excellent\":pct>=70?\"Good\":pct>=40?\"Incomplete\":\"Missing\";return {og_title:ogTitle,og_description:ogDesc,og_image:ogImage,og_image_secure:ogImageSecure,og_image_width:ogW,og_image_height:ogH,og_image_alt:ogAlt,og_url:ogUrl,og_type:ogType,og_site_name:ogSite,og_locale:ogLocale,og_count:String(ogCount),og_missing:ogMissing.join(\", \"),twitter_card:twCard,twitter_title:twTitle,twitter_description:twDesc,twitter_image:twImage,twitter_site:twSite,twitter_creator:twCreator,twitter_count:String(twCount),twitter_missing:twMissing.join(\", \"),article_published:artPub,article_modified:artMod,article_author:artAuthor,article_section:artSection,article_tags:artTags.join(\", \"),og_url_matches_page:String(ogUrlMatch),og_image_is_absolute:String(ogImgAbs),social_score:String(pct),social_verdict:verdict};"
            }
          ],
          "properties": [
            {
              "name": "head_html",
              "type": "html",
              "selector": "css=head"
            },
            {
              "name": "page_url",
              "type": "page_url",
              "selector": ""
            },
            {
              "name": "og_title",
              "type": "index"
            },
            {
              "name": "og_description",
              "type": "index"
            },
            {
              "name": "og_image",
              "type": "index"
            },
            {
              "name": "og_image_secure",
              "type": "index"
            },
            {
              "name": "og_image_width",
              "type": "index"
            },
            {
              "name": "og_image_height",
              "type": "index"
            },
            {
              "name": "og_image_alt",
              "type": "index"
            },
            {
              "name": "og_url",
              "type": "index"
            },
            {
              "name": "og_type",
              "type": "index"
            },
            {
              "name": "og_site_name",
              "type": "index"
            },
            {
              "name": "og_locale",
              "type": "index"
            },
            {
              "name": "og_count",
              "type": "index"
            },
            {
              "name": "og_missing",
              "type": "index"
            },
            {
              "name": "twitter_card",
              "type": "index"
            },
            {
              "name": "twitter_title",
              "type": "index"
            },
            {
              "name": "twitter_description",
              "type": "index"
            },
            {
              "name": "twitter_image",
              "type": "index"
            },
            {
              "name": "twitter_site",
              "type": "index"
            },
            {
              "name": "twitter_creator",
              "type": "index"
            },
            {
              "name": "twitter_count",
              "type": "index"
            },
            {
              "name": "twitter_missing",
              "type": "index"
            },
            {
              "name": "article_published",
              "type": "index"
            },
            {
              "name": "article_modified",
              "type": "index"
            },
            {
              "name": "article_author",
              "type": "index"
            },
            {
              "name": "article_section",
              "type": "index"
            },
            {
              "name": "article_tags",
              "type": "index"
            },
            {
              "name": "og_url_matches_page",
              "type": "index"
            },
            {
              "name": "og_image_is_absolute",
              "type": "index"
            },
            {
              "name": "social_score",
              "type": "index"
            },
            {
              "name": "social_verdict",
              "type": "index"
            }
          ]
        }
      ],
      "required_fields": [
        "Page_URL"
      ]
    },
    "Content_Readability": {
      "item_selector": "css=html",
      "properties": [
        {
          "name": "Page_URL",
          "type": "page_url",
          "selector": ""
        },
        {
          "name": "Paragraph_Count",
          "type": "count",
          "selector": "css=body p"
        },
        {
          "name": "List_Count",
          "type": "count",
          "selector": "css=body ul,ol"
        },
        {
          "name": "Table_Count",
          "type": "count",
          "selector": "css=body table"
        },
        {
          "name": "Blockquote_Count",
          "type": "count",
          "selector": "css=body blockquote"
        },
        {
          "name": "Main_Landmark",
          "type": "count",
          "selector": "css=main,[role='main'],article"
        },
        {
          "name": "Content_Metrics",
          "type": "list",
          "selector": "css=self",
          "transformations": [
            {
              "type": "script",
              "code": "var it=(Array.isArray(value)&&value.length)?value[0]:{};var text=String(it.text||\"\").replace(/[\\u200B-\\u200D\\uFEFF]/g,\" \").replace(/\\s+/g,\" \").trim();var html=String(it.html||\"\");var title=String(it.title||\"\").replace(/\\s+/g,\" \").trim();var h1=String(it.h1||\"\").replace(/\\s+/g,\" \").trim();var desc=String(it.desc||\"\").replace(/\\s+/g,\" \").trim();var STOP={the:1,be:1,to:1,of:1,and:1,a:1,in:1,that:1,have:1,i:1,it:1,for:1,not:1,on:1,with:1,he:1,as:1,you:1,do:1,at:1,this:1,but:1,his:1,by:1,from:1,they:1,we:1,say:1,her:1,she:1,or:1,an:1,will:1,my:1,one:1,all:1,would:1,there:1,their:1,what:1,so:1,up:1,out:1,if:1,about:1,who:1,get:1,which:1,go:1,me:1,when:1,make:1,can:1,like:1,time:1,no:1,just:1,him:1,know:1,take:1,people:1,into:1,year:1,your:1,good:1,some:1,could:1,them:1,see:1,other:1,than:1,then:1,now:1,look:1,only:1,come:1,its:1,over:1,think:1,also:1,back:1,after:1,use:1,two:1,how:1,our:1,work:1,first:1,well:1,way:1,even:1,new:1,want:1,because:1,any:1,these:1,give:1,day:1,most:1,us:1,is:1,are:1,was:1,were:1,been:1,has:1,had:1,did:1,does:1};var words=text?text.split(\" \").filter(function(w){return w.length>0;}):[];var wc=words.length;var sentences=text.split(/[.!?]+(?:\\s|$)/).filter(function(s){return s.trim().length>1;});var sc=sentences.length||1;function syl(w){w=w.toLowerCase().replace(/[^a-z]/g,\"\");if(!w)return 0;if(w.length<=3)return 1;w=w.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/,\"\").replace(/^y/,\"\");var m=w.match(/[aeiouy]{1,2}/g);return m?m.length:1;}var sylTotal=0,longWords=0,chars=0;var uniq={},topMap={};for(var i=0;i<words.length;i++){var raw=words[i];var w=raw.toLowerCase().replace(/[^a-z0-9'-]/g,\"\");if(!w)continue;chars+=w.length;var sy=syl(w);sylTotal+=sy;if(sy>=3)longWords++;uniq[w]=1;if(w.length>2&&!STOP[w])topMap[w]=(topMap[w]||0)+1;}var uw=Object.keys(uniq).length;var asl=wc/sc;var asw=wc?sylTotal/wc:0;function r2(x){return Math.round(x*100)/100;}var fre=wc?r2(206.835-(1.015*asl)-(84.6*asw)):0;var fkg=wc?r2((0.39*asl)+(11.8*asw)-15.59):0;var fog=wc?r2(0.4*(asl+(wc?(longWords/wc)*100:0))):0;var smog=sc>=30?r2(1.0430*Math.sqrt((longWords*(30/sc)))+3.1291):0;var ari=wc?r2((4.71*(chars/wc))+(0.5*(wc/sc))-21.43):0;var cl=wc?r2((0.0588*(chars/wc*100)/100)*100-(0.296*(wc/sc))-15.8):0;var readVerdict=fre>=90?\"Very Easy\":fre>=80?\"Easy\":fre>=70?\"Fairly Easy\":fre>=60?\"Plain\":fre>=50?\"Fairly Difficult\":fre>=30?\"Difficult\":wc?\"Very Difficult\":\"No text\";var textChars=text.length,htmlChars=html.length;var ratio=htmlChars?r2((textChars/htmlChars)*100):0;var ratioVerdict=ratio===0?\"No text\":ratio<10?\"Very Low\":ratio<25?\"Low\":ratio<70?\"Healthy\":\"High\";var readMin=Math.max(1,Math.round(wc/225));var pairs=Object.keys(topMap).map(function(k){return [k,topMap[k]];});pairs.sort(function(a,b){return b[1]-a[1];});var top=pairs.slice(0,15).map(function(p){return p[0]+\"(\"+p[1]+\")\";});var stopCount=0;for(var j=0;j<words.length;j++){var lw=words[j].toLowerCase().replace(/[^a-z]/g,\"\");if(STOP[lw])stopCount++;}var stopRatio=wc?r2((stopCount/wc)*100):0;var longest=0;for(var k2=0;k2<words.length;k2++){if(words[k2].length>longest)longest=words[k2].length;}var avgWordLen=wc?r2(chars/wc):0;function cyrb128(str){var h1=1779033703,h2=3144134277,h3=1013904242,h4=2773480762;for(var q=0,chr;q<str.length;q++){chr=str.charCodeAt(q);h1=Math.imul(h1^chr,2654435761);h2=Math.imul(h2^chr,1597334677);h3=Math.imul(h3^chr,2246822507);h4=Math.imul(h4^chr,3266489909);}h1=Math.imul(h1^(h1>>>16),2246822507)^Math.imul(h2^(h2>>>13),3266489909);h2=Math.imul(h2^(h2>>>16),2246822507)^Math.imul(h1^(h1>>>13),3266489909);h3=Math.imul(h3^(h3>>>16),2246822507)^Math.imul(h4^(h4>>>13),3266489909);h4=Math.imul(h4^(h4>>>16),2246822507)^Math.imul(h3^(h3>>>13),3266489909);return [h1>>>0,h2>>>0,h3>>>0,h4>>>0];}var norm=text.toLowerCase().replace(/[^a-z0-9\\s]/g,\" \").replace(/\\s+/g,\" \").trim();var shingles={};var nWords=norm.split(\" \");for(var s2=0;s2+2<nWords.length;s2++){var sh=nWords[s2]+\" \"+nWords[s2+1]+\" \"+nWords[s2+2];shingles[sh]=(shingles[sh]||0)+1;}var shKeys=Object.keys(shingles);var sim=0;if(shKeys.length){var bits=new Array(64);for(var b=0;b<64;b++)bits[b]=0;for(var z=0;z<shKeys.length;z++){var hh=cyrb128(shKeys[z]);var hex=\"\";for(var y=0;y<4;y++){hex+=(\"00000000\"+hh[y].toString(16)).slice(-8);}for(var bb=0;bb<64;bb++){bits[bb]+=(hex.charAt(bb)===\"1\"?1:-1)*shingles[shKeys[z]];}}for(var b2=0;b2<64;b2++){if(bits[b2]>0)sim=sim*2+1;else sim=sim*2;}sim=sim>>>0;}var hashArr=cyrb128(norm);var hashHex=\"\";for(var w2=0;w2<4;w2++){hashHex+=(\"00000000\"+hashArr[w2].toString(16)).slice(-8);}var simHex=(\"0000000000000000\"+sim.toString(16)).slice(-16);var langGuess=\"\";var hl=String(it.html_lang||\"\").trim();if(hl)langGuess=hl;else{var enScore=(text.match(/\\b(the|and|of|to|in|is|for|with)\\b/gi)||[]).length;var esScore=(text.match(/\\b(el|la|de|que|y|en|un|una|los|las)\\b/gi)||[]).length;if(enScore>esScore&&enScore>5)langGuess=\"en\";else if(esScore>5)langGuess=\"es\";else langGuess=\"unknown\";}function norm2(x){return x.toLowerCase().replace(/[^a-z0-9]/g,\"\");}var titleInBody=norm2(title).length>6&&norm.indexOf(norm2(title))!==-1;var h1InBody=norm2(h1).length>3&&norm.indexOf(norm2(h1))!==-1;var descInBody=norm2(desc).length>20&&norm.indexOf(norm2(desc))!==-1;var lorem=/lorem\\s+ipsum/i.test(text);var placeholder=/\\b(coming soon|under construction|todo:|tbd|placeholder text|your text here)\\b/i.test(text);var cy=null;var cym=text.match(/©|\\(c\\)|copyright/gi)?text.match(/(?:©|\\(c\\)|copyright)\\s*(?:\\d{4}\\s*[-–]\\s*)?(\\d{4})/i):null;if(cym)cy=parseInt(cym[1],10);var nowYear=new Date().getFullYear();var cyAge=(cy&&cy>1990&&cy<=nowYear+1)?(nowYear-cy):null;var dateMatches=text.match(/\\b(?:19|20)\\d{2}-\\d{2}-\\d{2}\\b|\\b(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\\.?[\\s]+\\d{1,2},?[\\s]+(?:19|20)\\d{2}\\b|\\b\\d{1,2}\\s+(?:January|February|March|April|May|June|July|August|September|October|November|December)\\s+(?:19|20)\\d{2}\\b/gi)||[];var latest=\"\";for(var d2=0;d2<dateMatches.length;d2++){var dm=dateMatches[d2].match(/(19|20)\\d{2}/);if(dm){var yr=parseInt(dm[0],10);if(yr>parseInt(latest||\"0\",10))latest=String(yr);}}var emails=[];var em=text.match(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g)||[];for(var e2=0;e2<em.length;e2++){if(emails.indexOf(em[e2])===-1)emails.push(em[e2]);print}var phones=[];var ph=text.match(/(?:\\+?\\d{1,3}[\\s.-]?)?(?:\\(\\d{2,4}\\)[\\s.-]?)?\\d{3}[\\s.-]?\\d{3,4}[\\s.-]?\\d{3,4}/g)||[];for(var p2=0;p2<ph.length&&phones.length<5;p2++){if(ph[p2].replace(/\\D/g,\"\").length>=9&&phones.indexOf(ph[p2])===-1)phones.push(ph[p2]);}var socialRe=/(?:https?:\\/\\/)?(?:www\\.)?(facebook|instagram|twitter|x|linkedin|youtube|pinterest|tiktok|github|reddit|whatsapp|t\\.me|telegram)\\.com\\/[^\\s\"'<>)]+/gi;var socialMatches=html.match(socialRe)||[];var socialDomains={};for(var sm2=0;sm2<socialMatches.length;sm2++){var dm2=socialMatches[sm2].match(/(?:facebook|instagram|twitter|x|linkedin|youtube|pinterest|tiktok|github|reddit|whatsapp|t\\.me|telegram)\\./i);if(dm2)socialDomains[dm2[0].replace(/\\.$/,\"\").toLowerCase()]=1;}var comments=(html.match(/<!--[\\s\\S]*?-->/g)||[]).length;var sensitive=/<!--[^>]*(password|secret|api[_-]?key|token|debug|do not remove|todo:|fixme)/i.test(html);var stuffScore=0;if(pairs.length&&wc>50){var topFreq=pairs[0][1];var density=(topFreq/wc)*100;stuffScore=Math.round(density*100)/100;}var stuffVerdict=stuffScore>8?\"Keyword stuffing suspected\":stuffScore>5?\"High density\":\"Normal\";var thin=wc<300;var lenClass=wc===0?\"Empty\":wc<150?\"Very thin\":wc<300?\"Thin\":wc<800?\"Short\":wc<2000?\"Standard\":\"Long-form\";return {word_count:String(wc),unique_word_count:String(uw),unique_word_ratio:String(wc?r2((uw/wc)*100):0),sentence_count:String(sc),avg_words_per_sentence:String(r2(asl)),syllable_count:String(sylTotal),avg_syllables_per_word:String(r2(asw)),flesch_reading_ease:String(fre),flesch_kincaid_grade:String(fkg),gunning_fog:String(fog),smog_index:String(smog),automated_readability:String(ari),coleman_liau:String(cl),readability_verdict:readVerdict,text_chars:String(textChars),html_chars:String(htmlChars),text_to_html_ratio:String(ratio),text_ratio_verdict:ratioVerdict,reading_time_min:String(readMin),top_words:top.join(\", \"),stopword_ratio:String(stopRatio),longest_word:String(longest),avg_word_length:String(avgWordLen),content_hash:hashHex,content_simhash:simHex,near_duplicate_key:simHex.substring(0,8),content_thin:String(thin),content_length_class:lenClass,language_guess:langGuess,title_in_body:String(titleInBody),h1_in_body:String(h1InBody),description_in_body:String(descInBody),has_lorem_ipsum:String(lorem),has_placeholder_text:String(placeholder),copyright_year:cy?String(cy):\"\",copyright_age_years:cyAge===null?\"\":String(cyAge),dates_found:String(dateMatches.length),latest_date_found:latest,emails_found:emails.slice(0,10).join(\", \"),phones_found:phones.join(\", \"),social_profile_count:String(Object.keys(socialDomains).length),social_profiles:Object.keys(socialDomains).join(\", \"),html_comment_count:String(comments),has_sensitive_comment:String(sensitive),keyword_stuffing_score:String(stuffScore),keyword_stuffing_verdict:stuffVerdict};"
            }
          ],
          "properties": [
            {
              "name": "text",
              "type": "text",
              "selector": "css=body"
            },
            {
              "name": "html",
              "type": "html",
              "selector": "css=self"
            },
            {
              "name": "title",
              "type": "text",
              "selector": "css=head title"
            },
            {
              "name": "h1",
              "type": "text",
              "selector": "css=h1"
            },
            {
              "name": "desc",
              "type": "attribute",
              "selector": "css=meta[name='description']",
              "attribute": "content"
            },
            {
              "name": "html_lang",
              "type": "attribute",
              "selector": "css=html",
              "attribute": "lang"
            },
            {
              "name": "word_count",
              "type": "index"
            },
            {
              "name": "unique_word_count",
              "type": "index"
            },
            {
              "name": "unique_word_ratio",
              "type": "index"
            },
            {
              "name": "sentence_count",
              "type": "index"
            },
            {
              "name": "avg_words_per_sentence",
              "type": "index"
            },
            {
              "name": "syllable_count",
              "type": "index"
            },
            {
              "name": "avg_syllables_per_word",
              "type": "index"
            },
            {
              "name": "flesch_reading_ease",
              "type": "index"
            },
            {
              "name": "flesch_kincaid_grade",
              "type": "index"
            },
            {
              "name": "gunning_fog",
              "type": "index"
            },
            {
              "name": "smog_index",
              "type": "index"
            },
            {
              "name": "automated_readability",
              "type": "index"
            },
            {
              "name": "coleman_liau",
              "type": "index"
            },
            {
              "name": "readability_verdict",
              "type": "index"
            },
            {
              "name": "text_chars",
              "type": "index"
            },
            {
              "name": "html_chars",
              "type": "index"
            },
            {
              "name": "text_to_html_ratio",
              "type": "index"
            },
            {
              "name": "text_ratio_verdict",
              "type": "index"
            },
            {
              "name": "reading_time_min",
              "type": "index"
            },
            {
              "name": "top_words",
              "type": "index"
            },
            {
              "name": "stopword_ratio",
              "type": "index"
            },
            {
              "name": "longest_word",
              "type": "index"
            },
            {
              "name": "avg_word_length",
              "type": "index"
            },
            {
              "name": "content_hash",
              "type": "index"
            },
            {
              "name": "content_simhash",
              "type": "index"
            },
            {
              "name": "near_duplicate_key",
              "type": "index"
            },
            {
              "name": "content_thin",
              "type": "index"
            },
            {
              "name": "content_length_class",
              "type": "index"
            },
            {
              "name": "language_guess",
              "type": "index"
            },
            {
              "name": "title_in_body",
              "type": "index"
            },
            {
              "name": "h1_in_body",
              "type": "index"
            },
            {
              "name": "description_in_body",
              "type": "index"
            },
            {
              "name": "has_lorem_ipsum",
              "type": "index"
            },
            {
              "name": "has_placeholder_text",
              "type": "index"
            },
            {
              "name": "copyright_year",
              "type": "index"
            },
            {
              "name": "copyright_age_years",
              "type": "index"
            },
            {
              "name": "dates_found",
              "type": "index"
            },
            {
              "name": "latest_date_found",
              "type": "index"
            },
            {
              "name": "emails_found",
              "type": "index"
            },
            {
              "name": "phones_found",
              "type": "index"
            },
            {
              "name": "social_profile_count",
              "type": "index"
            },
            {
              "name": "social_profiles",
              "type": "index"
            },
            {
              "name": "html_comment_count",
              "type": "index"
            },
            {
              "name": "has_sensitive_comment",
              "type": "index"
            },
            {
              "name": "keyword_stuffing_score",
              "type": "index"
            },
            {
              "name": "keyword_stuffing_verdict",
              "type": "index"
            }
          ]
        }
      ],
      "required_fields": [
        "Page_URL"
      ]
    },
    "Links_Census": {
      "item_selector": "css=html",
      "properties": [
        {
          "name": "Page_URL",
          "type": "page_url",
          "selector": ""
        },
        {
          "name": "Total_Anchors",
          "type": "count",
          "selector": "css=a"
        },
        {
          "name": "Anchors_NoHref",
          "type": "count",
          "selector": "css=a:not([href])"
        },
        {
          "name": "Link_Audit",
          "type": "list",
          "selector": "css=a",
          "transformations": [
            {
              "type": "script",
              "code": "var rows=Array.isArray(value)?value:[];var origin=\"\",hostname=\"\",pageUrl=\"\",pageSecure=false;for(var q=0;q<rows.length;q++){if(rows[q]&&rows[q].page_url){pageUrl=String(rows[q].page_url);break;}}try{var pu=new URL(pageUrl);origin=pu.origin;hostname=pu.hostname;pageSecure=pu.protocol===\"https:\";}catch(e){}var total=rows.length,internal=0,external=0,fragment=0,mailto=0,tel=0,jsProto=0,emptyHref=0,hashOnly=0,protoRel=0;var nofollow=0,nofollowInt=0,nofollowExt=0,sponsored=0,ugc=0,newTab=0,noopenerMissing=0;var downloadAttr=0,nonHtml=0,insecureOnHttps=0,emptyText=0,imageOnly=0,generic=0,longText=0,toSelf=0,samePage=0;var intSet={},extSet={},hostCounts={},relSeen={},nonHtmlExt={},genericSamples=[],externalSamples=[],depthMax=0,deep=0;var textSeen={},dupeText=0;var GENERIC=/^(click here|here|read more|more|learn more|link|this|details|click|go|visit|source|info|find out more|leer más|lire la suite)\\.?$/i;var NONHTML=/\\.(pdf|docx?|xlsx?|pptx?|zip|rar|gz|tar|7z|exe|dmg|csv|txt|rtf|epub|mp[34]|avi|mov|wmv|flv|webm|png|jpe?g|gif|svg|webp|ico)(?:$|\\?|#)/i;for(var i=0;i<rows.length;i++){var r=rows[i]||{};var raw=String(r.raw_href===null||r.raw_href===undefined?\"\":r.raw_href).trim();var abs=String(r.abs_href===null||r.abs_href===undefined?\"\":r.abs_href).trim();var rel=String(r.rel||\"\").toLowerCase();var txt=String(r.text||\"\").replace(/\\s+/g,\" \").trim();var tgt=String(r.target||\"\").toLowerCase();var imgs=parseInt(r.imgs,10)||0;if(rel){rel.split(/\\s+/).forEach(function(x){if(x)relSeen[x]=(relSeen[x]||0)+1;});}if(rel.indexOf(\"nofollow\")!==-1)nofollow++;if(rel.indexOf(\"sponsored\")!==-1)sponsored++;if(rel.indexOf(\"ugc\")!==-1)ugc++;if(tgt===\"_blank\"){newTab++;if(rel.indexOf(\"noopener\")===-1&&rel.indexOf(\"noreferrer\")===-1)noopenerMissing++;}if(raw===\"\"){emptyHref++;continue;}if(raw.charAt(0)===\"#\"){if(raw.length===1)hashOnly++;else{fragment++;samePage++;}continue;}var rl=raw.toLowerCase();if(rl.indexOf(\"javascript:\")===0){jsProto++;continue;}if(rl.indexOf(\"mailto:\")===0){mailto++;continue;}if(rl.indexOf(\"tel:\")===0){tel++;continue;}if(rl.indexOf(\"data:\")===0||rl.indexOf(\"blob:\")===0){continue;}if(raw.indexOf(\"//\")===0)protoRel++;var au=null;try{au=new URL(raw,pageUrl);}catch(e){}if(!au)continue;if(au.protocol!==\"http:\"&&au.protocol!==\"https:\"){continue;}if(NONHTML.test(au.pathname+au.search)){nonHtml++;var em=au.pathname.match(/\\.([a-z0-9]{2,5})$/i);if(em)nonHtmlExt[em[1].toLowerCase()]=1;if(rel.indexOf(\"nofollow\")!==-1){}if(r.download!==undefined&&r.download!==null&&r.download!==\"\")downloadAttr++;}if(pageSecure&&au.protocol===\"http:\")insecureOnHttps++;var key=au.origin+au.pathname+au.search;var sameSite=hostname!==\"\"&&(au.hostname===hostname||au.hostname===\"www.\"+hostname||hostname===\"www.\"+au.hostname);if(sameSite){internal++;intSet[key]=1;var d=au.pathname.split(\"/\").filter(function(s){return s.length>0;}).length;if(d>depthMax)depthMax=d;if(d>4)deep++;if(key===origin+(function(){try{return new URL(pageUrl).pathname+new URL(pageUrl).search;}catch(e){return \"\";}})())toSelf++;}else{external++;extSet[key]=1;hostCounts[au.hostname]=(hostCounts[au.hostname]||0)+1;if(externalSamples.length<15&&externalSamples.indexOf(key)===-1)externalSamples.push(key);}if(rel.indexOf(\"nofollow\")!==-1){if(sameSite)nofollowInt++;else nofollowExt++;}var tl=txt.toLowerCase();if(txt===\"\"){emptyText++;if(imgs>0)imageOnly++;}else{if(GENERIC.test(txt)){generic++;if(genericSamples.length<10&&genericSamples.indexOf(txt)===-1)genericSamples.push(txt);}if(txt.length>100)longText++;if(textSeen[tl])dupeText++;else textSeen[tl]=1;}}var hostPairs=Object.keys(hostCounts).map(function(h2){return [h2,hostCounts[h2]];});hostPairs.sort(function(a,b){return b[1]-a[1];});var topHosts=hostPairs.slice(0,15).map(function(p){return p[0]+\" (\"+p[1]+\")\";});return {total:String(total),internal:String(internal),external:String(external),unique_internal:String(Object.keys(intSet).length),unique_external:String(Object.keys(extSet).length),unique_external_domains:String(hostPairs.length),top_external_domains:topHosts.join(\", \"),nofollow_total:String(nofollow),nofollow_internal:String(nofollowInt),nofollow_external:String(nofollowExt),sponsored:String(sponsored),ugc:String(ugc),noopener_missing:String(noopenerMissing),new_tab:String(newTab),fragment_only:String(fragment),mailto:String(mailto),tel:String(tel),javascript_protocol:String(jsProto),empty_href:String(emptyHref),hash_only_href:String(hashOnly),protocol_relative:String(protoRel),insecure_http_on_https:String(insecureOnHttps),download_attr:String(downloadAttr),non_html_targets:String(nonHtml),non_html_extensions:Object.keys(nonHtmlExt).join(\", \"),empty_anchor_text:String(emptyText),image_only_anchor:String(imageOnly),generic_anchor_text:String(generic),generic_anchor_samples:genericSamples.join(\", \"),long_anchor_text:String(longText),duplicate_anchor_text:String(dupeText),links_to_self:String(toSelf),same_page_anchors:String(samePage),internal_depth_max:String(depthMax),deep_internal_links:String(deep),external_sample:externalSamples.join(\" | \"),rel_values_seen:Object.keys(relSeen).map(function(k){return k+\"(\"+relSeen[k]+\")\";}).join(\", \"),outbound_verdict:external>300?\"Very high outbound link count\":external>100?\"High outbound link count\":\"Normal\"};"
            }
          ],
          "properties": [
            {
              "name": "raw_href",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "href"
            },
            {
              "name": "abs_href",
              "type": "property",
              "selector": "css=self"
            },
            {
              "name": "rel",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "rel"
            },
            {
              "name": "text",
              "type": "text",
              "selector": "css=self"
            },
            {
              "name": "target",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "target"
            },
            {
              "name": "imgs",
              "type": "count",
              "selector": "css=img,svg"
            },
            {
              "name": "page_url",
              "type": "page_url",
              "selector": ""
            },
            {
              "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": "top_external_domains",
              "type": "index"
            },
            {
              "name": "nofollow_total",
              "type": "index"
            },
            {
              "name": "nofollow_internal",
              "type": "index"
            },
            {
              "name": "nofollow_external",
              "type": "index"
            },
            {
              "name": "sponsored",
              "type": "index"
            },
            {
              "name": "ugc",
              "type": "index"
            },
            {
              "name": "noopener_missing",
              "type": "index"
            },
            {
              "name": "new_tab",
              "type": "index"
            },
            {
              "name": "fragment_only",
              "type": "index"
            },
            {
              "name": "mailto",
              "type": "index"
            },
            {
              "name": "tel",
              "type": "index"
            },
            {
              "name": "javascript_protocol",
              "type": "index"
            },
            {
              "name": "empty_href",
              "type": "index"
            },
            {
              "name": "hash_only_href",
              "type": "index"
            },
            {
              "name": "protocol_relative",
              "type": "index"
            },
            {
              "name": "insecure_http_on_https",
              "type": "index"
            },
            {
              "name": "download_attr",
              "type": "index"
            },
            {
              "name": "non_html_targets",
              "type": "index"
            },
            {
              "name": "non_html_extensions",
              "type": "index"
            },
            {
              "name": "empty_anchor_text",
              "type": "index"
            },
            {
              "name": "image_only_anchor",
              "type": "index"
            },
            {
              "name": "generic_anchor_text",
              "type": "index"
            },
            {
              "name": "generic_anchor_samples",
              "type": "index"
            },
            {
              "name": "long_anchor_text",
              "type": "index"
            },
            {
              "name": "duplicate_anchor_text",
              "type": "index"
            },
            {
              "name": "links_to_self",
              "type": "index"
            },
            {
              "name": "same_page_anchors",
              "type": "index"
            },
            {
              "name": "internal_depth_max",
              "type": "index"
            },
            {
              "name": "deep_internal_links",
              "type": "index"
            },
            {
              "name": "external_sample",
              "type": "index"
            },
            {
              "name": "rel_values_seen",
              "type": "index"
            },
            {
              "name": "outbound_verdict",
              "type": "index"
            }
          ]
        }
      ],
      "required_fields": [
        "Page_URL"
      ]
    },
    "Media_Performance": {
      "item_selector": "css=html",
      "properties": [
        {
          "name": "Page_URL",
          "type": "page_url",
          "selector": ""
        },
        {
          "name": "DOM_Node_Count",
          "type": "count",
          "selector": "css=*"
        },
        {
          "name": "Img_Count",
          "type": "count",
          "selector": "css=img"
        },
        {
          "name": "Script_Count",
          "type": "count",
          "selector": "css=script"
        },
        {
          "name": "Stylesheet_Count",
          "type": "count",
          "selector": "css=link[rel='stylesheet']"
        },
        {
          "name": "Iframe_Count",
          "type": "count",
          "selector": "css=iframe"
        },
        {
          "name": "Form_Count",
          "type": "count",
          "selector": "css=form"
        },
        {
          "name": "Input_Count",
          "type": "count",
          "selector": "css=input,textarea,select"
        },
        {
          "name": "Button_Count",
          "type": "count",
          "selector": "css=button"
        },
        {
          "name": "SVG_Count",
          "type": "count",
          "selector": "css=svg"
        },
        {
          "name": "Noscript_Count",
          "type": "count",
          "selector": "css=noscript"
        },
        {
          "name": "Inline_Style_Attrs",
          "type": "count",
          "selector": "css=[style]"
        },
        {
          "name": "Image_Audit",
          "type": "list",
          "selector": "css=img",
          "transformations": [
            {
              "type": "script",
              "code": "var rows=Array.isArray(value)?value:[];var total=rows.length,missingAlt=0,emptyAlt=0,goodAlt=0,longAlt=0,missingSrc=0,emptySrc=0;var lazy=0,eager=0,jsLazy=0,hasSrcset=0,missingDims=0,hasDims=0,modern=0,legacy=0;var hasTitle=0,asyncDec=0,extImg=0,insecure=0;var fmt={},srcSeen={},altSamples=[];var pageUrl=\"\",hostname=\"\";try{pageUrl=String(rows[0].page_url||\"\");hostname=new URL(pageUrl).hostname;}catch(e){}for(var i=0;i<rows.length;i++){var r=rows[i]||{};var src=String(r.src||\"\").trim();var cs=String(r.current_src||\"\").trim();var eff=cs||src;var alt=r.alt;var hasAltAttr=(alt!==null&&alt!==undefined);if(!hasAltAttr){missingAlt++;if(altSamples.length<10)altSamples.push(eff.substring(eff.lastIndexOf(\"/\")+1,eff.lastIndexOf(\"/\")+60)||\"(no src)\");}else if(String(alt).trim()===\"\")emptyAlt++;else{goodAlt++;if(String(alt).length>125)longAlt++;}if(!hasAltAttr&&!src)missingSrc++;if(src===\"\")emptySrc++;if(String(r.loading||\"\").toLowerCase()===\"lazy\")lazy++;else if(src)eager++;if(!src&&String(r.data_src||\"\").trim())jsLazy++;if(String(r.srcset||\"\").trim())hasSrcset++;var w=String(r.w||\"\").trim(),h=String(r.h||\"\").trim();if(w&&h)hasDims++;else missingDims++;if(String(r.title||\"\").trim())hasTitle++;if(String(r.decoding||\"\").toLowerCase()===\"async\")asyncDec++;var ext=\"\";var em=eff.match(/\\.([a-z0-9]{2,5})(?:$|\\?|#)/i);if(em)ext=em[1].toLowerCase();else if(eff.indexOf(\"data:image/\")===0){var dm=eff.match(/^data:image\\/([a-z0-9.+-]+)/i);if(dm)ext=dm[1].toLowerCase();}if(ext)fmt[ext]=(fmt[ext]||0)+1;if(ext===\"webp\"||ext===\"avif\"||ext===\"jxl\")modern++;else if(ext)legacy++;if(eff){var key=eff.split(\"?\")[0];srcSeen[key]=(srcSeen[key]||0)+1;try{var u=new URL(eff,pageUrl);if(u.hostname&&u.hostname!==hostname)extImg++;if(u.protocol===\"http:\"&&/^https:/i.test(pageUrl))insecure++;}catch(e){}}}var dupes=0;Object.keys(srcSeen).forEach(function(k){if(srcSeen[k]>1)dupes+=srcSeen[k]-1;});var fmtStr=Object.keys(fmt).map(function(k){return k+\"(\"+fmt[k]+\")\";}).sort().join(\", \");var verdict=[];if(missingAlt>0)verdict.push(missingAlt+\" img missing alt\");if(missingDims>0&&total>0&&(missingDims/total)>0.3)verdict.push(Math.round((missingDims/total)*100)+\"% missing width/height (CLS risk)\");if(modern===0&&total>3)verdict.push(\"No modern image formats (WebP/AVIF)\");if(insecure>0)verdict.push(insecure+\" insecure http:// image(s)\");return {total:String(total),missing_alt:String(missingAlt),empty_alt:String(emptyAlt),good_alt:String(goodAlt),long_alt:String(longAlt),alt_missing_sample:altSamples.join(\" | \"),missing_src:String(missingSrc),empty_src:String(emptySrc),lazy_loaded:String(lazy),eager_loaded:String(eager),js_lazy_loaded:String(jsLazy),has_srcset:String(hasSrcset),responsive_coverage:String(total?Math.round((hasSrcset/total)*100):0),missing_dimensions:String(missingDims),has_dimensions:String(hasDims),cls_risk_ratio:String(total?Math.round((missingDims/total)*100):0),modern_format:String(modern),legacy_format:String(legacy),format_breakdown:fmtStr,external_images:String(extImg),insecure_images:String(insecure),has_title_attr:String(hasTitle),async_decoding:String(asyncDec),unique_srcs:String(Object.keys(srcSeen).length),duplicate_srcs:String(dupes),image_verdict:verdict.length?verdict.join(\"; \"):\"OK\"};"
            }
          ],
          "properties": [
            {
              "name": "src",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "src"
            },
            {
              "name": "alt",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "alt"
            },
            {
              "name": "w",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "width"
            },
            {
              "name": "h",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "height"
            },
            {
              "name": "loading",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "loading"
            },
            {
              "name": "srcset",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "srcset"
            },
            {
              "name": "decoding",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "decoding"
            },
            {
              "name": "data_src",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "data-src"
            },
            {
              "name": "current_src",
              "type": "property",
              "selector": "css=self"
            },
            {
              "name": "total",
              "type": "index"
            },
            {
              "name": "missing_alt",
              "type": "index"
            },
            {
              "name": "empty_alt",
              "type": "index"
            },
            {
              "name": "good_alt",
              "type": "index"
            },
            {
              "name": "long_alt",
              "type": "index"
            },
            {
              "name": "alt_missing_sample",
              "type": "index"
            },
            {
              "name": "missing_src",
              "type": "index"
            },
            {
              "name": "empty_src",
              "type": "index"
            },
            {
              "name": "lazy_loaded",
              "type": "index"
            },
            {
              "name": "eager_loaded",
              "type": "index"
            },
            {
              "name": "js_lazy_loaded",
              "type": "index"
            },
            {
              "name": "has_srcset",
              "type": "index"
            },
            {
              "name": "responsive_coverage",
              "type": "index"
            },
            {
              "name": "missing_dimensions",
              "type": "index"
            },
            {
              "name": "has_dimensions",
              "type": "index"
            },
            {
              "name": "cls_risk_ratio",
              "type": "index"
            },
            {
              "name": "modern_format",
              "type": "index"
            },
            {
              "name": "legacy_format",
              "type": "index"
            },
            {
              "name": "format_breakdown",
              "type": "index"
            },
            {
              "name": "external_images",
              "type": "index"
            },
            {
              "name": "insecure_images",
              "type": "index"
            },
            {
              "name": "has_title_attr",
              "type": "index"
            },
            {
              "name": "async_decoding",
              "type": "index"
            },
            {
              "name": "unique_srcs",
              "type": "index"
            },
            {
              "name": "duplicate_srcs",
              "type": "index"
            },
            {
              "name": "image_verdict",
              "type": "index"
            }
          ]
        },
        {
          "name": "Resource_Audit",
          "type": "list",
          "selector": "css=script,link[rel='stylesheet']",
          "transformations": [
            {
              "type": "script",
              "code": "var rows=Array.isArray(value)?value:[];var pageUrl=\"\",hostname=\"\";for(var q=0;q<rows.length;q++){if(rows[q]&&rows[q].page_url){pageUrl=String(rows[q].page_url);break;}}try{hostname=new URL(pageUrl).hostname;}catch(e){}var scripts=0,scriptsExt=0,scriptsInline=0,scriptsAsync=0,scriptsDefer=0,scriptsBlocking=0,scriptsThird=0,moduleScripts=0;var sheets=0,sheetsBlocking=0,sheetsPrint=0,sheetsThird=0;var thirdDomains={},insecure=0,blockSamples=[];for(var i=0;i<rows.length;i++){var r=rows[i]||{};var tag=String(r.tag||\"\").toLowerCase();var rel=String(r.rel||\"\").toLowerCase();var src=String(r.src||\"\").trim();var href=String(r.href||\"\").trim();var url=src||href;var third=false;if(url&&hostname){try{var u=new URL(url,pageUrl);if(u.hostname&&u.hostname!==hostname){third=true;thirdDomains[u.hostname]=(thirdDomains[u.hostname]||0)+1;}if(u.protocol===\"http:\"&&/^https:/i.test(pageUrl))insecure++;}catch(e){}}if(tag===\"script\"){scripts++;var type=String(r.type_a||\"\").toLowerCase();if(type.indexOf(\"module\")!==-1)moduleScripts++;if(src){scriptsExt++;if(third)scriptsThird++;}else scriptsInline++;var isAsync=(r.async_a!==null&&r.async_a!==undefined)||(r.defer_a!==null&&r.defer_a!==undefined)||type===\"module\";if(isAsync){if(r.async_a!==null&&r.async_a!==undefined)scriptsAsync++;if(r.defer_a!==null&&r.defer_a!==undefined)scriptsDefer++;}else{scriptsBlocking++;if(blockSamples.length<12&&src)blockSamples.push(src);}}else if(tag===\"link\"&&rel.indexOf(\"stylesheet\")!==-1){sheets++;var media=String(r.media_a||\"\").toLowerCase();if(media&&media!==\"all\"&&media.indexOf(\"print\")!==-1)sheetsPrint++;else{sheetsBlocking++;if(blockSamples.length<12&&href)blockSamples.push(href);}if(third)sheetsThird++;}}var td=Object.keys(thirdDomains).map(function(k){return [k,thirdDomains[k]];});td.sort(function(a,b){return b[1]-a[1];});var total=rows.length;var blockingTotal=sheetsBlocking+scriptsBlocking;var verdict=blockingTotal===0?\"No render-blocking resources\":blockingTotal<=3?\"Low render-blocking load (\"+blockingTotal+\")\":blockingTotal<=8?\"Moderate render-blocking load (\"+blockingTotal+\")\":\"Heavy render-blocking load (\"+blockingTotal+\")\";return {total:String(total),scripts_total:String(scripts),scripts_external:String(scriptsExt),scripts_inline:String(scriptsInline),scripts_async:String(scriptsAsync),scripts_defer:String(scriptsDefer),scripts_blocking:String(scriptsBlocking),scripts_third_party:String(scriptsThird),third_party_domains:td.slice(0,20).map(function(p){return p[0]+\"(\"+p[1]+\")\";}).join(\", \"),stylesheets_total:String(sheets),stylesheets_render_blocking:String(sheetsBlocking),stylesheets_print_only:String(sheetsPrint),stylesheets_third_party:String(sheetsThird),render_blocking_total:String(blockingTotal),render_blocking_sample:blockSamples.join(\" | \"),insecure_resources:String(insecure),module_scripts:String(moduleScripts),blocking_verdict:verdict};"
            }
          ],
          "properties": [
            {
              "name": "tag",
              "type": "property",
              "selector": "css=self"
            },
            {
              "name": "src",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "src"
            },
            {
              "name": "href",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "href"
            },
            {
              "name": "rel",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "rel"
            },
            {
              "name": "async_a",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "async"
            },
            {
              "name": "defer_a",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "defer"
            },
            {
              "name": "type_a",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "type"
            },
            {
              "name": "media_a",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "media"
            },
            {
              "name": "page_url",
              "type": "page_url",
              "selector": ""
            },
            {
              "name": "total",
              "type": "index"
            },
            {
              "name": "scripts_total",
              "type": "index"
            },
            {
              "name": "scripts_external",
              "type": "index"
            },
            {
              "name": "scripts_inline",
              "type": "index"
            },
            {
              "name": "scripts_async",
              "type": "index"
            },
            {
              "name": "scripts_defer",
              "type": "index"
            },
            {
              "name": "scripts_blocking",
              "type": "index"
            },
            {
              "name": "scripts_third_party",
              "type": "index"
            },
            {
              "name": "third_party_domains",
              "type": "index"
            },
            {
              "name": "stylesheets_total",
              "type": "index"
            },
            {
              "name": "stylesheets_render_blocking",
              "type": "index"
            },
            {
              "name": "stylesheets_print_only",
              "type": "index"
            },
            {
              "name": "stylesheets_third_party",
              "type": "index"
            },
            {
              "name": "render_blocking_total",
              "type": "index"
            },
            {
              "name": "render_blocking_sample",
              "type": "index"
            },
            {
              "name": "insecure_resources",
              "type": "index"
            },
            {
              "name": "module_scripts",
              "type": "index"
            },
            {
              "name": "blocking_verdict",
              "type": "index"
            }
          ]
        },
        {
          "name": "Embed_Audit",
          "type": "list",
          "selector": "css=iframe,video,audio,embed,object",
          "transformations": [
            {
              "type": "script",
              "code": "var rows=Array.isArray(value)?value:[];var total=rows.length,iframes=0,ifrNoTitle=0,ifrLazy=0,yt=0,vimeo=0,maps=0,ads=0,videos=0,audios=0,objects=0,insecure=0;var domains={};for(var i=0;i<rows.length;i++){var r=rows[i]||{};var tag=String(r.tag||\"\").toLowerCase();var src=String(r.src||\"\").trim();if(tag===\"iframe\"){iframes++;if(!String(r.title||\"\").trim())ifrNoTitle++;if(String(r.loading||\"\").toLowerCase()===\"lazy\")ifrLazy++;}else if(tag===\"video\")videos++;else if(tag===\"audio\")audios++;else if(tag===\"embed\"||tag===\"object\")objects++;if(src){try{var u=new URL(src,\"about:blank\");var h=u.hostname.replace(/^www\\./,\"\");domains[h]=(domains[h]||0)+1;if(u.protocol===\"http:\")insecure++;if(/youtube\\.com|youtu\\.be/.test(h))yt++;else if(/vimeo\\.com/.test(h))vimeo++;else if(/google\\.[a-z.]+\\/maps|maps\\.google/.test(h))maps++;else if(/doubleclick|googlesyndication|adsystem|amazon-adsystem|adnxs|criteo|taboola|outbrain/.test(h))ads++;}catch(e){}}}return {total:String(total),iframes:String(iframes),iframes_missing_title:String(ifrNoTitle),iframes_lazy:String(ifrLazy),youtube_embeds:String(yt),vimeo_embeds:String(vimeo),map_embeds:String(maps),ad_embeds:String(ads),videos:String(videos),audios:String(audios),objects:String(objects),embed_domains:Object.keys(domains).map(function(k){return k+\"(\"+domains[k]+\")\";}).join(\", \"),insecure_embeds:String(insecure)};"
            }
          ],
          "properties": [
            {
              "name": "tag",
              "type": "property",
              "selector": "css=self"
            },
            {
              "name": "src",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "src"
            },
            {
              "name": "title",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "title"
            },
            {
              "name": "loading",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "loading"
            },
            {
              "name": "sandbox",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "sandbox"
            },
            {
              "name": "total",
              "type": "index"
            },
            {
              "name": "iframes",
              "type": "index"
            },
            {
              "name": "iframes_missing_title",
              "type": "index"
            },
            {
              "name": "iframes_lazy",
              "type": "index"
            },
            {
              "name": "youtube_embeds",
              "type": "index"
            },
            {
              "name": "vimeo_embeds",
              "type": "index"
            },
            {
              "name": "map_embeds",
              "type": "index"
            },
            {
              "name": "ad_embeds",
              "type": "index"
            },
            {
              "name": "videos",
              "type": "index"
            },
            {
              "name": "audios",
              "type": "index"
            },
            {
              "name": "objects",
              "type": "index"
            },
            {
              "name": "embed_domains",
              "type": "index"
            },
            {
              "name": "insecure_embeds",
              "type": "index"
            }
          ]
        },
        {
          "name": "DOM_Performance",
          "type": "list",
          "selector": "css=self",
          "transformations": [
            {
              "type": "script",
              "code": "var it=(Array.isArray(value)&&value.length)?value[0]:{};var html=String(it.html||\"\");var domNodes=parseInt(it.dom_nodes,10)||0;var VOID={area:1,base:1,br:1,col:1,embed:1,hr:1,img:1,input:1,link:1,meta:1,param:1,source:1,track:1,wbr:1};var depth=0,maxDepth=0;var tagRe=/<(/)?([a-zA-Z][a-zA-Z0-9-]*)([^>]*)>/g;var m;while((m=tagRe.exec(html))!==null){var closing=m[1]===\"/\";var name=m[2].toLowerCase();var attrs=m[3]||\"\";if(name===\"script\"||name===\"style\"){if(!closing){var closeIdx=html.indexOf(\"</\"+name,tagRe.lastIndex);if(closeIdx!==-1)tagRe.lastIndex=closeIdx;}continue;}if(VOID[name]||/\\/\\s*$/.test(attrs))continue;if(closing){if(depth>0)depth--;}else{depth++;if(depth>maxDepth)maxDepth=depth;}}var preload=parseInt(it.preload,10)||0;var prefetch=parseInt(it.prefetch,10)||0;var preconnect=parseInt(it.preconnect,10)||0;var modulepreload=parseInt(it.modulepreload,10)||0;var prerender=parseInt(it.prerender,10)||0;var fontPreload=parseInt(it.fonts_preload,10)||0;var inlineStyles=parseInt(it.inline_styles,10)||0;var styleAttrs=parseInt(it.style_attrs,10)||0;var hints=preload+prefetch+preconnect+modulepreload+prerender;var ttfb=parseInt(it.response_ms,10);if(!isFinite(ttfb))ttfb=0;var bytes=parseInt(it.content_bytes,10);if(!isFinite(bytes))bytes=0;var proto=String(it.protocol||\"\").toLowerCase();var domVerdict=domNodes===0?\"Unknown\":domNodes<=1500?\"Healthy\":domNodes<=3000?\"Large\":domNodes<=5000?\"Very large\":\"Excessive\";var depthVerdict=maxDepth<=15?\"Healthy\":maxDepth<=25?\"Deep\":\"Excessively deep\";var ttfbVerdict=ttfb===0?\"Unknown\":ttfb<=200?\"Excellent (<=200ms)\":ttfb<=600?\"Good (<=600ms)\":ttfb<=1800?\"Needs improvement\":\"Poor (>1800ms)\";var score=100;if(domNodes>1500)score-=Math.min(25,Math.floor((domNodes-1500)/400));if(maxDepth>20)score-=Math.min(15,Math.floor((maxDepth-20)/5));if(ttfb>600)score-=Math.min(25,Math.floor((ttfb-600)/200));if(bytes>500000)score-=Math.min(15,Math.floor(bytes/500000));if(hints===0)score-=5;if(score<0)score=0;var pVerdict=score>=85?\"Excellent\":score>=70?\"Good\":score>=50?\"Needs improvement\":\"Poor\";return {dom_size:String(domNodes),dom_size_verdict:domVerdict,dom_max_depth:String(maxDepth),dom_depth_verdict:depthVerdict,html_bytes:String(html.length),html_kb:String(Math.round(html.length/1024)),resource_hint_count:String(hints),preload_count:String(preload),prefetch_count:String(prefetch),preconnect_count:String(preconnect),font_preload_count:String(fontPreload),inline_style_blocks:String(inlineStyles),inline_style_attrs:String(styleAttrs),ttfb_ms:String(ttfb),ttfb_verdict:ttfbVerdict,transfer_kb:String(Math.round(bytes/1024)),uses_http2:String(proto===\"h2\"),uses_http3:String(proto===\"h3\"||proto===\"h3-29\"),performance_score:String(score),performance_verdict:pVerdict};"
            }
          ],
          "properties": [
            {
              "name": "html",
              "type": "html",
              "selector": "css=self"
            },
            {
              "name": "dom_nodes",
              "type": "count",
              "selector": "css=*"
            },
            {
              "name": "preload",
              "type": "count",
              "selector": "css=link[rel='preload']"
            },
            {
              "name": "prefetch",
              "type": "count",
              "selector": "css=link[rel='prefetch']"
            },
            {
              "name": "preconnect",
              "type": "count",
              "selector": "css=link[rel='preconnect'],link[rel='dns-prefetch']"
            },
            {
              "name": "modulepreload",
              "type": "count",
              "selector": "css=link[rel='modulepreload']"
            },
            {
              "name": "prerender",
              "type": "count",
              "selector": "css=link[rel='prerender']"
            },
            {
              "name": "fonts_preload",
              "type": "count",
              "selector": "css=link[rel='preload'][as='font']"
            },
            {
              "name": "inline_styles",
              "type": "count",
              "selector": "css=style"
            },
            {
              "name": "style_attrs",
              "type": "count",
              "selector": "css=[style]"
            },
            {
              "name": "canonical_tags",
              "type": "count",
              "selector": "css=link[rel='canonical']"
            },
            {
              "name": "response_ms",
              "type": "text",
              "selector": "variable=last_response_time_ms"
            },
            {
              "name": "content_bytes",
              "type": "text",
              "selector": "variable=last_content_length"
            },
            {
              "name": "protocol",
              "type": "text",
              "selector": "variable=last_protocol"
            },
            {
              "name": "dom_size",
              "type": "index"
            },
            {
              "name": "dom_size_verdict",
              "type": "index"
            },
            {
              "name": "dom_max_depth",
              "type": "index"
            },
            {
              "name": "dom_depth_verdict",
              "type": "index"
            },
            {
              "name": "html_bytes",
              "type": "index"
            },
            {
              "name": "html_kb",
              "type": "index"
            },
            {
              "name": "resource_hint_count",
              "type": "index"
            },
            {
              "name": "preload_count",
              "type": "index"
            },
            {
              "name": "prefetch_count",
              "type": "index"
            },
            {
              "name": "preconnect_count",
              "type": "index"
            },
            {
              "name": "font_preload_count",
              "type": "index"
            },
            {
              "name": "inline_style_blocks",
              "type": "index"
            },
            {
              "name": "inline_style_attrs",
              "type": "index"
            },
            {
              "name": "ttfb_ms",
              "type": "index"
            },
            {
              "name": "ttfb_verdict",
              "type": "index"
            },
            {
              "name": "transfer_kb",
              "type": "index"
            },
            {
              "name": "uses_http2",
              "type": "index"
            },
            {
              "name": "uses_http3",
              "type": "index"
            },
            {
              "name": "performance_score",
              "type": "index"
            },
            {
              "name": "performance_verdict",
              "type": "index"
            }
          ]
        }
      ],
      "required_fields": [
        "Page_URL"
      ]
    },
    "Structured_Data": {
      "item_selector": "css=html",
      "properties": [
        {
          "name": "Page_URL",
          "type": "page_url",
          "selector": ""
        },
        {
          "name": "JsonLD_Count",
          "type": "count",
          "selector": "css=script[type='application/ld+json']"
        },
        {
          "name": "Microdata_Count",
          "type": "count",
          "selector": "css=[itemtype]"
        },
        {
          "name": "RDFa_Count",
          "type": "count",
          "selector": "css=[typeof]"
        },
        {
          "name": "Tech_Stack",
          "type": "text",
          "selector": "variable=tech_stack",
          "transformations": [
            {
              "type": "script",
              "code": "if(!value)return '';if(Array.isArray(value))return value.join(', ');return String(value);",
              "default_value": ""
            }
          ]
        },
        {
          "name": "Tech_Stack_Count",
          "type": "text",
          "selector": "variable=tech_stack",
          "transformations": [
            {
              "type": "script",
              "code": "return String(Array.isArray(value)?value.length:0);",
              "default_value": "0"
            }
          ]
        },
        {
          "name": "Structured_Data_Audit",
          "type": "list",
          "selector": "css=script[type='application/ld+json']",
          "transformations": [
            {
              "type": "script",
              "code": "var rows=Array.isArray(value)?value:[];var blocks=rows.length,valid=0,invalid=0,errors=[];var types={},ids=[],graphNodes=0,missingCtx=0,missingType=0;function walk(node,depth){if(!node||typeof node!==\"object\"||depth>8)return;if(Array.isArray(node)){for(var a=0;a<node.length;a++)walk(node[a],depth+1);return;}if(node[\"@graph\"]&&Array.isArray(node[\"@graph\"])){graphNodes+=node[\"@graph\"].length;walk(node[\"@graph\"],depth+1);}var t=node[\"@type\"];if(t){if(Array.isArray(t)){for(var b=0;b<t.length;b++){var tn=String(t[b]);types[tn]=(types[tn]||0)+1;}}else{var tn2=String(t);types[tn2]=(types[tn2]||0)+1;}}else if(node[\"@id\"]||node[\"@context\"])missingType++;if(node[\"@id\"])ids.push(String(node[\"@id\"]).substring(0,120));if(node[\"@context\"]===undefined&&node[\"@graph\"]===undefined&&node[\"@type\"]!==undefined)missingCtx++;var keys=Object.keys(node);for(var k=0;k<keys.length&&k<40;k++){var v=node[keys[k]];if(v&&typeof v===\"object\")walk(v,depth+1);}}for(var i=0;i<rows.length;i++){var raw=String(rows[i].json||\"\").trim();if(!raw){invalid++;errors.push(\"Block \"+(i+1)+\": empty\");continue;}try{var parsed=JSON.parse(raw);valid++;walk(parsed,0);}catch(e){invalid++;errors.push(\"Block \"+(i+1)+\": \"+String(e.message||e).substring(0,120));}}var typeNames=Object.keys(types);var has=function(re){for(var j=0;j<typeNames.length;j++){if(re.test(typeNames[j]))return true;}return false;};var rich=[];if(has(/^(Product|Offer|AggregateOffer)$/i))rich.push(\"Product/Merchant listing\");if(has(/^(Article|NewsArticle|BlogPosting|TechArticle)$/i))rich.push(\"Article\");if(has(/^FAQPage$/i))rich.push(\"FAQ\");if(has(/^HowTo$/i))rich.push(\"HowTo\");if(has(/^BreadcrumbList$/i))rich.push(\"Breadcrumb\");if(has(/^(LocalBusiness|Restaurant|Store|Dentist|LegalService)$/i))rich.push(\"Local Business\");if(has(/^(Review|AggregateRating)$/i))rich.push(\"Review stars\");if(has(/^(Event)$/i))rich.push(\"Event\");if(has(/^(VideoObject)$/i))rich.push(\"Video\");if(has(/^(Recipe)$/i))rich.push(\"Recipe\");if(has(/^(JobPosting)$/i))rich.push(\"Job posting\");if(has(/^(SoftwareApplication)$/i))rich.push(\"Software app\");if(has(/^(QAPage|Question|Answer)$/i))rich.push(\"Q&A\");if(has(/^(SpeakableSpecification)$/i))rich.push(\"Speakable\");if(has(/^(Organization)$/i))rich.push(\"Organization knowledge panel\");if(has(/^(WebSite)$/i))rich.push(\"Sitelinks searchbox\");var issues=[];if(blocks===0)issues.push(\"No JSON-LD found\");if(invalid>0)issues.push(invalid+\" invalid JSON-LD block(s)\");if(missingCtx>0)issues.push(missingCtx+\" node(s) missing @context\");if(missingType>0)issues.push(missingType+\" node(s) missing @type\");var verdict=blocks===0?\"Missing structured data\":invalid>0?\"Broken structured data\":rich.length?\"Rich result eligible: \"+rich.join(\", \"):\"Valid but no rich-result type\";return {blocks:String(blocks),valid_blocks:String(valid),invalid_blocks:String(invalid),parse_errors:errors.join(\" | \").substring(0,2000),types:typeNames.map(function(t){return t+\"(\"+types[t]+\")\";}).join(\", \"),type_count:String(typeNames.length),has_organization:String(has(/^(Organization|Corporation|LocalBusiness)$/i)),has_localbusiness:String(has(/LocalBusiness|Restaurant|Store|Dentist|LegalService|AutoDealer|HealthAndBeautyBusiness/i)),has_website:String(has(/^WebSite$/i)),has_webpage:String(has(/^(WebPage|ItemPage|AboutPage|ContactPage|CollectionPage)$/i)),has_breadcrumb:String(has(/^BreadcrumbList$/i)),has_article:String(has(/^(Article|NewsArticle|BlogPosting|TechArticle|ScholarlyArticle)$/i)),has_product:String(has(/^(Product|Offer|AggregateOffer)$/i)),has_faq:String(has(/^FAQPage$/i)),has_howto:String(has(/^HowTo$/i)),has_review:String(has(/^Review$/i)),has_aggregate_rating:String(has(/^AggregateRating$/i)),has_video:String(has(/^(VideoObject)$/i)),has_event:String(has(/^(Event)$/i)),has_person:String(has(/^Person$/i)),has_speakable:String(has(/^(SpeakableSpecification)$/i)),missing_context:String(missingCtx),missing_type:String(missingType),graph_nodes:String(graphNodes),entity_ids:ids.slice(0,20).join(\", \"),rich_result_eligible:rich.join(\", \"),issues:issues.join(\"; \"),structured_data_verdict:verdict};"
            }
          ],
          "properties": [
            {
              "name": "json",
              "type": "text",
              "selector": "css=self"
            },
            {
              "name": "page_url",
              "type": "page_url",
              "selector": ""
            },
            {
              "name": "blocks",
              "type": "index"
            },
            {
              "name": "valid_blocks",
              "type": "index"
            },
            {
              "name": "invalid_blocks",
              "type": "index"
            },
            {
              "name": "parse_errors",
              "type": "index"
            },
            {
              "name": "types",
              "type": "index"
            },
            {
              "name": "type_count",
              "type": "index"
            },
            {
              "name": "has_organization",
              "type": "index"
            },
            {
              "name": "has_localbusiness",
              "type": "index"
            },
            {
              "name": "has_website",
              "type": "index"
            },
            {
              "name": "has_webpage",
              "type": "index"
            },
            {
              "name": "has_breadcrumb",
              "type": "index"
            },
            {
              "name": "has_article",
              "type": "index"
            },
            {
              "name": "has_product",
              "type": "index"
            },
            {
              "name": "has_faq",
              "type": "index"
            },
            {
              "name": "has_howto",
              "type": "index"
            },
            {
              "name": "has_review",
              "type": "index"
            },
            {
              "name": "has_aggregate_rating",
              "type": "index"
            },
            {
              "name": "has_video",
              "type": "index"
            },
            {
              "name": "has_event",
              "type": "index"
            },
            {
              "name": "has_person",
              "type": "index"
            },
            {
              "name": "has_speakable",
              "type": "index"
            },
            {
              "name": "missing_context",
              "type": "index"
            },
            {
              "name": "missing_type",
              "type": "index"
            },
            {
              "name": "graph_nodes",
              "type": "index"
            },
            {
              "name": "entity_ids",
              "type": "index"
            },
            {
              "name": "rich_result_eligible",
              "type": "index"
            },
            {
              "name": "issues",
              "type": "index"
            },
            {
              "name": "structured_data_verdict",
              "type": "index"
            }
          ]
        },
        {
          "name": "Microdata_RDFa",
          "type": "list",
          "selector": "css=self",
          "transformations": [
            {
              "type": "script",
              "code": "var it=(Array.isArray(value)&&value.length)?value[0]:{};var itemtypes=parseInt(it.itemtypes,10)||0;var itemprops=parseInt(it.itemprops,10)||0;var typeofs=parseInt(it.typeof_nodes,10)||0;var props=parseInt(it.property_nodes,10)||0;var mdTypes=String(it.microdata_types||\"\").split(\"\\n\").map(function(s){return s.trim();}).filter(Boolean);var rdTypes=String(it.rdfa_types||\"\").split(\"\\n\").map(function(s){return s.trim();}).filter(Boolean);var mdClean=[],rdClean=[];for(var i=0;i<mdTypes.length;i++){var p=mdTypes[i].replace(/^https?:\\/\\/schema\\.org\\//i,\"\");if(mdClean.indexOf(p)===-1)mdClean.push(p);}for(var j=0;j<rdTypes.length;j++){var p2=rdTypes[j].replace(/^https?:\\/\\/schema\\.org\\//i,\"\");if(rdClean.indexOf(p2)===-1)rdClean.push(p2);}var formats=[];if(itemtypes>0||itemprops>0)formats.push(\"Microdata\");if(typeofs>0||props>0)formats.push(\"RDFa\");var verdict=formats.length===0?\"No Microdata or RDFa markup\":formats.join(\" + \")+\" detected\";return {microdata_total:String(itemtypes),microdata_types_all:mdClean.join(\", \"),rdfa_total:String(typeofs),rdfa_types_all:rdClean.join(\", \"),markup_formats_used:formats.join(\", \"),markup_verdict:verdict};"
            }
          ],
          "properties": [
            {
              "name": "itemtypes",
              "type": "count",
              "selector": "css=[itemtype]"
            },
            {
              "name": "itemprops",
              "type": "count",
              "selector": "css=[itemprop]"
            },
            {
              "name": "typeof_nodes",
              "type": "count",
              "selector": "css=[typeof]"
            },
            {
              "name": "property_nodes",
              "type": "count",
              "selector": "css=[property]"
            },
            {
              "name": "microdata_types",
              "type": "attribute",
              "selector": "css=[itemtype]",
              "attribute": "itemtype"
            },
            {
              "name": "rdfa_types",
              "type": "attribute",
              "selector": "css=[typeof]",
              "attribute": "typeof"
            },
            {
              "name": "microdata_total",
              "type": "index"
            },
            {
              "name": "microdata_types_all",
              "type": "index"
            },
            {
              "name": "rdfa_total",
              "type": "index"
            },
            {
              "name": "rdfa_types_all",
              "type": "index"
            },
            {
              "name": "markup_formats_used",
              "type": "index"
            },
            {
              "name": "markup_verdict",
              "type": "index"
            }
          ]
        }
      ],
      "required_fields": [
        "Page_URL"
      ]
    },
    "Accessibility_AXE": {
      "item_selector": "css=html",
      "properties": [
        {
          "name": "Page_URL",
          "type": "page_url",
          "selector": ""
        },
        {
          "name": "AXE_Violations",
          "type": "text",
          "selector": "variable=axe_report",
          "transformations": [
            {
              "type": "json_path"
            },
            {
              "type": "script",
              "code": "return String(Array.isArray(value)?value.length:0);",
              "default_value": "0"
            }
          ]
        },
        {
          "name": "AXE_Passes",
          "type": "text",
          "selector": "variable=axe_report",
          "transformations": [
            {
              "type": "json_path"
            },
            {
              "type": "script",
              "code": "return String(Array.isArray(value)?value.length:0);",
              "default_value": "0"
            }
          ]
        },
        {
          "name": "AXE_Incomplete",
          "type": "text",
          "selector": "variable=axe_report",
          "transformations": [
            {
              "type": "json_path"
            },
            {
              "type": "script",
              "code": "return String(Array.isArray(value)?value.length:0);",
              "default_value": "0"
            }
          ]
        },
        {
          "name": "AXE_Inapplicable",
          "type": "text",
          "selector": "variable=axe_report",
          "transformations": [
            {
              "type": "json_path"
            },
            {
              "type": "script",
              "code": "return String(Array.isArray(value)?value.length:0);",
              "default_value": "0"
            }
          ]
        },
        {
          "name": "AXE_Summary",
          "type": "list",
          "selector": "css=self",
          "transformations": [
            {
              "type": "script",
              "code": "var it=(Array.isArray(value)&&value.length)?value[0]:{};var rep=it.report;if(!rep||typeof rep!==\"object\"){return {ran:\"false\",violation_count:\"0\",critical_count:\"0\",serious_count:\"0\",moderate_count:\"0\",minor_count:\"0\",affected_nodes:\"0\",violation_ids:\"\",top_violations:\"\",wcag_tags:\"\",passes_count:\"0\",incomplete_count:\"0\",axe_score:\"\",axe_grade:\"\",axe_verdict:\"AXE did not run (blocked, CSP, or CDN unreachable)\",axe_url:\"\",axe_engine_version:\"\"};}var v=Array.isArray(rep.violations)?rep.violations:[];var p=Array.isArray(rep.passes)?rep.passes:[];var inc=Array.isArray(rep.incomplete)?rep.incomplete:[];var crit=0,ser=0,mod=0,min=0,nodes=0,ids=[],tops=[],tags={};for(var i=0;i<v.length;i++){var imp=String(v[i].impact||\"\").toLowerCase();var nc=Array.isArray(v[i].nodes)?v[i].nodes.length:0;nodes+=nc;if(imp===\"critical\")crit++;else if(imp===\"serious\")ser++;else if(imp===\"moderate\")mod++;else min++;ids.push(v[i].id);tops.push((v[i].id||\"?\")+\" [\"+(imp||\"?\")+\":\"+nc+\"] \"+String(v[i].help||\"\").substring(0,70));var t=Array.isArray(v[i].tags)?v[i].tags:[];for(var j=0;j<t.length;j++){if(/^wcag/i.test(t[j])||/^best-practice/i.test(t[j])||/^section508/i.test(t[j]))tags[t[j]]=1;}}tops.sort(function(a,b){var oa=[\"critical\",\"serious\",\"moderate\",\"minor\"];var ai=9,bi=9;for(var k=0;k<oa.length;k++){if(a.indexOf(\"[\"+oa[k])!==-1)ai=k;if(b.indexOf(\"[\"+oa[k])!==-1)bi=k;}return ai-bi;});var checked=p.length+v.length+inc.length;var score=checked?Math.round((p.length/checked)*100):100;var grade=score>=95?\"A\":score>=90?\"B\":score>=80?\"C\":score>=70?\"D\":\"F\";var verdict=(crit+ser)===0?(v.length===0?\"No accessibility violations\":v.length+\" minor/moderate violation(s)\"):(crit+\" critical, \"+ser+\" serious violation(s)\");var engine=\"\";try{engine=(rep.testEngine&&rep.testEngine.name||\"\")+\" \"+((rep.testEngine&&rep.testEngine.version)||\"\");}catch(e){}return {ran:\"true\",violation_count:String(v.length),critical_count:String(crit),serious_count:String(ser),moderate_count:String(mod),minor_count:String(min),affected_nodes:String(nodes),violation_ids:ids.join(\", \"),top_violations:tops.slice(0,15).join(\" || \").substring(0,4000),wcag_tags:Object.keys(tags).join(\", \"),passes_count:String(p.length),incomplete_count:String(inc.length),axe_score:String(score),axe_grade:grade,axe_verdict:verdict,axe_url:String(rep.url||it.page_url||\"\"),axe_engine_version:engine.trim()};"
            }
          ],
          "properties": [
            {
              "name": "report",
              "type": "attribute",
              "selector": "variable=axe_report",
              "attribute": "content"
            },
            {
              "name": "page_url",
              "type": "page_url",
              "selector": ""
            },
            {
              "name": "ran",
              "type": "index"
            },
            {
              "name": "violation_count",
              "type": "index"
            },
            {
              "name": "critical_count",
              "type": "index"
            },
            {
              "name": "serious_count",
              "type": "index"
            },
            {
              "name": "moderate_count",
              "type": "index"
            },
            {
              "name": "minor_count",
              "type": "index"
            },
            {
              "name": "affected_nodes",
              "type": "index"
            },
            {
              "name": "violation_ids",
              "type": "index"
            },
            {
              "name": "top_violations",
              "type": "index"
            },
            {
              "name": "wcag_tags",
              "type": "index"
            },
            {
              "name": "passes_count",
              "type": "index"
            },
            {
              "name": "incomplete_count",
              "type": "index"
            },
            {
              "name": "axe_score",
              "type": "index"
            },
            {
              "name": "axe_grade",
              "type": "index"
            },
            {
              "name": "axe_verdict",
              "type": "index"
            },
            {
              "name": "axe_url",
              "type": "index"
            },
            {
              "name": "axe_engine_version",
              "type": "index"
            }
          ]
        },
        {
          "name": "DOM_Accessibility",
          "type": "list",
          "selector": "css=[id]",
          "transformations": [
            {
              "type": "script",
              "code": "var rows=Array.isArray(value)?value:[];var seen={},dupes=[],invalid=0;for(var i=0;i<rows.length;i++){var id=String(rows[i].idv||\"\").trim();if(!id)continue;if(!/^[A-Za-z][A-Za-z0-9_\\-:\\.]*$/.test(id))invalid++;if(seen[id])dupes.push(id);else seen[id]=1;}var dupeUnique={};for(var j=0;j<dupes.length;j++)dupeUnique[dupes[j]]=1;var dk=Object.keys(dupeUnique);return {total_ids:String(rows.length),unique_ids:String(Object.keys(seen).length),duplicate_id_count:String(dupes.length),duplicate_ids:dk.slice(0,40).join(\", \"),invalid_ids:String(invalid),duplicate_id_verdict:dupes.length===0?\"OK\":dupes.length+\" duplicate id occurrence(s) across \"+dk.length+\" id(s)\"};"
            }
          ],
          "properties": [
            {
              "name": "idv",
              "type": "attribute",
              "selector": "css=self",
              "attribute": "id"
            },
            {
              "name": "total_ids",
              "type": "index"
            },
            {
              "name": "unique_ids",
              "type": "index"
            },
            {
              "name": "duplicate_id_count",
              "type": "index"
            },
            {
              "name": "duplicate_ids",
              "type": "index"
            },
            {
              "name": "invalid_ids",
              "type": "index"
            },
            {
              "name": "duplicate_id_verdict",
              "type": "index"
            }
          ]
        },
        {
          "name": "Form_Accessibility",
          "type": "list",
          "selector": "css=self",
          "transformations": [
            {
              "type": "script",
              "code": "var it=(Array.isArray(value)&&value.length)?value[0]:{};function n(x){var v=parseInt(x,10);return isFinite(v)?v:0;}var inputs=n(it.inputs),noId=n(it.inputs_no_id),labels=n(it.labels),labelsFor=n(it.labels_with_for);var forms=n(it.forms),formsNoAction=n(it.forms_no_action),submits=n(it.submit_buttons);var ifrNoTitle=n(it.iframes_no_title),emptyBtns=n(it.buttons_empty),skip=n(it.skip_links),noLang=n(it.lang_missing);var coverage=inputs?Math.round(((inputs-noId)/inputs)*100):100;var issues=[];if(noLang>0)issues.push(\"html missing lang attribute\");if(noId>0)issues.push(noId+\" form control(s) without id/aria-label/title\");if(ifrNoTitle>0)issues.push(ifrNoTitle+\" iframe(s) without title\");if(emptyBtns>0)issues.push(emptyBtns+\" empty button(s)\");if(!skip&&forms>0)issues.push(\"No skip link\");return {total_form_controls:String(inputs),controls_missing_label:String(noId),label_coverage:String(coverage),forms_total:String(forms),forms_missing_action:String(formsNoAction),submit_buttons_total:String(submits),iframes_missing_title:String(ifrNoTitle),empty_buttons:String(emptyBtns),has_skip_link:String(skip>0),html_lang_missing:String(noLang>0),form_verdict:issues.length?issues.join(\"; \"):\"OK\"};"
            }
          ],
          "properties": [
            {
              "name": "inputs",
              "type": "count",
              "selector": "css=input,textarea,select"
            },
            {
              "name": "inputs_no_id",
              "type": "count",
              "selector": "css=input:not([id]):not([aria-label]):not([aria-labelledby]):not([title]),textarea:not([id]):not([aria-label]):not([aria-labelledby]):not([title]),select:not([id]):not([aria-label]):not([aria-labelledby]):not([title])"
            },
            {
              "name": "labels",
              "type": "count",
              "selector": "css=label"
            },
            {
              "name": "labels_with_for",
              "type": "count",
              "selector": "css=label[for]"
            },
            {
              "name": "forms",
              "type": "count",
              "selector": "css=form"
            },
            {
              "name": "forms_no_action",
              "type": "count",
              "selector": "css=form:not([action])"
            },
            {
              "name": "submit_buttons",
              "type": "count",
              "selector": "css=button[type='submit'],input[type='submit']"
            },
            {
              "name": "aria_labelled",
              "type": "count",
              "selector": "css=[aria-label],[aria-labelledby]"
            },
            {
              "name": "iframes_no_title",
              "type": "count",
              "selector": "css=iframe:not([title])"
            },
            {
              "name": "buttons_empty",
              "type": "count",
              "selector": "css=button:empty"
            },
            {
              "name": "skip_links",
              "type": "count",
              "selector": "css=a[href^='#main'],a[href^='#content'],a[href^='#skip'],a.skip-link"
            },
            {
              "name": "lang_missing",
              "type": "count",
              "selector": "css=html:not([lang])"
            },
            {
              "name": "total_form_controls",
              "type": "index"
            },
            {
              "name": "controls_missing_label",
              "type": "index"
            },
            {
              "name": "label_coverage",
              "type": "index"
            },
            {
              "name": "forms_total",
              "type": "index"
            },
            {
              "name": "forms_missing_action",
              "type": "index"
            },
            {
              "name": "submit_buttons_total",
              "type": "index"
            },
            {
              "name": "iframes_missing_title",
              "type": "index"
            },
            {
              "name": "empty_buttons",
              "type": "index"
            },
            {
              "name": "has_skip_link",
              "type": "index"
            },
            {
              "name": "html_lang_missing",
              "type": "index"
            },
            {
              "name": "form_verdict",
              "type": "index"
            }
          ]
        }
      ],
      "required_fields": [
        "Page_URL"
      ]
    },
    "Critical_Issues": {
      "item_selector": "css=html",
      "properties": [
        {
          "name": "URL",
          "type": "page_url",
          "selector": ""
        },
        {
          "name": "Status_Code",
          "type": "text",
          "selector": "variable=last_http_status"
        },
        {
          "name": "Title",
          "type": "text",
          "selector": "css=head title",
          "transformations": [
            {
              "type": "trim"
            }
          ]
        },
        {
          "name": "Title_Count",
          "type": "count",
          "selector": "css=head title"
        },
        {
          "name": "Description_Count",
          "type": "count",
          "selector": "css=meta[name='description']"
        },
        {
          "name": "H1_Count",
          "type": "count",
          "selector": "css=h1"
        },
        {
          "name": "Canonical_Count",
          "type": "count",
          "selector": "css=link[rel='canonical']"
        },
        {
          "name": "Meta_Robots",
          "type": "text",
          "selector": "css=meta[name='robots']"
        },
        {
          "name": "X_Robots_Tag",
          "type": "text",
          "selector": "variable=last_x_robots_tag"
        },
        {
          "name": "Viewport_Count",
          "type": "count",
          "selector": "css=meta[name='viewport']"
        },
        {
          "name": "Img_Total",
          "type": "count",
          "selector": "css=img"
        },
        {
          "name": "Img_Missing_Alt",
          "type": "count",
          "selector": "css=img:not([alt])"
        },
        {
          "name": "JsonLD_Count",
          "type": "count",
          "selector": "css=script[type='application/ld+json']"
        },
        {
          "name": "DOM_Node_Count",
          "type": "count",
          "selector": "css=*"
        }
      ],
      "required_fields": [
        "URL"
      ]
    },
    "Healthy_Pages": {
      "item_selector": "css=html",
      "properties": [
        {
          "name": "URL",
          "type": "page_url",
          "selector": ""
        },
        {
          "name": "Status_Code",
          "type": "text",
          "selector": "variable=last_http_status"
        },
        {
          "name": "Title",
          "type": "text",
          "selector": "css=head title",
          "transformations": [
            {
              "type": "trim"
            }
          ]
        },
        {
          "name": "Title_Chars",
          "type": "text",
          "selector": "css=head title",
          "transformations": [
            {
              "type": "script",
              "code": "return String(String(value==null?'':value).trim().length);",
              "default_value": "0"
            }
          ]
        },
        {
          "name": "H1_Count",
          "type": "count",
          "selector": "css=h1"
        },
        {
          "name": "Canonical_Count",
          "type": "count",
          "selector": "css=link[rel='canonical']"
        },
        {
          "name": "Response_Time_ms",
          "type": "text",
          "selector": "variable=last_response_time_ms"
        }
      ],
      "required_fields": [
        "URL"
      ]
    }
  },
  "commands": [
    {
      "command": "try_catch",
      "params": {
        "try": [
          {
            "command": "goto",
            "params": {
              "url": "${last_target_url}",
              "timeout": 60000
            }
          }
        ],
        "catch": [
          {
            "command": "comment",
            "params": {
              "text": "Navigation failed: ${last_error}"
            }
          }
        ]
      }
    },
    {
      "command": "wait_for_load_state",
      "params": {
        "state": "networkidle",
        "timeout": 10000
      }
    },
    {
      "command": "scroll",
      "params": {
        "direction": "bottom",
        "delay": 600
      }
    },
    {
      "command": "scroll",
      "params": {
        "direction": "top",
        "delay": 300
      }
    },
    {
      "command": "detect_tech_stack",
      "params": {
        "output_variable": "tech_stack"
      }
    },
    {
      "command": "extract_data",
      "params": {
        "dataset": "Response_Indexability"
      }
    },
    {
      "command": "extract_data",
      "params": {
        "dataset": "OnPage_Elements"
      }
    },
    {
      "command": "extract_data",
      "params": {
        "dataset": "Content_Readability"
      }
    },
    {
      "command": "extract_data",
      "params": {
        "dataset": "Links_Census"
      }
    },
    {
      "command": "extract_data",
      "params": {
        "dataset": "Media_Performance"
      }
    },
    {
      "command": "extract_data",
      "params": {
        "dataset": "Structured_Data"
      }
    },
    {
      "command": "try_catch",
      "params": {
        "try": [
          {
            "command": "audit_accessibility",
            "params": {
              "scope": "html",
              "output_variable": "axe_report"
            }
          }
        ],
        "catch": [
          {
            "command": "comment",
            "params": {
              "text": "AXE audit unavailable: ${last_error}"
            }
          }
        ]
      }
    },
    {
      "command": "extract_data",
      "params": {
        "dataset": "Accessibility_AXE"
      }
    },
    {
      "command": "extract_data",
      "params": {
        "dataset": "Critical_Issues",
        "filter_condition": "Number(item.Status_Code) >= 400 || Number(item.Title_Count) !== 1 || Number(item.H1_Count) !== 1 || Number(item.Description_Count) > 1 || Number(item.Canonical_Count) > 1 || Number(item.Viewport_Count) === 0 || String(item.Meta_Robots).toLowerCase().indexOf('noindex') !== -1 || String(item.X_Robots_Tag).toLowerCase().indexOf('noindex') !== -1 || (Number(item.Img_Total) > 0 && Number(item.Img_Missing_Alt) / Number(item.Img_Total) > 0.25) || Number(item.DOM_Node_Count) > 1500"
      }
    },
    {
      "command": "extract_data",
      "params": {
        "dataset": "Healthy_Pages",
        "filter_condition": "Number(item.Status_Code) >= 200 && Number(item.Status_Code) < 300 && Number(item.Title_Count) === 1 && Number(item.H1_Count) === 1 && Number(item.Canonical_Count) <= 1 && Number(item.Title_Chars) >= 10 && Number(item.Title_Chars) <= 60 && Number(item.Response_Time_ms) < 3000"
      }
    }
  ],
  "authors": []
}

Frequently asked questions

How do I audit a list of URLs for on-page SEO?
Paste your URLs, one per line, into the required urls_to_audit project setting before launching. The bot works through the list with up to four concurrent workers, and every dataset records a Page_URL column so rows stay attributable to the page they came from. Results are de-duplicated per URL.
What checks does the auditor run on each page?
Nine datasets per page: HTTP response and indexability (status, redirects, robots directives, canonicals, charset, viewport, cookies, security headers with a letter grade); on-page elements (title and meta description with pixel-width truncation checks, heading structure outline, hreflang, Open Graph and Twitter card scoring); content readability (word counts, six readability formulas, text-to-HTML ratio, keyword-density flag, placeholder-text detection); a full links census (internal versus external counts, rel values, anchor-text quality, insecure targets); media and performance (image alt coverage, missing dimensions as a layout-shift risk, modern-format coverage, render-blocking scripts and stylesheets, DOM size and depth, TTFB); structured data (JSON-LD validity, schema types, rich-result eligibility, Microdata and RDFa census); an AXE accessibility audit with severity counts and a grade; and two triage views, Critical_Issues and Healthy_Pages.
Does it check canonical tags and robots directives?
Yes, in depth. The Response_Indexability dataset records the meta robots content, the X-Robots-Tag response header, every robots directive parsed out (noindex, nofollow, noarchive, nosnippet, max-snippet and friends), the source of any noindex signal, canonical count, whether the canonical is self-referencing and absolute, where it resolves to, and a canonical verdict listing concrete issues such as missing, multiple, relative, cross-host or pointing elsewhere. A combined indexability verdict names every blocker found, including meta refresh and non-HTML content types.
How does it score readability?
The Content_Readability dataset computes Flesch Reading Ease, Flesch-Kincaid grade, Gunning Fog, SMOG, Automated Readability and Coleman-Liau from the rendered body text, plus average sentence length, syllables per word, unique-word ratio and estimated reading time. It flags pages as thin when the word count falls below the low_content_words setting (300 by default), classifies length from Empty to Long-form, reports the top non-stopword terms with a keyword-stuffing density verdict, and detects leftover lorem ipsum or placeholder text.
Does it run an accessibility audit?
Yes. The audit_accessibility step runs the AXE engine over the whole document and stores violations, passes and incomplete checks; the Accessibility_AXE dataset then reports counts by severity (critical, serious, moderate, minor), affected nodes, the specific violation ids, WCAG and best-practice tags, a pass-rate score and a letter grade. The step is wrapped in error handling: if the engine cannot run because of a content security policy, a blocking rule or an unreachable engine source, the output says so explicitly instead of pretending the page passed.
What lands in the critical issues file?
Critical_Issues is a filtered triage view containing only pages that fail at least one hard check: HTTP status 400 or above, a title count other than one, an H1 count other than one, more than one meta description, more than one canonical, a missing viewport tag, noindex present in meta robots or the X-Robots-Tag header, more than 25 percent of images missing alt text, or a DOM larger than 1500 nodes. An empty Critical_Issues file after a run is the good-news outcome.
How many URLs can one run audit?
There is no built-in cap on the list length; the practical bounds are your patience and the target server's tolerance. The bot audits with up to four concurrent workers, and each page navigation allows 60 seconds before it is caught, logged and skipped. For large lists, audit in batches and keep an eye on rate-limit responses in the Status_Code column.
Why does the bot block images and stylesheets?
Speed and bandwidth. The configuration blocks image, media, font, stylesheet, websocket, manifest, texttrack, eventsource and other network requests, because the audit reads the DOM, response headers and HTTP metadata rather than pixels. Image tags and their attributes are still fully analysed for alt text, dimensions, lazy loading and formats - only the binary downloads are skipped. The trade-off is that the bot cannot judge visual rendering, so screenshot-dependent checks are out of scope.
Does it crawl my whole site automatically?
No. The bot audits exactly the URLs you submit in the urls_to_audit setting and nothing more; it does not discover pages, follow internal links or parse sitemaps. That is deliberate: an audit list you control is predictable, polite to the server and defensible. If you need discovery, generate the URL list from your own sitemap or analytics export first, then feed it in.
Can it detect structured data and rich result eligibility?
Yes. The Structured_Data dataset counts and parses every JSON-LD block, records parse errors verbatim, walks nested nodes and graphs, and lists all schema types found with counts. It sets flags for Organization, LocalBusiness, WebSite, WebPage, BreadcrumbList, Article, Product, FAQ, HowTo, Review, AggregateRating, VideoObject, Event, Person and Speakable, and produces a rich_result_eligible summary naming the enhancements the page qualifies for. A separate Microdata_RDFa census reports itemtype, itemprop, typeof and property usage so mixed-format markup is visible.
How are duplicate pages detected?
The Content_Readability dataset fingerprints each page's normalised body text with a full content hash and a 64-bit simhash built from three-word shingles, and exposes an eight-character near_duplicate_key. After a run, sort or group that column across your URL list: pages sharing a near-duplicate key have substantially similar body text, which is how you find template duplicates, boilerplate-heavy pages or canonicalisation candidates without eyeballing every file.
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.