Integrasi API Seller Shopee dan Tokopedia

Foto oleh Zuko.io Images via Wikimedia Commons (CC BY 2.0)
Tidak lagi. Setelah merger, integrasi seller Tokopedia berjalan lewat TikTok Shop Open API dan Tokopedia Partner Center. Anda mendaftar satu aplikasi di sana dan memakai Open API yang sama untuk mengelola aplikasi Tokopedia maupun Shop, bukan endpoint lama khusus Tokopedia yang sudah dipensiunkan.
Access token Shopee Open Platform berumur sekitar 4 jam dan refresh token sekitar 30 hari. Perbarui secara proaktif dengan jadwal alih-alih menunggu panggilan gagal, dan selalu simpan access token baru sekaligus refresh token yang dikembalikan karena refresh token bisa berotasi.
Jaga satu layanan inventory sebagai satu sumber kebenaran. Setiap pesanan mengurangi stok master lebih dulu, lalu antrean menyebarkan kuantitas baru ke setiap channel yang menjual SKU itu. Rekonsiliasi berkala menarik stok yang dilaporkan tiap channel dan mengoreksi selisih terhadap master.
Penyebab paling umum adalah urutan field yang salah pada base string. Panggilan Shopee level toko menandatangani gabungan partner_id, path API, timestamp, access_token, dan shop_id dengan partner_key Anda memakai HMAC-SHA256. Bungkus dalam satu helper yang teruji dan jangan pernah menyusun signature secara inline.
Salurkan tiap panggilan keluar lewat antrean dengan token-bucket limiter per toko. Shopee membatasi panggilan per partner dalam jendela waktu, sedangkan TikTok Shop mengalokasikan kuota dinamis per toko dan mengembalikan HTTP 429 saat berlebih. Gunakan exponential backoff pada 429 dan tarik hanya record yang berubah dengan paginasi cursor.

