Answers
Reviewing, accepting, and exporting crowd worker answers — and converting them into datasets or input data for further pipeline runs.
A crowd answer is created when a worker submits a completed task. Each answer is linked to its task slot, the job it belongs to, and the organisation that owns the job. The answer contains the worker's structured responses as a JSONB answers object whose keys match the field names defined in the survey template, plus optional attached files if the template included file-upload questions.
Answer Status
Every answer starts in pending status and must be reviewed before the worker receives their credits.
| Status | Meaning |
|---|---|
pending | Submitted but not yet reviewed. |
accepted | Approved by the job owner. rewardCredits are transferred to the worker's balance. |
rejected | Declined by the job owner, optionally with a rejectionReason. The worker is not paid for this submission. |
Rejecting an answer does not automatically create a new task slot. If you want the variant to be reassigned to a different worker, update the job's maxRepetitionsPerVariant to allow an additional round — subject to the organisation having sufficient balance to cover the additional credits.
Listing Answers
Retrieve answers for a job with optional status filtering and pagination.
curl "https://api.crowdee.ai/v2/crowd-jobs/{jobId}/answers?status=pending&limit=50&offset=0" \
-H "X-API-Key: crw_YOUR_API_KEY"The response includes the total count and a paginated list of answer objects:
{
"total": 142,
"items": [
{
"id": "ans_abc123",
"taskId": "tsk_xyz987",
"jobId": "job_def456",
"workerId": "usr_ghi789",
"guestWorkerId": null,
"answers": {
"assessment": "Clearly manipulated",
"reasoning": "The lighting on the subject does not match the background."
},
"inputDataVariantIndex": 7,
"status": "pending",
"creditsEarned": 0,
"createdAt": "2025-09-14T10:23:41Z"
}
]
}Accepting and Rejecting Answers
Accept an answer — transfers rewardCredits to the worker:
curl -X PATCH https://api.crowdee.ai/v2/crowd-answers/{answerId}/accept \
-H "X-API-Key: crw_YOUR_API_KEY"Reject an answer — with an optional reason shown to the worker:
curl -X PATCH https://api.crowdee.ai/v2/crowd-answers/{answerId}/reject \
-H "X-API-Key: crw_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "rejectionReason": "Response does not address the required criteria." }'Both endpoints return the updated answer object with its new status and creditsEarned.
Answer Files
Workers can attach files to their answers if the survey template includes one or more file-upload questions. Attached files are stored in your organisation's S3 bucket.
List all files attached to answers for a job:
GET /v2/crowd-jobs/{jobId}/files
X-API-Key: crw_YOUR_API_KEYDownload all files — returns presigned S3 URLs valid for 24 hours:
GET /v2/crowd-jobs/{jobId}/files/download
X-API-Key: crw_YOUR_API_KEYThe response is a JSON object with a urls array. Each URL points directly to one file in S3 and expires after 24 hours.
Files are stored per answer, not per job. The download endpoint aggregates all files across all answers for the job. If you need files from specific answers only (e.g. accepted answers only), filter the answer list first and use the file references in each answer object.
Exporting Answers
Export all answers for a job as structured JSON or a flat CSV.
# JSON export — array of full answer objects
GET /v2/crowd-jobs/{jobId}/answers/export?format=json&status=accepted
# CSV export — flattened, one row per answer
GET /v2/crowd-jobs/{jobId}/answers/export?format=csv&status=allThe status query parameter filters by answer status (pending, accepted, rejected, or all). Defaults to all.
JSON format — an array of answer objects identical to the list endpoint response, including the answers JSONB, metadata fields, and timestamps. Suitable for programmatic ingestion into your own systems or downstream analysis.
CSV format — each row corresponds to one answer. The answers JSONB fields are flattened to individual columns using dot notation (e.g. answers.assessment, answers.reasoning). Metadata columns (id, taskId, workerId, status, inputDataVariantIndex, createdAt) are prepended. Suitable for spreadsheet tools and simple data pipelines.
Answers to Dataset
Convert the files attached to matching answers into a new named dataset. This is the primary path from a data-collection job into a verification pipeline run.
curl -X POST https://api.crowdee.ai/v2/crowd-jobs/{jobId}/answers-to-dataset \
-H "X-API-Key: crw_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"datasetName": "Q3 Labelled Images — Accepted",
"fileFieldNames": ["annotated_image"],
"answerStatus": "accepted"
}'| Field | Description |
|---|---|
datasetName | Name of the new dataset. |
fileFieldNames | Optional array of survey field names whose file attachments to include. If omitted, all file fields are included. |
answerStatus | Filter which answers to pull files from: "pending", "accepted", "rejected", or "all" (default "all"). |
The endpoint returns { "datasetId": "...", "fileCount": 47 }. The new dataset is immediately available for cleaning, enrichment, and verification pipeline runs. See Datasets for next steps.
Only answers that have at least one file matching the fileFieldNames filter are included. Answers with no attached files are silently skipped. If fileCount is lower than expected, verify that the survey template field names in fileFieldNames match exactly.
Answers to Input Data
Convert the textual fields from matching answers into a new input data set. Use this to feed one round of collection directly into the next job iteration, or as structured input for a downstream pipeline.
curl -X POST https://api.crowdee.ai/v2/crowd-jobs/{jobId}/answers-to-input-data \
-H "X-API-Key: crw_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"inputDataName": "Crowd-Written Claims — Round 1",
"textFieldNames": ["claim_text", "source_url"],
"scope": "organization",
"answerStatus": "accepted"
}'| Field | Description |
|---|---|
inputDataName | Name of the new input data set. |
textFieldNames | Array of survey field names to extract (minimum 1). Each answer contributes one record containing only these fields. |
scope | "project" (default) or "organization" — controls visibility across projects. |
answerStatus | Filter which answers to include. Defaults to "all". |
The endpoint returns { "inputDataSetId": "...", "recordCount": 38 }. The input data set is immediately available to attach to a new crowd job or as context for a verification pipeline run.
Combining Answers to Input Data with a new job creates an iterative crowdsourcing loop: workers in round one generate text that becomes the input data for round two, where different workers review or annotate it. This pattern is useful for multi-stage annotation workflows and adversarial dataset construction.
How is this guide?
Content Gathering
Using the crowd to search for and collect content matching your criteria, rather than reviewing content you already have.
Task Templates
SurveyJS-based task definitions that structure the questions crowd workers answer during verification.