API Reseller

Satu API untuk pesanan, dompet prabayar, dan marketplace

Buat pesanan, pantau pengiriman, cek saldo, dan kelola listing dari sistem Anda sendiri. Endpoint REST berversi, kunci dengan cakupan, penulisan idempoten, dan webhook bertanda tangan, pada mesin yang sama dengan yang menjalankan toko ini.

  • REST /v1, JSON masuk dan keluar
  • Kunci Bearer dengan cakupan
  • Idempotency-Key pada penulisan
  • Webhook bertanda tangan
  • Paket Reseller

Cara kerja integrasi

Lima panggilan dari nol hingga pesanan terkirim

API meniru apa yang dilakukan dasbor, dengan urutan yang sama. Tidak ada biaya sampai Anda membuat pesanan, dan setiap penulisan bersifat idempoten.

  1. Buat kunci

    Di dasbor, pilih cakupan yang dibutuhkan kunci dan, jika mau, IP yang boleh menggunakannya. Kunci lengkap hanya ditampilkan sekali.

  2. Baca katalog

    GET /v1/catalog/services menampilkan setiap layanan yang diterbitkan dengan harga yang sudah dalam mata uang dan tingkat akun Anda.

  3. Cek kuotasi

    POST /v1/orders/preview memvalidasi tautan dan jumlah, lalu mengembalikan biaya yang tepat tanpa membuat apa pun.

  4. Buat pesanan

    POST /v1/orders dengan Idempotency-Key. Dompet prabayar didebit dan pesanan dialihkan ke pemasok dengan kualitas terukur terbaik.

  5. Terima event

    Daftarkan endpoint https dan terima event bertanda tangan untuk perubahan status, pengiriman sebagian, penyelesaian, pengembalian dana, dan isi ulang.

Buat pesanan dalam satu permintaanbash
curl -X POST https://YOUR-DOMAIN/v1/orders \
  -H "Authorization: Bearer smp_live_xxxxxxxxxx_..." \
  -H "Idempotency-Key: 2b7c1d9e-order-1001" \
  -H "Content-Type: application/json" \
  -d '{"service":"<service_id>","link":"https://instagram.com/p/abc","quantity":1000}'

Ganti YOUR-DOMAIN dengan host toko ini, kunci dengan kunci Anda sendiri, dan <service_id> dengan id dari katalog.

Autentikasi dan batas

Kunci yang bisa Anda batasi cakupannya dan rotasi

Kunci adalah kredensial sisi server. Kunci tidak pernah masuk ke browser, hanya membawa izin yang Anda berikan, dan Anda bisa mencabut atau merotasinya kapan saja tanpa mengganggu kunci lain.

Kunci Bearer

Kirim Authorization: Bearer smp_live_… atau X-Api-Key. Kunci lengkap hanya ditampilkan sekali dan hanya hash-nya yang disimpan. Hingga 20 kunci aktif per akun, tanggal kedaluwarsa opsional, dan rotasi dengan satu klik.

Daftar IP yang diizinkan

Secara opsional, kunci dapat dikunci ke hingga 20 alamat IP. Permintaan dari alamat lain ditolak dengan 403 FORBIDDEN.

Batas permintaan per kunci

Setiap kunci mewarisi batas permintaan per menit dari tingkat pelanggan Anda. Setiap respons menyertakan RateLimit-Limit, RateLimit-Remaining, dan RateLimit-Reset; jika melewati batas, Anda menerima 429 dengan Retry-After.

Batas yang berlaku untuk tingkat Reseller1.200 permintaan per menit

Cakupan

Setiap kunci hanya membawa cakupan yang Anda berikan. Panggilan di luar cakupannya ditolak dengan 403 FORBIDDEN.

CakupanFungsinya
catalog:readMelihat layanan dan harga
orders:readMembaca pesanan
orders:writeMembuat pesanan, isi ulang, dan membatalkan
wallet:readMembaca saldo
assets:readMelihat listing dan penawaran Anda
assets:writeMembuat dan mengedit listing, verifikasi, dan ketersediaan
transactions:writeMencatat langkah serah terima pada transaksi

