Langsung ke konten utama

Documentation Index

Fetch the complete documentation index at: https://docs.scalev.com/llms.txt

Use this file to discover all available pages before exploring further.

Halaman Scalev HTML Mode dapat memakai window.Scalev dari JavaScript browser. Runtime ini memberi akses ke konteks halaman yang aman, Store Context terpilih, helper checkout, analytics forwarding, helper prefill form, dan diagnostics tanpa mengekspos token API privat. Halaman ini ditulis untuk developer dan AI agent yang membuat file HTML Mode. Jika kamu membuat file HTML untuk Scalev, gunakan referensi ini dan jangan memanggil URL privat Scalev secara langsung.

Ketersediaan

Runtime tersedia di halaman HTML Mode yang sudah dirender. Di preview editor lokal, beberapa method dapat mengembalikan data preview. Selalu cek runtime sebelum dipakai:
const scalev = window.Scalev;

if (!scalev) {
  // Render fallback content atau pastikan halaman tetap bisa digunakan.
}
Sebagian besar method bersifat asynchronous dan mengembalikan Promise. Scalev.data.get() dan Scalev.diagnostics.get() bersifat synchronous.

Store Context

Halaman HTML Mode bisa memiliki Store Context atau tidak. Jika Store Context dipilih, Scalev.data.get().store berisi ringkasan store, produk terpilih, dan bundle price options terpilih saja. Data ini bukan seluruh katalog store. Jika Store Context belum dipilih, store tidak tersedia. Jangan membuat checkout, payment, shipping, diskon, katalog produk, cart, atau flow pembuatan order. Perlakukan halaman sebagai landing page biasa dan gunakan hanya method aman seperti Scalev.data.get(), Scalev.analytics.track(), dan Scalev.prefill.get().

Aturan keamanan

  • Jangan meminta atau menyimpan API key, business-user JWT, storefront API key, customer token, cookie, atau kredensial.
  • Jangan memanggil URL privat Scalev atau private API langsung dari JavaScript halaman.
  • Gunakan hanya method window.Scalev yang terdokumentasi.
  • Buat order hanya setelah pengunjung sengaja submit form.
  • Panggil Scalev.checkout.validateOrder() sebelum Scalev.checkout.createOrder().
  • Jangan mengasumsikan produk, bundle, harga, stok, payment method, opsi pengiriman, atau identitas customer yang tidak tersedia.

Scalev.data.get()

Mengembalikan data publik halaman yang diinject ke halaman.
const data = Scalev.data.get();
Bentuk respons:
{
  "page": {
    "id": 1,
    "uniqueId": "page_uid",
    "username": "brand"
  },
  "store": null
}
Dengan Store Context, store berisi konteks terpilih saja:
{
  "page": {
    "id": 1,
    "uniqueId": "page_uid",
    "username": "brand"
  },
  "store": {
    "id": 1,
    "unique_id": "store_uid",
    "name": "Main Store",
    "payment_methods": ["bank_transfer", "cod"],
    "sub_payment_methods": [],
    "products": [
      {
        "id": 1,
        "name": "Product",
        "variants": [
          {
            "id": 10,
            "unique_id": "variant_uid",
            "name": "Default",
            "price": 99000,
            "available_qty": 12
          }
        ]
      }
    ],
    "bundle_price_options": [
      {
        "id": 20,
        "unique_id": "bundle_option_uid",
        "name": "Bundle",
        "price": 179000
      }
    ]
  }
}
Gunakan data ini untuk render produk terpilih, bundle option, payment methods aktif, dan form yang memakai store. Jangan mengasumsikan produk, bundle, atau payment method yang tidak ada di payload ini. store.payment_methods berisi payment methods aktif setelah Scalev memfilter pengaturan store berdasarkan kapabilitas payment bisnis. Gunakan store.sub_payment_methods untuk submethod VA atau bank yang aktif saat tersedia.

Method lokasi

