Ambil tata tertib XyCloud dan tampilkan di website mana pun. Gratis, open source, lisensi MIT.
API ini terbuka untuk umum dan boleh dipakai komunitas lain. Dua syaratnya:
rules.xyc.my.id. Widget embed sudah otomatis menambahkannya.https://rules.xyc.my.id
Tanpa autentikasi. Tanpa rate limit keras. CORS dibuka untuk semua origin (*), jadi bisa dipanggil langsung dari browser.
| Method | Path | Keterangan |
|---|---|---|
| GET | /api/policy | Seluruh kebijakan dalam JSON |
| GET | /api/policy?format=index | Daftar section saja (ringan) |
| GET | /api/policy?section=promosi | Satu section spesifik |
| GET | /api/health | Status service & daftar endpoint |
| GET | /embed.js | Widget kebijakan siap tempel |
| GET | /gate.js | Popup persetujuan buat link bio |
| POST | /api/feedback | Kirim masukan ke email admin |
| Param | Nilai | Default | Fungsi |
|---|---|---|---|
format | json, html, markdown, text, index | json | Format output |
section | id atau nomor section | semua | Filter satu section |
version | public, internal | public | Varian bahasa |
pretty | 1 | 0 | JSON diformat rapi |
keluar-masuk · kelakuan · promosi · transaksi · ketipu · ngeyel · larangan · sanksi · saluran · privasi · admin
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..." }
}
]
}
<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>
| Atribut | Nilai | Default |
|---|---|---|
data-target | CSS selector | #xyc-policy |
data-theme | light, dark, auto | auto |
data-section | id section | semua |
data-accent | warna CSS | #25d366 |
data-credit | true, false | true |
Widget memancarkan event xyc:policy:loaded setelah selesai render.
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)`);
});
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>
);
}
$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>";
}
# 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"
curl -s "https://rules.xyc.my.id/api/policy?format=html" > kebijakan.html
format=html memakai class ber-prefix xyc- tanpa CSS bawaan, jadi lu bebas styling sendiri biar nyatu sama tema web lu.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.
<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>
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.
| Atribut | Nilai | Default | Fungsi |
|---|---|---|---|
data-auto | off, wa, all | off | Intercept otomatis |
data-theme | light, dark | light | Tema popup |
data-remember | angka hari | 30 | Lama ingat persetujuan. 0 = tanya terus |
data-require | scroll, check, both, none | scroll | Syarat tombol Setuju aktif |
data-accent | warna CSS | #25d366 |
both paling ketat: orang harus scroll sampai bawah dan centang kotak pernyataan. Cocok kalau lu mau bukti kuat kalau member emang udah baca.// 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
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." }
| Kode | Arti |
|---|---|
400 | vote_wajib atau alasan_atau_pesan_wajib |
429 | kebanyakan_kirim — maksimal 5 kiriman per 10 menit per IP |
502 | Layanan email lagi bermasalah |
RESEND_API_KEY, FEEDBACK_TO, dan FEEDBACK_FROM. Tanpa itu endpointnya balikin email_belum_dikonfigurasi.| Kode | Arti |
|---|---|
200 | Sukses |
404 | section_not_found — respons menyertakan daftar section yang tersedia |
405 | Method 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.
meta.version.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+.