Dokumentasi

API Requester

Buat campaign, tarik hasil, dan terima notifikasi otomatis secara programatik. Cocok untuk otomasi, integrasi pipeline data, atau tool internal.

Kelola API key & webhook di dashboard

Autentikasi

Setiap request wajib menyertakan API key kamu di header Authorization. Buat key di dashboard — key hanya ditampilkan sekali. Perlakukan seperti password.

http
Authorization: Bearer flvt_ab12cd34ef56_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Konvensi

Endpoint

POST/api/v1/campaigns
Buat campaign (escrow dikunci dari saldomu)

Wajib: title, category, currency, reward, positions. Opsional: instruction, estMinutes, proofType, items[] (dataset), consensusCount (1–5), dll.

bash
curl -X POST https://flavetask.com/api/v1/campaigns \
  -H "Authorization: Bearer $FLAVETASK_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Label 100 foto produk",
    "category": "IMAGE_TAG",
    "currency": "IDR",
    "reward": "1000",
    "positions": 100,
    "instruction": "Pilih kategori yang paling cocok untuk tiap foto.",
    "estMinutes": 2
  }'
json
{
  "campaign": {
    "id": "cmr1gv...",
    "title": "Label 100 foto produk",
    "currency": "IDR",
    "rewardPerPosition": "1000",
    "feePerPosition": "100",
    "positions": 100,
    "taken": 0,
    "approvedCount": 0,
    "totalCost": "110000",
    "status": "ACTIVE",
    "hasDataset": false,
    "createdAt": "2026-07-03T..."
  }
}
POST/api/v1/campaigns (dataset + konsensus)
Campaign per-item dengan honeypot & konsensus

Kirim items[] agar tiap worker dapat 1 item unik. isGold + goldAnswer = item kontrol (auto-cek). consensusCount = jumlah worker per item; positions dihitung otomatis (item × konsensus).

json
{
  "title": "Sentimen 3 ulasan",
  "category": "AI_TRAIN",
  "currency": "IDR",
  "reward": "500",
  "positions": 1,
  "consensusCount": 3,
  "items": [
    { "payload": "Barang bagus, cepat sampai" },
    { "payload": "Kecewa, tidak sesuai" },
    { "payload": "Apa ibukota Indonesia?", "isGold": true, "goldAnswer": "Jakarta" }
  ]
}
GET/api/v1/campaigns
Daftar semua campaign milikmu
bash
curl https://flavetask.com/api/v1/campaigns -H "Authorization: Bearer $FLAVETASK_KEY"
GET/api/v1/campaigns/:id
Detail + progres campaign

Termasuk description, instruction, taken, approvedCount, status.

GET/api/v1/campaigns/:id/results
Tarik hasil (submission yang disetujui)
json
{
  "count": 2,
  "results": [
    { "worker": "Budi", "country": "ID", "item": 4,
      "fileUrl": null, "submittedAt": "2026-07-03T...",
      "answers": { "jawaban": "positif" } }
  ]
}
GET/api/v1/campaigns/:id/items
Jawaban final per item (dataset + konsensus)

Hanya untuk campaign dataset. finalAnswer = majority vote; agreement 0–1; disputed = perlu ditinjau.

json
{
  "consensusCount": 3, "total": 3, "resolved": 3, "disputed": 0,
  "items": [
    { "item": 1, "payload": "Barang bagus...", "control": false,
      "status": "RESOLVED", "answers": 3,
      "finalAnswer": "positif", "agreement": 1, "disputed": false }
  ]
}
POST/api/v1/campaigns/:id/close
Tutup campaign & refund slot belum-selesai

Escrow untuk posisi yang belum disetujui dikembalikan ke saldomu.

Webhook

Set URL webhook di dashboard. Saat campaign selesai (semua posisi disetujui atau ditutup), kami kirim POST ber-signature. Verifikasi header x-flavetask-signature dengan HMAC-SHA256 dari raw body memakai signing secret-mu.

json
POST <your-webhook-url>
x-flavetask-event: campaign.completed
x-flavetask-signature: sha256=<hex>

{
  "event": "campaign.completed",
  "sentAt": "2026-07-03T...",
  "data": {
    "campaignId": "cmr1gv...", "title": "Label 100 foto produk",
    "positions": 100, "approved": 100, "currency": "IDR",
    "rewardPerPosition": "1000", "completedAt": "2026-07-03T...",
    "resultsUrl": "/api/v1/campaigns/cmr1gv.../results"
  }
}

Contoh verifikasi (Node.js / Express):

javascript
import crypto from "crypto";

app.post("/webhooks/flavetask",
  express.raw({ type: "application/json" }), (req, res) => {
    const sig = req.get("x-flavetask-signature") || "";
    const expected = "sha256=" + crypto
      .createHmac("sha256", process.env.FLAVETASK_WEBHOOK_SECRET)
      .update(req.body)          // raw body (Buffer), bukan yang sudah di-parse
      .digest("hex");
    const ok = sig.length === expected.length &&
      crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
    if (!ok) return res.sendStatus(401);
    const event = JSON.parse(req.body.toString());
    // ... proses event.data ...
    res.sendStatus(200);
  });

Kode Error

StatusArti
401API key tak ada / salah / dicabut
403Bukan requester, atau fitur dinonaktifkan admin
404Campaign tak ditemukan / bukan milikmu
413Body terlalu besar (maks 8 MB)
422Validasi gagal (cek pesan error)
503Platform sedang pemeliharaan

Body error: { "error": "pesan" }

Batas

Butuh bantuan integrasi? Hubungi support platform.