Pada setiap respons

  • X-Request-Id: sebutkan saat menghubungi dukungan
  • X-Api-Version: tanggal kontrak yang sedang Anda gunakan
  • Cache-Control: no-store, respons tidak pernah di-cache

Idempotensi

Coba ulang dengan aman, jangan pernah menagih dua kali

POST /v1/orders dan POST /v1/orders/batch memerlukan header Idempotency-Key dengan panjang 8 sampai 120 karakter. Mengulang panggilan dengan kunci yang sama akan mengembalikan pesanan yang sama tanpa menagih lagi. Menggunakan ulang kunci dengan body yang berbeda ditolak dengan 409 IDEMPOTENCY_KEY_REUSE. Di dalam batch, setiap item diidentifikasi dengan kunci batch ditambah indeksnya.

  • Buat satu kunci per pesanan logis (UUID paling ideal) dan simpan sebelum mengirim.
  • Jika terjadi timeout atau error jaringan, kirim ulang dengan kunci yang sama: Anda akan mendapatkan hasil awal.
  • Mengubah body? Gunakan kunci baru. Kunci lama tetap terikat pada permintaan pertama.
Isi errorhttp
HTTP/1.1 409 Conflict
X-Request-Id: req_<hex>

{
  "error": {
    "code": "IDEMPOTENCY_KEY_REUSE",
    "message": "..."
  },
  "request_id": "req_<hex>"
}

Endpoint

Semua yang bisa dilakukan toko, lewat HTTP

Semua path berada di bawah /v1 pada host toko ini. Uang selalu berupa string desimal dengan mata uang ISO 4217, bukan float. Skema lengkap permintaan dan respons ada di file OpenAPI.

Spesifikasi OpenAPI (YAML)

Katalog

MetodePathCakupanFungsinya
GET/v1/catalog/platformscatalog:readPlatform yang saat ini memiliki layanan terbit
GET/v1/catalog/servicescatalog:readLayanan dengan harga dalam mata uang dan tingkat Anda; filter berdasarkan platform
GET/v1/catalog/services/{id}catalog:readSatu layanan beserta skema kolomnya

Pesanan

MetodePathCakupanFungsinya
POST/v1/orders/previeworders:writeValidasi dan hitung kuotasi tanpa membuat atau menagih
POST/v1/ordersIdempotency-Key wajiborders:writeBuat pesanan: mendebit dompet prabayar dan mengalihkan ke pemasok terbaik
GET/v1/ordersorders:readDaftar pesanan, terbaru lebih dulu, dengan paginasi cursor
POST/v1/orders/batchIdempotency-Key wajiborders:writeHingga 100 pesanan dalam satu panggilan, masing-masing dengan hasilnya sendiri
GET/v1/orders/{id}orders:readAmbil satu pesanan berdasarkan id
POST/v1/orders/{id}/refillorders:writeMinta isi ulang dalam periode garansi
POST/v1/orders/{id}/cancelorders:writeMinta pembatalan; dikembalikan setelah pemasok mengonfirmasi

Dompet prabayar

MetodePathCakupanFungsinya
GET/v1/wallet/balancewallet:readSaldo per mata uang: tersedia, tunai, bonus, dan ditahan

Aset (penjual)

MetodePathCakupanFungsinya
POST/v1/assetsassets:writeBuat draf listing; tayang setelah verifikasi dan moderasi
GET/v1/assetsassets:readListing Anda
PATCH/v1/assets/{id}assets:writePerbarui listing (body lengkap; If-Match untuk penguncian optimis)
POST/v1/assets/batchassets:writeImpor hingga 1.000 listing, dicocokkan berdasarkan external_ref
POST/v1/assets/{id}/verifyassets:writeMulai (method) atau cek (verification_id) verifikasi kepemilikan
POST/v1/assets/{id}/availabilityassets:writeSembunyikan atau tampilkan listing (tidak saat sedang negosiasi)

Penawaran

MetodePathCakupanFungsinya
GET/v1/offersassets:readPenawaran yang diterima pada listing Anda

