文档开发者

TaskerData API

用你自己的代码发布活动、收集并审核工作者的提交,或连接外部资格测试。每个请求都使用你的 API 密钥进行身份验证。

概览

活动 API 让你的代码完成你在发布者控制台中做的事:创建活动、跟踪进度、下载提交及其凭证,并通过或拒绝它们。外部资格测试端点让你网站上的测试告诉 TaskerData 每位工作者是否通过。

所有请求都通过 HTTPS 发送到 https://taskerdata.com,请求和响应均为 JSON 格式。

通过 API 创建的活动与在控制台中创建的费用相同、规则相同。上线前由 TaskerData 审核(受信任的发布者会立即上线),资金的预留和支付方式也一样。

身份验证

打开发布者控制台,进入 API。你会看到两个密钥:

  • API 密钥:用于真实请求。活动 API 从 Authorization 请求头中读取它,资格测试端点则以 api_token 接收它。
  • 测试 API 密钥:仅用于资格测试的测试端点,让你在不影响真实工作者的情况下试用该集成。

生成新密钥会立即替换旧密钥,所以生成后请同步更新你的后端。每小时最多可生成 3 个新密钥。

重要: 请妥善保管你的 API 密钥,只在服务器上使用,绝不要放在访客能打开的网页或应用中。

每个活动 API 请求都要带上你的 API 密钥:

Authorization: Bearer YOUR_API_KEY

每分钟最多可发送 120 个活动 API 请求。X-RateLimit-Remaining 请求头显示还剩多少次。超出后会返回状态码 429,Retry-After 请求头会告诉你需要等待几秒。

活动 API

用你自己的代码创建活动,并处理活动收到的工作。

列出活动

GET/api/v1/campaigns

你的活动,按从新到旧排列。total 是符合条件的活动总数,你可以用 limit 和 offset 分页浏览。

查询参数

参数说明
status 只返回该状态的活动:pending、in review、active、paused、completed、terminated 或 rejected
limit 返回数量,1 到 100(默认 20)
offset 跳过的数量,用于分页(默认 0)
curl "https://taskerdata.com/api/v1/campaigns?status=active&limit=20" \
  -H "Authorization: Bearer $TASKERDATA_API_KEY"

响应 · 200

{
  "success": true,
  "campaigns": [
    {
      "id": "Ab12…-Cd34…-Ef56…",
      "title": "Test our sign-up page",
      "status": "active",
      "category": "Website Testing",
      "type": "instructions",
      "url": "https://example.com/signup",
      "payment": 0.5,
      "positions": 50,
      "filled_positions": 12,
      "time_to_complete": 10,
      "time_to_rate": 3,
      "cost": 34.06,
      "proof": {
        "text": "What went wrong?",
        "images": [
          "Screenshot after signing up"
        ],
        "video": null
      },
      "qualification_id": null,
      "created_at": "2026-10-16T09:30:00.000Z"
    }
  ],
  "total": 1,
  "limit": 20,
  "offset": 0
}

错误示例

// status 401
{
  "success": false,
  "error": {
    "code": "invalid_api_key",
    "message": "Invalid API key."
  }
}

获取单个活动

GET/api/v1/campaigns/{id}

返回一个活动的设置,以及待审核、等待修改、已通过和已拒绝的提交数量。可用来跟踪活动进度。

路径参数

参数说明
id 必填活动 ID(活动列表中的 id)
curl "https://taskerdata.com/api/v1/campaigns/CAMPAIGN_ID" \
  -H "Authorization: Bearer $TASKERDATA_API_KEY"

响应 · 200

{
  "success": true,
  "campaign": {
    "id": "Ab12…-Cd34…-Ef56…",
    "title": "Test our sign-up page",
    "status": "active",
    "category": "Website Testing",
    "type": "instructions",
    "url": "https://example.com/signup",
    "payment": 0.5,
    "positions": 50,
    "filled_positions": 12,
    "time_to_complete": 10,
    "time_to_rate": 3,
    "cost": 34.06,
    "proof": {
      "text": "What went wrong?",
      "images": [
        "Screenshot after signing up"
      ],
      "video": null
    },
    "qualification_id": null,
    "created_at": "2026-10-16T09:30:00.000Z",
    "submissions": {
      "total": 14,
      "to_review": 3,
      "revision_requested": 1,
      "approved": 9,
      "rejected": 1
    }
  }
}