Gunakan method ini untuk form alamat dan pengiriman.
const provinces = await Scalev.location.provinces();
const cities = await Scalev.location.cities(provinceId);
const subdistricts = await Scalev.location.subdistricts(cityId);
const postalCodes = await Scalev.location.postalCodes(subdistrictId);
provinces, cities, dan subdistricts menerima query object opsional:
const provinces = await Scalev.location.provinces({ q: "Jawa" });
const cities = await Scalev.location.cities(provinceId, { q: "Bandung" });
const subdistricts = await Scalev.location.subdistricts(cityId, {
  q: "Coblong",
});
Gunakan ID dari step sebelumnya. Jangan hardcode location ID kecuali user memberikannya secara eksplisit.

Scalev.checkout.validateDiscount(payload)

Memvalidasi kode diskon untuk payload checkout.
const store = Scalev.data.get().store;

const result = await Scalev.checkout.validateDiscount({
  code: "PROMO10",
  grossRevenue: 179000,
  netProductPrice: 179000,
  shippingCost: 0,
  paymentMethod: store.sub_payment_methods?.[0] || "bank_transfer",
});
Nama field dapat memakai camelCase atau snake_case:
  • code
  • grossRevenue atau gross_revenue
  • netProductPrice atau net_product_price
  • shippingCost atau shipping_cost
  • pageUniqueId atau page_unique_id
  • paymentMethod atau payment_method
  • domain
pageUniqueId otomatis memakai halaman saat ini, dan domain otomatis memakai hostname saat ini. Value payment dinormalisasi sebelum request: value BT_* menjadi bank_transfer, dan value yang ada di store.sub_payment_methods menjadi va. Gunakan hanya untuk flow checkout yang terhubung dengan store.

Scalev.checkout.searchWarehouses(payload)

Mengembalikan opsi warehouse untuk variant dan tujuan terpilih.
const data = Scalev.data.get();
const firstVariant = data.store.products[0].variants[0];

const warehouses = await Scalev.checkout.searchWarehouses({
  destinationSubdistrictId: selectedSubdistrictId,
  ordervariants: [{ variant_unique_id: firstVariant.unique_id, quantity: 1 }],
});
Nama field yang diterima:
  • storeId, store_id, atau store; jika tidak dikirim, runtime memakai Store Context terpilih.
  • destinationSubdistrictId, destination_subdistrict_id, subdistrictId, subdistrict_id, destinationId, destination_id, destination, locationId, location_id, atau location
  • variants, orderVariants, atau ordervariants: array { variantId | variant_id | id | variant_unique_id | variantUniqueId | unique_id | uniqueId, qty | quantity }
  • orderId, order_id, atau order untuk flow order yang sudah ada
Gunakan variant terpilih dari Scalev.data.get().store.products. Kamu boleh mengirim value publik variant_unique_id; runtime akan mencocokkannya ke numeric variant_id yang dibutuhkan endpoint warehouse landing page lama.

Scalev.checkout.searchCouriers(payload)

Mengembalikan opsi courier service untuk store, tujuan, warehouse, dan payment method.
const firstWarehouse = warehouses.data?.[0] || warehouses[0];

const couriers = await Scalev.checkout.searchCouriers({
  paymentMethod: "cod",
  destinationSubdistrictId: selectedSubdistrictId,
  warehouse: firstWarehouse,
  weight: 1200,
});
Nama field yang diterima:
  • storeId, store_id, atau store; jika tidak dikirim, runtime memakai Store Context terpilih.
  • paymentMethod atau payment_method
  • destinationSubdistrictId, destination_subdistrict_id, subdistrictId, subdistrict_id, locationId, location_id, destinationId, destination_id, destination, atau location
  • warehouseId, warehouse_id, atau warehouse. Kamu bisa mengirim object warehouse dari hasil searchWarehouses.
  • weight
Gunakan method ini setelah pengunjung memilih produk dan tujuan pengiriman. Backend membutuhkan numeric warehouse_id; runtime mengambil id itu dari object warehouse jika memungkinkan.

Scalev.checkout.validateOrder(payload)

Memvalidasi bentuk payload order tanpa membuat order.
const data = Scalev.data.get();
const store = data.store;
const firstVariant = store.products[0].variants[0];