Transaksi

MetodePathCakupanFungsinya
POST/v1/transactions/{id}/handofftransactions:writeTandai langkah prosedur, tambahkan item aman, atau selesaikan serah terima
Respons (201)http
HTTP/1.1 201 Created
X-Request-Id: req_<hex>
X-Api-Version: 2026-09-23
RateLimit-Limit: <limit>  RateLimit-Remaining: <n>  RateLimit-Reset: <seconds>

{
  "id": "SMP-7K2Q9XHT",
  "status": "routing",
  "service": "<service_id>",
  "link": "https://instagram.com/p/abc",
  "quantity": 1000,
  "charge": "<decimal>",
  "refunded": "0",
  "currency": "USD",
  "start_count": null,
  "remains": null,
  "delivered": null,
  "refill_until": null,
  "created_at": "2026-09-23T12:00:00.000Z",
  "updated_at": "2026-09-23T12:00:00.000Z"
}

Webhook

Event bertanda tangan, dikirim sampai Anda mengonfirmasinya

Daftarkan endpoint https di host publik dan pilih event yang Anda inginkan. Setiap pengiriman ditandatangani dengan secret endpoint Anda, yang ditampilkan sekali saat endpoint dibuat.

Header pengirimanhttp
POST /webhooks/orders HTTP/1.1
Content-Type: application/json
Webhook-Id: <event id>
Webhook-Timestamp: 1790000000
Webhook-Signature: t=1790000000,v1=<hex HMAC-SHA256(secret, "1790000000.<body>")>

{ "id": "<event id>", "type": "order.partial", "created_at": "2026-09-23T12:05:00.000Z",
  "data": { "orderId": "SMP-7K2Q9XHT", ... } }
Verifikasi di Node.jsjs
import { createHmac, timingSafeEqual } from 'node:crypto';

export function verifyWebhook(secret, headers, rawBody) {
  const t = headers['webhook-timestamp'];
  const v1 = (headers['webhook-signature'] ?? '')
    .split(',').find((p) => p.startsWith('v1='))?.slice(3) ?? '';
  const expected = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
  const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300; // 5 minutes
  return fresh && expected.length === v1.length
    && timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}

Verifikasi tanda tangan

  1. Baca Webhook-Timestamp (t) dan body permintaan mentah persis seperti yang diterima.
  2. Hitung HMAC-SHA256 dengan secret endpoint Anda atas string "t.body".
  3. Bandingkan dengan waktu konstan terhadap nilai v1 pada Webhook-Signature.
  4. Tolak timestamp yang lebih dari 5 menit dan deduplikasi berdasarkan Webhook-Id.
  5. Balas cepat dengan 2xx dan proses pekerjaannya secara asinkron.

Percobaan ulang dan outbox

Event ditulis ke outbox dalam transaksi database yang sama dengan perubahan yang memicunya, jadi tidak ada yang hilang saat pengiriman gagal. Pengiriman yang gagal dicoba lagi setelah 1 menit, 5 menit, 30 menit, 2 jam, 6 jam, 12 jam, dan 24 jam sebelum ditandai sebagai mati.

Event yang dapat Anda langgani

  • order.created
  • order.status_changed
  • order.partial
  • order.completed
  • order.refunded
  • order.refill_updated
  • deposit.confirmed
  • offer.created
  • offer.updated
  • reservation.created
  • transaction.updated
  • payout.updated
  • listing.updated
  • dispute.updated

Aturan endpoint

  • Hanya https://, pada host publik; alamat privat dan internal ditolak.
  • Langgani event tertentu atau semuanya.
  • Secret penandatanganan ditampilkan sekali, saat dibuat.

Kompatibilitas

Tambahkan toko ini ke panel SMM mana pun

POST /api/v2 mengimplementasikan kontrak umum “SMM API v2”: kirim key dan action sebagai field formulir atau JSON. Kunci, cakupan, dan batas permintaan sama dengan /v1; hanya formatnya yang berubah, dan error dikembalikan sebagai { "error": "message" }.