错误示例

// status 404
{
  "success": false,
  "error": {
    "code": "not_found",
    "message": "Campaign not found."
  }
}

创建活动

POST/api/v1/campaigns

发布一个新活动,并从你的可用余额中预留全部费用,与控制台中完全相同。响应包含活动的 id、费用和状态:TaskerData 审核期间为 pending,如果你是受信任的发布者则直接为 active。

JSON 请求体

参数说明
title 必填活动标题,最多 100 个字符
category 必填来自 GET /api/v1/options 的类别。使用模板时不要填写
instructions 必填工作者需要做什么,最多 5,000 个字符
url 工作者打开的链接。needs_url 为 true 的类别必须填写
payment 必填每个任务的报酬(美元),最低 0.12
positions 必填工作者数量,最少 10。使用模板数据文件时根据行数自动计算
time_to_complete 必填工作者完成任务的时限(分钟),1 到 120
time_to_rate 必填你审核每个提交的期限(天),1 到 30。超过期限会自动通过
proof.text 要求文字回答:告诉工作者要写什么
proof.images 要求截图或照片:每张图片一条说明
proof.video 要求视频或录屏:说明应该显示什么
targeting.region international(默认)、usa、west-europe、east-europe、latin-america 或 asia-africa
targeting.exclude_countries 要从该地区中排除的国家名称
targeting.min_success_rate 工作者最低通过率:75(默认)、80、85、90、95 或 100
targeting.type, targeting.group_id 将 type 设为 group,并将 group_id 设为你的某个工作者分组,任务就只发给该分组
qualification_id 只有通过此资格测试的工作者才能接这个任务
template 用你的某个模板代替说明:提供 id,以及包含 columns 和 rows 的 data 来填充模板占位符,每行一个任务。answers_per_row(1 到 5)和 rows_per_task(1 到 50)为选填
drip_feed 分批放出名额:min_workers 和 max_workers(1 到 50)以及 interval_minutes(15、30、60、120、180、360、720 或 1440)
location 适用于本地实地任务和神秘顾客:lat、lng、radius_m(50 到 50,000)以及选填的 address

目前,需要上传文件的类别(如音频转写或图片标签)、视频任务和示例图片只能在控制台中创建。费用与手续费指南介绍了价格的计算方式。

curl -X POST "https://taskerdata.com/api/v1/campaigns" \
  -H "Authorization: Bearer $TASKERDATA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Test our sign-up page",
    "category": "Website Testing",
    "url": "https://example.com/signup",
    "instructions": "Open the page, create an account and tell us anything that went wrong.",
    "payment": 0.5,
    "positions": 50,
    "time_to_complete": 10,
    "time_to_rate": 3,
    "proof": {
      "text": "What went wrong?",
      "images": [
        "Screenshot after signing up"
      ]
    },
    "targeting": {
      "region": "international",
      "min_success_rate": 90
    }
  }'

响应 · 201

{
  "success": true,
  "campaign": {
    "id": "Ab12…-Cd34…-Ef56…",
    "title": "Test our sign-up page",
    "status": "pending",
    "category": "Website Testing",
    "type": "instructions",
    "url": "https://example.com/signup",
    "payment": 0.5,
    "positions": 50,
    "filled_positions": 0,
    "time_to_complete": 10,
    "time_to_rate": 3,
    "cost": 34.06,
    "proof": {
      "text": "What went wrong?",
      "images": [
        "Screenshot after signing up"
      ],
      "video": null
    },
    "qualification_id": null,
    "created_at": "2026-10-16T09:30:00.000Z"
  },
  "balance": {
    "available": 65.94,
    "reserved": 34.06
  }
}

错误示例

// status 402
{
  "success": false,
  "error": {
    "code": "insufficient_balance",
    "message": "Insufficient balance"
  }
}

获取提交

GET/api/v1/campaigns/{id}/submissions

某个活动中工作者发来的工作,按从旧到新排列,并附带凭证:文字回答、图片和视频链接、模板答案(answers)、他们处理的数据行,以及实地任务中的位置。

路径参数

参数说明
id 必填活动 ID(活动列表中的 id)

查询参数

参数说明
status to_review(pending 和 resubmitted)、pending、resubmitted、revision_requested、approved 或 rejected
since 只返回在此时间或之后发送的提交,例如 2026-10-01T00:00:00Z
after_id 用于分页:只返回 id 更大的提交。请使用上一页返回的 next_after_id
limit 返回数量,1 到 100(默认 50)

