DocumentațieDezvoltatori

API TaskerData

Plasează campanii, colectează trimiterile lucrătorilor și verifică-le din propriul cod sau conectează un test de calificare extern. Fiecare cerere este autentificată cu cheia ta API.

Prezentare generală

API-ul pentru campanii îi permite codului tău să facă ce faci tu în panoul de solicitant: să creeze campanii, să le urmărească progresul, să descarce trimiterile cu dovezile lor și să le aprobe sau respingă. Endpointurile pentru calificări externe permit unui test de pe propriul site să-i spună TaskerData dacă fiecare lucrător a promovat.

Toate cererile merg la https://taskerdata.com prin HTTPS. Trimite și primește JSON.

Campaniile create prin API costă la fel și respectă aceleași reguli ca în panou. TaskerData le verifică înainte de publicare (solicitanții de încredere sunt publicați imediat), iar banii sunt rezervați și plătiți în același mod.

Autentificare

Deschide panoul de solicitant și mergi la API. Acolo găsești două chei:

  • Cheie API: pentru cereri reale. API-ul pentru campanii o citește din antetul Authorization. Endpointul pentru calificări o primește ca api_token.
  • Cheie API de test: doar pentru endpointul de test al calificărilor, ca să poți încerca integrarea fără să afectezi lucrători reali.

Generarea unei chei noi o înlocuiește imediat pe cea veche, așa că actualizează-ți backendul când faci asta. Poți genera până la 3 chei noi pe oră.

Important: Păstrează secretă cheia API. Folosește-o doar pe serverul tău, niciodată într-o pagină web sau aplicație pe care vizitatorii o pot deschide.

Trimite cheia API cu fiecare cerere către API-ul pentru campanii:

Authorization: Bearer YOUR_API_KEY

Poți face până la 120 de cereri către API-ul pentru campanii pe minut. Antetul X-RateLimit-Remaining arată câte au mai rămas. După aceea primești starea 429, iar antetul Retry-After spune câte secunde trebuie să aștepți.

API-ul pentru campanii

Creează campanii și gestionează munca pe care o aduc, din propriul cod.

Listează campaniile

GET/api/v1/campaigns

Campaniile tale, cele mai noi primele. total arată câte campanii se potrivesc, ca să le poți parcurge cu limit și offset.

Parametri de interogare

ParametruDescriere
status Doar campaniile cu această stare: pending, in review, active, paused, completed, terminated sau rejected
limit Câte să returneze, între 1 și 100 (implicit 20)
offset Câte să sară, pentru paginare (implicit 0)
curl "https://taskerdata.com/api/v1/campaigns?status=active&limit=20" \
  -H "Authorization: Bearer $TASKERDATA_API_KEY"

Răspuns · 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
}

Exemplu de eroare

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

Obține o campanie

GET/api/v1/campaigns/{id}

O campanie cu setările ei și câte trimiteri așteaptă verificarea, așteaptă o revizuire, sunt aprobate și respinse. Folosește-o pentru a urmări progresul unei campanii.

În adresă

ParametruDescriere
id obligatoriuID-ul campaniei (id în lista de campanii)
curl "https://taskerdata.com/api/v1/campaigns/CAMPAIGN_ID" \
  -H "Authorization: Bearer $TASKERDATA_API_KEY"

Răspuns · 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
    }
  }
}

Exemplu de eroare

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

Creează o campanie

POST/api/v1/campaigns

Plasează o campanie nouă și rezervă costul ei total din soldul disponibil, exact ca în panou. Răspunsul include id-ul campaniei, costul și starea: pending cât TaskerData o verifică sau active imediat dacă ești solicitant de încredere.

Corp JSON

