Loading
Kembali ke Dokumentasi

🏪 Mirel Tower — Otak AI untuk Bisnis Anda

> Mirel Tower adalah platform API Services yang menyediakan kecerdasan buatan (AI) untuk aplikasi kasir, ERP, dan sistem bisnis Anda. Terpisah dari Mirel ERP & POS — bisa dipasang ke sistem apapun.

Base URL API: https://mirel.my.id/api

SDK GitHub: github.com/phyranyansen/Mirel-API-Services

Instalasi Composer: composer require mirel/tower-sdk

SDK Download: MirelTowerClient.php · mirel-tower-client.js


📋 Daftar Isi

  1. 🏪 Pengenalan Solusi Mirel
  2. 🤖 Layanan API Services — Katalog Fitur AI
  3. 🚀 Panduan Integrasi Cepat — 3 Langkah Instan

🏪 Pengenalan Solusi Mirel

Mirel adalah ekosistem aplikasi bisnis pintar yang menggabungkan kasir modern, manajemen stok, akuntansi otomatis, dan kecerdasan buatan (AI) dalam satu platform terpadu.

Aplikasi Unggulan

| Produk | Fungsi |

| Mirel ERP & POS | Aplikasi kasir + manajemen toko lengkap dengan AI |

| Mirel Tower | API Services AI — otak AI yang bisa dipasang ke aplikasi manapun |

> Butuh aplikasi kasir lengkap? Lihat Mirel ERP & POS — sistem kasir pintar dengan modul pembelian, penjualan, stok, akuntansi, dan laporan keuangan siap pakai.

Yang Membedakan Mirel


🤖 Layanan API Services — Katalog Fitur AI

Mirel Tower menyediakan 18+ layanan AI yang bisa langsung dipanggil via REST API. Pilih sesuai kebutuhan bisnis Anda:

🌟 Untuk Semua Paket (Standard)

| Fitur AI | Fungsi |

| 🔍 Scan Faktur (OCR) | Membaca faktur & struk dari foto → JSON otomatis |

| 📦 Inisialisasi Bisnis | Setel data bisnis & produk baru sekali klik |

| 💬 AI Assistant | Tanya jawab seputar fitur Mirel (GRATIS, tanpa potong token) |

| 📊 Cek Saldo Token | Lihat sisa token AI kapan saja |

| 💰 Top-Up Token | Isi ulang token untuk pemakaian AI |

⚡ Untuk Paket Pro

| Fitur AI | Fungsi |

| 📒 Jurnal Akuntansi Otomatis | Buat jurnal dari transaksi harian — siap tutup buku |

| 🏦 Rekonsiliasi Bank | Cocokkan mutasi bank dengan invoice otomatis |

| 🔗 Pencocokan Transaksi | Temukan pasangan transaksi pembayaran & tagihan |

| 🗺️ Mapping COA | Petakan Chart of Accounts secara otomatis |

| 🚨 Deteksi Anomali Kasir | Temukan transaksi mencurigakan — cegah kecurangan |

| 🧮 Hitung Pajak | Hitung PPN & PPh otomatis dari transaksi |

| 💬 Query Data (NL) | Tanya data bisnis pakai bahasa sehari-hari (natural language) |

🚀 Untuk Paket Enterprise

| Fitur AI | Fungsi |

| 📈 Prediksi Permintaan Stok | Forecast kebutuhan stok 6 bulan ke depan |

| 📋 Wawasan Keuangan | Analisis profit, tren, dan kesehatan finansial |

| 📄 OCR / Parse Dokumen | Baca dokumen AP, AR, kontrak — jadi data terstruktur |

| 💵 Proyeksi Arus Kas | Simulasi arus kas toko untuk pengambilan keputusan |

| 😊 Analisis Sentimen | Ukur kepuasan pelanggan dari ulasan & feedback |

| 🛒 Rekomendasi Pembelian Cerdas | Saran pembelian stok berdasarkan data historis & tren |

> 💡 Tip: Baru mau coba? Semua fitur di atas bisa kamu tes di Mode Sandbox — GRATIS 100%, data simulasi, tanpa potong token. Lanjut ke Panduan Integrasi di bawah!


🚀 Panduan Integrasi Cepat — 3 Langkah Instan

> SDK kini tersedia via Composer dari GitHub — install, autoload, dan panggil.


Langkah 1: Install SDK

🔹 PHP — Via Composer (Rekomendasi)

`bash

composer require mirel/tower-sdk


Atau clone langsung dari GitHub:

```bash
git clone https://github.com/phyranyansen/Mirel-API-Services.git

