Skip to content
Gauge

ax-check.com

Clerk

clerk.com

ax-check.com

Checked 6 October 2026

A

100/100

Agents need your login

Clerk's docs, setup, and pricing are clear and agent-ready.

All 23 checklist items passed: quickstarts, CLI, SDKs, MCP server, and API specs are all directly reachable with stated pricing.

1 fix to start with

Concrete changes, backed by what we found.

Onboarding

Give agents a clear login handoff and a way to resume setup.

Agents cannot progress through onboarding without human help. Provide an agent-accessible path through authentication and setup.

Recorded coding sessions

Same task, 3 models, no clerk.com account. Recorded 6 October 2026 on Pi.

3 recorded · 1m 14s

1m 14s · recorded

Session findings

Select a finding to see it in context.

piv0.84.2
modelQwen 3.8 Maxcwd/sandbox/repo
Help me build a simple example using Clerk. Tell me how pricing works, and briefly tell me whether this product will be easy for you to manage. Let me know if you get blocked. If this product has no developer workflow you can act on, say so plainly and stop. Stay light: use the hosted product through its SDK or API. Do not start local service stacks or wait for long-running commands; if the quickstart requires either, say so plainly and stop.
Thinking…

The user is asking about Clerk — a hosted authentication product. Let's check the environment: network access? Let's investigate the sandbox and see whether there are any existing projects. Also, the user is asking how the pricing works, and whether this product is easy to manage.

Let's check the cwd and whether network access is available (e.g., can we install the clerk SDK from npm).

ls -la /sandbox/repo && node --version 2>/dev/null; npm --version 2>/dev/null
total 16
total 16
drwxr-xr-x 3 root root 4096 Sep 18 08:00 .
drwxr-xr-x 7 root root 4096 Oct  6 01:49 ..
drwxr-xr-x 8 root root 4096 Sep 24 20:05 .git
-rw-r--r-- 1 root root  408 Sep 18 08:00 .gitignore
v22.23.2
10.9.8
timeout 15 npm view @clerk/nextjs version 2>&1 | tail -5; echo "exit: $?"
npm notice
npm notice
npm notice New major version of npm available! 10.9.8 -> 12.2.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v12.2.0
npm notice To update run: npm install -g npm@12.2.0
npm notice
exit: 0
Thinking…

Let's check whether the npm view output actually returned a version (was it cut off by tail -5?). I'll try running it again in a cleaner form. Also, I'll check network access to the clerk documentation.

