Test inside Claude
Give Claude a tester's judgment. Plan, inspect, run, review, and make evidence-backed ship decisions without leaving your coding workflow.
- Local browser by default
- No API key to start
- Optional managed cloud runs
Steer the plan, approve what runs, follow cloud execution, and review the evidence behind every result.
Give Claude a tester's judgment. Plan, inspect, run, review, and make evidence-backed ship decisions without leaving your coding workflow.
Paste a URL, review the AI-drafted plan, control what runs, and explore evidence and reports in the full visual interface.
CARBON learns your code, UI, APIs, AI features, states, and flows; creates risk-ranked intent tests; executes with your coding agent; and turns screenshots, network traffic, console output, traces, and results into confidence and remaining-risk reporting.
Tell us whether you want CARBON with cloud execution, steered cloud runs on their own, or help comparing both.
AI drafts the plan — then every widget is yours. Dial the run up or down and add your own tests. Nothing runs that you didn't choose.
Ranked #1 bug-finder across 16 AI models →AI analyzes your site and drafts a plan — then you configure it. Every widget is a decision you make — features, checks, personas, tests and bots. Dial it up or down; nothing runs that you didn't choose.
Every finding grounded in evidence — screenshots, severity, persona reactions, and pass/fail on every test you steered.
We fine-tune and blend multiple models with QA-specific parameters into the best QA and bug-finder AI LLM — and it consistently tops frontier models across every benchmark.
Your site is being tested now. The full report lands in your inbox when it's done.
Load the skill at https://testers.ai/SKILL.md and use it for quality tests.
jank https://bing.com
Sign in to your testers.ai account.
~/.claude/skills/jank-cloud/SKILL.mdjank https://bing.com
The first LLM fine-tuned for QA & testing. OpenAI-compatible — drop it into any client by swapping the base URL. Free to start.
No credit card · email verification sent instantly
✓ Check your email — we sent a verification link. Click it to activate your key.
https://model.testers.ai
curl https://model.testers.ai/v1/chat/completions \
-H "Authorization: Bearer <your-key>" \
-d '{"model":"tai-1","messages":[{"role":"user","content":"Find bugs on https://bing.com"}]}'
api.testers.ai/v1Claude · ChatGPT · Cursor · run cloud tests from any chatbotQuestions about testing, pricing, or want us to test your app? We read every message.
Tell us which plugin you're interested in and how you're using AI in your workflow. We'll send setup instructions as soon as your slot is ready.
Contact IcebergQA
Senior QA engineers + AI tooling — Jason or Phil will personally read this and reach out.
Signup and we'll send you an unlock code that removes free-trial rate limits on this chat and the AI-based testing tools.
Drop a few details and one of our test engineers will reach out to scope a run against your app — bugs, accessibility, persona feedback, and a comprehensive quality report.
Add specifications, test plans, API docs, requirements — anything the assistant should treat as ground truth. Each entry is sent with every query. Add as many as you need.
Zero effort. AI finds your most important escaped issues, persona feedback, and regression-testing gaps — and shows how you compare to category peers.
What's your role?
Which platform?
Recommended for :
Your profile is stored only in this browser.
We tailor responses and recommended tools to your role. VP/Exec gets quality-analytics emphasis; engineers get technical depth.
Controls UI labels and the language the assistant replies in.
Free-trial proxy. Optional: attach your email / unlock code for higher limits.
Don't have an unlock code? Request an unlock code →
Calls OpenAI directly from your browser. Key is stored in this browser only.
Calls Anthropic directly from your browser. Key is stored in this browser only.
Calls Gemini directly from your browser. Key is stored in this browser only.
Connect Jira, TestRail, or Xray to auto-file bugs & tests, and to pull existing issues/tests into chat context. Beta — requires your org to allow CORS from this page; if filing fails, use the CSV exports.
TestRail admin → My Settings → API Keys.
Xray lives inside Jira. Uses your Jira credentials above. Fill in project + test plan to auto-link filed tests.
Submit one or more URLs for analysis. Returns immediately with report ID(s); analysis runs asynchronously.
curl -X POST https://reports.testers.ai/api/reports \
-H "X-Api-Key: jk_YOUR_KEY" \
-H "X-Account: you@example.com" \
-H "Content-Type: application/json" \
-d '{
"urls": ["https://example.com"],
"visibility": "public",
"intensity": "standard",
"subpages": { "enabled": true, "count": 2 },
"personas": { "enabled": true, "count": 4 },
"flows": { "enabled": true, "count": 5 }
}'
import requests
resp = requests.post(
"https://reports.testers.ai/api/reports",
headers={
"X-Api-Key": "jk_YOUR_KEY",
"X-Account": "you@example.com",
"Content-Type":"application/json",
},
json={
"urls": ["https://example.com"],
"visibility": "public",
"intensity": "standard",
"subpages": {"enabled": True, "count": 2},
"personas": {"enabled": True, "count": 4},
"flows": {"enabled": True, "count": 5},
},
timeout=30,
)
resp.raise_for_status()
report_id = resp.json()["created"][0]["id"]
print("Queued:", report_id)
// Node.js 18+ or any modern browser
const resp = await fetch("https://reports.testers.ai/api/reports", {
method: "POST",
headers: {
"X-Api-Key": "jk_YOUR_KEY",
"X-Account": "you@example.com",
"Content-Type": "application/json",
},
body: JSON.stringify({
urls: ["https://example.com"],
visibility: "public",
intensity: "standard",
subpages: { enabled: true, count: 2 },
personas: { enabled: true, count: 4 },
flows: { enabled: true, count: 5 },
}),
});
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const { created } = await resp.json();
console.log("Queued:", created[0].id);
{
"created": [{
"id": "387ee94b-2834-49bc-b832-223e66e32d34",
"url": "https://example.com/",
"viewUrl": "/r/387ee94b-2834-49bc-b832-223e66e32d34"
}]
}
| Field | Type | Notes |
|---|---|---|
| urls | string[] | 1–25 URLs. Scheme auto-prefixed. |
| visibility | "public"|"private" | Default: public |
| intensity | "standard"|"deep" | deep = 3× credits, VPAT |
| subpages | object|false | {enabled, count} — AI crawls N extra pages |
| personas | object|false | {enabled, count} — N persona reviews |
| flows | object|false | {enabled, count} — N generated test flows |
| label | string | Optional tag shown in dashboard |
Poll every 5s while status is queued or running. Add ?slim=1 for a lightweight polling response (<5KB). Drop it when done for the full report.
# Poll while running
curl "https://reports.testers.ai/api/reports/REPORT_ID?slim=1" \
-H "X-Api-Key: jk_YOUR_KEY" \
-H "X-Account: you@example.com"
# Full report once done
curl "https://reports.testers.ai/api/reports/REPORT_ID" \
-H "X-Api-Key: jk_YOUR_KEY" \
-H "X-Account: you@example.com"
import time, requests
REPORT_ID = "387ee94b-…"
H = {"X-Api-Key": "jk_YOUR_KEY", "X-Account": "you@example.com"}
URL = f"https://reports.testers.ai/api/reports/{REPORT_ID}"
# Poll lightweight endpoint every 5s until done
while True:
r = requests.get(URL + "?slim=1", headers=H, timeout=15).json()
if r["status"] in ("done", "failed", "blocked"):
break
print(f"status={r['status']} pct={r.get('progress',{}).get('percent',0)}")
time.sleep(5)
# Fetch the full report once status is done
report = requests.get(URL, headers=H, timeout=30).json()
print("Score:", report["analysis"]["score"])
for issue in report["analysis"]["issues"][:5]:
print("-", issue["bug_title"])
const REPORT_ID = "387ee94b-…";
const headers = { "X-Api-Key": "jk_YOUR_KEY", "X-Account": "you@example.com" };
const URL = `https://reports.testers.ai/api/reports/${REPORT_ID}`;
// Poll lightweight endpoint every 5s
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
while (true) {
const r = await (await fetch(`${URL}?slim=1`, { headers })).json();
if (["done", "failed", "blocked"].includes(r.status)) break;
console.log(`status=${r.status} pct=${r.progress?.percent ?? 0}`);
await sleep(5000);
}
// Fetch the full report once done
const report = await (await fetch(URL, { headers })).json();
console.log("Score:", report.analysis.score);
for (const issue of report.analysis.issues.slice(0, 5)) {
console.log("-", issue.bug_title);
}
{
"status": "done",
"analysis": {
"score": 24,
"issues": [{
"bug_title": "Submit button has insufficient contrast",
"bug_type": ["accessibility"],
"bug_priority": 2,
"bug_severity": "moderate",
"prompt_to_fix_this_issue": "Paste into Claude Code / Cursor: …"
}]
},
"personaFeedback": { "personas": [ … ] },
"testFlows": { "flows": [ … ] },
"baselines": { "rank": { "betterThanPct": 68 } },
"artifacts": { "entryScreenshotUrl": "https://…" }
}
https://reports.testers.ai/r/REPORT_ID.json # full JSON
https://reports.testers.ai/r/REPORT_ID.md # Markdown (paste into docs/issues)
List all reports for your account, newest first.
curl "https://reports.testers.ai/api/reports?limit=20" \
-H "X-Api-Key: jk_YOUR_KEY" \
-H "X-Account: you@example.com"
| Param | Notes |
|---|---|
| limit | Max results (default 20, max 100) |
| before | Cursor — timestamp for pagination |
| status | Filter by: queued | running | done | failed |
Ask questions about a specific report. The server attaches a compact summary of issues, personas, flows, and baselines as context.
curl -X POST \
"https://reports.testers.ai/api/reports/REPORT_ID/chat" \
-H "X-Api-Key: jk_YOUR_KEY" \
-H "X-Account: you@example.com" \
-H "Content-Type: application/json" \
-d '{
"messages": [
{"role": "user", "content": "What is the most critical issue?"}
]
}'
{ "reply": "The highest-priority issue is …" }
| Mode | Headers | Quota |
|---|---|---|
| Demo | X-Account: you@email.com | 1 report/day · 1 URL |
| API key | X-Api-Key: jk_… + X-Account: … | 25/day · 25 URLs/req |
Sign in → click your avatar → Generate API key. Keys have the format jk_…
# Every request needs both headers
X-Api-Key: jk_YOUR_KEY
X-Account: you@example.com
25 reports/day per key · up to 25 URLs per request · reports are kept indefinitely · screenshots retained 90 days.
OpenAI-compatible endpoint — drop-in replacement. Quality-tuned for software testing tasks: bug finding, test generation, accessibility review.
curl -X POST https://api.testers.ai/v1/chat/completions \
-H "Authorization: Bearer YOUR_TAI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "tai-1",
"messages": [
{"role": "system", "content": "You are a QA expert."},
{"role": "user", "content": "Review this login form for bugs."}
]
}'
from openai import OpenAI
client = OpenAI(
base_url="https://api.testers.ai/v1",
api_key="YOUR_TAI_KEY"
)
response = client.chat.completions.create(
model="tai-1",
messages=[
{"role": "user", "content": "Find accessibility bugs in this HTML."}
]
)
print(response.choices[0].message.content)
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.testers.ai/v1",
apiKey: "YOUR_TAI_KEY",
});
const res = await client.chat.completions.create({
model: "tai-1",
messages: [{ role: "user", content: "Generate test cases for checkout." }],
});
console.log(res.choices[0].message.content);
All models are quality-tuned — optimised for software testing tasks vs. general-purpose LLMs.
# List available models
curl https://api.testers.ai/v1/models \
-H "Authorization: Bearer YOUR_TAI_KEY"
Authorization: Bearer YOUR_TAI_KEY
Same key as the Test Reports API (jk_… format). Sign in → profile → Generate API key.
# Before
base_url = "https://api.openai.com/v1"
api_key = "sk-…"
# After — same SDK, same code
base_url = "https://api.testers.ai/v1"
api_key = "YOUR_TAI_KEY"
All standard OpenAI SDK methods work: chat.completions, streaming, function calling, embeddings.