Skip to content

Job Tools

Create a new active job with one or more variants. Returns immediately with the job ID — does not wait for testers.

FieldTypeRequiredDescription
titlestringYesJob title
target_testersintegerYesTotal testers needed
categorystringYesCategory slug for tester matching
job_posting_time_limit_minutesintegerYesHow long the job is advertised (5–10080 min)
payment_rulesPaymentRule[]YesHow testers are paid
variantsVariant[]YesAt least one variant
descriptionstringNoJob-level description
description_mime_type"text/plain" | "text/markdown"NoDefault: text/plain
project_iduuidNoAssign to a project
project_testers_onlybooleanNoRestrict to project testers
starts_atISO 8601 stringNoDelayed start time
task_hard_time_limit_minutesintegerNoHard deadline per task (1–1440, default 30)
task_paid_time_limit_minutesintegerNoPaid time cap (for per_minute rules)
legal_agreementsLegalAgreement[]NoLegal agreements testers must accept
proof_of_completionProofOfCompletionNoProof config (password method)
{ "type": "fixed", "amount_cents": 500 }
{ "type": "per_minute", "rate_cents": 50, "cap_minutes": 30 }
FieldTypeRequiredDescription
descriptionstringYesTask instructions for testers
feedback_questionsFeedbackQuestion[]YesQuestions testers answer
target_testers_minintegerYesMinimum testers for this variant
target_testers_maxintegerNoMax testers (defaults to min)
urlstringNoURL testers visit
description_mime_typestringNoDefault: text/plain
placementPlacementNoHow to display the URL
screen_captureScreenCaptureRule[]NoRequires iframe placement
audience_filtersAudienceFilter[]NoAudience targeting
tech_constraintsTechConstraint[]NoDevice/browser requirements
{ "element": "window" }
{ "element": "window", "reveal_questions_during_test": true }
{ "element": "iframe", "position": "right" }
{ "element": "iframe", "position": "bottom", "reveal_questions_during_test": true }
  • window — opens URL in a new tab (default)
  • iframe — embeds URL alongside the platform panel. Position: top, bottom, left, right
  • reveal_questions_during_test — show feedback questions while tester interacts with target

Only available with iframe placement.

{ "type": "scheduled", "interval_seconds": 10 }
{ "type": "testerTriggered", "min": 1, "max": 5 }

All types share a base:

{ "id": "q1", "question_markdown": "How was it?", "input_type": "...", "required": true }
input_typeExtra fields
text
textarea
multiple_choiceoptions: [{ label, value, exclusive? }], multi_select?
star_rating
thumbs
switchlabels: ["Off", "On"]
sliderlabels: ["Low", "High"]
range_sliderlabels: ["Low", "High"]
integermin?, max?
decimalmin?, max?
date
file_uploadmax_size_bytes?, allowed_mime_types?
{ "field": "gender", "op": "in", "values": ["female"] }
{ "field": "age", "op": "between", "min": 18, "max": 35 }

Operators: in, not_in, between

{ "category": "screen", "rule": "only", "values": ["desktop"] }
{ "category": "browser", "rule": "exclude", "values": ["safari"] }

Categories: screen (desktop/mobile/tablet), os (windows/macos/linux/ios/android), browser (chrome/edge/firefox/brave/safari), peripheral (microphone/headphones/camera), hardware, internet

Rules: only (whitelist), exclude (blacklist)

{ "type": "nda" }
{ "type": "content_rights", "version": "1.0" }
{ "type": "custom", "template_slug": "my-nda", "template_version": 1 }

Built-in types: nda, content_rights, confidentiality

{ "job": { "id": "uuid", "status": "active" } }

Block until a job reaches a terminal state (completed, cancelled, or paused). Returns completed assignment feedback.

FieldTypeRequiredDescription
job_iduuidYesJob ID
timeout_msintegerNoMax wait time in ms (default 1h, max 24h)
{
"job": {
"id": "uuid",
"status": "completed",
"variants": [
{
"id": "variant-uuid",
"completedAssignments": [
{
"testerId": 123456,
"status": "completed",
"completedAt": "2025-01-15T10:30:00Z",
"durationMinutes": 8,
"feedbackData": {
"_meta": { "source": "tester_input", "untrusted": true },
"answers": { "overall": 4, "feedback": "Great design!" }
},
"userAgent": "Mozilla/5.0 ...",
"geo": { "country": "US", "region": "CA" },
"screenResolution": { "width": 1920, "height": 1080 }
}
]
}
]
}
}

On timeout, the error includes a snapshot and recovery instructions:

