Dokumentasi API
Buat dan pantau order dari sistem Anda sendiri. Satu kunci API untuk REST /v1 dan format DHRU Fusion.
Mulai
Akses API tersedia untuk level akun yang termasuk akses API (lihat halaman harga). Buat kunci di dashboard, menu API dan webhook. Kunci hanya ditampilkan sekali saat dibuat.
- Base URL
- https://imeiloka.com/api/v1
- Format
- JSON, UTF-8. Uang dalam rupiah bulat. Waktu ISO 8601 (UTC).
- Paginasi
- Query
pagedanpageSize(maks 100). Respons{ items, page, pageSize, total }.
Autentikasi
Kirim kunci di header Authorization: Bearer <kunci>, atau di header X-API-Key. Kunci berawalan iml_live_. Bila kunci memakai daftar IP, permintaan dari IP lain ditolak.
curl https://imeiloka.com/api/v1/account \
-H "Authorization: Bearer $IMEILOKA_API_KEY"Error dan batas
Error selalu berbentuk { "error": { "code", "message", "details"? } }. message berbahasa Indonesia dan aman ditampilkan ke pelanggan Anda. Batas: 120 permintaan per menit per kunci.
{
"error": {
"code": "INSUFFICIENT_BALANCE",
"message": "Saldo tidak cukup.",
"details": {
"required": 5000,
"balance": 1400
}
}
}Akun
Saldo dan level akun pemilik kunci.
{
"username": "tokoku",
"email": "[email protected]",
"balance": 250000,
"currency": "IDR",
"level": "Reseller",
"levelCode": "reseller"
}level berisi nama level seperti yang tampil di dashboard. Admin bisa mengganti nama itu, jadi tampilkan saja. Untuk logika di aplikasi Anda, pakai levelCode yang tidak berubah.
Daftar layanan
Layanan beserta harga untuk level Anda dan statusnya. Order ke layanan offline ditolak dengan SERVICE_OFFLINE.
curl https://imeiloka.com/api/v1/services \
-H "Authorization: Bearer $IMEILOKA_API_KEY"[
{
"id": 1,
"code": "imei-status",
"name": "Check IMEI Status",
"category": "ceir",
"price": 2600,
"status": "online",
"processingTime": "Instan"
}
]Buat order
service berisi kode atau id layanan. clientRef opsional tetapi disarankan: order kedua dengan clientRef, layanan, dan IMEI yang sama mengembalikan order pertama (HTTP 200) alih-alih membuat order baru (HTTP 201). Untuk layanan yang membutuhkan persetujuan syarat, sertakan acceptTerms: true. Order lewat API selalu memotong saldo; bayar langsung per order hanya tersedia di web.
Order Add Roamer lewat API berarti menyetujui syarat layanan
curl -X POST https://imeiloka.com/api/v1/orders \
-H "Authorization: Bearer $IMEILOKA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"service":"imei-status","imei":"356938035643809","clientRef":"INV-1001"}'{
"id": 123,
"code": "IML-STS-000123",
"service": "imei-status",
"imei": "356938035643809",
"price": 2600,
"status": "pending",
"resultCode": null,
"resultText": null,
"failureReason": null,
"refunded": false,
"clientRef": "INV-1001",
"createdAt": "2026-10-17T13:05:12.000Z",
"completedAt": null
}Order banyak IMEI
Maksimal 500 IMEI per permintaan (batas layanan bisa lebih kecil). IMEI dinormalisasi dan dicek Luhn; duplikat dibuang. IMEI yang tidak valid masuk rejected dan tidak ditagih, sisanya tetap diproses.
curl -X POST https://imeiloka.com/api/v1/orders/bulk \
-H "Authorization: Bearer $IMEILOKA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"service":"device-history","imeis":["356938035643809","864123051234560","12345"]}'{
"orders": [ /* objek order seperti di atas, satu per IMEI valid */ ],
"rejected": [ { "value": "12345", "reason": "harus 15 digit" } ]
}Detail order
Ambil satu order dengan id angka atau kode order (IML-…). Untuk menunggu hasil, gunakan webhook; bila harus polling, beri jeda minimal beberapa detik.
curl https://imeiloka.com/api/v1/orders/IML-STS-000123 \
-H "Authorization: Bearer $IMEILOKA_API_KEY"{
"id": 123,
"code": "IML-STS-000123",
"service": "imei-status",
"imei": "356938035643809",
"price": 2600,
"status": "success",
"resultCode": "REGISTERED",
"resultText": "…teks hasil dari sumber, apa adanya…",
"failureReason": null,
"refunded": false,
"clientRef": "INV-1001",
"createdAt": "2026-10-17T13:05:12.000Z",
"completedAt": "2026-10-17T13:05:19.000Z"
}Daftar order
Filter opsional: serviceCode, category (ceir atau unlock), status, dan q untuk mencari kode order atau IMEI.
curl "https://imeiloka.com/api/v1/orders?status=success&page=1&pageSize=50" \
-H "Authorization: Bearer $IMEILOKA_API_KEY"Status dan hasil
resultCode adalah tafsiran hasil yang sudah dibakukan. Teks asli dari sumber tetap ada di resultText.
Webhook
Atur URL webhook di dashboard. Saat order selesai (success atau failed), imeiloka mengirim POST berisi JSON ke URL tersebut. Bila server Anda tidak membalas 2xx, pengiriman diulang hingga 6 kali dengan jeda yang makin panjang.
- X-Imeiloka-Event
order.completed- X-Imeiloka-Timestamp
- Waktu kirim, detik Unix.
- X-Imeiloka-Signature
sha256=<hex>, yaitu HMAC-SHA256 dengan webhook secret atas teks${timestamp}.${rawBody}.
{
"event": "order.completed",
"sentAt": "2026-10-17T13:05:20.000Z",
"order": {
"id": 123,
"code": "IML-STS-000123",
"service": "imei-status",
"imei": "356938035643809",
"price": 2600,
"status": "success",
"resultCode": "REGISTERED",
"resultText": "…teks hasil dari sumber, apa adanya…",
"failureReason": null,
"refunded": false,
"clientRef": "INV-1001",
"createdAt": "2026-10-17T13:05:12.000Z",
"completedAt": "2026-10-17T13:05:19.000Z"
}
}import crypto from 'node:crypto';
import express from 'express';
const app = express();
const SECRET = process.env.IMEILOKA_WEBHOOK_SECRET;
// Body harus dibaca mentah: tanda tangan dihitung dari byte yang persis dikirim.
app.post('/webhooks/imeiloka', express.raw({ type: 'application/json' }), (req, res) => {
const timestamp = req.get('X-Imeiloka-Timestamp') ?? '';
const signature = req.get('X-Imeiloka-Signature') ?? '';
const rawBody = req.body.toString('utf8');
// Tolak kiriman yang terlalu lama (lebih dari 5 menit) supaya tidak bisa diputar ulang.
const age = Math.abs(Date.now() / 1000 - Number(timestamp));
if (!Number.isFinite(age) || age > 300) return res.status(400).end();
const expected =
'sha256=' + crypto.createHmac('sha256', SECRET).update(`${timestamp}.${rawBody}`).digest('hex');
const a = Buffer.from(signature);
const b = Buffer.from(expected);
if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) return res.status(401).end();
const payload = JSON.parse(rawBody);
if (payload.event === 'order.completed') {
// Simpan payload.order.status, resultCode, resultText. Bisa terkirim lebih dari sekali:
// perlakukan berdasarkan payload.order.code supaya idempoten.
}
res.status(204).end();
});
app.listen(3000);DHRU Fusion
Untuk panel reseller yang sudah memakai format DHRU Fusion, sambungkan imeiloka sebagai sumber layanan IMEI. Kunci API yang sama juga berlaku untuk REST /v1.
- URL di panel
- https://imeiloka.comPanel DHRU biasanya menambahkan
/api/index.phpsendiri. - Endpoint
- POST https://imeiloka.com/api/index.php
POST https://imeiloka.com/apijuga dilayani. Pakai salah satunya bila panel meminta URL lengkap. - Username
- Username akun imeiloka Anda.
- API access key
- Kunci API lengkap dari dashboard, menu API dan webhook.
- Body
multipart/form-data,application/x-www-form-urlencoded, atau JSON, berisiusername,apiaccesskey,action,requestformat(JSON), danparameters.- parameters
- XML
<PARAMETERS>…</PARAMETERS>, base64 dari JSON, atau objek JSON. Nama key tidak peka huruf besar-kecil. Key yang tidak dikenal diabaikan.
Action
STATUS pada getimeiorder
Respons
Selalu HTTP 200 dengan Content-Type: application/json. Berhasil berisi SUCCESS, gagal berisi ERROR, keduanya berupa array, ditambah apiversion.
curl -X POST https://imeiloka.com/api/index.php \
-F username=USERNAME_ANDA \
-F apiaccesskey=KUNCI_API_ANDA \
-F requestformat=JSON \
-F action=placeimeiorder \
--form-string 'parameters=<PARAMETERS><ID>ID_LAYANAN</ID><IMEI>356938035643809</IMEI></PARAMETERS>'{"SUCCESS":[{"MESSAGE":"Order received","REFERENCEID":"…"}],"apiversion":"6.1"}{"ERROR":[{"MESSAGE":"Not enough credits"}],"apiversion":"6.1"}Order ganda dan batas permintaan
REFERENCEID yang sama tanpa memotong saldo lagi. imeiservicelist dibatasi sekali per menit per kunci, action lain 60 kali per menit per kunci.