Lalu di composer.json:

`json

{

"autoload": {

"psr-4": {

"Mirel\\TowerSdk\\": "path/to/Mirel-API-Services/src/"

}

}

}


Jalankan: `composer dump-autoload`

**🔹 PHP — Single File (Tanpa Composer)**

Download [`MirelTowerClient.php`](https://mirel.my.id/sdk/MirelTowerClient.php) langsung:

```php
<?php
require_once 'path/to/MirelTowerClient.php';

🔹 JavaScript / Node.js

Download mirel-tower-client.js:

`javascript

// Node.js — ES Module

import { MirelTowerClient } from "./mirel-tower-client.js";

// atau CommonJS

const { MirelTowerClient } = require("./mirel-tower-client.js");


```html
<!-- Browser — tinggal pake script tag -->
<script src="path/to/mirel-tower-client.js"></script>

Langkah 2: Inisialisasi & Pilih Mode

🔧 Mode Sandbox = Gratis 100% — semua response data simulasi, tidak memotong saldo. Cocok buat testing.

`php

<?php

require_once 'vendor/autoload.php'; // Composer autoload

use Mirel\TowerSdk\MirelTowerClient;

$client = new MirelTowerClient(

licenseKey: 'YOUR_LICENSE_KEY', // Bisa diisi apa saja untuk sandbox

apiKey: 'mirel_sandbox_dev_key', // ← "Saklar" Sandbox: awali dengan mirel_sandbox_

isSandbox: true

);

// Test koneksi

$usage = $client->validateAiUsage();

echo "Status: " . ($usage['mode'] ?? 'sandbox') . " — Siap!";


```javascript
const client = new MirelTowerClient({
  licenseKey: &quot;YOUR_LICENSE_KEY&quot;,
  apiKey: &quot;mirel_sandbox_dev_key&quot;, // ← Mode sandbox
  isSandbox: true,
});

const usage = await client.validateAiUsage();
console.log(&quot;Status:&quot;, usage.mode, &quot;— Siap!&quot;);

🚀 Mode Production — Ganti API Key jadi mirel_live_* untuk AI beneran.

