LinkCash.id Partner API

API untuk mitra yang membangun aplikasi cashback sendiri di atas LinkCash.id. Dipanggil dari server mitra (bukan dari aplikasi/peramban pengguna), berformat JSON lewat HTTPS.

Mulai

  1. Minta akses ke pengelola LinkCash.id dengan menyertakan: alamat website/aplikasimu, IP publik server, dan URL callback (boleh menyusul).
  2. Kamu menerima API key (hanya diberikan sekali — simpan di variabel lingkungan server) dan secret callback.
  3. Uji sambungan dengan GET /ping.

Base URL:

https://api.linkcash.id/v1
curl https://api.linkcash.id/v1/ping -H "Authorization: Bearer $LINKCASH_API_KEY"

Postman: Import → pilih berkas openapi.yaml → di tab Authorization koleksinya pilih Bearer Token dan isi API key. Ingat: permintaan hanya diterima dari IP terdaftar, jadi daftarkan juga IP tempat kamu menjalankan Postman.

Alur integrasi

  1. Tampilkan toko (GET /merchants) dan/atau produk (GET /products) di aplikasimu.
  2. Saat user memilih, servermu memanggil POST /links dengan user_id milikmu → dapat link https://linkcash.id/go/….
  3. Arahkan user ke link itu tepat sebelum belanja. User belanja dan membayar seperti biasa di tokonya.
  4. Transaksi tercatat (umumnya 1–2 hari) berstatus pending → kamu menerima callback, atau menariknya lewat GET /conversions.
  5. Setelah toko memvalidasi pesanan (umumnya 30–60 hari) status menjadi approved, lalu paid setelah dibayarkan ke mitra. Pesanan batal/retur menjadi rejected.

Satu tingkat. Pendapatan dihitung per transaksi untuk akun mitra (earning). Pembagian ke user — termasuk skema referral/berjenjang apa pun — sepenuhnya diatur di sistemmu sendiri.

Autentikasi & batas

Authorization: Bearer lc_live_xxxxxxxxxxxxxxxxxxxxxxxx

Error

{ "error": { "code": "unsupported_url", "message": "Link ini bukan dari toko yang didukung. Lihat GET /merchants." } }

Andalkan code di programmu; message bisa berubah.

HTTPcodeArti
400invalid_requestParameter/body salah atau kurang.
401unauthorizedHeader Authorization tidak ada, atau key tidak dikenali.
403client_disabled · ip_not_allowedAkun dinonaktifkan · IP belum didaftarkan.
404not_found · merchant_not_found · product_not_foundAlamat/transaksi, toko, atau produk tidak ada.
422unsupported_urlLink bukan dari toko yang didukung.
422product_not_eligibleProduk itu tidak ikut program komisi tokonya — minta user memilih produk lain.
422url_requiredToko ini hanya mendukung link per produk; kirim url.
422callback_not_setURL callback belum didaftarkan.
429rate_limited · too_many_failed_attemptsLihat header Retry-After.
503merchant_unavailable · temporarily_unavailable · maintenanceSementara; coba lagi nanti.
500server_errorKesalahan di sisi kami.

GET/merchants

Daftar toko yang bisa dibuatkan link.

{ "data": [ {
  "slug": "traveloka", "name": "Traveloka", "category": "Travel",
  "homepage": "https://www.traveloka.com", "logo": "https://…/traveloka.svg",
  "rate_text": "s/d 6%", "max_rate_pct": 6,
  "store_link": true, "product_link": false
} ] }

GET/products

Katalog produk yang bisa dicari. Parameter: q (kata kunci; kosong = produk pilihan), page (1–200), limit (1–50, bawaan 20).

{ "data": [ {
  "product_id": 555, "name": "Sepatu Lari", "image": "https://…jpg",
  "price": 200000, "original_price": 250000, "platform": "tokopedia",
  "category": "Olahraga", "shop_name": "",
  "est_rate_pct": 1.5, "est_earning": 3000
} ], "page": 1, "has_more": false }

Buat link-nya dengan product_id. Katalog diperbarui tiap hari — jangan menyimpan product_id terlalu lama.

Membuat link cashback untuk satu user. Body JSON berisi user_id dan tepat satu dari:

