- Claude Code →
~/.claude/skills/jank-cloud/SKILL.md - Cursor / VS Code → project root or your AI plugin's skills directory
- ChatGPT / Custom GPTs → paste the contents into your system prompt or knowledge base
- Anything else → upload the file as context or paste it inline
jank 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.
- model.testers.ai
- tai-1 & tai-1-tuned
- Streaming SSE
- 6 modes
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 chatbotConnection — tunnels & proxies
Advanced — auth & headers
Get in Touch
Questions about testing, pricing, or want us to test your app? We read every message.
🔌 Request Plugin Early Access
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.
Request Testers.ai Unlock Code
Signup and we'll send you an unlock code that removes free-trial rate limits on this chat and the AI-based testing tools.
Have our experts run AI testing for your app
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.
Chat Context
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.
Get the report for your app
Zero effort. AI finds your most important escaped issues, persona feedback, and regression-testing gaps — and shows how you compare to category peers.
- Full report unlocked
- Bugs across 7 categories
- Persona feedback findings
- Category benchmarks
- Competitive intelligence
- Everything in Standard
- Human expert review
- Custom testing & reporting
- Pre-production & on-premise
coTestPilot
What's your role?
Which platform?
Recommended for :
Settings
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.