`php

$client = new MirelTowerClient(

licenseKey: 'LICENSE_KEY_ASLI',

apiKey: 'mirel_live_kunci_produksi_xyz', // ← Production

isSandbox: false

);


&gt; **💡 Response `&quot;mode&quot;: &quot;sandbox&quot;`** menandakan koneksi berhasil! Lanjut ke Langkah 3.

---

### Langkah 3: Panggil Fitur AI

Setelah terhubung, panggil method SDK sesuai kebutuhan. Ini 3 fitur andalan:

#### 🔍 Scan Faktur (OCR) — `analyzeFaktur()`

Otomatis baca faktur dari foto — output JSON siap pakai.

```php
&lt;?php
$result = $client-&gt;analyzeFaktur(&#039;/path/to/invoice.jpg&#039;);

print_r($result[&#039;data&#039;]);
// {
//   &quot;no_faktur&quot;: &quot;INV-20260710-001&quot;,
//   &quot;nama_supplier_mentah&quot;: &quot;UD Sumber Makmur&quot;,
//   &quot;total_nominal&quot;: 1575000,
//   &quot;items&quot;: [
//     { &quot;nama_barang_mentah&quot;: &quot;Beras Ramos 5kg&quot;, &quot;qty&quot;: 10 },
//     { &quot;nama_barang_mentah&quot;: &quot;Minyak Goreng 2L&quot;, &quot;qty&quot;: 24 }
//   ]
// }

`javascript

// Browser: upload dari <input type="file">

const file = document.getElementById("invoiceUpload").files[0];

const result = await client.analyzeFaktur(file);

// Node.js: kirim path file

const result = await client.analyzeFaktur("/path/to/invoice.jpg");


#### 🚨 Deteksi Anomali Kasir — `detectAnomaly()`

Cegah kecurangan dengan AI yang mendeteksi transaksi mencurigakan.

```php
&lt;?php
$result = $client-&gt;detectAnomaly([
    &#039;transactions&#039; =&gt; [...],
    &#039;reference_period&#039; =&gt; &#039;2026-06-01 to 2026-06-30&#039;
]);

echo &quot;Anomali: &quot; . $result[&#039;data&#039;][&#039;anomalies_found&#039;];

`javascript

const result = await client.detectAnomaly({

transactions: [...],

reference_period: "2026-06-01 to 2026-06-30",

});

console.log("Skor risiko:", result.data.risk_score);


#### 💵 Proyeksi Arus Kas Toko — `cashflowForecast()`

Prediksi arus kas &amp; stok 6 bulan ke depan.

```php
&lt;?php
$result = $client-&gt;cashflowForecast([
    &#039;product_id&#039; =&gt; &#039;PROD-001&#039;,
    &#039;sales_history&#039; =&gt; [
        [&#039;date&#039; =&gt; &#039;2026-07-01&#039;, &#039;qty&#039; =&gt; 15],
        [&#039;date&#039; =&gt; &#039;2026-07-02&#039;, &#039;qty&#039; =&gt; 12],
    ],
    &#039;current_stock&#039; =&gt; 50,
]);

echo &quot;Stok aman: {$result[&#039;data&#039;][&#039;safety_stock&#039;]}&quot;;
echo &quot;Reorder point: {$result[&#039;data&#039;][&#039;reorder_point&#039;]}&quot;;

`javascript

const result = await client.cashflowForecast({

product_id: "PROD-001",

sales_history: [{ date: "2026-07-01", qty: 15 }],

current_stock: 50,

});

console.log("Urgensi restock:", result.data.urgency);


---

### 🎯 Referensi Cepat

#### Kirim License Key

| Cara                           | Contoh                                  |
| ------------------------------ | --------------------------------------- |
| `X-License-Key` header         | `X-License-Key: KJ8F2M...abc123`        |
| `Authorization: Bearer` header | `Authorization: Bearer KJ8F2M...abc123` |
| JSON body                      | `{&quot;license_key&quot;: &quot;KJ8F2M...abc123&quot;}`    |

&gt; ⚠️ **Case-sensitive!** `KJ8F2M` ≠ `kj8f2m`.

#### Saklar Sandbox / Production

| `X-Mirel-API-Key` | Mode        | Biaya       |
| ----------------- | ----------- | ----------- |
| `mirel_sandbox_*` | **Sandbox** | ✅ Gratis   |
| `mirel_live_*`    | **Live**    | Pakai token |

#### Rate Limit (per 60 detik)

| Paket      | Batas Request |
| ---------- | ------------- |
| Standard   | 10            |
| Pro        | 20            |
| Enterprise | 60            |

&gt; Kena **HTTP 429**? Tenang — tunggu beberapa detik, ulangi.

#### Error yang Sering Muncul

| Kode    | Artinya                | Solusi                         |
| ------- | ---------------------- | ------------------------------ |
| **401** | License key salah      | Cek key di dashboard           |
| **402** | Token habis            | Top-up atau tunggu reset bulan |
| **403** | Paket kurang memadai   | Upgrade paket                  |
| **429** | Terlalu banyak request | Tunggu bentar, ulangi          |

---

### ❓ FAQ

**&quot;Gimana cara dapetin License Key?&quot;**
Registrasi di portal klien Mirel. Dapatkan key setelah berlangganan paket.

**&quot;Sandbox dan Production bedanya apa?&quot;**
**Sandbox** = Gratis, data simulasi, buat testing. **Production** = AI beneran, potong saldo.

**&quot;Token habis, gimana?&quot;**
Fitur non-AI tetap jalan. Tinggal top-up atau tunggu reset bulanan.

**&quot;SDK-nya support browser?&quot;**
Ya! JS SDK support browser &amp; Node.js.

**&quot;Error 28 (Connection timeout)?&quot;**
Pastikan server Anda bisa mengakses `https://mirel.my.id`. Cek firewall atau `ping mirel.my.id`.

---

&gt; **Mirel Tower** — API Services AI untuk bisnis Anda.
&gt;
&gt; Terpisah dari Mirel ERP &amp; POS. Bisa diintegrasikan ke sistem apapun.
&gt;
&gt; © 2026 Mirel Tower. All rights reserved.

      &quot;coa_code&quot;: &quot;4-1000&quot;,
      &quot;coa_name&quot;: &quot;Pendapatan&quot;,
      &quot;debit&quot;: 0,
      &quot;credit&quot;: 5000000
    },
    { &quot;coa_code&quot;: &quot;1-1000&quot;, &quot;coa_name&quot;: &quot;Kas&quot;, &quot;debit&quot;: 5000000, &quot;credit&quot;: 0 }

]
}

````

**Response (200):**

```json
{
  &quot;status&quot;: &quot;success&quot;,
  &quot;message&quot;: &quot;Jurnal berhasil diproses oleh Tower AI.&quot;,
  &quot;data&quot;: {
    &quot;journal_id&quot;: 42,
    &quot;reference_no&quot;: &quot;INV-20260710-001&quot;,
    &quot;approval_status&quot;: &quot;PENDING_APPROVAL&quot;,
    &quot;is_ai_generated&quot;: 1
  }
}
````

### 6.2 Accounting Endpoints (`/api/v1/accounting`)

| Endpoint             | Method | Min. Tier | Deskripsi                 |
| -------------------- | ------ | --------- | ------------------------- |
| `process-journal`    | POST   | Pro       | Buat jurnal akuntansi     |
| `cleanup-duplicates` | POST   | Pro       | Bersihkan jurnal duplikat |

### 6.3 Guide Endpoints (`/api/v1/guide`)

| Endpoint         | Method | Min. Tier | Deskripsi                         |
| ---------------- | ------ | --------- | --------------------------------- |
| `sync`           | POST   | Standard  | Sinkronisasi fitur knowledge base |
| `stats`          | GET    | Standard  | Statistik penggunaan Guide        |
| `features`       | GET    | Standard  | Daftar fitur yang tersedia        |
| `update-feature` | POST   | Standard  | Update data fitur tertentu        |

### 6.4 System &amp; Utility Endpoints

| Endpoint                        | Method   | Auth        | Deskripsi                                  |
| ------------------------------- | -------- | ----------- | ------------------------------------------ |
| `/api/v1/system-health/receive` | POST     | `X-API-Key` | Terima laporan kesehatan sistem dari klien |
| `/api/v1/bug-receiver`          | POST     | `X-API-Key` | Terima laporan bug dari aplikasi klien     |
| `/api/v1/rules/sync`            | GET/POST | License key | Sinkronisasi aturan tier &amp; points          |

---

## 7. Rate Limiting &amp; Kuota

### 7.1 Rate Limit per Paket

Rate limit diterapkan per **license key** dan diskalakan sesuai paket:

| Paket      | Request / 60 detik | Rekomendasi Delay      |
| ---------- | ------------------ | ---------------------- |
| Standard   | 10 request         | ~6 detik antar request |
| Pro        | 20 request         | ~3 detik antar request |
| Enterprise | 60 request         | ~1 detik antar request |

Saat limit terlampaui, API mengembalikan HTTP **429** dengan body:

```json
{
  &quot;status&quot;: &quot;error&quot;,
  &quot;message&quot;: &quot;Too many requests. Please wait.&quot;,
  &quot;retry_after&quot;: 5
}

7.2 Token Quota


8. Idempotensi

Kirim header X-Idempotency-Key untuk mencegah pemrosesan duplikat:

X-Idempotency-Key: stable-unique-string-anda

9. Error Handling

9.1 Envelope Error

Semua error mengembalikan format JSON konsisten:

`json

{

"status": "error",

"code": "ERROR_CODE",

"message": "Deskripsi error yang jelas."

}


### 9.2 Kode Error

| HTTP Code | Kode               | Arti                                | Solusi                     |
| --------- | ------------------ | ----------------------------------- | -------------------------- |
| **400**   | `BAD_REQUEST`      | Request tidak valid                 | Periksa parameter request  |
| **401**   | `INVALID_LICENSE`  | License key tidak valid/tidak aktif | Periksa license key        |
| **402**   | `TOKEN_EXHAUSTED`  | Kuota token habis                   | Lakukan top-up token       |
| **403**   | `UPGRADE_REQUIRED` | Paket tidak mencukupi               | Upgrade paket              |
| **403**   | `DOMAIN_MISMATCH`  | Domain tidak cocok                  | Daftarkan domain           |
| **404**   | `NOT_FOUND`        | Endpoint tidak ditemukan            | Periksa URL                |
| **409**   | `DUPLICATE_ENTRY`  | Data duplikat (idempotensi)         | Gunakan idempotency key    |
| **429**   | `RATE_LIMITED`     | Rate limit terlampaui               | Tunggu `retry_after` detik |
| **500**   | `INTERNAL_ERROR`   | Error server                        | Hubungi admin Tower        |

### 9.3 Pola Penanganan (Best Practice)

```php
// PHP
try {
    $result = $client-&gt;processJournal($data);
} catch (RuntimeException $e) {
    $message = $e-&gt;getMessage();

    if (str_contains($message, &#039;402&#039;)) {
        // Token habis — aktifkan circuit breaker
        $this-&gt;circuitBreaker-&gt;open();
    } elseif (str_contains($message, &#039;429&#039;)) {
        // Rate limit — tunggu dan retry
        sleep(6);
        $result = $client-&gt;processJournal($data);
    } else {
        // Error lain — log dan notifikasi
        log_message(&#039;error&#039;, &#039;API Tower Error: &#039; . $message);
    }
}

10. Circuit Breaker Pattern

Aplikasi klien (seperti Mirel ERP POS) HARUS menerapkan Circuit Breaker untuk menangani HTTP 402 (token habis) dari Tower.

State Machine

CLOSED (normal) → OPEN (token habis) → HALF_OPEN (coba lagi) → CLOSED

Logika Dasar

`php

// Pseudocode — Circuit Breaker

class AiCircuitBreaker {

private string $state = 'CLOSED'; // CLOSED | OPEN | HALF_OPEN

private int $failureCount = 0;

private int $threshold = 3; // Gagal 3 kali → OPEN

private ?int $lastFailureTime = null;

private int $timeout = 300; // 5 menit sebelum HALF_OPEN

public function canCall(): bool {

if ($this->state === 'OPEN') {

if (time() - $this->lastFailureTime > $this->timeout) {

$this->state = 'HALF_OPEN';

return true; // Izinkan 1 request percobaan

}

return false; // Blokir request

}

return true;

}

public function recordSuccess(): void {

$this->state = 'CLOSED';

$this->failureCount = 0;

}

public function recordFailure(): void {

$this->failureCount++;

$this->lastFailureTime = time();

if ($this->failureCount >= $this->threshold) {

$this->state = 'OPEN'; // Circuit terbuka

}

}

}


### Yang Harus Dilakukan Saat Circuit OPEN

- ⛔ **Blokir SEMUA panggilan API AI** (jangan hitung token lokal)
- ✅ **Fitur non-AI tetap berjalan normal** (POS, Gudang, Pembelian, dll.)
- 🔄 Tampilkan pesan: _&quot;Fitur AI sedang tidak tersedia. Silakan lakukan top-up token.&quot;_
- ⏱ Coba lagi setelah interval tertentu (HALF_OPEN)

---

## 11. FAQ &amp; Troubleshooting

### Q: Bagaimana cara mendapatkan license key?

Hubungi admin Mirel Tower atau registrasi di portal klien `https://tower.mirel.my.id/client/login`.

### Q: Apa bedanya Sandbox dan Production?

Sandbox mengembalikan data mock tanpa memanggil AI dan tanpa biaya. Production menggunakan AI sungguhan dan memotong token.

### Q: Berapa biaya per panggilan API?

1 token per panggilan AI. Token bisa dibeli melalui halaman top-up di portal publik.

### Q: Bagaimana jika token habis?

API mengembalikan HTTP 402. Implementasikan Circuit Breaker di sisi klien agar sistem tetap berjalan. Lakukan top-up token.

### Q: Apakah ada limit jumlah request?

Ya — lihat tabel Rate Limit di atas. Limit di-reset setiap 60 detik.

### Q: Domain saya tidak terdaftar, bagaimana?

Hubungi admin untuk mendaftarkan domain Anda. Pastikan license key dibuat dengan domain yang benar.

### Q: Apakah SDK mendukung browser?

Ya, JavaScript SDK mendukung browser (mengirim File/Blob untuk `analyzeFaktur`) dan Node.js (mengirim path file).

### Q: Error &quot;cURL error 28&quot; — Connection timeout?

Pastikan firewall tidak memblokir koneksi ke `https://mirel.my.id`. Coba perbesar nilai `CURLOPT_TIMEOUT` di SDK.

---

## Lampiran: Daftar File Referensi

| File                          | Lokasi        | Deskripsi                     |
| ----------------------------- | ------------- | ----------------------------- |
| `MirelTowerClient.php`        | `public/sdk/` | PHP SDK Client                |
| `mirel-tower-client.js`       | `public/sdk/` | JavaScript/Node.js SDK Client |
| `API.md`                      | `docs/`       | API Reference (versi ringkas) |
| `DEPLOYMENT_DUAL_MODE.md`     | `docs/`       | Panduan deployment dual-mode  |
| `AI_CIRCUIT_BREAKER_GUIDE.md` | `docs/`       | Panduan circuit breaker AI    |

---

&gt; **Mirel Tower API Services** — Platform AI Microservices terintegrasi untuk finance, accounting, dan bisnis.
&gt;
&gt; Terpisah dari Mirel ERP &amp; POS. API Services berdiri sendiri sebagai layanan REST API.
&gt;
&gt; © 2026 Mirel Tower. All rights reserved.