Docs

Three integration paths, one API. Pick what fits your agent runtime.

Quick start

Get a key, make your first solve — 30 seconds.

# 1. Sign up (no account, no credit card) curl -X POST https://api.useagentstore.com /signup # → { "apiKey": "sk_...", "freeCallsRemaining": 100 } # 2. Solve a Turnstile challenge curl -X POST https://api.useagentstore.com /solve \ -H "Authorization: Bearer sk_..." \ -H "Content-Type: application/json" \ -d '{"type":"turnstile","url":"https://example.com","sitekey":"0x4AAA..."}' # → { "success": true, "token": "0.abc...", "solvedInMs": 2601, "confidence": 0.95 }

Submit the returned token as the cf-turnstile-response field when posting the target form. Your agent is through.

MCP server

For Claude Desktop, Claude Agent SDK, Cursor, Windsurf, or any MCP-enabled agent host.

Add this block to your MCP server config:

{ "mcpServers": { "solve": { "command": "npx", "args": ["-y", "@useagentstore/solve-mcp"] } } }

Restart your agent host. The server auto-signs-up on first use and writes the generated key to stderr. Your agent now has a solve_turnstile(url, sitekey) tool.

Persisting your API key

To avoid re-signup on every restart, copy the key from stderr into the config:

{ "mcpServers": { "solve": { "command": "npx", "args": ["-y", "@useagentstore/solve-mcp"], "env": { "SOLVE_API_KEY": "sk_..." } } } }

TypeScript SDK

Zero dependencies. Works in Node 20+, Bun, Deno, and modern browsers.

npm install @useagentstore/solve
import { SolveClient } from '@useagentstore/solve'; // One-time self-serve signup const { apiKey } = await SolveClient.signup(); const client = new SolveClient({ apiKey }); const result = await client.solveTurnstile({ url: 'https://example.com/login', sitekey: '0x4AAA...', }); if (result.success) { console.log('token:', result.token); } else { console.error('failed:', result.error); }

HTTP API

Plain HTTP. Works from any language.

Python

import requests signup = requests.post("https://api.useagentstore.com /signup").json() api_key = signup["apiKey"] res = requests.post( "https://api.useagentstore.com /solve", headers={"Authorization": f"Bearer {api_key}"}, json={"type": "turnstile", "url": "...", "sitekey": "..."}, ).json() print(res["token"])

cURL

curl -X POST https://api.useagentstore.com /solve \ -H "Authorization: Bearer sk_..." \ -H "Content-Type: application/json" \ -d '{"type":"turnstile","url":"...","sitekey":"..."}'

API reference

POST /signup

Create a new API key. No auth required.

Request body (optional):

FieldTypeDescription
notestringOptional label (e.g. "my-agent-v1")

Response (201):

{ "apiKey": "sk_...", "freeCallsRemaining": 100, "docs": "https://useagentstore.com" }

POST /solve

Solve a CAPTCHA challenge. Requires Authorization: Bearer <apiKey>.

Request body:

FieldTypeRequiredDescription
typestringyesCurrently "turnstile" only
urlstringyesThe page where the widget is embedded
sitekeystringyesFrom the widget's data-sitekey attribute
actionstringnoTurnstile action parameter
cdatastringnoCustom data passed to validator

Response (success, 200):

{ "success": true, "token": "0.abc...", "backend": "playwright", "solvedInMs": 2601, "confidence": 0.95 }

Response (failure, 502):

{ "success": false, "error": "timeout: Waiting failed: 15000ms exceeded", "backend": "playwright", "attemptedInMs": 15002 }

Errors

StatusErrorMeaning
400invalid_requestMissing or malformed fields
401unauthorizedMissing or invalid API key
402quota_exceededFree tier used up (x402 top-up coming Week 2)
502solver_threw / timeoutSolver failed — auto-refund if paid

SLA & refunds

  • Target success rate: 95%+ on Cloudflare Turnstile, rolling 7-day window
  • Target p95 latency: < 10 seconds
  • Failed solves are automatically refunded (no credit consumed)
  • Public status dashboard: status (live metrics coming Week 3)

This is a beta — no uptime guarantees yet. Real enterprise SLA arrives when we're past 10k MRR.