Lewati ke konten

Dokumentasi API

Buat dan pantau order dari sistem Anda sendiri. Satu kunci API untuk REST /v1 dan format DHRU Fusion.

REST + JSONWebhook HMAC-SHA256DHRU 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 page dan pageSize (maks 100). Respons { items, page, pageSize, total }.
Base URL yang berlaku untuk akun Anda juga tertera di dashboard, menu API dan webhook.

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.

Uji kunci
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.

KodeHTTPKapan
INVALID_API_KEY401Kunci tidak ada, salah, atau sudah dicabut.
API_ACCESS_DISABLED403Level akun belum termasuk akses API.
IP_NOT_ALLOWED403IP pemanggil tidak ada di daftar IP kunci ini.
VALIDATION_FAILED400Body atau query tidak sesuai. details berisi daftar { path, message }.
INVALID_IMEI400Tidak ada satu pun IMEI yang lolos validasi.
TOO_MANY_IMEI400Jumlah IMEI melebihi batas layanan.
TERMS_REQUIRED400Layanan butuh persetujuan syarat: kirim acceptTerms: true.
INSUFFICIENT_BALANCE402Saldo kurang. details berisi { required, balance }.
SERVICE_NOT_FOUND404Kode atau id layanan tidak dikenal.
SERVICE_OFFLINE409Layanan sedang offline. Tidak ada saldo yang terpotong.
DUPLICATE_CLIENT_REF409clientRef sudah dipakai untuk layanan atau IMEI lain.
NOT_FOUND404Order tidak ditemukan di akun Anda.
RATE_LIMITED429Lebih dari 120 permintaan per menit untuk satu kunci.
Contoh error
{
  "error": {
    "code": "INSUFFICIENT_BALANCE",
    "message": "Saldo tidak cukup.",
    "details": {
      "required": 5000,
      "balance": 1400
    }
  }
}

Akun

GET/v1/account

Saldo dan level akun pemilik kunci.