Aksi yang didukung

  • services: katalog dengan rate, min, max, dan penanda isi ulang/pembatalan
  • add: buat pesanan (service, link, quantity, comments, usernames, runs, interval)
  • status: satu pesanan, atau hingga 100 dengan orders=id1,id2
  • balance: saldo tersedia dalam mata uang akun Anda
  • refill: minta isi ulang untuk satu atau beberapa pesanan
  • refill_status: status satu atau beberapa isi ulang
  • cancel: minta pembatalan untuk satu atau beberapa pesanan

Panel tidak mengirim kunci idempotensi, jadi kunci diturunkan dari isi pesanan dan menit saat ini; jendela pesanan ganda menangani sisanya.

Permintaanbash
curl -X POST https://YOUR-DOMAIN/api/v2 \
  -d key=smp_live_xxxxxxxxxx_... \
  -d action=add \
  -d service=<service_id> \
  -d link=https://instagram.com/p/abc \
  -d quantity=1000

{ "order": "SMP-7K2Q9XHT" }

Error

Satu bentuk untuk setiap error

Setiap respons non-2xx memiliki body yang sama. Integrasikan berdasarkan kode, bukan pesan: pesan bisa berubah, kode tidak. request_id juga dikirim sebagai header X-Request-Id.

Isi errorhttp
HTTP/1.1 400 Bad Request
X-Request-Id: req_<hex>

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Invalid request.",
    "details": {
      "fields": [{ "path": "quantity", "message": "..." }]
    }
  },
  "request_id": "req_<hex>"
}
KodeHTTPArti
VALIDATION_ERROR400Body atau header tidak valid; details.fields mencantumkan setiap path dan masalahnya
UNAUTHORIZED401Kunci tidak ada, tidak valid, dicabut, atau kedaluwarsa
INSUFFICIENT_FUNDS402Saldo dompet prabayar tidak cukup untuk kuotasi
FORBIDDEN403Kunci tidak memiliki cakupan, IP tidak diizinkan, sub-pengguna tanpa izin, atau akun ditangguhkan
NOT_FOUND404Pesanan, layanan, atau listing tidak ada untuk akun ini
CONFLICT409Konflik status, misalnya batas kunci aktif
INVALID_TRANSITION409Pesanan atau transaksi tidak dapat berpindah ke status tersebut
DUPLICATE_ORDER409Layanan, link, dan jumlah yang sama dalam jendela pesanan ganda
IDEMPOTENCY_KEY_REUSE409Idempotency-Key sudah dipakai dengan body yang berbeda
ALREADY_RESERVED409Aset sedang dipesan oleh pembeli lain
POLICY_BLOCKED422Layanan atau negara diblokir oleh kebijakan platform
MARGIN_GUARD422Tidak ada pemasok yang bisa melayani pesanan ini dengan harga yang dipublikasikan
UNPROCESSABLE422Permintaan valid, tetapi tidak dapat dipenuhi
RATE_LIMITED429Batas per kunci tercapai; tunggu beberapa detik sesuai Retry-After
INTERNAL500Error tak terduga; hubungi dukungan dengan request_id
PROVIDER_ERROR502Gangguan pemasok; pesanan dicoba ulang atau dana dikembalikan
NO_ROUTE503Tidak ada rute pemasok yang tersedia saat ini; coba lagi nanti
NOT_CONFIGURED503Fitur belum dikonfigurasi di toko ini

Siapa yang bisa menggunakannya

Tersedia di paket Reseller

Kunci API dan endpoint webhook dibuat oleh pemilik akun pada paket Reseller. Pesanan yang dibuat dengan kunci didebit dari dompet prabayar akun dan muncul di dasbor yang sama dengan pesanan manual. Sub-pengguna tidak dapat membuat kunci.

Membangun integrasi reseller dengan API SocialMediaPRO

Baik Anda menjalankan panel yang membutuhkan penyedia yang andal, alat agensi yang memesan untuk klien, atau inventaris penjual yang harus tetap sinkron dengan marketplace, integrasinya mengikuti pola yang sama: kunci dengan cakupan terbatas, penulisan yang idempoten, dan event yang Anda verifikasi sebelum mempercayainya.

