# Content Gathering (/docs/crowdsourcing/content-gathering)



Every other crowd job in this section assumes you already have the content — an image, a claim, a dataset — and you're asking workers to review, label, or verify it. Content gathering inverts that: you describe what you're looking for, and workers search the web and social platforms to find and submit matching content on your behalf.

<Callout type="info">
  Content gathering is a `jobs.category` value (`"gathering"`), not a separate resource. It uses the same job creation, task assignment, and payment mechanics as every other crowd job — see [Crowd Jobs](/docs/crowdsourcing/jobs) for the shared fields.
</Callout>

## How Gathering Jobs Differ From Survey Jobs [#how-gathering-jobs-differ-from-survey-jobs]

A survey job distributes a fixed, pre-defined set of input data records to workers — each worker sees one record and answers questions about it. A gathering job has no predefined content to distribute, so it's configured differently:

| Field                      | Survey job                                | Gathering job                                                                             |
| -------------------------- | ----------------------------------------- | ----------------------------------------------------------------------------------------- |
| `inputDataSetId`           | Usually set — one task variant per record | Omitted — there's nothing to pre-enumerate                                                |
| `forceUniqueTasks`         | Usually `true`                            | Set to `false` — the same worker can submit multiple items toward the target              |
| `maxRepetitionsPerVariant` | Responses per input record                | Interpreted as the **total number of items you want gathered**, shared across all workers |
| `maxAssignments`           | Usually `1`                               | Set higher — the number of items a single worker may submit                               |

## Gathering Criteria [#gathering-criteria]

When creating a gathering job, attach a `gatheringCriteria` object describing what workers should look for:

```json
{
  "name": "Springfield flooding coverage",
  "title": "Find social media posts about the Springfield flooding",
  "description": "Search for photos, videos, or eyewitness posts about the November 2026 flooding in Springfield.",
  "category": "gathering",
  "surveyTemplateVersionId": "tmplv_abc123def456ghi789jkl01",
  "maxRepetitionsPerVariant": 50,
  "maxAssignments": 10,
  "forceUniqueTasks": false,
  "rewardCredits": 15,
  "gatheringCriteria": {
    "keywords": ["springfield flooding", "springfield flood 2026"],
    "platforms": ["twitter", "telegram", "instagram"],
    "languages": ["en"],
    "contentTypes": ["image", "video", "text"],
    "useWebResearch": true
  }
}
```

| Field                           | Type               | Description                                                                                                                      |
| ------------------------------- | ------------------ | -------------------------------------------------------------------------------------------------------------------------------- |
| `keywords`                      | string\[]          | Search terms workers should use as a starting point.                                                                             |
| `platforms`                     | string\[]          | Social networks, messengers, or sites to focus on.                                                                               |
| `languages`                     | string\[]          | Acceptable content languages.                                                                                                    |
| `contentTypes`                  | string\[]          | Acceptable content types (e.g. `image`, `video`, `text`).                                                                        |
| `dateRangeFrom` / `dateRangeTo` | ISO 8601 timestamp | Restrict results to a publication window.                                                                                        |
| `minEngagement`                 | object             | Minimum engagement thresholds per metric (e.g. `{"likes": 100}`), enforced editorially by reviewers rather than by the platform. |
| `useWebResearch`                | boolean            | Whether workers get access to the in-task search assistant (see below).                                                          |

## What Workers Submit [#what-workers-submit]

Gathering-job task templates use a repeating question that lets a worker submit **one or more** items per task, each with:

| Field           | Description                                                                |
| --------------- | -------------------------------------------------------------------------- |
| `url`           | Link to the content (required).                                            |
| `platform`      | Where it was found.                                                        |
| `content_type`  | Type of content.                                                           |
| `author_handle` | Account or byline associated with the content, if visible.                 |
| `text_content`  | Post text or a transcription/description, if applicable.                   |
| `metrics`       | Engagement numbers the worker observed (likes, shares, views), if visible. |

Workers can optionally use an in-task search assistant to look for content without leaving the task page. Every submitted item is deduplicated per job by URL — if two workers submit the same link, only the first counts toward your target and payout.

## Reviewing Gathered Items [#reviewing-gathered-items]

Each submitted item becomes a row you can review independently of the worker's overall answer:

```bash
GET https://api.crowdee.ai/v2/crowd-jobs/{jobId}/gathered-items?reviewStatus=pending
X-API-Key: crw_YOUR_API_KEY
```

Update an item's status as you triage the results:

```bash
curl -X PATCH https://api.crowdee.ai/v2/gathered-items/{itemId} \
  -H "X-API-Key: crw_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reviewStatus": "accepted"}'
```

| Status      | Meaning                                                   |
| ----------- | --------------------------------------------------------- |
| `pending`   | Not yet reviewed (default on submission).                 |
| `accepted`  | Confirmed as relevant and usable.                         |
| `rejected`  | Not relevant, low quality, or otherwise unusable.         |
| `duplicate` | Same underlying content as another item already gathered. |

<Callout type="info">
  Reviewing gathered items is independent of accepting or rejecting the worker's *answer*. A worker is paid for submitting a complete, good-faith task — rejecting an individual gathered item doesn't claw back payment, since worker payment happens at the task level (see [Crowd Jobs](/docs/crowdsourcing/jobs)), while item review controls what flows into your downstream dataset.
</Callout>

## Exporting Gathered Content [#exporting-gathered-content]

Accepted items feed directly into Crowdee's other tools rather than sitting in a one-off table.

**Export to a dataset** — turns accepted items' attached files (photos, videos, screenshots) into a new dataset you can run through [multimedia verification pipelines](/docs/pipelines/verify-image-deep):

```bash
curl -X POST https://api.crowdee.ai/v2/crowd-jobs/{jobId}/gathered-items/export-to-dataset \
  -H "X-API-Key: crw_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"datasetName": "Springfield flooding media", "reviewStatus": "accepted"}'
```

**Export to input data** — turns accepted items' URLs (and text content, where present) into a new input data set:

```bash
curl -X POST https://api.crowdee.ai/v2/crowd-jobs/{jobId}/gathered-items/export-to-input-data \
  -H "X-API-Key: crw_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"inputDataName": "Springfield flooding sources", "reviewStatus": "accepted"}'
```

The resulting URLs are a natural input to [Source Research & Credibility Assessment](/docs/pipelines/verify-source-credibility) runs — gather content with the crowd, then trace each item back to its origin.

<Callout type="warn">
  Both export endpoints only consider items matching the requested `reviewStatus` (defaults to `accepted`). Review your gathered items before exporting — items left at `pending` are excluded by default.
</Callout>
