One endpoint, one API key, one tool name. Server-verified emoji challenges with quotas that scale to whatever you're building. No user data, no third parties, no tracking.
Every plan gets the same tools and the same API. Only the request ceiling differs.
Endpoint URL, your API key, and the tool name. That's it.
Every tool lives under /api/tools/{tool}/. Today the only tool is emoji_bot:
Pass your key in the X-API-Key header. Never in a URL, never in client-side code, never in your frontend bundle. Keep it server-side.
X-API-Key: n0d3_tier11_a1b2c3d4…
The tool is in the URL path. Currently the only tool is emoji_bot — more (e.g. proof_of_work, rate_guard, headless_check) will appear here with no change to the auth model.
curl -X POST https://n0d3.pages.dev/api/tools/emoji_bot/challenge \
-H "X-API-Key: n0d3_tier11_a1b2c3…"
Response (200):
{
"challenge_id": "8f3e2a1b-…",
"target": "😀",
"options": ["😀", "😃", "😄", "😁", "😆", "😅"],
"expires_in": 60,
"quota": { "used_today": 124, "limit_today": 90000,
"used_month": 3812, "limit_month": 900000 }
}
Show options to the user, tell them to click target. Any option is valid only if it equals the target. Challenges expire in 60 seconds.
curl -X POST https://n0d3.pages.dev/api/tools/emoji_bot/verify \
-H "X-API-Key: n0d3_tier11_a1b2c3…" \
-H "Content-Type: application/json" \
-d '{"challenge_id":"8f3e2a1b-…","clicked":"😀"}'
Response (200, success):
{
"success": true,
"session_token": "8f3e2a1b-….1735689600000.hmac_sig_here",
"expires_in": 300
}
Response (200, failure):
{ "success": false, "error": "wrong_emoji" }
On success, you get a session_token — an HMAC-signed proof that this user solved the challenge. You can trust it or verify it later by calling /api/tools/emoji_bot/check-session.
401 missing_api_key — no X-API-Key header401 invalid_api_key — key not found in our system403 key_inactive — key revoked or suspended403 tool_not_allowed — your plan doesn't include this tool429 daily_limit — you've hit your daily ceiling429 monthly_limit — you've hit your monthly ceiling400 challenge_not_found — expired or unknown challenge_id400 wrong_emoji — the clicked emoji didn't matchemoji_bot — Server-minted emoji challenge + verification. Available now.