ParametruDescriere
title obligatoriuTitlul campaniei, până la 100 de caractere
category obligatoriuO categorie din GET /api/v1/options. Omite-o când folosești un șablon
instructions obligatoriuCe trebuie să facă lucrătorii, până la 5.000 de caractere
url Linkul pe care îl deschid lucrătorii. Obligatoriu pentru categoriile la care needs_url este true
payment obligatoriuPlata per sarcină în USD, cel puțin 0.12
positions obligatoriuCâți lucrători, cel puțin 10. Cu un fișier de date pentru șablon, se calculează din rânduri
time_to_complete obligatoriuMinutele pe care le are un lucrător pentru a termina, între 1 și 120
time_to_rate obligatoriuZilele pe care le ai pentru a verifica fiecare trimitere, între 1 și 30. După aceea este aprobată automat
proof.text Cere un răspuns text: spune-i lucrătorului ce să scrie
proof.images Cere capturi de ecran sau fotografii: o descriere per imagine
proof.video Cere un videoclip sau o înregistrare: ce trebuie să arate
targeting.region international (implicit), usa, west-europe, east-europe, latin-america sau asia-africa
targeting.exclude_countries Numele țărilor de exclus din regiune
targeting.min_success_rate Rata minimă de succes a lucrătorului: 75 (implicit), 80, 85, 90, 95 sau 100
targeting.type, targeting.group_id Setează type la "group" și group_id la unul dintre grupurile tale de lucrători pentru a trimite sarcina doar acelui grup
qualification_id Doar lucrătorii care au promovat acest test de calificare pot lua sarcina
template Folosește unul dintre șabloanele tale în loc de instrucțiuni: id, plus data cu columns și rows care îi completează substituenții, un rând per sarcină. answers_per_row (1 până la 5) și rows_per_task (1 până la 50) sunt opționale
drip_feed Eliberează lucrătorii în loturi: min_workers și max_workers (1 până la 50) și interval_minutes (15, 30, 60, 120, 180, 360, 720 sau 1440)
location Pentru Sarcini locale pe teren și Mystery shopping: lat, lng, radius_m (50 până la 50.000) și o adresă opțională

Deocamdată, categoriile care au nevoie de fișiere încărcate de tine (precum Transcriere audio sau Etichetare de imagini), sarcinile video și imaginile exemplu pot fi create doar în panou. Ghidul Costuri și taxe explică modul de calcul al prețului.

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
    }
  }'

Răspuns · 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
  }
}

Exemplu de eroare

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

Obține trimiterile

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

Munca trimisă de lucrători pentru o campanie, cele mai vechi primele, cu dovezile lor: răspunsul text, linkuri către imagini și video, răspunsurile la șablon (answers), rândul de date la care au lucrat și, pentru sarcinile pe teren, locația lor.

În adresă

ParametruDescriere
id obligatoriuID-ul campaniei (id în lista de campanii)

Parametri de interogare

ParametruDescriere
status to_review (pending și resubmitted), pending, resubmitted, revision_requested, approved sau rejected
since Doar trimiterile trimise la sau după acest moment, de exemplu 2026-10-01T00:00:00Z
after_id Pentru paginare: doar trimiterile cu un id mai mare. Folosește next_after_id din pagina anterioară
limit Câte să returneze, între 1 și 100 (implicit 50)

Pentru a colecta regulat munca nouă, păstrează ultimul id primit și trimite-l ca after_id data viitoare. raw conține tot ce a trimis lucrătorul, în caz că ai nevoie de ceva ce nu este listat.

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

Răspuns · 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
}

Exemplu de eroare

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

Verifică o trimitere

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

Aprobă, respinge sau cere o revizuire, la fel ca butoanele din panou. Aprobarea îl plătește pe lucrător din banii rezervați. Respingerea returnează plata și comisionul ei în soldul tău și eliberează locul pentru alt lucrător.

În adresă

ParametruDescriere
id obligatoriuID-ul trimiterii

Corp JSON

ParametruDescriere
action obligatoriuapprove, reject sau revision
reason Cu reject: motivul pe care îl vede lucrătorul
note Cu revision (obligatoriu): ce trebuie să corecteze lucrătorul

Poți verifica o trimitere doar cât timp așteaptă verificarea (pending sau resubmitted). Revizuirile sunt limitate de limita de revizuiri a campaniei; după aceea poți doar să aprobi sau să respingi.

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."
  }'

Răspuns · 200

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

Exemplu de eroare

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

Verifică-ți soldul

GET/api/v1/balance

available este ce poți cheltui pe campanii noi, reserved este suma păstrată pentru campaniile active, iar spent este cât ai plătit lucrătorilor până acum.

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

Răspuns · 200

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

Opțiuni și ID-uri

GET/api/v1/options

Listează categoriile pe care le poți folosi prin API (needs_url și needs_location arată care au nevoie de un link sau de o locație), valorile permise pentru targetare și distribuire treptată și ID-urile șabloanelor, grupurilor de lucrători și testelor tale de calificare.

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