const validation = await Scalev.checkout.validateOrder({
  page: data.page.uniqueId,
  store: store.unique_id,
  customerName: "Customer Name",
  customerPhone: "08123456789",
  customerEmail: "customer@example.com",
  address: "Customer address",
  location: 12345,
  ordervariants: [{ variant_unique_id: firstVariant.unique_id, quantity: 1 }],
  paymentMethod: store.payment_methods[0] || "bank_transfer",
});
Bentuk respons:
{
  "valid": true,
  "normalized_payload": {
    "page_unique_id": "page_uid",
    "store_unique_id": "store_uid",
    "customer_name": "Customer Name",
    "customer_phone": "08123456789"
  },
  "warnings": []
}
Jika valid bernilai false, baca warnings dan perbaiki payload form sebelum membuat order. Warning umum mencakup page id, store id, nama customer, nomor customer, atau item order yang belum ada.

Scalev.checkout.createOrder(payload)

Membuat public order sungguhan. Panggil method ini hanya setelah pengunjung sengaja submit form dan validateOrder lolos.
async function submitOrder() {
  const data = Scalev.data.get();
  const store = data.store;
  const firstVariant = store.products[0].variants[0];

  const payload = {
    page: data.page.uniqueId,
    store: store.unique_id,
    customerName: "Customer Name",
    customerPhone: "08123456789",
    customerEmail: "customer@example.com",
    address: "Customer address",
    location: 12345,
    ordervariants: [{ variant_unique_id: firstVariant.unique_id, quantity: 1 }],
    paymentMethod: store.payment_methods[0] || "bank_transfer",
  };

  const validation = await Scalev.checkout.validateOrder(payload);
  if (!validation.valid) {
    return showValidationWarnings(validation.warnings);
  }

  const order = await Scalev.checkout.createOrder(payload);
  return order;
}
createOrder menerima key payload publik yang sama dengan flow checkout regular editor Scalev. Runtime menormalisasi payload sebelum mengirim request order:
  • Customer fields: customerName, customerPhone, customerEmail, name, phone, address
  • Store dan page fields: store, page, plus alias seperti storeUniqueId, store_unique_id, pageUniqueId, dan page_unique_id
  • Lokasi dan shipping fields: location, destinationSubdistrictId, subdistrictId, postalCode, shippingOrigin, courierService, shippingCost, dan courierAggregator
  • Payment fields: paymentMethod, financialEntityId, paymentAccount, paymentAccountHolder, paymentAccountNumber, dan subPaymentMethod
  • Item fields: ordervariants dengan { variant_unique_id, quantity }, orderbundles dengan { bundle_price_option_unique_id, quantity }, atau legacy orderlines
  • Diskon dan pricing fields: discountCodeCode, productDiscount, shippingCost, shippingDiscount
Gunakan value unique_id dari Scalev.data.get().store; jangan mengirim id numerik produk, variant, atau bundle sebagai identifier item order. Seperti helper diskon dan shipping, value payment dinormalisasi sebelum request. Value BT_* dikirim sebagai bank_transfer; submethod VA atau bank yang aktif di store.sub_payment_methods dikirim sebagai payment_method: "va" dengan submethod terpilih. Jangan membuat order otomatis saat halaman dibuka. Setelah createOrder berhasil, pilih redirect setelah order sendiri. Runtime hanya membuat order; runtime tidak menjalankan pengaturan Builder After Submit Event untuk kamu. Lihat Aksi setelah order HTML Mode.

Scalev.analytics.track(providerOrPayload, payload?)

Meneruskan event analytics yang sudah dikonfigurasi melalui Scalev.
await Scalev.analytics.track("facebook", {
  firstName: "Customer",
  phone: "08123456789",
  variants: [{ unique_id: "variant_uid", quantity: 1, price: 179000 }],
  events: [
    {
      event_name: "Lead",
      parameters: { value: 179000, currency: "IDR" },
    },
  ],
});
Kamu juga bisa mengirim satu object:
await Scalev.analytics.track({
  provider: "tiktok",
  payload: {
    events: [
      {
        event: "CompletePayment",
        parameters: { value: 179000, currency: "IDR" },
      },
    ],
  },
});
Nama provider yang didukung:
  • fb
  • facebook
  • tiktok
  • kwai