如需定期获取新工作,请记下收到的最后一个 id,下次作为 after_id 发送。raw 包含工作者发送的全部内容,以备你需要未列出的信息。

curl "https://taskerdata.com/api/v1/campaigns/CAMPAIGN_ID/submissions?status=to_review&after_id=0" \
  -H "Authorization: Bearer $TASKERDATA_API_KEY"

响应 · 200

{
  "success": true,
  "submissions": [
    {
      "id": 1842,
      "campaign_id": "Ab12…-Cd34…-Ef56…",
      "worker_id": "wK3…",
      "status": "pending",
      "started_at": "2026-10-16 10:02:11",
      "submitted_at": "2026-10-16 10:09:45",
      "revision_count": 0,
      "revision_note": null,
      "rejection_reason": null,
      "payment": 0.5,
      "proof": {
        "text": "The confirm button did nothing on mobile.",
        "image_urls": [
          "https://storage.taskerdata.com/…/proof_0.png"
        ],
        "video_url": null
      },
      "answers": null,
      "data_row": null,
      "data_row_number": null,
      "items": null,
      "location": null,
      "raw": {
        "textProof": "…"
      }
    }
  ],
  "has_more": false,
  "next_after_id": null
}

错误示例

// status 400
{
  "success": false,
  "error": {
    "code": "invalid_status",
    "message": "status must be one of: to_review, pending, resubmitted, revision_requested, approved, rejected."
  }
}

审核提交

POST/api/v1/submissions/{id}/review

通过、拒绝或要求修改,与控制台中的按钮效果相同。通过后会从预留资金中向工作者付款。拒绝会把报酬及其手续费退回你的余额,并空出名额给其他工作者。

路径参数

参数说明
id 必填提交 ID

JSON 请求体

参数说明
action 必填approve、reject 或 revision
reason 配合 reject:工作者看到的拒绝理由
note 配合 revision(必填):工作者需要修改什么

只有在提交等待审核时(pending 或 resubmitted)才能审核。修改次数受活动的修改上限限制,达到上限后只能通过或拒绝。

curl -X POST "https://taskerdata.com/api/v1/submissions/1842/review" \
  -H "Authorization: Bearer $TASKERDATA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "revision",
    "note": "Please add a screenshot of the error message."
  }'

响应 · 200

{
  "success": true,
  "submission": {
    "id": 1842,
    "status": "revision_requested"
  },
  "balance": {
    "available": 65.94,
    "reserved": 34.06
  }
}

错误示例

// status 409
{
  "success": false,
  "error": {
    "code": "already_reviewed",
    "message": "Submission already reviewed"
  }
}

查看余额

GET/api/v1/balance

available 是你可用于新活动的金额,reserved 是为进行中的活动预留的金额,spent 是你到目前为止已支付给工作者的金额。

curl "https://taskerdata.com/api/v1/balance" \
  -H "Authorization: Bearer $TASKERDATA_API_KEY"

响应 · 200

{
  "success": true,
  "balance": {
    "available": 65.94,
    "reserved": 34.06,
    "spent": 212.4
  }
}

选项与 ID

GET/api/v1/options

列出可通过 API 使用的类别(needs_url 和 needs_location 表示哪些类别需要链接或位置)、允许的定向和逐步投放取值,以及你的模板、工作者分组和资格测试的 ID。

curl "https://taskerdata.com/api/v1/options" \
  -H "Authorization: Bearer $TASKERDATA_API_KEY"

响应 · 200

{
  "success": true,
  "categories": [
    {
      "name": "Website Testing",
      "needs_url": true,
      "needs_location": false
    },
    "…"
  ],
  "regions": [
    "international",
    "usa",
    "west-europe",
    "east-europe",
    "latin-america",
    "asia-africa"
  ],
  "min_success_rates": [
    75,
    80,
    85,
    90,
    95,
    100
  ],
  "drip_feed_intervals": [
    15,
    30,
    60,
    120,
    180,
    360,
    720,
    1440
  ],
  "templates": [
    {
      "id": 12,
      "title": "Sentiment check"
    }
  ],
  "worker_groups": [
    {
      "id": 3,
      "name": "Trusted testers",
      "workers": 25
    }
  ],
  "qualifications": [
    {
      "id": "Qa1…",
      "title": "English test",
      "status": "active"
    }
  ]
}

