Langsung ke konten utama

API Screening

Kirim kandidat beserta spesifikasi pekerjaan, dapatkan skor AI, dan terima hasil yang sudah ditinjau manusia di webhook Anda. Setiap skor disetujui, ditolak, atau diedit oleh peninjau manusia sebelum dikirim — API tidak pernah mengirim output model mentah begitu saja.

Mulai cepat

Kirim satu kandidat dengan satu permintaan. Kredit langsung terpakai dan permintaan langsung diantre; skoring dan peninjauan berjalan secara asinkron.

curl -X POST "https://lokerdollar.com/api/screening/v1/screen" \
  -H "Authorization: Bearer lk_live_…" \
  -H "Content-Type: application/json" \
  -d '{"idempotencyKey":"req-backend-eng-jane-2026-08-03","candidate":{"kind":"structured","fullName":"Jane Doe","email":"jane.doe@example.com","summary":"5 years backend engineering focused on Node.js and PostgreSQL; led a 4-person team at a Series A logistics startup.","skills":["Node.js","PostgreSQL","TypeScript","AWS"],"experienceYears":5},"jobSpec":{"title":"Senior Backend Engineer","mustHaves":["Node.js","PostgreSQL","3+ years backend experience"],"niceToHaves":["AWS","Prior team-lead experience"],"salaryBandMinIdr":25000000,"salaryBandMaxIdr":40000000,"description":"Own the payments service for a Series B fintech."}}'

Autentikasi

Kirim kunci API employer sebagai bearer token di setiap permintaan. Satu kunci hanya terhubung ke satu tenant, jadi permintaan untuk data tenant lain akan selalu gagal, apa pun ID di URL-nya.

Authorization: Bearer lk_live_…

Status permintaan

Setiap permintaan screening berakhir pada tepat satu status terminal: delivered, failed, atau expired. Tidak ada yang menggantung tanpa batas.

StatusArti
receivedDiterima, kredit terpakai, antre untuk diproses.
parsedTeks resume/kandidat sudah diproses.
scoredSkor AI sudah ada, menunggu peninjau manusia.
pending_reviewBerada di antrean peninjau (kedaluwarsa setelah 72 jam jika tak disentuh).
approved / rejected / editedPeninjau manusia sudah memutuskan. Setiap keputusan tetap dikirim.
deliveredPengiriman webhook berhasil.
failedGagal permanen (mis. AI tak menghasilkan output yang bisa dipakai). Kredit dikembalikan.
expiredTerlalu lama di pending_review tanpa keputusan (>72 jam). Kredit dikembalikan.

Endpoint

POST /api/screening/v1/screen

Kirim kandidat. Body: idempotencyKey, candidate (referensi resume atau field terstruktur), jobSpec (title, mustHaves, niceToHaves, rentang gaji, description). Mengembalikan 201 dengan id dan status permintaan baru, atau 200 dengan id yang sama jika idempotencyKey sudah pernah diterima.

{
  "requestId": "scr_7c1e0a9b4f2d4c8e",
  "state": "received"
}

402 saat batas bulanan tier gratis atau saldo kredit berbayar habis. Body selalu membawa error.upsell.upgradeUrl, tidak pernah diam-diam dikurangi kualitasnya.

GET /api/screening/v1/usage

Saldo kredit Anda saat ini, sehingga bisa dicek sebelum mengirim, bukan setelah permintaan gagal.

{
  "tenantId": "biz_9f3a2c",
  "planTier": "free",
  "creditsRemaining": 37,
  "creditsCap": 50,
  "usagePercent": 0.26,
  "nearLimit": false,
  "resetAt": "2026-09-01T00:00:00.000Z",
  "freeScreenCap": 50
}

GET /api/screening/v1/audit

Ekspor berpaginasi dari setiap perubahan status milik tenant Anda: audit ledger. Query: since (ISO-8601), cursor (dari nextCursor halaman sebelumnya), limit (1–500, default 100). Append-only, jadi tidak ada yang pernah diubah atau dihapus.

{
  "events": [
    {
      "id": "scrv_a1b2c3d4",
      "requestId": "scr_7c1e0a9b4f2d4c8e",
      "fromState": "pending_review",
      "toState": "approved",
      "actor": "reviewer:412",
      "payload": null,
      "createdAt": "2026-08-03T09:14:10.000Z"
    }
  ],
  "nextCursor": null
}

Bentuk hasil skor

Bentuk screening yang sudah selesai: skor 0–100, rincian per dimensi dengan kutipan bukti, rationale singkat, provenance model (modelId/promptVersion), dan keputusan peninjau setelah ada.

{
  "schemaVersion": 1,
  "score": 78,
  "dimensions": [
    {
      "name": "must-haves",
      "score": 85,
      "evidence": "5 years backend engineering focused on Node.js and PostgreSQL"
    },
    {
      "name": "seniority fit",
      "score": 70,
      "evidence": "led a 4-person team at a Series A logistics startup"
    }
  ],
  "rationale": "Meets every must-have and has one prior lead role; salary expectations were not provided so band fit is unconfirmed.",
  "confidence": 0.82,
  "modelId": "@cf/google/gemma-4-26b-a4b-it",
  "promptVersion": "screening-scorer-v1"
}

Setelah ditinjau, permintaan yang sama juga membawa keputusan peninjau:

{
  "schemaVersion": 1,
  "decision": "approved",
  "reviewerId": "reviewer_412",
  "reviewerRole": "recruiter",
  "latencyMs": 46000,
  "note": "Strong must-have coverage, forward to the hiring manager."
}

Webhook pengiriman

Setelah skor atau keputusan peninjau tersedia, kami POST ke webhookUrl Anda dan menandatangani body mentah dengan HMAC-SHA256 memakai webhookSecret Anda. Verifikasi X-Screening-Signature sebelum memercayai payload.

X-Screening-Signature: sha256=<hex>
X-Screening-Event: screening.review_decided
X-Screening-Request-Id: scr_7c1e0a9b4f2d4c8e
{
  "requestId": "scr_7c1e0a9b4f2d4c8e",
  "tenantId": "biz_9f3a2c",
  "event": "screening.review_decided",
  "result": {
    "schemaVersion": 1,
    "decision": "approved",
    "reviewerId": "reviewer_412",
    "reviewerRole": "recruiter",
    "latencyMs": 46000,
    "note": "Strong must-have coverage, forward to the hiring manager."
  },
  "deliveredAt": "2026-08-03T09:14:22.000Z"
}

Respons non-2xx atau timeout akan dicoba ulang dengan backoff; setiap percobaan pengiriman juga tercatat di audit ledger, sehingga endpoint yang bermasalah tetap terlihat lewat GET /audit sebelum Anda memperbaikinya.

Error

Setiap error mengembalikan envelope yang sama dengan code stabil, kontrak yang sama dengan API lowongan:

{ "error": { "code": "payment_required", "message": "…" } }
unauthorized401
forbidden403
payment_required402
not_found404
invalid_request400
internal500

Halaman ini dan spesifikasi OpenAPI dibuat dari kontrak request/response yang sama dengan yang divalidasi server di setiap panggilan — perubahan bentuk API memperbarui keduanya tanpa penulisan ulang terpisah.

Dengan menggunakan API, Anda menyetujui Ketentuan Layanan API.