Agent API Reference
BetaWindow exposes a REST API so AI agents (Cursor, Replit Agent, v0, etc.) can programmatically hire human testers without any manual steps from the developer. This is the core "AI agents hiring humans" workflow.
Authentication
All /api/v1/ endpoints use API key authentication. Generate a key in your Dashboard → API Keys.
Authorization: Bearer aqk_<your-key>Base URL
https://betawindow.com/api/v1Tiers & Pricing
| Tier | Duration | Price | Use when |
|---|---|---|---|
quick | ~10 min | $5 | Smoke test, happy path only |
standard | ~20 min | $10 | Core flows + edge cases |
deep | ~30 min | $15 | Full regression + accessibility |
Endpoints
List jobs
GET /api/v1/jobs?limit=20&offset=0Returns a paginated list of test jobs you have submitted.
Response
{
"jobs": [
{
"id": "uuid",
"title": "Check checkout flow",
"status": "completed",
"tier": "quick",
"price_cents": 500
}
],
"pagination": {
"total": 42,
"limit": 20,
"offset": 0
}
}Create a job
POST /api/v1/jobsCreates a new test job. Set auto_submit: true to immediately queue it for a human tester (skips the draft step).
Request body
{
"title": "Test checkout flow on /checkout",
"url": "https://my-app.vercel.app/checkout",
"tier": "quick",
"instructions": "Try adding an item to the cart and completing checkout. Report any errors.",
"auto_submit": true
}Response 201
{
"job": {
"id": "uuid",
"status": "pending",
"tier": "quick",
"price_cents": 500
}
}Get job status & results
GET /api/v1/jobs/:idReturns the job with its current status, feedback, and session info. Poll this until status === "completed".
Job status lifecycle
draft → pending → in_progress → completed
↘ cancelledUpdate / submit a draft
PATCH /api/v1/jobs/:idUpdate fields on a draft job. To submit it for testing, set { status: "pending" }.
Cancel a job
DELETE /api/v1/jobs/:idCancels a draft or pending job. Has no effect once a tester has started.
Quick-start (curl)
# 1. Submit a test job
curl -X POST https://betawindow.com/api/v1/jobs \
-H "Authorization: Bearer aqk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Smoke test homepage",
"url": "https://my-app.vercel.app",
"tier": "quick",
"instructions": "Navigate the site and report any broken links or JS errors.",
"auto_submit": true
}'
# 2. Poll for results
curl https://betawindow.com/api/v1/jobs/JOB_ID \
-H "Authorization: Bearer aqk_YOUR_KEY"Quick-start (Python SDK)
import httpx, time
API_KEY = "aqk_YOUR_KEY"
BASE = "https://betawindow.com/api/v1"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
# Submit
resp = httpx.post(f"{BASE}/jobs", headers=HEADERS, json={
"title": "Smoke test homepage",
"url": "https://my-app.vercel.app",
"tier": "quick",
"auto_submit": True,
})
job = resp.json()["job"]
print(f"Job {job['id']} submitted")
# Poll until done
while job["status"] not in ("completed", "cancelled"):
time.sleep(30)
job = httpx.get(f"{BASE}/jobs/{job['id']}", headers=HEADERS).json()["job"]
print("Feedback:", job.get("feedback"))Rate limits
50 requests / minute per API key. Exceeding returns 429 Too Many Requests.
Errors
All errors return JSON with an error field and a standard HTTP status code.
{
"error": "title and url are required"
}