Contoh respons
{
  "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

GET/v1/services

Layanan beserta harga untuk level Anda dan statusnya. Order ke layanan offline ditolak dengan SERVICE_OFFLINE.

Permintaan
curl https://imeiloka.com/api/v1/services \
  -H "Authorization: Bearer $IMEILOKA_API_KEY"
Contoh respons
[
  {
    "id": 1,
    "code": "imei-status",
    "name": "Check IMEI Status",
    "category": "ceir",
    "price": 2600,
    "status": "online",
    "processingTime": "Instan"
  }
]

Buat order

POST/v1/orders

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

Setiap order Add Roamer yang dikirim lewat REST /v1 atau format DHRU Fusion dianggap menyetujui syarat layanan, termasuk ketentuan Add Roamer dan garansi proses ulang. Sampaikan ketentuan itu kepada pelanggan Anda.
Permintaan
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"}'
Contoh respons
{
  "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

POST/v1/orders/bulk

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.

Permintaan
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"]}'
Bentuk respons
{
  "orders": [ /* objek order seperti di atas, satu per IMEI valid */ ],
  "rejected": [ { "value": "12345", "reason": "harus 15 digit" } ]
}

Detail order

GET/v1/orders/:idOrCode

Ambil satu order dengan id angka atau kode order (IML-…). Untuk menunggu hasil, gunakan webhook; bila harus polling, beri jeda minimal beberapa detik.

Permintaan
curl https://imeiloka.com/api/v1/orders/IML-STS-000123 \
  -H "Authorization: Bearer $IMEILOKA_API_KEY"
Contoh respons
{
  "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

GET/v1/orders

Filter opsional: serviceCode, category (ceir atau unlock), status, dan q untuk mencari kode order atau IMEI.

Permintaan
curl "https://imeiloka.com/api/v1/orders?status=success&page=1&pageSize=50" \
  -H "Authorization: Bearer $IMEILOKA_API_KEY"

Status dan hasil

statusArti
pendingMenungguOrder dibuat dan saldo sudah dipotong, menunggu dikirim ke pemroses.
processingDiprosesSedang diproses.
successBerhasilSelesai. resultCode dan resultText terisi.
failedGagalGagal. failureReason terisi. Saldo selalu dikembalikan otomatis; refunded true setelah tercatat.
cancelledDibatalkanDibatalkan admin. Saldo selalu dikembalikan.

resultCode adalah tafsiran hasil yang sudah dibakukan. Teks asli dari sumber tetap ada di resultText.

resultCodeArti
REGISTEREDIMEI terdaftar resmi di database CEIR. Ini status paling aman.
ROAMERIMEI dalam mode turis (roamer) dengan masa aktif terbatas, biasanya 1 sampai 3 bulan tergantung cara pendaftarannya.
UNKNOWNIMEI tidak terdaftar di database CEIR. Perangkat berisiko tidak mendapat sinyal operator Indonesia.
HISTORY_EMPTYTidak ada riwayat di CEIR. Artinya bisa dua hal: perangkat tidak terdaftar, atau terdaftar resmi lewat Bea Cukai.
HISTORY_IMSIPerangkat tercatat sebagai produk resmi pasar Indonesia (terdaftar lewat Kemenperin).
HISTORY_ROAMERPerangkat sedang atau pernah berada dalam mode turis. Status ini sejalan dengan hasil Roamer.
ROAMER_ADDEDIMEI sudah didaftarkan sebagai roamer. Sinyal biasanya muncul setelah perangkat dinyalakan ulang.
OTHERHasil dari sumber tidak dikenali otomatis. Baca teks hasil lengkapnya.

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}.
Body
{
  "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"
  }
}
Verifikasi tanda tangan (Node.js + Express)
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

Order Add Roamer lewat DHRU Fusion juga berarti menyetujui syarat layanan, sama seperti lewat REST /v1. Panel DHRU tidak punya kolom persetujuan, jadi persetujuan dianggap diberikan saat order dikirim.

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.php sendiri.
Endpoint
POST https://imeiloka.com/api/index.phpPOST https://imeiloka.com/api juga 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, berisi username, apiaccesskey, action, requestformat (JSON), dan parameters.
parameters
XML <PARAMETERS>…</PARAMETERS>, base64 dari JSON, atau objek JSON. Nama key tidak peka huruf besar-kecil. Key yang tidak dikenal diabaikan.

Action

actionparametersHasil
accountinfo-Saldo (credit, creditraw), email akun, dan currency IDR. Key AccoutInfo sengaja mengikuti ejaan DHRU agar panel bisa membacanya.
imeiservicelist-Layanan dalam grup CEIR Check dan Unlock IMEI. CREDIT adalah harga untuk level akun Anda. Layanan yang sedang offline tidak dicantumkan.
placeimeiorderID, IMEIREFERENCEID order. IMEI wajib 15 digit dengan digit cek yang benar. Saldo kurang dibalas Not enough credits.
getimeiorderID (= REFERENCEID)STATUS, CODE, IMEI, dan COMMENTS. Order yang tidak ada dibalas NoResultFound.
placeimeiorderbulkBanyak item, base64(JSON)Tiap item diproses sendiri-sendiri. Respons memakai key yang sama dengan permintaan. Maksimal 100 item.
getimeiorderbulkBanyak ID, base64(JSON)Status tiap order, dengan key yang sama dengan permintaan. Maksimal 100 item.

STATUS pada getimeiorder

STATUSArti
0Order diterima, menunggu diproses.
1Sedang diproses.
3Gagal atau dibatalkan. CODE berisi alasannya. Saldo dikembalikan.
4Selesai. CODE berisi teks hasil.

Respons

Selalu HTTP 200 dengan Content-Type: application/json. Berhasil berisi SUCCESS, gagal berisi ERROR, keduanya berupa array, ditambah apiversion.

Contoh permintaan (placeimeiorder)
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>'
Berhasil
{"SUCCESS":[{"MESSAGE":"Order received","REFERENCEID":"…"}],"apiversion":"6.1"}
Gagal
{"ERROR":[{"MESSAGE":"Not enough credits"}],"apiversion":"6.1"}

Order ganda dan batas permintaan

Order untuk layanan dan IMEI yang sama, yang masih menunggu atau diproses dan dibuat dalam 10 menit terakhir, mengembalikan REFERENCEID yang sama tanpa memotong saldo lagi. imeiservicelist dibatasi sekali per menit per kunci, action lain 60 kali per menit per kunci.