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.
| Status | Arti |
|---|---|
| received | Diterima, kredit terpakai, antre untuk diproses. |
| parsed | Teks resume/kandidat sudah diproses. |
| scored | Skor AI sudah ada, menunggu peninjau manusia. |
| pending_review | Berada di antrean peninjau (kedaluwarsa setelah 72 jam jika tak disentuh). |
| approved / rejected / edited | Peninjau manusia sudah memutuskan. Setiap keputusan tetap dikirim. |
| delivered | Pengiriman webhook berhasil. |
| failed | Gagal permanen (mis. AI tak menghasilkan output yang bisa dipakai). Kredit dikembalikan. |
| expired | Terlalu 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": "…" } }| unauthorized | 401 |
| forbidden | 403 |
| payment_required | 402 |
| not_found | 404 |
| invalid_request | 400 |
| internal | 500 |
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.