Runtime meneruskan shape payload analytics Scalev lama untuk setiap provider. Runtime menambahkan page id saat ini, event source URL, referrer, dan attribution aman dari cookie browser atau URL parameter saat tersedia. Untuk event Facebook dan TikTok, event_id dibuat otomatis jika tidak dikirim. Untuk atribusi produk, kirim variants, orderVariants, atau ordervariants dengan variant_unique_id / unique_id, dan bundlePriceOptions, bundle_price_options, atau orderbundles dengan bundle_price_option_unique_id / unique_id. Track hanya event yang sesuai dengan interaksi halaman. Jangan mengirim kredensial atau customer token privat dalam payload analytics.

Scalev.prefill.get()

Membaca data prefill form yang aman dan tersimpan di browser.
const prefill = await Scalev.prefill.get();
const formData = prefill.data || {};
Bentuk respons:
{
  "data": {
    "customerName": "Customer Name",
    "customerPhone": "08123456789"
  }
}
Gunakan ini untuk mengisi ulang field form. Anggap semua value opsional.

Scalev.prefill.save(form, metadata?)

Menyimpan data prefill form yang aman untuk kunjungan berikutnya.
await Scalev.prefill.save(
  {
    customerName: "Customer Name",
    customerPhone: "08123456789",
  },
  {
    source: "html_mode",
  },
);
Simpan hanya value form biasa yang aman untuk diingat. Jangan menyimpan password, token, rahasia pembayaran, atau kredensial privat.

Scalev.customer.prefill()

Mengembalikan profil customer termediasi saat pengunjung memiliki sesi customer storefront aktif. Jika sesi customer tidak tersedia, atau lookup customer gagal, method ini mengembalikan null.
const customer = await Scalev.customer.prefill();

if (customer) {
  // Gunakan data customer mediated.
}
Runtime memanggil endpoint lokal Scalev supaya token customer tetap berada di server. Selalu handle null.

Scalev.diagnostics.get()

Mengembalikan diagnostics runtime terbaru untuk debugging.
const diagnostics = Scalev.diagnostics.get();
Diagnostics dapat mencakup request runtime yang gagal dan, saat ?agent_debug=1 aktif, warning visual seperti horizontal overflow atau form control yang terlihat tetapi belum memiliki label. Jangan membuat logika customer-facing dari diagnostics; gunakan hanya untuk debugging dan QA.

Contoh minimal tanpa store

Gunakan pola ini saat Store Context belum dipilih:
<script>
  async function init() {
    const scalev = window.Scalev;
    const data = scalev?.data?.get
      ? scalev.data.get()
      : { page: {}, store: null };
    const prefill = scalev?.prefill?.get
      ? await scalev.prefill.get()
      : { data: {} };

    document.querySelector("[name='name']").value =
      prefill.data?.customerName || "";

    document.querySelector("form").addEventListener("submit", async (event) => {
      event.preventDefault();
      const form = Object.fromEntries(new FormData(event.currentTarget));
      await scalev?.prefill?.save?.(form, { source: "lead_form" });
    });
  }

  init();
</script>

Contoh minimal checkout store

Gunakan pola ini hanya saat Store Context dipilih:
<script>
  async function submitOrder(event) {
    event.preventDefault();

    const scalev = window.Scalev;
    const data = scalev.data.get();
    const store = data.store;
    const firstProduct = store.products[0];
    const firstVariant = firstProduct.variants[0];

    const payload = {
      page: data.page.uniqueId,
      store: store.unique_id,
      customerName: event.currentTarget.elements.customerName.value,
      customerPhone: event.currentTarget.elements.customerPhone.value,
      ordervariants: [
        { variant_unique_id: firstVariant.unique_id, quantity: 1 },
      ],
      paymentMethod: store.payment_methods[0] || "bank_transfer",
    };

    const validation = await scalev.checkout.validateOrder(payload);
    if (!validation.valid) {
      console.warn(validation.warnings);
      return;
    }

    const order = await scalev.checkout.createOrder(payload);
    console.log(order);
  }
</script>