FieldDipakai saat
merchantUser membuka toko (slug dari GET /merchants yang store_link-nya true).
urlUser menempel link produk yang disalin dari aplikasi toko. Boleh berupa teks "Bagikan" utuh — link-nya dicari otomatis.
product_idUser memilih produk dari GET /products.
curl -X POST https://api.linkcash.id/v1/links \
  -H "Authorization: Bearer $LINKCASH_API_KEY" -H "Content-Type: application/json" \
  -d '{"user_id":"u-1001","merchant":"traveloka"}'
{ "code": "k3m9x2p7qa", "url": "https://linkcash.id/go/k3m9x2p7qa",
  "merchant": "traveloka", "scope": "store", "user_id": "u-1001",
  "clicks": 0, "created_at": "2026-09-20T09:00:00Z" }

GET/conversions

Transaksi akunmu, terbaru lebih dulu. Filter: status, user_id, updated_since (RFC 3339), limit (1–200, bawaan 50), cursor.

{ "data": [ {
  "id": "trx_1024", "user_id": "u-1001", "merchant": "Traveloka", "order_id": "ORD-778812",
  "amount": 200000, "commission_pct": 50, "earning": 5000, "status": "pending",
  "created_at": "2026-09-20T09:00:00Z", "updated_at": "2026-09-20T09:00:00Z"
} ], "next_cursor": "1023" }

GET/balance

{ "currency": "IDR", "commission_pct": 50,
  "earning": { "pending": 12500, "approved": 40000, "paid": 150000, "rejected": 3000 } }

Callback

Kalau URL callback didaftarkan (wajib https://, alamat publik), kami mengirim POST JSON ke sana saat transaksimu tercatat (conversion.created) dan saat status/nilainya berubah (conversion.updated). Isi data sama persis dengan objek transaksi di atas.

POST /linkcash/callback
Content-Type: application/json
X-LinkCash-Event: conversion.updated
X-LinkCash-Timestamp: 1790000000
X-LinkCash-Signature: sha256=5f2b…

{ "event": "conversion.updated", "created_at": "2026-10-25T03:00:00Z", "data": { "id": "trx_1024", "status": "approved", … } }

Wajib: verifikasi tanda tangan

Tanpa ini siapa pun yang tahu URL-mu bisa mengirim transaksi palsu. Rumusnya: HMAC-SHA256(secret, timestamp + "." + body_mentah), heksadesimal, diawali sha256=. Pakai body mentah (sebelum di-parse), bandingkan dengan fungsi aman-waktu, dan tolak kalau selisih timestamp lebih dari 5 menit.

// PHP
$body = file_get_contents('php://input');
$ts   = $_SERVER['HTTP_X_LINKCASH_TIMESTAMP'] ?? '';
$sig  = $_SERVER['HTTP_X_LINKCASH_SIGNATURE'] ?? '';
$mau  = 'sha256=' . hash_hmac('sha256', $ts . '.' . $body, getenv('LINKCASH_CALLBACK_SECRET'));
if (!hash_equals($mau, $sig) || abs(time() - (int)$ts) > 300) { http_response_code(401); exit; }
$event = json_decode($body, true);   // aman diproses
http_response_code(204);
// Node.js (Express) — pastikan body mentah tersedia: express.raw({ type: 'application/json' })
const crypto = require('crypto');
app.post('/linkcash/callback', express.raw({ type: 'application/json' }), (req, res) => {
  const ts = req.get('X-LinkCash-Timestamp') || '', sig = req.get('X-LinkCash-Signature') || '';
  const mau = 'sha256=' + crypto.createHmac('sha256', process.env.LINKCASH_CALLBACK_SECRET)
    .update(ts + '.').update(req.body).digest('hex');
  const sah = sig.length === mau.length && crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(mau));
  if (!sah || Math.abs(Date.now() / 1000 - Number(ts)) > 300) return res.sendStatus(401);
  const event = JSON.parse(req.body);  // aman diproses
  res.sendStatus(204);
});

POST/callback/test

Mengirim event ping ke URL callback-mu saat itu juga dan melaporkan hasilnya — untuk menguji penerima dan verifikasi tanda tanganmu tanpa menunggu transaksi sungguhan.

{ "delivered": true, "url": "https://api.mitra.com/linkcash/callback", "http_status": 204 }