错误

活动 API 使用 HTTP 状态码。出错时 success 为 false,error 中包含一个供代码判断的 code,以及一条可显示或记录的 message。活动检查使用与控制台相同的提示信息。

状态码error.code含义
400invalid_body, invalid_campaign, invalid_region, category_needs_files, invalid_status, invalid_since, invalid_action, note_required请求中缺少某些内容或包含不允许的内容。message 会说明具体问题。
401missing_api_key, invalid_api_key没有 API 密钥,或密钥错误,或已被更新的密钥替换。
402insufficient_balance你的可用余额不足以支付该活动。请充值后重试。
403test_key_not_allowed, account_suspended请使用你的正式 API 密钥。被暂停的账户无法使用 API。
404not_found你的账户中没有该 ID 对应的活动或提交。
409already_reviewed, review_refused该提交已经审核过,或目前无法审核,例如已达到修改上限。
429rate_limited一分钟内请求超过 120 次。请等待 Retry-After 中给出的秒数。
500internal_error我们这边出了问题。请重试,如果问题持续出现,请联系客服。

外部资格测试

适用于在你自己网站上进行的资格测试。

上报测试结果 已上线

GET/api/worker/external_qualification/data

适用于标记为外部来源的资格测试。工作者从资格测试中打开你的测试,并在你的网站上输入他们的工作者令牌。完成后,用 approve 或 reject 调用此端点。

参数说明
qualification_id 必填你的资格测试 ID
worker_token 必填工作者在你的网站上输入的工作者令牌
api_token 必填你的 API 密钥(测试端点使用测试密钥)
decision 必填approve 或 reject

如果测试对通过者发放奖金,而你的发布者余额不足以支付,该提交会改为保存为待审核,你可以充值后在控制台中通过。

每位工作者在每个测试中只能被评估一次。测试必须处于活跃状态并标记为外部来源,且 API 密钥必须属于该测试的所有者。

curl -G "https://taskerdata.com/api/worker/external_qualification/data" \
  --data-urlencode "qualification_id=QUAL_ID" \
  --data-urlencode "worker_token=WORKER_TOKEN" \
  --data-urlencode "api_token=YOUR_API_KEY" \
  --data-urlencode "decision=approve"

响应 · 200

{
  "success": true
}

错误示例

{
  "success": false,
  "error": "This worker has already been evaluated for this qualification"
}

测试你的配置

POST/api/worker/external_qualification/data_test

用你的测试 API 密钥,以 JSON 格式向测试端点发送相同的字段。不会保存任何数据,也不会影响任何工作者,只会检查你的请求。

参数说明
qualification_id 必填你的资格测试 ID
worker_token 必填工作者在你的网站上输入的工作者令牌
api_token 必填你的 API 密钥(测试端点使用测试密钥)
decision 必填approve 或 reject

测试密钥错误会返回状态码 401;缺少字段或 decision 值错误会返回状态码 400。

curl -X POST "https://taskerdata.com/api/worker/external_qualification/data_test" \
  -H "Content-Type: application/json" \
  -d '{
    "qualification_id": "QUAL_ID",
    "worker_token": "WORKER_TOKEN",
    "api_token": "YOUR_TEST_API_KEY",
    "decision": "approve"
  }'

响应 · 200

{
  "success": true
}

错误示例

// status 401
{
  "statusCode": 401,
  "statusMessage": "Invalid API test key"
}

测试结果错误

结果端点始终返回状态码 200。请检查 success:当它为 false 时,error 会说明原因:

error含义
Missing required parameters: qualification_id, worker_token, api_token, decision四个参数中缺少了一个。
Decision must be 'approve' or 'reject'decision 的值不是这两者之一。
Invalid API tokenAPI 密钥错误,或已被更新的密钥替换。
Worker token not found for this qualification该令牌不属于这个测试。请让工作者检查一下。
API token does not belong to the qualification owner请使用创建该测试的账户的密钥。
This qualification is not configured for external submissions该测试未标记为外部来源。
This qualification is no longer active该测试已暂停或已结束。
This worker has already been evaluated for this qualification每位工作者在每个测试中只能有一个结果。
Worker account is suspended该工作者目前无法参加测试。
No remaining positions for this qualification测试的所有名额都已占满。