tgpay cryptoAPI
crypto-payapisubscriptionsrecurring

Referensi API: langganan

Baca 2 menitDiperbarui 22 Agu 2026

Penagihan berulang — ekstensi di luar Crypto Bot. Kamu membuat paket (jumlah + periode), mengirim link persetujuannya ke pengguna, lalu platform menagih mereka dari saldo dompetnya tiap periode dan menambahkan hasilnya ke saldo aplikasimu setelah dipotong biaya. Konvensi umumnya ada di halaman Referensi Merchant API.

Model penagihan

Paket adalah snapshot yang tidak bisa diubah: mandat yang disetujui pengguna persis sebesar jumlah ini untuk periode ini. Untuk mengubah harga, buat paket baru lalu arsipkan yang lama — langganan yang sudah berjalan tetap diperpanjang dengan ketentuan yang mereka setujui. Periode pertama ditagih saat persetujuan.

Perpanjangan ditagih otomatis di akhir tiap periode. Kalau perpanjangan gagal (saldo tidak cukup, akun dibatasi), langganannya masuk status grace dan platform mencoba lagi tiap jam selama masa tenggang (saat ini 48 jam); kalau tetap tidak tertagih, langganannya jadi expired. Di sisi merchant, current_period_end adalah batas akhir aksesnya.

Setiap event siklus hidup punya webhook opsional yang perlu kamu aktifkan dulu: subscription_activated, subscription_charged, subscription_cancelled, subscription_expired.

createSubscriptionPlan

POST /pay/api/createSubscriptionPlan — scope subscriptions.

ParameterTipeWajibKeterangan
namestringya1–64 karakter, ditampilkan ke pelanggan
assetstringyakode aset
amountstringyajumlah yang ditagih tiap periode, string desimal positif
period_daysintegeryaperiode penagihan dalam hari, dari minimum platform (saat ini 7) sampai 365

Hasilnya adalah objek paket: plan_id, name, asset, amount, amount_minor, period_days, archived, mini_app_subscribe_url — link t.me yang kamu kirim ke pengguna untuk disetujui — dan created_at.

Error: 404 unknown_asset, 400 invalid_amount, 409 invalid_period, 503 subs_disabled (fiturnya dimatikan dari sisi platform).

getSubscriptionPlans

GET /pay/api/getSubscriptionPlans — scope read, tanpa parameter. Mengembalikan {"items": [plan, …]}, diurutkan dari yang terbaru, masing-masing dengan satu field tambahan: active_subscribers — banyaknya langganan yang masih berjalan (active + grace) di paket itu.

archiveSubscriptionPlan

POST /pay/api/archiveSubscriptionPlan — scope subscriptions. Satu parameter: plan_id. Menghentikan persetujuan baru; langganan yang sudah ada tetap diperpanjang dengan snapshot-nya (hentikan satu per satu pakai cancelSubscription). Pengarsipan tidak bisa dibatalkan lewat API. Hasilnya adalah objek paket terbaru dengan archived: true. Error: 404 plan_not_found.

getSubscriptions

GET /pay/api/getSubscriptions — scope read. Filter: plan_id, user_id, status (active / grace / cancelled / expired), plus offset / count (maksimal 500). Mengembalikan {"items": [subscription, …]}, diurutkan dari yang terbaru.

Objek langganan: subscription_id, plan_id, user_id (ID Telegram pelanggan), ketentuan snapshot-nya (asset, amount, amount_minor, period_days), status, auto_renew, period_no (periode yang sudah dibayar sejauh ini), current_period_start / current_period_end, created_at, cancelled_at, cancelled_by (user atau merchant), expired_at.

cancelSubscription

POST /pay/api/cancelSubscription — scope subscriptions. Satu parameter: subscription_id. Menghentikan perpanjangan (cancelled_by: "merchant"); periode yang sudah dibayar tetap bisa dipakai sampai current_period_end, statusnya langsung berubah jadi cancelled, dan pelanggannya diberi tahu. Pelanggan yang langganannya dibatalkan bisa menyetujui lagi nanti lewat link paket yang sama. Hasilnya adalah objek langganan terbaru.

Error: 404 sub_not_found, 409 sub_not_active (sudah dibatalkan atau berakhir).