Satu kontrak, berversi per tanggal

Setiap endpoint berada di bawah /v1 pada domain etalase yang Anda integrasikan. Respons berformat JSON, jumlah berupa string desimal yang dipasangkan dengan mata uang ISO 4217, dan timestamp mengikuti ISO 8601. Setiap respons membawa header X-Api-Version dengan tanggal kontrak yang sedang Anda gunakan, dan X-Request-Id yang dapat Anda sebutkan ke dukungan. Error selalu memiliki bentuk yang sama: objek error dengan kode yang stabil, pesan yang dapat dibaca, dan detail opsional, bersama request_id.

Berkas OpenAPI 3.1 mendeskripsikan setiap rute, skema, dan kode error. Impor ke klien HTTP atau generator kode Anda, dan Anda akan mendapatkan permintaan bertipe untuk katalog, pesanan, dompet, iklan, penawaran, dan serah terima transaksi.

Kunci, izin, dan akun yang diwakilinya

Kunci dibuat oleh pemilik akun di paket Reseller dan hanya ditampilkan sekali; yang disimpan hanya hash-nya. Saat dibuat, Anda memilih izinnya, daftar IP yang diizinkan opsional (hingga 20 alamat), dan tanggal kedaluwarsa opsional. Rotasi membuat kunci baru dengan izin yang sama dan mencabut yang lama, sehingga Anda dapat mengganti kredensial tanpa gangguan. Pesanan yang dibuat dengan kunci didebitkan dari dompet akun dan muncul di dasbor pesanan yang sama dengan pesanan manual, dengan sumber yang ditandai sebagai API.

Setiap kunci mewarisi batas permintaan per menit dari tingkat klien akun. Header RateLimit-Limit, RateLimit-Remaining, dan RateLimit-Reset menunjukkan posisi Anda; jika batas terlampaui, API merespons 429 dengan header Retry-After, dan reaksi yang benar adalah menunggu tepat selama waktu itu.

Penulisan idempoten dan batch

Pembuatan pesanan adalah satu-satunya panggilan yang menggerakkan uang, jadi dilindungi dua kali. Pertama, header Idempotency-Key wajib: mengulang permintaan dengan kunci yang sama mengembalikan pesanan asli tanpa penagihan kedua, dan menggunakan kembali kunci dengan badan yang berbeda ditolak dengan 409 IDEMPOTENCY_KEY_REUSE. Kedua, jendela anti-duplikat mendeteksi layanan, tautan, dan jumlah yang sama yang dikirim lagi dalam interval singkat tanpa kecocokan kunci, dan mengembalikan 409 DUPLICATE_ORDER.

Batch menerima hingga 100 pesanan per panggilan. Setiap item divalidasi dan didebitkan secara terpisah, diidentifikasi oleh kunci batch ditambah indeksnya, dan respons melaporkan hasil per item, sehingga satu baris yang rusak tidak pernah menghentikan yang lain. Gunakan POST /v1/orders/preview terlebih dahulu saat Anda ingin tahu jumlah penagihan yang tepat dan hasil validasi tanpa membuat apa pun.

  • Buat UUID untuk setiap pesanan logis dan simpan sebelum dikirim.
  • Jika terjadi timeout, kirim ulang dengan kunci yang sama; jangan pernah membuat kunci baru untuk pesanan yang sama.
  • Perlakukan kode 4xx sebagai final, dan kode 5xx serta 429 sebagai dapat dicoba ulang dengan jeda yang semakin lama.

Webhook yang bisa Anda percaya

Setiap perubahan status ditulis ke antrean dalam transaksi database yang sama dengan perubahannya, dan distributor mengirimkannya ke endpoint https Anda dengan tiga header: Webhook-Id, Webhook-Timestamp, dan Webhook-Signature. Tanda tangannya adalah HMAC-SHA256 dari timestamp, titik, dan badan mentah, dihitung dengan secret endpoint yang ditampilkan sekali saat pembuatan. Verifikasi dalam waktu konstan, tolak timestamp yang lebih dari lima menit, dan deduplikasi berdasarkan Webhook-Id, karena event yang dicoba ulang membawa id yang sama.

