Public API · No Key Required

Dokumentasi API Kebijakan

Ambil tata tertib XyCloud dan tampilkan di website mana pun. Gratis, open source, lisensi MIT.

Izin Pemakaian

API ini terbuka untuk umum dan boleh dipakai komunitas lain. Dua syaratnya:

Minta Izin ke Admin Source Code

Base URL

https://rules.xyc.my.id

Tanpa autentikasi. Tanpa rate limit keras. CORS dibuka untuk semua origin (*), jadi bisa dipanggil langsung dari browser.

Endpoint

MethodPathKeterangan
GET/api/policySeluruh kebijakan dalam JSON
GET/api/policy?format=indexDaftar section saja (ringan)
GET/api/policy?section=promosiSatu section spesifik
GET/api/healthStatus service & daftar endpoint
GET/embed.jsWidget kebijakan siap tempel
GET/gate.jsPopup persetujuan buat link bio
POST/api/feedbackKirim masukan ke email admin

Query Parameter

ParamNilaiDefaultFungsi
formatjson, html, markdown, text, indexjsonFormat output
sectionid atau nomor sectionsemuaFilter satu section
versionpublic, internalpublicVarian bahasa
pretty10JSON diformat rapi

ID Section

keluar-masuk · kelakuan · promosi · transaksi · ketipu · ngeyel · larangan · sanksi · saluran · privasi · admin

Contoh Respons

GET /api/policy?section=promosi&pretty=1

{
  "ok": true,
  "meta": {
    "name": "XyCloud | Official",
    "version": "2.0.0",
    "updated": "2026-09-01",
    "license": "MIT",
    "attribution": "Wajib cantumkan kredit ke https://rules.xyc.my.id"
  },
  "sections": [
    {
      "number": 3,
      "id": "promosi",
      "title": "Aturan Promosi",
      "subtitle": "Ini yang paling sering dilanggar. Baca pelan-pelan.",
      "items": [
        { "type": "prohibited", "text": "Promosi apa pun WAJIB izin admin dulu..." },
        { "type": "allowed",    "text": "Promosi yang diizinkan maksimal 1 kali per hari..." }
      ],
      "note": { "level": "strict", "text": "Admin punya hak penuh buat hapus promo lu..." }
    }
  ]
}

Cara Pakai

1. Widget instan (paling gampang)

<div id="xyc-policy"></div>
<script src="https://rules.xyc.my.id/embed.js" defer></script>

Opsi tambahan lewat atribut data-*:

<script src="https://rules.xyc.my.id/embed.js"
        data-target="#kebijakan"
        data-theme="dark"
        data-section="promosi"
        data-accent="#00ff88"
        defer></script>
AtributNilaiDefault
data-targetCSS selector#xyc-policy
data-themelight, dark, autoauto
data-sectionid sectionsemua
data-accentwarna CSS#25d366
data-credittrue, falsetrue

Widget memancarkan event xyc:policy:loaded setelah selesai render.

2. JavaScript / Fetch

const res  = await fetch('https://rules.xyc.my.id/api/policy');
const data = await res.json();

data.sections.forEach(s => {
  console.log(`${s.number}. ${s.title} (${s.items.length} poin)`);
});

3. React

import { useEffect, useState } from 'react';

export function Kebijakan() {
  const [p, setP] = useState(null);
  useEffect(() => {
    fetch('https://rules.xyc.my.id/api/policy')
      .then(r => r.json()).then(setP);
  }, []);
  if (!p) return <p>Memuat...</p>;
  return (
    <div>
      <h1>{p.meta.title}</h1>
      {p.sections.map(s => (
        <section key={s.id}>
          <h2>{s.number}. {s.title}</h2>
          <ul>{s.items.map((i, n) => <li key={n}>{i.text}</li>)}</ul>
        </section>
      ))}
      <a href={p.meta.url}>Sumber: {p.meta.domain}</a>
    </div>
  );
}

4. PHP

$json = file_get_contents('https://rules.xyc.my.id/api/policy');
$data = json_decode($json, true);
foreach ($data['sections'] as $s) {
    echo "<h2>{$s['number']}. {$s['title']}</h2>";
}

5. Bot WhatsApp / Telegram

# Kirim satu section sebagai teks polos ke chat
curl -s "https://rules.xyc.my.id/api/policy?section=ketipu&format=text"

# Versi Markdown untuk bot Telegram
curl -s "https://rules.xyc.my.id/api/policy?format=markdown"

