Skip to content

Admin

Admin endpoints require JWT authentication with admin-level permissions. Standard tester or business tokens will receive a 403 response.

Endpoints

GET /api/admin/testers JWT

List all registered testers with filtering and pagination

Query parameters

ParameterTypeDescription
statusstringFilter by status: active, suspended, pending
countrystringISO 3166-1 alpha-2 country code
minSessionsintegerMinimum completed session count
pageintegerPage number (default: 1)
limitintegerResults per page (default: 20, max: 100)

Response

{
"success": true,
"data": [
{
"testerId": "user_xyz789",
"email": "tester@example.com",
"displayName": "Alex R.",
"country": "IT",
"status": "active",
"completedSessions": 14,
"avgRating": 4.6,
"joinedAt": "2025-11-01T00:00:00Z"
}
],
"error": null,
"metadata": {
"page": 1,
"limit": 20,
"total": 248
}
}
GET /api/admin/quiz JWT

Retrieve the current tester qualification quiz configuration

Returns the active quiz used to evaluate prospective testers during onboarding. Includes all questions, options, and correct answers.

Response

{
"success": true,
"data": {
"quizId": "quiz_v3",
"version": 3,
"passingScore": 70,
"questions": [
{
"questionId": "q_001",
"text": "What does 'think aloud' mean in usability testing?",
"type": "multiple_choice",
"options": [
{ "id": "a", "text": "Reading instructions out loud" },
{ "id": "b", "text": "Narrating your thoughts and actions while performing tasks" },
{ "id": "c", "text": "Answering questions after the test" },
{ "id": "d", "text": "Using a voice interface" }
],
"correctOptionId": "b",
"points": 10
}
],
"updatedAt": "2026-01-15T00:00:00Z"
},
"error": null,
"metadata": null
}
POST /api/admin/quiz JWT

Create a new version of the tester qualification quiz

Publishes a new quiz version. The new version becomes active immediately and applies to all subsequent tester applications.

Request body

{
"passingScore": 75,
"questions": [
{
"text": "Which behavior indicates a usability problem?",
"type": "multiple_choice",
"options": [
{ "id": "a", "text": "Completing a task in under 30 seconds" },
{ "id": "b", "text": "Repeated navigation to the wrong section" },
{ "id": "c", "text": "Using keyboard shortcuts" },
{ "id": "d", "text": "Reading all on-screen text before acting" }
],
"correctOptionId": "b",
"points": 10
}
]
}
FieldTypeRequiredDescription
passingScoreinteger (0-100)YesMinimum score to pass
questionsarrayYesArray of question objects

Response

{
"success": true,
"data": {
"quizId": "quiz_v4",
"version": 4,
"questionCount": 10,
"publishedAt": "2026-03-16T09:00:00Z"
},
"error": null,
"metadata": null
}
PATCH /api/admin/quiz JWT

Update fields of the current quiz version

Updates the active quiz in-place. Use this to change passingScore or modify individual questions without publishing a full new version.

Request body

{
"passingScore": 80
}

Only fields provided in the request body are updated. Omitted fields retain their current values.

Response

{
"success": true,
"data": {
"quizId": "quiz_v4",
"passingScore": 80,
"updatedAt": "2026-03-16T10:00:00Z"
},
"error": null,
"metadata": null
}
GET /api/admin/capacity-reviews JWT

List pending capacity review requests

Capacity reviews are triggered when a study requests more testers than are currently available in a matching demographic segment.

Query parameters

ParameterTypeDescription
statusstringFilter by pending, approved, rejected
pageintegerPage number (default: 1)
limitintegerResults per page (default: 20)

Response

{
"success": true,
"data": [
{
"reviewId": "cr_001",
"jobId": "job_abc123",
"requestedCount": 20,
"availableCount": 12,
"segment": { "country": "DE", "ageRange": "25-34" },
"status": "pending",
"createdAt": "2026-03-15T14:00:00Z"
}
],
"error": null,
"metadata": {
"page": 1,
"limit": 20,
"total": 3
}
}
PATCH /api/admin/capacity-reviews/:id JWT

Approve or reject a capacity review

Path parameters

ParameterDescription
idCapacity review ID

Request body

{
"decision": "approved",
"adjustedCount": 15,
"note": "Sourcing additional testers from partner network."
}
FieldTypeRequiredDescription
decisionstringYesapproved or rejected
adjustedCountintegerNoApproved tester count if different from the requested amount
notestringNoInternal note for audit trail

Response

{
"success": true,
"data": {
"reviewId": "cr_001",
"status": "approved",
"adjustedCount": 15,
"resolvedAt": "2026-03-16T09:30:00Z"
},
"error": null,
"metadata": null
}