Pengiriman yang tidak menerima 2xx akan dicoba ulang setelah 1 menit, 5 menit, 30 menit, 2 jam, 6 jam, 12 jam, dan 24 jam, sebelum ditandai gagal secara permanen. Balas dengan cepat dan proses secara asinkron; handler yang lambat adalah penyebab paling umum pemrosesan ganda.

Panel anak melalui endpoint SMM v2

Jika panel Anda sudah menggunakan format "SMM API v2" yang umum, Anda dapat menambahkan etalase ini sebagai penyedia dengan menempelkan URL /api/v2 dan kunci Anda. Tindakan yang didukung adalah services, add, status, balance, refill, refill_status, dan cancel; harga kembali dalam mata uang dan tingkat akun Anda, dan error menggunakan bentuk datar { "error": "pesan" } yang diharapkan panel-panel ini. Idempotensi berasal dari isi pesanan dan menit saat ini, sehingga pengiriman ganda yang tidak disengaja dalam menit yang sama akan digabungkan.

Pertanyaan yang sering diajukan

Paket apa yang saya perlukan untuk menggunakan API?

Paket Reseller. Kunci API dan endpoint webhook dibuat oleh pemilik akun; sub-pengguna tidak dapat membuatnya. Kunci adalah kredensial sisi server dan tidak boleh pernah ditanamkan di browser atau aplikasi mobile.

Bagaimana saya mengautentikasi permintaan?

Kirim kunci sebagai Authorization: Bearer smp_live_… atau di header X-Api-Key. Kunci harus memiliki cakupan yang diminta endpoint, seperti orders:write untuk membuat pesanan atau catalog:read untuk mencantumkan layanan.

Apa yang terjadi jika permintaan saya timeout setelah membuat pesanan?

Kirim ulang dengan Idempotency-Key yang sama. Anda menerima pesanan asli dan tidak ada yang didebitkan dua kali. Jika Anda mengirim badan yang berbeda dengan kunci yang sama, API merespons 409 IDEMPOTENCY_KEY_REUSE.

Bagaimana saya memverifikasi webhook?

Hitung HMAC-SHA256 dengan secret endpoint Anda atas string yang terdiri dari Webhook-Timestamp, titik, dan badan mentah, lalu bandingkan dalam waktu konstan dengan nilai v1 di Webhook-Signature. Tolak timestamp yang lebih dari 5 menit dan deduplikasi berdasarkan Webhook-Id.

Berapa batas permintaannya?

Setiap kunci mewarisi batas permintaan per menit dari tingkat klien Anda, yang ditampilkan di halaman ini. Header RateLimit-* menunjukkan jendela saat ini, dan respons 429 menyertakan Retry-After dalam detik.

Apakah harga di API sama dengan di situs?

Ya. GET /v1/catalog/services mengembalikan harga yang sudah dikonversi ke mata uang akun Anda dengan diskon tingkat Anda, dan POST /v1/orders/preview mengembalikan jumlah penagihan yang tepat, termasuk diskon volume dan kupon, sebelum Anda mengonfirmasi.

Bisakah saya menggunakan API untuk iklan marketplace?

Ya. Dengan cakupan assets:write Anda dapat membuat dan memperbarui iklan, mengimpor hingga 1.000 sekaligus, memulai verifikasi kepemilikan, dan mengubah ketersediaan; assets:read mencantumkan iklan dan penawaran Anda, dan transactions:write mencatat langkah serah terima pada sebuah negosiasi.

Siap berintegrasi?

Di paket Reseller, buat kunci, unduh file OpenAPI, dan kirim pesanan pertama Anda dari sistem Anda sendiri.

Kami tidak pernah menjual ulasan atau penilaian. Beberapa platform membatasi layanan engagement atau pemindahan akun dalam ketentuannya; Anda bertanggung jawab atas aturan setiap platform yang Anda gunakan.