6. Tempel HTML langsung (server side)

curl -s "https://rules.xyc.my.id/api/policy?format=html" > kebijakan.html
Output format=html memakai class ber-prefix xyc- tanpa CSS bawaan, jadi lu bebas styling sendiri biar nyatu sama tema web lu.

Gate Popup — Wajib Baca Sebelum Lanjut

Fitur andalan. Pasang di link bio atau website lu: begitu orang pencet link WhatsApp, kebijakan muncul dulu sebagai popup. Tombol Setuju baru nyala setelah discroll sampai bawah, dan link-nya baru kebuka setelah dipencet.

Coba Demo Langsung

Pemakaian dasar

<script src="https://rules.xyc.my.id/gate.js" defer></script>

<a href="https://wa.me/6283116632566" data-xyc-gate>Japri Admin</a>
<a href="https://chat.whatsapp.com/xxxx" data-xyc-gate>Join Grup</a>

Mode otomatis

Semua link WhatsApp di halaman ikut ke-gate tanpa perlu ditandai satu-satu:

<script src="https://rules.xyc.my.id/gate.js" data-auto="wa" defer></script>

Mau ada link yang dikecualikan? Kasih data-xyc-gate-skip di link itu.

Opsi

AtributNilaiDefaultFungsi
data-autooff, wa, alloffIntercept otomatis
data-themelight, darklightTema popup
data-rememberangka hari30Lama ingat persetujuan. 0 = tanya terus
data-requirescroll, check, both, nonescrollSyarat tombol Setuju aktif
data-accentwarna CSS#25d366
Mode both paling ketat: orang harus scroll sampai bawah dan centang kotak pernyataan. Cocok kalau lu mau bukti kuat kalau member emang udah baca.

Panggil dari kode

// Buka popup manual, dapat hasilnya sebagai Promise
XycGate.open('https://wa.me/6283116632566')
  .then(setuju => {
    if (setuju) console.log('dia setuju, link kebuka');
    else        console.log('dia batal');
  });

XycGate.agreed();   // true kalau udah pernah setuju & belum expired
XycGate.reset();    // hapus persetujuan tersimpan
Popup dirender di dalam Shadow DOM, jadi CSS website lu ga bakal bentrok sama tampilan popup, dan sebaliknya.

Endpoint Feedback

Halaman kebijakan punya tombol suka/kurang. Kalau dipencet, muncul popup pilihan alasan plus kolom pesan, dan hasilnya langsung dikirim ke email admin.

POST /api/feedback
Content-Type: application/json

{
  "vote": "dislike",              // "like" atau "dislike" (wajib)
  "reasons": ["Kepanjangan"],     // array, opsional
  "message": "Bagian promosi ga jelas",
  "contact": "6283116632566",     // opsional, buat dibales
  "page": "/",
  "version": "3.0.0"
}

Balasan sukses:

{ "ok": true, "id": "49c70341-...", "message": "Makasih, masukannya udah masuk ke admin." }
KodeArti
400vote_wajib atau alasan_atau_pesan_wajib
429kebanyakan_kirim — maksimal 5 kiriman per 10 menit per IP
502Layanan email lagi bermasalah
Kalau lu self host, set env RESEND_API_KEY, FEEDBACK_TO, dan FEEDBACK_FROM. Tanpa itu endpointnya balikin email_belum_dikonfigurasi.

Error & Caching

KodeArti
200Sukses
404section_not_found — respons menyertakan daftar section yang tersedia
405Method selain GET/HEAD/OPTIONS

Respons di-cache di edge selama 1 jam (s-maxage=3600) dengan stale-while-revalidate 24 jam. Versi kebijakan bisa dicek lewat header X-Policy-Version tanpa parsing body.

Kebijakan bisa berubah sewaktu-waktu. Kalau lu cache di sisi lu sendiri, refresh minimal sekali sehari atau pantau meta.version.

Self Host

Ga mau bergantung sama server XyCloud? Fork aja, semua aturan ada di satu file data/policy.json.

git clone https://github.com/xykalnotkel/xycloud-policy.git
cd xycloud-policy
npm run dev        # http://localhost:3000

# edit data/policy.json, lalu:
npm run build      # regenerate index.html + internal.html + sitemap

Deploy ke Vercel, Netlify, Cloudflare Pages, atau hosting statis apa pun. Endpoint API butuh runtime Node 18+.