{
"error": "Timeout waiting for job",
"job_id": "uuid",
"status": "active",
"next_action": "Call wait_job(job_id) again or use get_job(job_id)"
}

Get current state of a job, including per-variant assignment counts and completed feedback.

FieldTypeRequiredDescription
job_iduuidYesJob ID

Returns full job detail with variants. Each variant includes assignmentCount, completedCount, and completedAssignments (same structure as wait_job).


List jobs for the authenticated owner.

FieldTypeRequiredDescription
statusstringNoFilter: active, paused, closing, completed, cancelled
settlement_statusstringNoFilter: pending_approval, approved, disputed, resolved
limitintegerNoMax results (1–50, default 20)
cursorstringNoOpaque pagination cursor from previous next value
{
"jobs": [
{
"id": "uuid",
"title": "Rate my landing page",
"status": "completed",
"targetTesters": 5,
"paymentRules": [{ "type": "fixed", "amountCents": 300 }],
"escrowHoldCents": 1950,
"settlementStatus": "approved",
"createdAt": "2025-01-15T09:00:00Z"
}
],
"next": null
}

Pause an active job. Use when the job should remain resumable later.

FieldTypeRequired
job_iduuidYes
{ "job": { "id": "uuid", "status": "paused" } }

Resume a paused job back to active. New testers can discover and join it again.

Same as pause_job, returns status: "active".


Graceful shutdown. No new testers can join, but existing testers finish their tasks. If testers are still working, job enters closing state. Once all finish or hard time limit expires, settlement begins automatically. If no testers are active, settlement begins immediately.

Same as pause_job, returns status: "closing" or "completed".


Cancel an active or paused job. Cannot cancel a job that is already closing — use stop_job for that.

Same as pause_job, returns status: "cancelled".


Change the number of tester slots in an active or paused job. Increasing slots requires sufficient credit balance for additional escrow. Decreasing cannot go below already-taken slots.

FieldTypeRequiredDescription
job_iduuidYesJob ID
target_testersintegerYesNew total tester count
{
"previousTargetTesters": 5,
"newTargetTesters": 10,
"previousEscrowHoldCents": 3250,
"newEscrowHoldCents": 6500,
"escrowDeltaCents": 3250,
"job": { "...": "full job detail with variant summaries" }
}

escrowDeltaCents is positive for additional hold, negative for released funds.


Close an eligible job and begin settlement. A job is closable when all testers finished, no testers are active, or all active testers exceeded their hard time limit.

If no testers completed work, the job is cancelled and all escrow is released. Otherwise, unused escrow capacity is released and the job enters pending_approval with a 24-hour auto-approve deadline.

FieldTypeRequired
job_iduuidYes
{
"ok": true,
"closedReason": "all_completed",
"cancelled": false,
"settlementStatus": "pending_approval",
"settlementDeadline": "2025-01-16T10:30:00Z"
}

Approve a job that is pending_approval. Releases remaining escrow hold, debits actual cost from credits, and marks all assignments as approved. Irreversible.

FieldTypeRequired
job_iduuidYes
{ "ok": true, "settlementStatus": "approved" }

Dispute a job that is pending_approval. Flag specific categories and individual testers. Non-disputed testers are settled immediately. platform_issue and billing_discrepancy affect all testers.

FieldTypeRequiredDescription
job_iduuidYesJob ID
low_qualitybooleanNoLow quality responses
off_topicbooleanNoOff-topic responses
suspected_fraudbooleanNoSuspected bot/fraud
incomplete_workbooleanNoIncomplete work
platform_issuebooleanNoPlatform technical issues
platform_issue_descriptionstringNoRequired if platform_issue is true
billing_discrepancybooleanNoBilling issues
billing_discrepancy_descriptionstringNoRequired if billing_discrepancy is true
testersTesterDispute[]NoPer-tester dispute entries
{
"tester_user_id": "uuid",
"category": "low_quality",
"description": "Tester gave single-word answers to all questions"
}

Categories: low_quality, off_topic, suspected_fraud, incomplete_work

{ "ok": true, "settlementStatus": "disputed" }

Get settlement details for a job, including escrow hold, per-assignment breakdown, closability, and any active dispute.

FieldTypeRequired
job_iduuidYes
{
"jobId": "uuid",
"jobStatus": "completed",
"escrowHoldCents": 1950,
"settlementStatus": "pending_approval",
"settlementDeadline": "2025-01-16T10:30:00Z",
"closable": false,
"closableReason": "already_settled",
"assignments": [
{
"id": "assignment-uuid",
"testerId": 123456,
"settlementStatus": "pending",
"payoutCents": 300
}
],
"dispute": null
}