The Plain Fetch viewer
In short
The viewer requests a URL the way a plain-fetch agent does: no JavaScript, one request for HTML, one for markdown, one for llms.txt and one for a path that should not exist. It shows the initial HTML on the left, the readable text on the right, and seven flags underneath.
Pre-loaded with www.wikipedia.org, read 4 November 2026. Type any public URL to run your own.
The page answers a plain fetch: 6 of 6 checks found.
Initial HTML what a plain fetch receives
<!DOCTYPE html>
<html data-dpl-id="dpl_GTMroWDTNgGHkYQBaSDtzfT5Ti54" lang="en" class="WpjB7a_variable FMl8Nq_variable bH8fPa_variable h-full scroll-pt-(--root-scroll-pt,4rem) bg-(--root-bg) antialiased [--root-bg:var(--light,var(--color [... 116 characters folded ...]>
<head>
<meta charSet="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
[... 52 more head elements folded ...]
<meta http-equiv="origin-trial" content="AqqPfjJCRTCZclPEcDgNnFwC7LJ01+qvT2Q64e/ego1N1nU9uckRoCkQFR1ThcnOnGn7a2iB1DPNqZc7R0bqTw8AAABceyJvcmlnaW4iOiJodHRwczovL2NsZXJrLmNvbTo0NDMiLCJmZWF0dXJlIjoiV2ViTUNQIiwiZXhwaXJ5IjoxODA2MzY0ODAwLCJpc1N1YmRvbWFpbiI6dHJ1ZX0="/>
[... 1 more head element folded ...]
<title>Clerk | Authentication and User Management
</title>
<meta name="description" content="The easiest way to add authentication and user management to your application. Purpose-built for React, Next.js, Remix, and “The Modern Web”."/>
<link rel="canonical" href="https://clerk.com"/>
<link rel="alternate" type="application/atom+xml" href="https://clerk.com/changelog/atom.xml" title="Clerk Changelog"/>
<link rel="alternate" type="application/atom+xml" href="https://clerk.com/blog/atom.xml" title="Clerk Blog"/>
[... 24 more head elements folded ...]
</head>
<body class="flex min-h-full flex-col bg-(--root-bg)" style="--scrollbar-offset:calc(var(--root-pr, 0px) + var(--removed-body-scroll-bar-size, 0px))">
<div hidden=""><!--$--><!--/$-->
</div><!--$--><!--/$--><!--$--><!--/$-->
<div class="isolate flex flex-auto flex-col bg-(--root-bg)">
<div class="sr-only focus-within:not-sr-only focus-within:fixed focus-within:z-200 focus-within:p-4"><a href="#main" class="group relative isolate inline-flex items-center justify-center overflow-hidden text-left font-medium transition duration-300 ease-[cubic-bezier(0.4,0.36,0,1)] before:duration-300 before:ease-[cubic [... 588 characters folded ...]>Skip to main content</a>
</div>
<header id="header" class="sticky top-2 isolate mt-(--header-mt-mobile,var(--header-mt,0)) h-fit w-full md:mt-(--header-mt,0)! light" style="--header-mt-mobile:var(--header-mt, 0);z-index:50">
<div class="header-background relative z-40">
<div class="pointer-events-none absolute inset-0 top-[-0.5rem] -z-10" style="height:3.15rem;--mask-opacity:0">
<div class="" style="position:relative;width:100%;height:100%">
<div class="pointer-events-none absolute inset-0" style="backdrop-filter:blur(1px);-webkit-backdrop-filter:blur(1px);mask-image:linear-gradient(to bottom, rgba(0, 0, 0, var(--mask-opacity, 1)) 40%, rgba(0, 0, 0, 0) 100%) [... 133 characters folded ...]>
</div>
<div class="pointer-events-none absolute inset-0" style="backdrop-filter:blur(1px);-webkit-backdrop-filter:blur(1px);mask-image:linear-gradient(to bottom, rgba(0, 0, 0, var(--mask-opacity, 1)) 40%, rgba(0, 0, 0, 0) 95%); [... 131 characters folded ...]>
</div>
<div class="pointer-events-none absolute inset-0" style="backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);mask-image:linear-gradient(to bottom, rgba(0, 0, 0, var(--mask-opacity, 1)) 40%, rgba(0, 0, 0, 0) 90%); [... 131 characters folded ...]>
</div>
<div class="pointer-events-none absolute inset-0" style="backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);mask-image:linear-gradient(to bottom, rgba(0, 0, 0, var(--mask-opacity, 1)) 40%, rgba(0, 0, 0, 0) 85%); [... 131 characters folded ...]>
</div>
<div class="pointer-events-none absolute inset-0" style="backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);mask-image:linear-gradient(to bottom, rgba(0, 0, 0, var(--mask-opacity, 1)) 40%, rgba(0, 0, 0, 0) 80%); [... 131 characters folded ...]>
</div>
<div class="pointer-events-none absolute inset-0" style="backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);mask-image:linear-gradient(to bottom, rgba(0, 0, 0, var(--mask-opacity, 1)) 40%, rgba(0, 0, 0, 0) 75%); [... 131 characters folded ...]>
</div>
<div class="pointer-events-none absolute inset-0" style="backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px);mask-image:linear-gradient(to bottom, rgba(0, 0, 0, var(--mask-opacity, 1)) 40%, rgba(0, 0, 0, 0) 70%); [... 131 characters folded ...]>
</div>
<div class="pointer-events-none absolute inset-0" style="backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);mask-image:linear-gradient(to bottom, rgba(0, 0, 0, var(--mask-opacity, 1)) 40%, rgba(0, 0, 0, 0) 65%); [... 131 characters folded ...]>
</div>
<div class="pointer-events-none absolute inset-0" style="backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);mask-image:linear-gradient(to bottom, rgba(0, 0, 0, var(--mask-opacity, 1)) 40%, rgba(0, 0, 0, 0) 60%); [... 131 characters folded ...]>
</div>
<div class="pointer-events-none absolute inset-0" style="backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);mask-image:linear-gradient(to bottom, rgba(0, 0, 0, var(--mask-opacity, 1)) 40%, rgba(0, 0, 0, 0) 55% [... 133 characters folded ...]>
</div>
<div class="pointer-events-none absolute inset-0" style="backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);mask-image:linear-gradient(to bottom, rgba(0, 0, 0, var(--mask-opacity, 1)) 40%, rgba(0, 0, 0, 0) 50% [... 133 characters folded ...]>
</div>
<div class="pointer-events-none absolute inset-0" style="backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);mask-image:linear-gradient(to bottom, rgba(0, 0, 0, var(--mask-opacity, 1)) 40%, rgba(0, 0, 0, 0) 45% [... 133 characters folded ...]>
</div>
</div>
</div>
<div class="transition-[color,background-color,border-color,text-decoration-color,fill,stroke,box-shadow,background] duration-450 ease-[cubic-bezier(0.33,1,0.68,1)] hover:duration-200 relative m-auto w-[76.75rem] max-w-[calc(100vw-1rem)] rounded-xl md:max-w-[calc(100vw-2rem)]">
<div class="transition-[color,background-color,border-color,text-decoration-color,fill,stroke,box-shadow,background] duration-450 ease-[cubic-bezier(0.33,1,0.68,1)] hover:duration-200 pointer-events-auto relative z-30 mx [... 537 characters folded ...]><a aria-label="Clerk Home Page" class="flex items-center gap-x-3 select-none" data-state="closed" style="-webkit-touch-callout:none" href="/">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 62 18" fill="none" aria-hidden="true" class="h-[1.125rem]" style="--logo-fill:#131316;--logo-fill-light:#F7F7F8">[... 13,873 characters folded ...]
</svg>
<div aria-hidden="true" class="transition-[color,background-color,border-color,text-decoration-color,fill,stroke,box-shadow,background] duration-450 ease-[cubic-bezier(0.33,1,0.68,1)] hover:duration-200 box-content hidde [... 186 characters folded ...]>
</div></a>
<nav aria-label="Main" data-orientation="horizontal" dir="ltr" class="ml-3 hidden md:block">
<div style="position:relative">
<ul data-orientation="horizontal" class="group/nav flex items-center text-gray-950" dir="ltr">
<li data-navitem="true" class="relative flex"><button id="radix-_R_16b5tabdb_-trigger-Products" data-state="closed" aria-expanded="false" aria-controls="radix-_R_16b5tabdb_-content-Products" class="group relative flex pr-2 before:absolute before:inset-x-0 before:-in [... 164 characters folded ...]><span class="transition-[color,background-color,border-color,text-decoration-color,fill,stroke,box-shadow,background] duration-450 ease-[cubic-bezier(0.33,1,0.68,1)] hover:duration-200 group-has-[[data-navitem]:hover]/na [... 383 characters folded ...]>Products<span class="relative top-[-0.5px] flex h-[0.25rem] w-[0.5rem] items-center justify-center">
<svg aria-hidden="true" viewBox="0 0 8 4" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" style="transform:translateZ(0)" class="[transition:color_450ms_cubic-bezier(0. [... 622 characters folded ...]><path d="M 7.04 0.604 L 4.537 3.107 C 4.240 3.404 3.759 3.404 3.463 3.107 L 0.96 0.604"></path>
</svg></span></span></button>
</li>
<li data-navitem="true" class="relative flex"><button id="radix-_R_16b5tabdb_-trigger-Docs" data-state="closed" aria-expanded="false" aria-controls="radix-_R_16b5tabdb_-content-Docs" class="group relative flex pr-2 before:absolute before:inset-x-0 before:-inset-y-3 [... 161 characters folded ...]><span class="transition-[color,background-color,border-color,text-decoration-color,fill,stroke,box-shadow,background] duration-450 ease-[cubic-bezier(0.33,1,0.68,1)] hover:duration-200 group-has-[[data-navitem]:hover]/na [... 383 characters folded ...]>Docs<span class="relative top-[-0.5px] flex h-[0.25rem] w-[0.5rem] items-center justify-center">
<svg aria-hidden="true" viewBox="0 0 8 4" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" style="transform:translateZ(0)" class="[transition:color_450ms_cubic-bezier(0. [... 622 characters folded ...]><path d="M 7.04 0.604 L 4.537 3.107 C 4.240 3.404 3.759 3.404 3.463 3.107 L 0.96 0.604"></path>
</svg></span></span></button>
</li>
<li data-navitem="true" class="relative flex"><button id="radix-_R_16b5tabdb_-trigger-Changelog" data-state="closed" aria-expanded="false" aria-controls="radix-_R_16b5tabdb_-content-Changelog" class="group relative flex pr-2 before:absolute before:inset-x-0 before:- [... 171 characters folded ...]><span class="transition-[color,background-color,border-color,text-decoration-color,fill,stroke,box-shadow,background] duration-450 ease-[cubic-bezier(0.33,1,0.68,1)] hover:duration-200 group-has-[[data-navitem]:hover]/na [... 383 characters folded ...]>Changelog<span class="relative top-[-0.5px] flex h-[0.25rem] w-[0.5rem] items-center justify-center">
<svg aria-hidden="true" viewBox="0 0 8 4" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" style="transform:translateZ(0)" class="[transition:color_450ms_cubic-bezier(0. [... 622 characters folded ...]><path d="M 7.04 0.604 L 4.537 3.107 C 4.240 3.404 3.759 3.404 3.463 3.107 L 0.96 0.604"></path>
</svg></span></span></button>
</li>
<li data-navitem="true" class="relative flex"><button id="radix-_R_16b5tabdb_-trigger-Company" data-state="closed" aria-expanded="false" aria-controls="radix-_R_16b5tabdb_-content-Company" class="group relative flex pr-2 before:absolute before:inset-x-0 before:-inse [... 167 characters folded ...]><span class="transition-[color,background-color,border-color,text-decoration-color,fill,stroke,box-shadow,background] duration-450 ease-[cubic-bezier(0.33,1,0.68,1)] hover:duration-200 group-has-[[data-navitem]:hover]/na [... 383 characters folded ...]>Company<span class="relative top-[-0.5px] flex h-[0.25rem] w-[0.5rem] items-center justify-center">
<svg aria-hidden="true" viewBox="0 0 8 4" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" style="transform:translateZ(0)" class="[transition:color_450ms_cubic-bezier(0. [... 622 characters folded ...]><path d="M 7.04 0.604 L 4.537 3.107 C 4.240 3.404 3.759 3.404 3.463 3.107 L 0.96 0.604"></path>
</svg></span></span></button>
</li>
<li data-navitem="true" class="relative flex"><button id="radix-_R_16b5tabdb_-trigger-AI" data-state="closed" aria-expanded="false" aria-controls="radix-_R_16b5tabdb_-content-AI" class="group relative flex pr-2 before:absolute before:inset-x-0 before:-inset-y-3 data [... 157 characters folded ...]><span class="transition-[color,background-color,border-color,text-decoration-color,fill,stroke,box-shadow,background] duration-450 ease-[cubic-bezier(0.33,1,0.68,1)] hover:duration-200 group-has-[[data-navitem]:hover]/na [... 383 characters folded ...]>AI<span class="relative top-[-0.5px] flex h-[0.25rem] w-[0.5rem] items-center justify-center">
<svg aria-hidden="true" viewBox="0 0 8 4" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" style="transform:translateZ(0)" class="[transition:color_450ms_cubic-bezier(0. [... 622 characters folded ...]><path d="M 7.04 0.604 L 4.537 3.107 C 4.240 3.404 3.759 3.404 3.463 3.107 L 0.96 0.604"></path>
</svg></span></span></button>
</li>
<li data-navitem="true" class="flex"><a class="group relative flex px-2 before:absolute before:inset-x-0 before:-inset-y-3" data-radix-collection-item="" href="/pricing"><span class="transition-[color,background-color,border-color,text-decoration-color,fill,stroke,box-shadow,background] duration-450 ease-[cubic-bezier(0.33,1,0.68,1)] hover:duration-200 group-has-[[data-navitem]:hover]/na [... 268 characters folded ...]>Pricing</span></a>
</li>
</ul>
</div>
</nav>
<div class="ml-auto flex items-center gap-6 font-medium [@media(width<22.5rem)]:hidden">
<div data-auth="" data-signed-out="" class="hidden in-[.signed-out]:contents">
<div class="flex items-center"><button class="group label-3 relative flex h-[1.625rem] items-center justify-center rounded-md border-[0.5px] border-solid px-2.5 text-gray-950 dark:text-gray-50 transition-[color,background-color,border-color,box-shadow [... 330 characters folded ...]><span class="pointer-events-none">Sign in</span></button>
<div aria-hidden="true" class="mx-1 box-content h-3.5 w-[0.5px] border-r-[0.5px] border-solid border-white bg-[rgba(19,19,22,0.15)] dark:border-[rgba(247,247,248,0.15)] dark:bg-[rgba(247,247,248,0.15)]">
</div><a class="group label-3 relative flex h-[1.625rem] items-center justify-center rounded-md border-[0.5px] border-solid px-2.5 text-gray-950 dark:text-gray-50 transition-[color,background-color,border-color,box-shadow] dur [... 368 characters folded ...]>Sign up</a>
</div>
</div>
<div data-auth="" data-signed-in="" class="hidden in-[.signed-in]:contents">
<div class="flex items-center"><button class="group label-3 relative flex h-[1.625rem] items-center justify-center rounded-md border-[0.5px] border-solid px-2.5 text-gray-950 dark:text-gray-50 transition-[color,background-color,border-color,box-shadow [... 330 characters folded ...]><span class="pointer-events-none">Sign out</span></button>
<div aria-hidden="true" class="mx-1 box-content h-3.5 w-[0.5px] border-r-[0.5px] border-solid border-white bg-[rgba(19,19,22,0.15)] dark:border-[rgba(247,247,248,0.15)] dark:bg-[rgba(247,247,248,0.15)]">
</div><a class="group label-3 relative flex h-[1.625rem] items-center justify-center rounded-md border-[0.5px] border-solid px-2.5 text-gray-950 dark:text-gray-50 transition-[color,background-color,border-color,box-shadow] dur [... 360 characters folded ...]>Dashboard</a>
</div>
</div>
</div><button class="transition-[color,background-color,border-color,text-decoration-color,fill,stroke,box-shadow,background] duration-450 ease-[cubic-bezier(0.33,1,0.68,1)] hover:duration-200 data-[focus-visible]:outline-focu [... 420 characters folded ...]>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" class="size-4">[... 200 characters folded ...]
</svg></button>
</div>
</div>
</div>
</header>
<script>[... 548 characters folded ...]
</script>
<main id="main">
<style>:root { --header-mt: 3rem }
</style><a class="group absolute top-0 z-10 mt-0 flex w-full gap-x-4 bg-gray-950 py-2 text-sm font-medium whitespace-nowrap text-white outline-none" href="/mcp">
<div aria-hidden="true" class="relative -my-2 grow overflow-hidden before:absolute before:inset-0 before:mr-8 before:-translate-y-[calc(100%-0.625rem)] before:skew-x-[-45deg] before:rounded before:border-r before:border-b before:border-white/[0.14] before:bg-black/60">
</div>
<div class="truncate">Configure Clerk with your agent
</div>
<div class="my-[calc(3/16*1rem)] w-px flex-none bg-white/20">
</div>
<div aria-hidden="true" class="group-focus-visible:outline-focus flex [--focus-outline:white]"><span class="group relative isolate inline-flex items-center justify-center overflow-hidden text-left font-medium transition duration-300 ease-[cubic-bezier(0.4,0.36,0,1)] before:duration-300 before:ease-[cubic-bezier(0.4,0.36,0,1)] before:transition-opacity text-gray-950 text-sm text-white">Install the MCP
<svg viewBox="0 0 10 10" aria-hidden="true" class="ml-2 h-2.5 w-2.5 flex-none opacity-60 group-hover:translate-x-6 group-hover:opacity-0 transition duration-300 ease-[cubic-bezier(0.4,0.36,0,1)] before:duration-300 befor [... 63 characters folded ...]>[... 154 characters folded ...]
</svg>
<svg viewBox="0 0 10 10" aria-hidden="true" class="-ml-2.5 h-2.5 w-2.5 flex-none -translate-x-2 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 transition duration-300 ease-[cubic-bezier(0.4,0.36,0,1)] before [... 82 characters folded ...]>[... 154 characters folded ...]
</svg></span>
</div>
<div aria-hidden="true" class="relative -my-2 grow overflow-hidden before:absolute before:inset-0 before:ml-8 before:-translate-y-[calc(100%-0.625rem)] before:skew-x-45 before:rounded before:border-b before:border-l before:border-white/[0.14] before:bg-black/60">
</div></a>
<div class="relative bg-white pb-8">
<section class="relative isolate -mt-16 overflow-x-clip bg-white pt-34 sm:pt-[9.9rem] lg:pt-[10.25rem]">
<div class="mx-auto w-full px-6 sm:max-w-[40rem] md:max-w-[48rem] md:px-8 lg:max-w-[64rem] xl:max-w-[79rem]">
<div class="grid grid-cols-1 gap-8 lg:grid-cols-4 lg:items-end lg:gap-1">
<div class="lg:col-span-2">
<h1 class="heading-4 sm:text-5.5xl lg:max-xl:text-4.5xl text-balance text-gray-950 sm:text-center lg:text-left">Everything you need <br class="sm:hidden"/>for authentication
</h1>
<p class="body-2 sm:body-1 mt-4 max-w-[38.4rem] text-balance text-gray-600 sm:mx-auto sm:text-center lg:mx-0 lg:text-left">More than APIs. The complete user layer for modern apps.
</p>
</div>
<div class="lg:col-span-2 lg:mb-2">
<div class="flex w-full justify-center max-sm:justify-start lg:justify-end">
<div class="w-(--bar-w) max-w-full motion-reduce:transition-none! motion-reduce:**:transition-none! [--glass-fill:var(--glass-fill-light)] dark:[--glass-fill:var(--glass-fill-dark)] [--glass-ink:var(--glass-ink-light)] d [... 2465 characters folded ...]><button class="data-focus-visible:outline-focus block w-full cursor-pointer rounded-(--glass-r)" data-rac="" type="button" tabindex="0" data-react-aria-pressable="true" aria-label="Copy prompt" aria-describedby="_R_296av5ubt5tabdb_" id="react-aria-_R_e96av5ubt5tabdb_"><span class="relative isolate flex h-(--bar-h) min-w-0 rounded-(--glass-r) before:absolute before:inset-px before:-z-15 before:rounded-[calc(var(--glass-r)-1px)] before:border before:border-transparent before:[background [... 342 characters folded ...]><span aria-hidden="true" class="absolute inset-0 -z-20 rounded-[inherit] bg-(--glass-fill) [box-shadow:var(--glass-shadow)] backdrop-blur-md"></span><span class="relative flex min-w-0 flex-1 overflow-hidden rounded-l-(--glass-r) pl-[calc(var(--glass-pad)+0.125rem+var(--bubble)+var(--stack-spill))]"><span class="flex min-w-0 flex-1" inert="" style="opacity:0;transition:opacity 350ms linear(0, 0.3049, 0.6506, 0.8453, 0.936, 0.9746, 0.9902, 0.9963, 0.9986, 0.9995, 1, 1) 0ms"><span style="mask-image:linear-gradient(to right, transparent, #000 0px, #000 calc(100% - 32px), transparent)" class="body-3 flex min-w-0 flex-1 items-center overflow-x-scroll pr-3 pl-1.5 text-left font-mono whitespace-nowrap text-(--glass-ink) scrollbar-none" tabindex="-1"><span class="block [text-box:trim-both_cap_alphabetic] not-supports-[text-box:trim-both_cap_alphabetic]:before:-mb-[calc(var(--trim-top)*1em)] not-supports-[text-box:trim-both_cap_alphabetic]:before:table not-supports-[t [... 184 characters folded ...]>Add Clerk auth to my app: clerk.com/SKILL.md</span></span></span></span><span class="pointer-events-none absolute inset-y-0 left-[calc(var(--glass-pad)+0.125rem)] z-10 flex items-center"><span class="grid flex-none" style="width:calc(3 * var(--bubble-step) + var(--bubble))" aria-hidden="true"><span class="size-(--bubble) [grid-area:1/1]" style="translate:calc(0 * var(--bubble-step));opacity:1;scale:1;z-index:6;transition:translate 350ms linear(0, 0.1812, 0.4669, 0.6943, 0.8403, 0.9233, 0.9664, 0.9869, 0.9958, [... 235 characters folded ...]><span class="grid size-full place-items-center rounded-full" style="background:linear-gradient(to bottom, #e0876a, #d97757);box-shadow:0 0.5px 0 0 rgba(255 255 255 / 0.7) inset, 0 0 0 0.5px rgba(0 0 0 / 0.22), 0 1px 2px [... 201 characters folded ...]>
<svg viewBox="0 0 32 32" fill="none" class="size-[calc(0.6*var(--bubble))] [&_path]:fill-white">[... 2,468 characters folded ...]
</svg></span></span><span class="size-(--bubble) [grid-area:1/1]" style="translate:calc(1 * var(--bubble-step));opacity:1;scale:1;z-index:5;transition:translate 350ms linear(0, 0.1812, 0.4669, 0.6943, 0.8403, 0.9233, 0.9664, 0.9869, 0.9958, [... 235 characters folded ...]><span class="grid size-full place-items-center rounded-full" style="background:linear-gradient(to bottom, #fff, #ededed);box-shadow:0 0.5px 0 0 rgba(255 255 255 / 0.7) inset, 0 0 0 0.5px rgba(0 0 0 / 0.22), 0 1px 2px -1p [... 209 characters folded ...]>
Shown with 390 long blocks (scripts, styles, long tags) folded into a marker that says how many characters they hide; line breaks added before block tags because the source is minified; the pane stops after the first 200 words; the page is 1.1 MB.
Reading view the text a plain-fetch client can extract
title: Clerk | Authentication and User Management
Everything you need for authentication
Skip to main content Products Docs Changelog Company AI Pricing Sign in Sign up Sign out Dashboard Configure Clerk with your agent Install the MCP Everything you need for authentication More than APIs. The complete user layer for modern apps. Add Clerk auth to my app: clerk.com/SKILL.md Copy prompt Add Clerk auth to my app: clerk.com/SKILL.md User Authentication Multi-tenancy Enterprise Authentication Agent Authentication Sign In & Sign Up User Button User Profile Sign In & Sign UpSign In & Sign Up User Button User Profile Sign In & Sign Up User Button User Profile User authentication Auth that keeps evolving Ever feel like authentication requirements change with the season? Clerk keeps up with the latest trends and security best practices. Explore user authentication Multifactor Authentication Each user's self-serve multifactor settings are enforced automatically during sign-in. Fraud and Abuse Prevention Reduce fraudulent sign-ups and free trial abuse by blocking high-risk disposable email domains and restricting the use of email subaddresses with the “+” separator. Fraudulent sign-ups detected 14:09 bad_actor+1@example.com Blocked Aug 4 at 14:09 bad_actor+2@example.com Blocked Aug 4 at 14:10 another.bad.actor@example.com Blocked Aug 4 at 14:12 bad_actor+3@example.com Blocked Aug 4 at 14:16 Advanced security Clerk is SOC 2 type 2 compliant
1231 more words follow in the initial HTML.
| Check | Result | Detail |
|---|---|---|
| H1 in the initial HTML | Found one H1 | First H1: Everything you need for authentication |
| First 200 words in the initial HTML | Found 200 of 200 words | The initial HTML carries 1431 words of visible text; the first 200 are marked in the left pane. |
| llms.txt present and linked | Found present and linked | 5901 bytes, 54 links. Structure grade A (6 of 6). The home page links it, which is how agents reached it in Ora's lab. |
| Markdown on request | Found text/markdown | Accept: text/markdown returned 200 with text/markdown; charset=utf-8. Vary: Accept is set. |
| Status of a made-up path | Found 404 | /agent-ready-html-missing-path-check returned 404: a real status code for a missing page. |
| JSON-LD types | Found ContactPoint, ImageObject, Organization, PostalAddress and 1 more | 5 schema.org types in JSON-LD blocks on the home page: ContactPoint, ImageObject, Organization, PostalAddress, WebSite. |
| OpenAPI link | Note none on the home page | No OpenAPI link on the home page. It matters only for a site that ships an API. |
Run the full check
The viewer read one page with four requests. The full check we recommend next is Ora's scan. Its Access layer runs 42 checks worth 30 of its 100 points, among them content without JavaScript, bot detection, llms.txt, markdown on request, JSON-LD and the sitemap (Ora's check catalogue, contract 1.38.0, read 5 November 2026). Open Ora's report for clerk.com.
Limits: Ora reads public URLs only, says two runs of one scan land within a couple of points without publishing repeat-scan data, and keeps the product that fixes what it finds behind a waitlist. Cloudflare's scanner at isitagentready.com is a quick free alternative, and Mintlify's score covers documentation.
What the viewer does
It sends four plain GET requests with the user agent Mozilla/5.0 (compatible; agent-readiness-crawl/1.0): the URL itself, the same URL with Accept: text/markdown, /llms.txt on the same host, and a made-up path at the root. It runs no JavaScript. The left pane is the first bytes of the HTML as text, with long scripts and styles folded into a marker that says how many characters they hide. The H1 and the first 200 words of visible text are marked in both panes. The flags under the panes say what the four responses added up to.
Limits
- Ten seconds for all four requests together, 1.5 MB read from the home page, at most five redirects, each one checked again.
- http and https only, default ports only. Private, local and internal addresses and names are refused.
- Ten runs per address per minute. The counter lives in memory on the edge function, so it is per instance rather than global. Past ten you get a 429 with a Retry-After header.
- Results are cached for 24 hours by the response headers. Nothing is written to a database: the viewer keeps the first 200 words and the extracted fields for the length of the request and keeps no page body beyond that.
What it does not tell you
A plain fetch from this server is not a real agent. Bot protection weighs the source address more than the user agent, so a page that answers 200 here can still refuse an agent, and the reverse. Ora's lab found (2026-10-19) that returning 403 to agent user agents and hiding the answer in JavaScript were the only two of 19 configurations that stopped retrieval; the viewer can see the second, and can only hint at the first. The initial HTML reference covers both. The server logs and the published crawler address ranges settle the first.
The seven flags
- H1 in the initial HTML
- Whether the HTML the server sends already contains an H1. It is the cheapest sign that the page does not depend on scripts to say what it is.
- First 200 words in the initial HTML
- Whether at least 200 words of visible text arrive in the initial HTML. Under 40 words with an app root element is flagged as a JavaScript shell.
- llms.txt present and linked
- Whether /llms.txt answers with a plain-text file, whether the home page links it (an anchor, a link element or a Link header), and the structure grade the index uses.
- Markdown on request
- Whether a request with Accept: text/markdown comes back as text/markdown. Cloudflare Radar found 3.9 percent of scanned top sites passing this at its April 2026 launch.
- Status of a made-up path
- Whether a path that should not exist returns 404 or 410. A 200 is a soft 404 and reads as a live page.
- JSON-LD types
- The schema.org types found in JSON-LD blocks on the page. Ora's lab found JSON-LD made no difference when the answer was already in the HTML.
- OpenAPI link
- Whether the page links an OpenAPI file, by an anchor or a service-desc link relation. It matters only for a site that ships an API.
Sources
- Ora: AgentReady launch post (Ora's lab findings) https://ora.ai/blog/agentready-launch, read 4 November 2026
- Ora check catalogue, contract 1.38.0 (132 checks, 42 in the Access layer) https://ora.ai/api/checks, read 5 November 2026
- Ora home page (the fixing product is behind a waitlist) https://ora.ai/, read 5 November 2026
- Ora: Introducing Deep Scan (repeat scans) https://ora.ai/blog/introducing-deep-scan, read 5 November 2026
- Ora llms.txt (public URLs only) https://ora.ai/llms.txt, read 5 November 2026
- Vercel: Make your site readable by AI agents https://vercel.com/kb/guide/make-your-site-readable-by-ai-agents, read 4 November 2026
- llms.txt proposal (llmstxt.org) https://llmstxt.org/, read 4 November 2026
Last reviewed 5 November 2026