Foto oleh Zuko.io Images via Wikimedia Commons (CC BY 2.0)
Ringkasan Utama
Berjualan di Shopee dan Tokopedia sekaligus berarti mengintegrasikan dua API seller dengan autentikasi berbeda: Shopee Open Platform memakai signature HMAC-SHA256 dengan access token 4 jam, sedangkan Tokopedia kini berjalan di TikTok Shop Open API dengan token 24 jam. Bangun satu middleware yang memegang stok sebagai satu sumber kebenaran dan mendorong stok ke tiap channel.
Hampir semua seller UKM Indonesia yang saya tangani menjual produk yang sama di Shopee dan Tokopedia, ditambah mungkin toko web mereka sendiri. Begitu dua pesanan untuk unit terakhir masuk berselang detik di marketplace berbeda, terjadi oversell, pembatalan, dan penurunan rating toko. Satu-satunya solusi nyata adalah backend yang memperlakukan database Anda sendiri sebagai kebenaran dan terus merekonsiliasi stok ke tiap channel.
Pada sebuah proyek baru-baru ini saya membangun middleware omnichannel semacam ini. Di bawah adalah bentuk praktis kedua API, bagian yang sering menjebak, dan cara saya menyusun sinkronisasi agar stok tidak pernah melenceng.
Hal terpenting yang harus dipahami sebelum menulis kode: Shopee dan Tokopedia melakukan autentikasi dengan cara yang benar-benar berbeda, dan Tokopedia bukan lagi API tersendiri. Setelah merger, seller Tokopedia dikelola melalui TikTok Shop Open API dan Tokopedia Partner Center. Anda mendaftar satu aplikasi, tetapi kedua integrasi hampir tidak berbagi kode di luar logika bisnis Anda.
Jika Anda mengintegrasikan Tokopedia sebelum migrasi TikTok Shop, endpoint lama khusus Tokopedia sedang dipensiunkan. Toko baru dan data yang baru dibuat hanya bisa diakses lewat TikTok Shop Open API, jadi pastikan enabler atau kode Anda sendiri menyasar versi terkini sebelum meng-onboarding seller.
Kedua platform memakai pola OAuth yang serupa: Anda mengarahkan seller ke halaman otorisasi, mereka menyetujui akses ke toko mereka, dan marketplace mengarahkan balik dengan code berumur pendek. Server Anda menukar code itu menjadi access token dan refresh token. Detailnya berbeda pada cara request ditandatangani.
Untuk Shopee, signature untuk panggilan level toko adalah HMAC-SHA256 dari gabungan partner_id, path API, timestamp, access_token, dan shop_id, dengan kunci partner_key Anda. Salah urutan field dan semua panggilan mengembalikan error signature, jadi saya membungkusnya dalam satu helper dan tidak pernah menyusunnya inline.
// Shopee Open Platform v2 — shop-level request signature
import { createHmac } from "crypto";
function shopeeSign(params: {
partnerId: number;
partnerKey: string;
apiPath: string; // e.g. "/api/v2/product/update_stock"
accessToken: string;
shopId: number;
}): { sign: string; timestamp: number } {
const timestamp = Math.floor(Date.now() / 1000);
const base =
`${params.partnerId}${params.apiPath}${timestamp}` +
`${params.accessToken}${params.shopId}`;
const sign = createHmac("sha256", params.partnerKey)
.update(base)
.digest("hex");
return { sign, timestamp };
}
// Token refresh runs on a schedule, NOT lazily on 401.
// Shopee access_token ~4h, refresh_token ~30d — refresh early,
// persist BOTH returned values, they can rotate.Perbarui token dengan timer, bukan saat request pertama gagal. Dengan token Shopee 4 jam, cron yang memperbarui tiap ~3 jam menjaga Anda jauh dari batas. Selalu simpan access token baru sekaligus refresh token yang dikembalikan, karena refresh token bisa berotasi tiap panggilan.
Ada dua arah sinkronisasi. Masuk: pesanan baru mengalir dari tiap marketplace ke sistem Anda, idealnya lewat push notification atau webhook agar bereaksi dalam hitungan detik, dengan polling terjadwal sebagai jaring pengaman untuk event yang terlewat. Keluar: kapan pun stok berubah karena alasan apa pun, Anda mendorong kuantitas baru ke setiap channel yang mencantumkan SKU itu.
Tabel pemetaan antara SKU internal Anda dan identifier item serta model tiap marketplace adalah jantung sistem. Shopee memisahkan item_id dari model_id (variasinya), dan TikTok Shop memisahkan product_id dari sku_id. Jika pemetaan itu salah, Anda memperbarui varian yang keliru dan diam-diam oversell ukuran populer sementara ukuran kurang laku menampilkan stok hantu.
Pembuatan produk adalah bagian paling berat skema di kedua API. Tiap marketplace menerapkan pohon kategori sendiri, atribut wajib per kategori, aturan gambar, dan opsi logistik. Saya tidak mencoba membangun model produk lowest-common-denominator. Sebaliknya saya menyimpan produk internal yang kaya dan menulis adapter per channel yang memetakannya ke persyaratan kategori dan atribut persis tiap marketplace.
Rate limit adalah tempat integrasi naif tumbang. Shopee membatasi panggilan per partner dalam jendela waktu; TikTok Shop mengalokasikan kuota secara dinamis per toko per aplikasi dan mengembalikan HTTP 429 saat Anda melampauinya. Keduanya jauh lebih toleran jika Anda melakukan batch, backoff, dan paginasi dengan benar ketimbang menggempur. Salurkan tiap panggilan keluar lewat antrean dengan token-bucket limiter per toko, dan hormati 429 dengan exponential backoff.
Saat menarik katalog besar, utamakan paginasi berbasis cursor dan tarik hanya yang berubah sejak sinkronisasi terakhir memakai filter waktu update. Penarikan ulang katalog penuh adalah cara tercepat menghabiskan jatah rate limit dan paling lambat selesai.
Arsitektur yang tidak pernah mengecewakan saya sengaja dibuat membosankan: satu layanan inventory memegang kuantitas master, dan marketplace adalah konsumen hilir, bukan penulis, dari angka itu. Setiap perubahan stok, entah dari penjualan, retur, edit manual, atau stock opname gudang, memperbarui master lebih dulu lalu disebar ke channel lewat antrean.
| Aspek | Shopee Open Platform | Tokopedia (TikTok Shop API) |
|---|---|---|
| Kredensial | partner_id + partner_key | app_key + app_secret |
| Penandatanganan request | sign HMAC-SHA256 + timestamp | parameter sign sesuai dokumentasi |
| Umur access token | Sekitar 4 jam | Sekitar 24 jam |
| Umur refresh token | Sekitar 30 hari | Hingga 365 hari |
| Pembatasan laju | Jendela waktu per partner | QPS dinamis per toko, 429 saat berlebih |
| Identitas varian | item_id + model_id | product_id + sku_id |
Dengan itu terpasang, menambah channel ketiga nanti — Lazada, TikTok Shop mandiri, toko Anda sendiri — hanyalah adapter lain dan baris lain di tabel pemetaan SKU. Logika inti inventory tidak pernah berubah, dan itulah persis yang Anda inginkan ketika marketplace-nya sendiri terus berubah di bawah Anda.