Crowdee
Crowdsourcing

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.

StatusMeaning
pendingSubmitted but not yet reviewed.
acceptedApproved by the job owner. rewardCredits are transferred to the worker's balance.
rejectedDeclined 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_KEY

Download all files — returns presigned S3 URLs valid for 24 hours:

GET /v2/crowd-jobs/{jobId}/files/download
X-API-Key: crw_YOUR_API_KEY

The 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=all

The 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"
  }'
FieldDescription
datasetNameName of the new dataset.
fileFieldNamesOptional array of survey field names whose file attachments to include. If omitted, all file fields are included.
answerStatusFilter 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"
  }'
FieldDescription
inputDataNameName of the new input data set.
textFieldNamesArray 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.
answerStatusFilter 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?

© 2026 Crowdee GmbH. All rights reserved.

On this page