timeout 20 npm view @clerk/nextjs version 2>/dev/null; timeout 20 npm view @clerk/clerk-js version 2>/dev/null; timeout 20 npm view @clerk/backend version 2>/dev/null
7.9.11
7.9.11
6.38.0
3.23.0
timeout 15 curl -sI https://clerk.com/docs/pricing 2>&1 | head -5; echo "---"; timeout 15 curl -s https://clerk.com/pricing 2>/dev/null | grep -oiE '(free|\\$[0-9]+|per (MAU|user)|monthly)[^<]{0,80}' | head -30
HTTP/2 500
HTTP/2 500 
cache-control: public, max-age=0, must-revalidate
date: Tue, 06 Oct 2026 01:49:27 GMT
referrer-policy: same-origin
server: Vercel
---
Free Up to 50K Users | Plans from $0/mo
free for up to 50,000 monthly retained users. Pro plans from $20/mo. No credit card 
Free Up to 50K Users | Plans from $0/mo"/>
free for up to 50,000 monthly retained users. Pro plans from $20/mo. No credit card 
Free Up to 50K Users | Plans from $0/mo"/>
free for up to 50,000 monthly retained users. Pro plans from $20/mo. No credit card 
free for up to 50,000 monthly retained users. Pro plans from $20/mo. No credit card 
Free
free
Monthly
Monthly
Free in all plans
Free in all plans
Monthly retained organizations (MROs)
monthly retained user for that month.
free
Free for your first 50,000 monthly retained users and 100 monthly retained orgs. No 
free tier is generous at 25K MAU, but its paid plans start at $35/mo for Essentials 
monthly retained users or 100 monthly retained organizations?","acceptedAnswer":{"@type
monthly retained users you will be required to upgrade to the Pro plan. Once you exceed
monthly retained organizations, you will be required to upgrade to the B2B Authenticati
free tier allowance will be added to your monthly bill.\u003c/p>\n\u003cp>You'll be 
free trial?","acceptedAnswer":{"@type":"Answer","text":"\u003cp>All of our Pro tier 
Free\"?","acceptedAnswer":{"@type":"Answer","text":"\u003cp>\"First Day Free\" is ou
free of charge.\u003c/p>"}},{"@type":"Question","name":"Is Clerk pricing based on MA
Monthly Retained Users (MRU), not traditional MAU. A user only counts as retained if th
monthly retained user?","acceptedAnswer":{"@type":"Answer","text":"\u003cp>A monthly re
free day avoids unwelcome fees from users who don't activate.\u003c/p>"}},{"@type":"
monthly retained organization?","acceptedAnswer":{"@type":"Answer","text":"\u003cp>A mo
monthly retained user for that month. Like users, you are only billed for retained orga
Thinking…

Good — network access is working. Clerk has an actual developer workflow via SDKs. Now, the constraints:

  • Keep it lightweight: use the hosted product via SDK or API. Don't spin up a local service stack or wait on long-running commands.
  • Building a "simple example" with Clerk requires publishable/secret keys from a Clerk account/dashboard. I can't create a Clerk account (needs email signup). I'll be blocked at the point of getting actual API keys.

Options: I could scaffold a Next.js app with the Clerk SDK integrated and use placeholder keys from env, but installing Next.js and creating the app is a long-running command (npx create-next-app takes time, downloads). "Keep it light" — I might be able to create a minimal example: manually create a small Next.js project file (without create-next-app) and install dependencies. But actually running it requires a dev server (long-running) and real keys.

Alternative lightweight approach: use Clerk's Backend API (REST) with curl, but this also needs a secret key from an instance.

Honest path: scaffold code that uses the Clerk SDK (a minimal Next.js app, or even simpler: a plain HTML page using @clerk/clerk-js via CDN. This is the lightest option — clerk-js from CDN with publishable key, no build step). This is Clerk's "vanilla JS" quickstart. I can write this file without installing anything. This satisfies "use the hosted product via SDK" without a local stack.

But it can't be fully "executed" without a Clerk instance/keys. I should state this clearly: scaffold the sample code, note that the user needs to drop in a publishable key from the Clerk dashboard, and I'm blocked on running/verifying against an actual instance.

Also, answer the pricing question, and whether this product is easy for me to manage.

Pricing (from the pricing page): free up to 50K monthly retained users (MRUs); Pro starts at $20/month (usage-based billing beyond that); B2B plans; billing is based on MRUs, not MAUs — a user counts if they've been active for at least one day of the month. Let me fetch a bit more detail for accuracy. From grep results: "The first 50,000 monthly retained users and 100 monthly retained organizations are free", "Pro plan starts at $20/month". Let me get Pro's overage rate (historically $0.02/MRU/month). Rather than guess, I should fetch the page a bit more to confirm.

After that, write the example. Let me create a minimal vanilla JS example:

  • index.html that loads @clerk/clerk-js from CDN
  • Uses a publishable key from a placeholder/env
  • Shows sign-in button and user display

Should I include a small server-side verification example with the Backend SDK? Keep it light — vanilla JS example plus notes. Might also add a README with quickstart steps.

Should I run anything? Opening index.html requires a browser and real keys — can't do it. I'll state clearly that I'm blocked on running without a Clerk account/keys.

Let me quickly fetch Pro's overage pricing.

The network is working, and Clerk has an actual developer workflow (CDN JS SDK, npm SDK, REST Backend API), so I can respond. Before I get started, let me check the pricing details:

timeout 15 curl -s https://clerk.com/pricing 2>/dev/null | grep -oiE '(0\.0[0-9]|per (additional )?(monthly retained|MRU|user|seat))[^<"]{0,100}' | sort -u | head -15
0.00001 each
0.00001 each
0.000Z\
0.001 each
0.01 per SMS. International: market rate
0.012/mo each
0.015/mo each
0.0172 35.9158 10.0172H40.829C40.9198 10.0172 40.9869 9.93217 40.9617 9.84491C40.6268 8.68592 39.7772 7.
0.0176 35.9163 10.0176H40.8293C40.9201 10.0175 40.9874 9.93196 40.9622 9.84473C40.6273 8.68588 39.7775 7
0.018/mo each
0.02)] dark:border-[rgba(255,255,255,0)] dark:bg-[rgba(255,255,255,0)] dark:hover:border-[rgba(255,255,2
0.02/MRU/mo with volume discounts at higher tiers.
0.02/MRU/mo with volume discounts at higher tiers.\
0.02/MRU/mo with volume discounts at higher tiers.\\u003c/p\u003e\
0.02/MRU/mo with volume discounts at higher tiers.\u003c/p>
0.02/mo each
Thinking…

Got enough pricing info already: free for up to 50,000 MRUs, Pro is $20/month (base fee included?) then $0.02 per MRU/month after that, with volume discounts applied. B2B plans available for organizations.

Now I'll build the example. The lightest option is a vanilla HTML page using the Clerk JS SDK via CDN (no build step, no local stack). I'll write the following:

  • /sandbox/repo/clerk-example/index.html — loads clerk-js from CDN, uses a publishable key, mounts SignIn/SignUp or uses openSignIn, displays the session user
  • README.md — how to obtain keys from the Clerk dashboard, how to run it (just open it in a browser / serve statically)

Blocker: without a Clerk account I can't obtain a real publishable key, so I can't run it end-to-end. I'll communicate this clearly.

Also, I'll add an optional server-side snippet in the README showing token verification via @clerk/backend (curl or node), but keep it concise.

Pricing confirmed. Clerk is a hosted authentication service with a full-fledged developer workflow (CDN JS SDK, npm SDK, REST Backend API), and there's an actionable approach. The lightest possible quickstart is the Clerk JS SDK via CDN — no build steps, no local stack required. I'll build that now:

File edits

1 file

Completed
Writtenclerk-example/index.htmlView changes

/sandbox/repo/clerk-example/index.html

Written content · previous contents were not recorded

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Clerk Vanilla JS Example</title>
<style>
body { font-family: system-ui, sans-serif; max-width: 640px; margin: 4rem auto; padding: 0 1rem; }
pre { background: #f4f4f5; padding: 1rem; border-radius: 8px; overflow-x: auto; }
button { padding: 0.6rem 1.2rem; font-size: 1rem; border-radius: 8px; border: 1px solid #ccc; cursor: pointer; }
#error { color: #b00020; }
</style>
</head>
<body>
<h1>Clerk Auth Demo</h1>
<p id="error"></p>
<div id="signed-out">
<p>You are signed out.</p>
<button id="sign-in-btn">Sign in / Sign up</button>
</div>
<div id="signed-in" hidden>
<p>Signed in as <strong id="user-identifier"></strong></p>
<pre id="session-token"></pre>
<button id="sign-out-btn">Sign out</button>
</div>
<script>
// Replace with the publishable key from your Clerk dashboard
// (Dashboard -> Instances -> your instance -> API Keys).
// Publishable keys (pk_...) are safe to expose in client code.
const PUBLISHABLE_KEY = "pk_test_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
const errorEl = document.getElementById("error");
if (PUBLISHABLE_KEY.includes("XXXX")) {
errorEl.textContent = "Set your Clerk publishable key (pk_...) in index.html first.";
}
// Load Clerk JS from the CDN (no build step, no bundler)
const script = document.createElement("script");
script.async = true;
script.src = "https://cdn.jsdelivr.net/npm/@clerk/clerk-js@latest/dist/clerk.browser.js";
script.dataset.clerkPublishableKey = PUBLISHABLE_KEY;
script.onload = () => init();
script.onerror = () => (errorEl.textContent = "Failed to load Clerk JS from CDN.");
document.head.appendChild(script);
async function init() {
const clerk = new window.Clerk(PUBLISHABLE_KEY);
await clerk.load();
const signedOutEl = document.getElementById("signed-out");
const signedInEl = document.getElementById("signed-in");
function render(session) {
signedOutEl.hidden = !!session;
signedInEl.hidden = !session;
if (session) {
const user = session.user;
const identifier =
user.primaryEmailAddress?.emailAddress ||
user.primaryPhoneNumber?.phoneNumber ||
user.username ||
user.id;
document.getElementById("user-identifier").textContent = identifier;
// The session JWT is what you'd send to your backend for verification
// (e.g. via @clerk/backend's verifyToken or the JWKS endpoint).
session.getToken().then((jwt) => {
document.getElementById("session-token").textContent =
"Session JWT (truncated):\n" + jwt.slice(0, 60) + "...";
});
}
}
// Re-render on any auth state change
clerk.addListener(({ session }) => render(session));
render(clerk.session);
document.getElementById("sign-in-btn").onclick = () => clerk.openSignIn();
document.getElementById("sign-out-btn").onclick = () => clerk.signOut();
}
</script>
</body>
</html>

File edits

1 file

Completed
Writtenclerk-example/README.mdView changes

/sandbox/repo/clerk-example/README.md

Written content · previous contents were not recorded

# Clerk Vanilla JS Example
Minimal Clerk auth demo using the hosted Clerk service through its CDN-hosted
JS SDK (`@clerk/clerk-js`). No build step, no local server stack, no npm install.
## Setup (2 minutes)
1. Create a free account at https://dashboard.clerk.com and create an
application/instance (pick Email or Social sign-in options).
2. Copy the **publishable key** (`pk_test_...` or `pk_live_...`) from
**Configure → API Keys**.
3. Paste it into `PUBLISHABLE_KEY` in `index.html`.
4. Open `index.html` in a browser (double-click it, or `npx serve .` if you
want a static host). Sign in — the page shows your identifier and a
truncated session JWT.
## Notes
- `pk_` keys are safe in client code. The **secret key** (`sk_...`) must stay
server-side only.
- The session JWT (`session.getToken()`) is what a backend verifies. With the
`@clerk/backend` SDK that's `verifyToken(jwt, { secretKey })`; with plain
HTTPS you can fetch the instance's JWKS and verify the signature yourself.
- To call the Clerk Backend API from a server:
`curl https://api.clerk.com/v1/users -H "Authorization: Bearer sk_..."`.
## Pricing (as of check date, from clerk.com/pricing)
- **Free tier**: up to 50,000 Monthly Retained Users (MRUs) and 100 monthly
retained organizations per month, no credit card required.
- **Pro**: from $20/mo, then $0.02/MRU/mo beyond the free allowance, with
volume discounts at higher tiers.
- Billing is based on **MRUs, not MAU**: a user counts only if they were
active on at least one day ("First Day Free" model), so signups that never
activate don't cost you anything.
- Add-ons priced separately, e.g. SMS at $0.01/message (international at
market rate); B2B/organizations features on dedicated plans.
Thinking…

Perform a sanity check that the CDN URL resolves (a simple HEAD request), and verify that the sample HTML is valid. After that, report back.

timeout 15 curl -sI https://cdn.jsdelivr.net/npm/@clerk/clerk-js@latest/dist/clerk.browser.js | head -3
HTTP/2 200
HTTP/2 200 
date: Tue, 06 Oct 2026 01:50:08 GMT
content-type: application/javascript; charset=utf-8
Thinking…

Confirmed that the CDN URL is valid. Done. To summarize: the files created, pricing, ease of management, and where we ran into obstacles.

Done. Here's the summary:

What I built

  • clerk-example/index.html — a complete auth demo using the Clerk JS SDK via CDN (@clerk/clerk-js, URL verified live, HTTP 200). No npm install, no build step, no local stack. It handles sign-in/sign-up, displays the signed-in user, and fetches the session JWT (what you'd verify server-side).
  • clerk-example/README.md — setup steps, backend token-verification notes, and pricing.

How pricing works (verified from clerk.com/pricing)

  • Free tier: up to 50,000 Monthly Retained Users (MRUs) and 100 monthly retained organizations per month — no credit card.
  • Pro: from $20/mo, then $0.02/MRU/mo beyond the free allowance, with volume discounts.
  • Billing uses MRU, not MAU: a user only counts if active on ≥1 day of the month ("First Day Free"), so inactive signups are free.
  • Add-ons separate (e.g., SMS $0.01/message; B2B org features on their own plan).

Is it easy for me to manage?

Mostly yes. Clerk is API-first: npm SDKs, a REST Backend API, and JWKS-based token verification — all scriptable with curl/SDK calls, which suits an agent workflow well. The one friction point: instance creation and key issuance happen in a web dashboard tied to a human account, so there's no fully headless bootstrap path for me.

Where I'm blocked (stating plainly)

I can't complete an end-to-end run: the example needs a publishable key (pk_...) from a Clerk dashboard account, which requires you to sign up (email/OAuth). I verified everything I can without it — SDK availability on npm (@clerk/nextjs 7.9.11, @clerk/backend 3.23.0) and the CDN asset. Once you paste your key into index.html, opening the file in a browser is the entire "run" step. I did not start any dev servers or long-running processes.

AX Fundamentals

23 checks. Open an area for details.

This check is a quick preview. Test more tasks and models with Gauge Agents.

Test your product with Gauge Agents

AX Check by Gauge