API Reseller Limitz Store
Jual produk Limitz Store dari website, bot WhatsApp, bot Telegram, spreadsheet, atau aplikasi apa pun. Saldo yang dipakai = Saldo Akun kamu, harga mengikuti level akunmu.
Atur keamanan
Isi Whitelist IP server kamu dan Callback URL (untuk notifikasi status).
Panggil API
Kirim header
X-API-Key di setiap permintaan.curl -X POST https://limitzstore.com/api/v2/balance \
-H "X-API-Key: API_KEY_KAMU"
<?php
function mg(string $endpoint, array $data = []): array {
$ch = curl_init('https://limitzstore.com/api/v2/' . $endpoint);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['X-API-Key: ' . getenv('MG_API_KEY'), 'Content-Type: application/json'],
]);
$res = json_decode((string) curl_exec($ch), true);
curl_close($ch);
return is_array($res) ? $res : ['status' => false, 'message' => 'Koneksi gagal'];
}
$saldo = mg('balance');
echo $saldo['status'] ? $saldo['data']['balance'] : $saldo['message'];
// Node.js 18+ (fetch bawaan)
const API = 'https://limitzstore.com/api/v2';
async function mg(endpoint, data = {}) {
const res = await fetch(`${API}/${endpoint}`, {
method: 'POST',
headers: { 'X-API-Key': process.env.MG_API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
return res.json(); // { status, message, data }
}
const saldo = await mg('balance');
console.log(saldo.status ? saldo.data.balance : saldo.message);
import os, requests
API = "https://limitzstore.com/api/v2"
def mg(endpoint, data=None):
r = requests.post(f"{API}/{endpoint}", json=data or {},
headers={"X-API-Key": os.environ["MG_API_KEY"]}, timeout=30)
return r.json() # {"status", "message", "data"}
saldo = mg("balance")
print(saldo["data"]["balance"] if saldo["status"] else saldo["message"])
Semua endpoint menerima POST dengan body JSON (Content-Type: application/json) atau form biasa. Endpoint yang hanya membaca data juga boleh GET dengan parameter di URL. Endpoint order wajib POST.
Autentikasi & keamanan
| Cara | Contoh |
|---|---|
| Header (dianjurkan) | X-API-Key: MG-1a2b3c... |
| Header Bearer | Authorization: Bearer MG-1a2b3c... |
| Field body | {"api_key": "LZ-1a2b3c..."} (untuk alat yang tidak bisa mengatur header) |
API key = akses ke saldo kamu. Simpan di server/environment variable, jangan di aplikasi HP, kode JavaScript halaman web, atau chat. Bocor? Tekan Reset Api Key, key lama langsung mati.
Whitelist IP
Isi IP publik server yang memanggil API di Pengaturan Akun. Bisa lebih dari satu (pisahkan koma) dan boleh CIDR, mis. 203.0.113.10, 198.51.100.0/24. Kosong = semua IP boleh (tidak dianjurkan). Tidak tahu IP server kamu? Panggil /profile, lihat your_ip.
Batas permintaan
| Jenis | Batas |
|---|---|
| Semua endpoint | 120 permintaan / menit / akun |
/order | 30 order / menit / akun |
/check-id | 30 cek / menit / akun |
Lewat batas = HTTP 429 kode RATE_LIMITED; tunggu beberapa detik lalu coba lagi.
IP kami
Webhook dikirim dari IP server kami 36.50.77.116. Bila server kamu memakai firewall, izinkan IP ini ke Callback URL. Selalu verifikasi tanda tangan, jangan hanya mengandalkan IP.
Format respons & kode error
Setiap respons berupa JSON dengan HTTP status yang sesuai.
// berhasil
{ "status": true, "message": "OK", "data": { ... } }
// gagal
{ "status": false, "message": "Saldo tidak mencukupi. Total bayar Rp 21.500", "error": { "code": "INSUFFICIENT_BALANCE" }, "data": null } | HTTP | error.code | Arti & tindakan |
|---|---|---|
| 401 | MISSING_API_KEY, INVALID_API_KEY | Header API key tidak ada / salah. |
| 403 | IP_NOT_WHITELISTED | IP pemanggil belum di whitelist (IP-nya ada di error.ip). |
| 403 | ACCOUNT_DISABLED | Akun dinonaktifkan, hubungi admin. |
| 402 | INSUFFICIENT_BALANCE | Saldo kurang, isi saldo dulu. |
| 404 | ORDER_NOT_FOUND, GAME_NOT_FOUND, ENDPOINT_NOT_FOUND | Data tidak ditemukan / alamat salah. |
| 405 | METHOD_NOT_ALLOWED | Order harus POST. |
| 409 | OUT_OF_STOCK | Stok produk habis. |
| 422 | INVALID_TARGET | ID tujuan kosong / tidak ditemukan / region tidak dilayani. |
| 422 | PRODUCT_REQUIRED, PRODUCT_UNAVAILABLE, INVALID_REF_ID, MISSING_USER_ID, ORDER_REJECTED | Periksa isi permintaan, pesan detail ada di message. |
| 429 | RATE_LIMITED | Terlalu cepat, tunggu sebentar. |
| 503 | PRICE_UPDATING | Harga produk sedang diperbarui, coba beberapa saat lagi. |
Status pesanan
| status | Arti | Final? |
|---|---|---|
Processing | Sedang dikirim ke provider | Belum |
Success | Berhasil, SN/kode ada di sn | Ya |
Partial | Sebagian berhasil (produk berisi beberapa kode) | Ya |
Canceled / Failed | Gagal; saldo dikembalikan otomatis (status lalu menjadi Refunded) | Ya |
Refunded | Gagal dan saldo sudah dikembalikan | Ya |
Alur order yang benar
- Ambil daftar produk sekali lalu simpan (cache) beberapa menit; jangan memanggil
/productsdi setiap pesan pembeli. - Buat
ref_idunik untuk setiap pesanan (nomor invoice di sistemmu). Koneksi putus atau timeout? Kirim ulang ref_id yang sama: kamu akan menerima pesanan yang sama, saldo tidak terpotong dua kali. - Order diproses di belakang layar (asinkron). Respons pertama berstatus
Processing. - Tunggu webhook untuk status final. Tanpa webhook? Cek
/statustiap 10-30 detik, berhenti saat status final.
Profil akun
Info akun pemilik API key. Alias lama: /account.
{
"status": true, "message": "OK",
"data": {
"username": "tokobudi", "level": "Gold", "level_name": "Gold", "balance": 1250000,
"whatsapp": "08123456789", "callback_url": "https://tokobudi.com/mg-webhook",
"ip_whitelist": ["203.0.113.10"], "your_ip": "203.0.113.10"
}
}Saldo
{ "status": true, "message": "OK", "data": { "balance": 1250000 } }Daftar game
Game yang bisa dipesan beserta kolom tujuan (fields) yang harus dikirim saat order. key = nama field di /order.
| Parameter | Tipe | Keterangan |
|---|---|---|
q | string | Opsional, cari nama/slug game. |
{
"status": true, "message": "OK",
"data": [{
"game": "Mobile Legends", "slug": "mobile-legends", "category": "Top Up Game", "products": 120,
"fields": [
{ "key": "user_id", "title": "User ID", "type": "number", "required": true },
{ "key": "zone_id", "title": "Server", "type": "number", "required": true }
],
"check_id": true
}, {
"game": "Genshin Impact", "slug": "genshin-impact", "products": 18,
"fields": [
{ "key": "user_id", "title": "UID", "type": "number", "required": true },
{ "key": "zone_id", "title": "Pilih Server", "type": "select", "required": true,
"options": [{ "value": "asia", "label": "Asia" }, { "value": "euro", "label": "Europe" }] }
],
"check_id": false
}]
}Daftar produk & harga
Harga sudah mengikuti level akunmu. Hanya produk yang bisa dipesan lewat API yang muncul. Alias lama: /product.
| Parameter | Tipe | Keterangan |
|---|---|---|
game | string | Opsional, slug / nama / id game, mis. mobile-legends. Dianjurkan diisi supaya respons kecil. |
category | string | Opsional, nama kategori produk persis. |
q | string | Opsional, cari nama produk, mis. diamond. |
product_id | integer | Opsional, satu produk saja. |
{
"status": true, "message": "OK",
"data": [{
"product_id": 1201, "game": "Mobile Legends", "game_slug": "mobile-legends", "category": "Diamond",
"product": "86 Diamonds", "price": 21500, "original_price": null,
"stock": null, "max_qty": 1, "need_target": true
}]
} stock null = tidak dibatasi; angka = stok tersisa (produk voucher/akun). max_qty > 1 = boleh beli banyak sekaligus lewat qty.
Cek ID / nickname
Cek ID akun game sebelum order (game dengan check_id: true). Order juga mengecek ID otomatis, jadi endpoint ini untuk menampilkan nickname ke pembeli. Alias lama: /check_nick.
| Parameter | Tipe | Keterangan |
|---|---|---|
product_id atau game | integer / string | wajib salah satu. Pakai product_id supaya region produk ikut dicek. |
user_id | string | wajib |
zone_id | string | Server/zone bila game memintanya. |
{ "status": true, "message": "OK", "data": { "valid": true, "status": "valid", "nickname": "BudiGG", "region": "ID", "message": "" } } valid: true ditemukan, false tidak ditemukan / region tidak dilayani, null belum bisa dicek (coba lagi) atau game tidak mendukung.
Order
Saldo dipotong saat pesanan diterima (HTTP 201). Gagal di provider = saldo dikembalikan otomatis.
| Parameter | Tipe | Keterangan |
|---|---|---|
product_id | integer | wajib, dari /products. |
user_id | string | Kolom tujuan pertama (lihat fields di /games). Wajib bila need_target. |
zone_id | string | Kolom tujuan kedua (server/zone). |
field_3, field_4 | string | Kolom tujuan berikutnya (jarang). |
target | string | Alternatif semua kolom dalam satu teks dipisah koma: "12345678,1234". |
qty | integer | Jumlah (hanya produk dengan max_qty > 1). Bawaan 1. |
ref_id | string | Sangat dianjurkan. Nomor unik dari sistemmu, huruf/angka/tanda hubung, maks 40. ref_id sama = pesanan sama. |
curl -X POST https://limitzstore.com/api/v2/order \
-H "X-API-Key: API_KEY_KAMU" \
-H "Content-Type: application/json" \
-d '{"product_id": 1201, "user_id": "12345678", "zone_id": "1234", "ref_id": "INV-20261027-0001"}'
<?php
$hasil = mg('order', [
'product_id' => 1201,
'user_id' => '12345678',
'zone_id' => '1234',
'ref_id' => 'INV-20261027-0001', // nomor pesanan di sistemmu (unik)
]);
if ($hasil['status']) {
echo 'Diterima: ' . $hasil['data']['order_id'] . ' (' . $hasil['data']['status'] . ')';
} else {
echo 'Gagal [' . $hasil['error']['code'] . ']: ' . $hasil['message'];
}
const r = await mg('order', {
product_id: 1201, user_id: '12345678', zone_id: '1234',
ref_id: 'INV-20261027-0001', // nomor pesanan di sistemmu (unik)
});
if (r.status) console.log('Diterima', r.data.order_id, r.data.status);
else console.log('Gagal', r.error.code, r.message);
r = mg("order", {"product_id": 1201, "user_id": "12345678", "zone_id": "1234",
"ref_id": "INV-20261027-0001"})
if r["status"]:
print("Diterima", r["data"]["order_id"], r["data"]["status"])
else:
print("Gagal", r["error"]["code"], r["message"])
Respons
// HTTP 201 Created
{
"status": true, "message": "Pesanan diterima dan sedang diproses",
"data": {
"order_id": "MG123456271026", "ref_id": "INV-20261027-0001",
"status": "Processing", "status_text": "Sedang diproses",
"game": "Mobile Legends", "product": "86 Diamonds", "product_id": 1201, "qty": 1,
"user_id": "12345678", "zone_id": "1234", "nickname": "BudiGG",
"price": 21500, "sn": "", "note": "Dalam antrian proses", "created_at": "2026-10-27 10:15:02",
"balance": 1228500, "idempotent": false
}
} 200 berisi pesanan yang sudah ada dengan "idempotent": true (saldo tidak dipotong lagi).Status pesanan
| Parameter | Tipe | Keterangan |
|---|---|---|
order_id | string | Nomor pesanan kami, atau |
ref_id | string | ref_id yang kamu kirim saat order. |
{
"status": true, "message": "OK",
"data": {
"order_id": "MG123456271026", "ref_id": "INV-20261027-0001",
"status": "Success", "status_text": "Berhasil",
"game": "Mobile Legends", "product": "86 Diamonds", "product_id": 1201, "qty": 1,
"user_id": "12345678", "zone_id": "1234", "nickname": "BudiGG",
"price": 21500, "sn": "1234567890ABCDEF", "note": "", "created_at": "2026-10-27 10:15:02"
}
}Riwayat pesanan
Pesanan terbaru akunmu (dari web maupun API). Parameter: limit (1-50, bawaan 20), status (opsional).
Webhook (callback)
Setiap status pesanan berubah, kami mengirim POST JSON ke Callback URL di Pengaturan Akun. Balas HTTP 2xx dalam 10 detik. Callback URL harus alamat publik http(s):// milikmu.
POST https://tokobudi.com/mg-webhook
Content-Type: application/json
X-Event: order.update
X-Signature: 5f0c2b... (hex HMAC-SHA256 dari body mentah, kunci = API key kamu)
{
"event": "order.update", "order_id": "MG123456271026", "ref_id": "INV-20261027-0001",
"status": "Success", "status_text": "Berhasil", "sn": "1234567890ABCDEF",
"game": "Mobile Legends", "product": "86 Diamonds", "product_id": 1201, "qty": 1,
"user_id": "12345678", "zone_id": "1234", "price": 21500, "timestamp": 1761534902
} Verifikasi tanda tangan (wajib)
Siapa pun yang tahu Callback URL kamu bisa mengirim permintaan palsu. Hitung HMAC-SHA256 dari body mentah (sebelum di-parse) dengan API key kamu, bandingkan dengan header X-Signature.
<?php
// webhook.php = Callback URL kamu (isi di Pengaturan Akun)
$raw = file_get_contents('php://input');
$sign = hash_hmac('sha256', $raw, getenv('MG_API_KEY'));
if (!hash_equals($sign, $_SERVER['HTTP_X_SIGNATURE'] ?? '')) {
http_response_code(401);
exit('tanda tangan salah');
}
$e = json_decode($raw, true);
// cari pesanan di sistemmu lewat $e['ref_id'] (atau $e['order_id']), lalu simpan $e['status'] & $e['sn']
http_response_code(200);
echo 'OK';
// npm i express
const express = require('express');
const crypto = require('crypto');
const app = express();
app.post('/mg-webhook', express.raw({ type: '*/*' }), (req, res) => {
const sign = crypto.createHmac('sha256', process.env.MG_API_KEY).update(req.body).digest('hex');
const dari = req.get('X-Signature') || '';
if (dari.length !== sign.length || !crypto.timingSafeEqual(Buffer.from(dari), Buffer.from(sign))) {
return res.status(401).send('tanda tangan salah');
}
const e = JSON.parse(req.body.toString());
console.log(e.ref_id, e.order_id, e.status, e.sn);
res.send('OK'); // balas 2xx secepatnya, kerjakan hal berat setelahnya
});
app.listen(3000);
# pip install flask
import hmac, hashlib, os
from flask import Flask, request, abort
app = Flask(__name__)
@app.post("/mg-webhook")
def mg_webhook():
raw = request.get_data()
sign = hmac.new(os.environ["MG_API_KEY"].encode(), raw, hashlib.sha256).hexdigest()
if not hmac.compare_digest(sign, request.headers.get("X-Signature", "")):
abort(401)
e = request.get_json()
print(e["ref_id"], e["order_id"], e["status"], e["sn"])
return "OK"
Canceled lalu Refunded). Simpan status terakhir berdasarkan order_id, jangan mengirim barang dua kali. Webhook gagal (server mati)? Status tetap bisa diambil lewat /status.Bot WhatsApp
Pola untuk semua bot: bot = program kecil di servermu. Perintah dari chat → bot memanggil API; webhook masuk → bot mengirim pesan ke chat yang memesan. Simpan pasangan ref_id ↔ nomor chat supaya tahu harus membalas ke siapa.
Contoh di bawah memakai whatsapp-web.js (login dengan scan QR). Perintah: !saldo, !produk mobile-legends, !cekid 1201 12345678 1234, !beli 1201 12345678 1234, !status MG123....
// Bot WhatsApp: Node.js 18+ | npm i whatsapp-web.js qrcode-terminal express
// Jalankan: MG_API_KEY=API_KEY_KAMU node bot-wa.js -> scan QR dari aplikasi WhatsApp
const { Client, LocalAuth } = require('whatsapp-web.js');
const qrcode = require('qrcode-terminal');
const express = require('express');
const crypto = require('crypto');
const API = 'https://limitzstore.com/api/v2';
const KEY = process.env.MG_API_KEY;
const rupiah = n => 'Rp ' + Number(n).toLocaleString('id-ID');
async function mg(endpoint, data = {}) {
const r = await fetch(`${API}/${endpoint}`, {
method: 'POST',
headers: { 'X-API-Key': KEY, 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
return r.json();
}
const wa = new Client({ authStrategy: new LocalAuth() });
const chatDariRef = new Map(); // ref_id -> nomor chat (pakai database di produksi)
wa.on('qr', qr => qrcode.generate(qr, { small: true }));
wa.on('ready', () => console.log('Bot WhatsApp siap'));
wa.on('message', async msg => {
const [perintah, ...a] = msg.body.trim().split(/\s+/);
switch (perintah.toLowerCase()) {
case '!saldo': {
const r = await mg('balance');
return msg.reply(r.status ? `Saldo: ${rupiah(r.data.balance)}` : r.message);
}
case '!produk': { // !produk mobile-legends
const r = await mg('products', { game: a[0] || '' });
if (!r.status) return msg.reply(r.message);
return msg.reply(r.data.slice(0, 40).map(p => `${p.product_id} | ${p.product} | ${rupiah(p.price)}`).join('\n') || 'Produk tidak ditemukan');
}
case '!cekid': { // !cekid 1201 12345678 1234
const r = await mg('check-id', { product_id: a[0], user_id: a[1], zone_id: a[2] || '' });
return msg.reply(r.status && r.data.valid ? `ID valid: ${r.data.nickname}` : (r.data?.message || r.message));
}
case '!beli': { // !beli 1201 12345678 1234
const ref = 'WA' + Date.now();
chatDariRef.set(ref, msg.from);
const r = await mg('order', { product_id: a[0], user_id: a[1], zone_id: a[2] || '', ref_id: ref });
return msg.reply(r.status
? `Pesanan ${r.data.order_id} diterima (${r.data.product}, ${rupiah(r.data.price)}). Tunggu notifikasi ya.`
: `Gagal: ${r.message}`);
}
case '!status': { // !status MG123456271026
const r = await mg('status', { order_id: a[0] });
return msg.reply(r.status ? `${r.data.order_id}: ${r.data.status_text}${r.data.sn ? '\nSN: ' + r.data.sn : ''}` : r.message);
}
}
});
wa.initialize();
// Callback URL di Pengaturan Akun = https://domain-bot-kamu.com/mg-webhook
const app = express();
app.post('/mg-webhook', express.raw({ type: '*/*' }), async (req, res) => {
const sign = crypto.createHmac('sha256', KEY).update(req.body).digest('hex');
const dari = req.get('X-Signature') || '';
if (dari.length !== sign.length || !crypto.timingSafeEqual(Buffer.from(dari), Buffer.from(sign))) return res.sendStatus(401);
res.send('OK');
const e = JSON.parse(req.body.toString());
const chat = chatDariRef.get(e.ref_id);
if (chat && e.status !== 'Processing') {
await wa.sendMessage(chat, `Pesanan ${e.order_id}: ${e.status_text}${e.sn ? '\nSN: ' + e.sn : ''}`);
}
});
app.listen(3000, () => console.log('Webhook di port 3000'));
mg() dan penerima webhook tinggal dipasang di handler pesan gateway kamu.Bot Telegram
Buat bot di @BotFather, ambil token, lalu jalankan contoh ini. Chat id disisipkan di ref_id (TG<chat_id>-<waktu>), jadi webhook tahu harus membalas ke chat mana tanpa database.
// Bot Telegram: Node.js 18+ | npm i telegraf express
// Jalankan: BOT_TOKEN=token_dari_BotFather MG_API_KEY=API_KEY_KAMU node bot-tg.js
const { Telegraf } = require('telegraf');
const express = require('express');
const crypto = require('crypto');
const API = 'https://limitzstore.com/api/v2';
const KEY = process.env.MG_API_KEY;
const rupiah = n => 'Rp ' + Number(n).toLocaleString('id-ID');
async function mg(endpoint, data = {}) {
const r = await fetch(`${API}/${endpoint}`, {
method: 'POST',
headers: { 'X-API-Key': KEY, 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
return r.json();
}
const bot = new Telegraf(process.env.BOT_TOKEN);
const arg = ctx => ctx.message.text.trim().split(/\s+/).slice(1);
bot.command('saldo', async ctx => {
const r = await mg('balance');
ctx.reply(r.status ? `Saldo: ${rupiah(r.data.balance)}` : r.message);
});
bot.command('produk', async ctx => { // /produk free-fire
const r = await mg('products', { game: arg(ctx)[0] || '' });
if (!r.status) return ctx.reply(r.message);
ctx.reply(r.data.slice(0, 40).map(p => `${p.product_id} | ${p.product} | ${rupiah(p.price)}`).join('\n') || 'Produk tidak ditemukan');
});
bot.command('beli', async ctx => { // /beli 1201 12345678 1234
const [pid, uid, zone] = arg(ctx);
const ref = `TG${ctx.chat.id}-${Date.now()}`; // chat id ikut di ref -> webhook tahu harus balas ke mana
const r = await mg('order', { product_id: pid, user_id: uid, zone_id: zone || '', ref_id: ref });
ctx.reply(r.status ? `Pesanan ${r.data.order_id} diterima, sedang diproses.` : `Gagal: ${r.message}`);
});
bot.command('status', async ctx => { // /status MG123456271026
const r = await mg('status', { order_id: arg(ctx)[0] });
ctx.reply(r.status ? `${r.data.order_id}: ${r.data.status_text}${r.data.sn ? '\nSN: ' + r.data.sn : ''}` : r.message);
});
bot.launch();
// Callback URL di Pengaturan Akun = https://domain-bot-kamu.com/mg-webhook
const app = express();
app.post('/mg-webhook', express.raw({ type: '*/*' }), async (req, res) => {
const sign = crypto.createHmac('sha256', KEY).update(req.body).digest('hex');
const dari = req.get('X-Signature') || '';
if (dari.length !== sign.length || !crypto.timingSafeEqual(Buffer.from(dari), Buffer.from(sign))) return res.sendStatus(401);
res.send('OK');
const e = JSON.parse(req.body.toString());
const m = /^TG(-?\d+)-/.exec(e.ref_id || '');
if (m && e.status !== 'Processing') {
await bot.telegram.sendMessage(m[1], `Pesanan ${e.order_id}: ${e.status_text}${e.sn ? '\nSN: ' + e.sn : ''}`);
}
});
app.listen(3000);
# Bot Telegram (Python) | pip install python-telegram-bot requests
import os, time, requests
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
API = "https://limitzstore.com/api/v2"
def mg(endpoint, data=None):
return requests.post(f"{API}/{endpoint}", json=data or {},
headers={"X-API-Key": os.environ["MG_API_KEY"]}, timeout=30).json()
async def saldo(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
r = mg("balance")
await update.message.reply_text(f"Saldo: Rp {r['data']['balance']:,}".replace(",", ".") if r["status"] else r["message"])
async def beli(update: Update, ctx: ContextTypes.DEFAULT_TYPE): # /beli 1201 12345678 1234
pid, uid, *zone = ctx.args
ref = f"TG{update.effective_chat.id}-{int(time.time() * 1000)}"
r = mg("order", {"product_id": pid, "user_id": uid, "zone_id": zone[0] if zone else "", "ref_id": ref})
await update.message.reply_text(f"Pesanan {r['data']['order_id']} diterima" if r["status"] else f"Gagal: {r['message']}")
app = ApplicationBuilder().token(os.environ["BOT_TOKEN"]).build()
app.add_handler(CommandHandler("saldo", saldo))
app.add_handler(CommandHandler("beli", beli))
app.run_polling()
n8n, Make, Zapier, Pabbly
Gunakan modul HTTP Request:
| Isian | Nilai |
|---|---|
| Method | POST |
| URL | https://limitzstore.com/api/v2/order (atau endpoint lain) |
| Header | X-API-Key = API key kamu, Content-Type = application/json |
| Body (JSON) | {"product_id": 1201, "user_id": "{{id}}", "zone_id": "{{server}}", "ref_id": "{{nomor_pesanan}}"} |
Untuk notifikasi status, buat Webhook trigger di n8n/Make lalu isi URL-nya sebagai Callback URL. Verifikasi X-Signature dengan node Crypto (HMAC SHA256, kunci = API key).
Google Sheets (Apps Script)
// Google Sheets > Extensions > Apps Script. Simpan API key di Project Settings > Script properties: MG_API_KEY
function mg(endpoint, data) {
const res = UrlFetchApp.fetch('https://limitzstore.com/api/v2/' + endpoint, {
method: 'post',
contentType: 'application/json',
headers: { 'X-API-Key': PropertiesService.getScriptProperties().getProperty('MG_API_KEY') },
payload: JSON.stringify(data || {}),
muteHttpExceptions: true,
});
return JSON.parse(res.getContentText());
}
// Isi sheet "Produk" dengan daftar produk Mobile Legends + harga level kamu
function tarikProduk() {
const r = mg('products', { game: 'mobile-legends' });
const sh = SpreadsheetApp.getActive().getSheetByName('Produk') || SpreadsheetApp.getActive().insertSheet('Produk');
sh.clear().appendRow(['ID', 'Produk', 'Harga']);
r.data.forEach(p => sh.appendRow([p.product_id, p.product, p.price]));
}
Postman, Insomnia & SDK
Spesifikasi lengkap tersedia dalam format OpenAPI 3.0: https://limitzstore.com/api/v2/openapi.json
- Postman: Import → Link → tempel URL di atas → isi API key di tab Authorization (API Key, header
X-API-Key). - Insomnia / Bruno / Hoppscotch: Import from URL.
- SDK otomatis (PHP, JavaScript/TypeScript, Python, Go, Java, Dart/Flutter, dll.):
npx @openapitools/openapi-generator-cli generate -i https://limitzstore.com/api/v2/openapi.json -g python -o limitzstore-sdk
Pindah dari API lama
API lama https://api.limitzstore.com/v2 sudah dihentikan (alamatnya tidak aktif dan banyak masalah). Perubahan yang perlu kamu lakukan:
| Dulu | Sekarang |
|---|---|
https://api.limitzstore.com/v2/... | https://limitzstore.com/api/v2/... |
AUTHORIZATION: APIKEY | X-API-Key: APIKEY (cara lama masih diterima) |
product: "110.10" / sku_product | product_id: 110 (format lama masih diterima) |
order_id dari sistemmu | ref_id (order_id lama masih dibaca sebagai ref_id) |
Respons order "data": "MG..." | "data" berisi objek pesanan lengkap |
| Callback tanpa tanda tangan | Header X-Signature wajib diverifikasi; isi callback lihat Webhook |
| Whitelist IP kami 103.89.0.40 | IP kami 36.50.77.116 |
API Reseller