Răspuns · 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"
    }
  ]
}

Erori

API-ul pentru campanii folosește coduri de stare HTTP. Când ceva nu merge, success este false, iar error are un code de verificat în codul tău și un message de afișat sau înregistrat. Verificările campaniilor folosesc aceleași mesaje ca panoul.

Stareerror.codeCe înseamnă
400invalid_body, invalid_campaign, invalid_region, category_needs_files, invalid_status, invalid_since, invalid_action, note_requiredCeva din cerere lipsește sau nu este permis. message spune ce.
401missing_api_key, invalid_api_keyNu există cheie API sau cheia este greșită ori a fost înlocuită de una mai nouă.
402insufficient_balanceSoldul disponibil nu acoperă campania. Adaugă fonduri și încearcă din nou.
403test_key_not_allowed, account_suspendedFolosește cheia API reală. Un cont suspendat nu poate folosi API-ul.
404not_foundNu există nicio campanie sau trimitere cu acest ID în contul tău.
409already_reviewed, review_refusedTrimiterea a fost deja verificată sau verificarea nu este posibilă acum, de exemplu pentru că s-a atins limita de revizuiri.
429rate_limitedMai mult de 120 de cereri într-un minut. Așteaptă numărul de secunde din Retry-After.
500internal_errorO problemă de partea noastră. Încearcă din nou și contactează asistența dacă se repetă.

Teste de calificare externe

Pentru testele de calificare care rulează pe propriul site.

Raportează un rezultat de test Live

GET/api/worker/external_qualification/data

Pentru testele de calificare marcate ca externe. Lucrătorul îți deschide testul din calificare și introduce tokenul de lucrător pe site-ul tău. Când termină, apelează acest endpoint cu approve sau reject.

ParametruDescriere
qualification_id obligatoriuID-ul testului tău de calificare
worker_token obligatoriuTokenul de lucrător introdus de lucrător pe site-ul tău
api_token obligatoriuCheia ta API (cheia de test pentru endpointul de test)
decision obligatoriuapprove sau reject

Dacă testul plătește un bonus la promovare și soldul de solicitant nu îl acoperă, trimiterea este salvată ca în așteptare, ca să poți alimenta soldul și să o aprobi din panou.

Un lucrător poate fi evaluat o singură dată per test. Testul trebuie să fie activ și marcat ca extern, iar cheia API trebuie să aparțină proprietarului testului.

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"

Răspuns · 200

{
  "success": true
}

Exemplu de eroare

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

Testează-ți configurarea

POST/api/worker/external_qualification/data_test

Trimite aceleași câmpuri ca JSON la endpointul de test, cu cheia API de test. Nu se salvează nimic și niciun lucrător nu este afectat: doar îți verifică cererea.

ParametruDescriere
qualification_id obligatoriuID-ul testului tău de calificare
worker_token obligatoriuTokenul de lucrător introdus de lucrător pe site-ul tău
api_token obligatoriuCheia ta API (cheia de test pentru endpointul de test)
decision obligatoriuapprove sau reject

O cheie de test greșită returnează starea 401; câmpurile lipsă sau o decizie greșită returnează starea 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"
  }'

Răspuns · 200

{
  "success": true
}

Exemplu de eroare

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

Erori la rezultatele testelor

Endpointul pentru rezultate răspunde întotdeauna cu starea 200. Verifică success: când este false, error spune de ce:

errorCe înseamnă
Missing required parameters: qualification_id, worker_token, api_token, decisionLipsește unul dintre cei patru parametri.
Decision must be 'approve' or 'reject'decision are altă valoare.
Invalid API tokenCheia API este greșită sau a fost înlocuită de una mai nouă.
Worker token not found for this qualificationTokenul nu aparține acestui test. Roagă lucrătorul să-l verifice.
API token does not belong to the qualification ownerFolosește cheia contului care a creat testul.
This qualification is not configured for external submissionsTestul nu este marcat ca extern.
This qualification is no longer activeTestul este pe pauză sau s-a încheiat.
This worker has already been evaluated for this qualificationFiecare lucrător primește un singur rezultat per test.
Worker account is suspendedLucrătorul nu poate susține teste momentan.
No remaining positions for this qualificationToate locurile din test sunt ocupate.