API 키를 서버 환경변수(.env)에 저장하고, 페이지를 렌더링할 때 iframe src에 주입합니다. 소스 코드·Git에 키가 없고, 게임은 bet14 서버에서 직접 로드되므로 리소스 문제도 없습니다. 렌더링된 HTML에는 키가 보이지만, 이는 업계 표준 임베드 방식입니다.
Embed URL
https://bet14mini.com/embed/{slug}/?key={API_KEY}
PHP
Node.js / Express
Next.js (React)
Nuxt.js (Vue)
ASP.NET Core
복사 .env / server config
BET14_API_KEY=YOUR_API_KEY
복사 game.php
<?php
$apiKey = getenv('BET14_API_KEY');
$slug = 'dragontiger'; // or dynamic
?>
<iframe
src="https://bet14mini.com/embed/<?= $slug ?>/?key=<?= htmlspecialchars($apiKey) ?>" allowfullscreen
></iframe>
복사 .env + Express (EJS/Pug template)
# .env
BET14_API_KEY=YOUR_API_KEY
// routes/game.js
router.get('/game/:slug', (req, res) => {
const allowed = ['dragontiger', 'baccarat', 'bigsixball'];
const slug = allowed.includes(req.params.slug) ? req.params.slug : 'dragontiger';
res.render('game', {
embedUrl: `https://bet14mini.com/embed/${slug}/?key=${process.env.BET14_API_KEY}`
});
});
// views/game.ejs
<iframe src="<%- embedUrl %>"
style="width:100%;aspect-ratio:830/553;border:none"
allowfullscreen sandbox="allow-scripts allow-same-origin allow-popups"></iframe>
복사 .env.local + Next.js Server Component
# .env.local
BET14_API_KEY=YOUR_API_KEY
// app/game/[slug]/page.jsx (Server Component)
const ALLOWED = ['dragontiger', 'baccarat', 'bigsixball'];
export default function GamePage({ params }) {
const slug = ALLOWED.includes(params.slug) ? params.slug : 'dragontiger';
const apiKey = process.env.BET14_API_KEY;
const src = `https://bet14mini.com/embed/${slug}/?key=${apiKey}`;
return (
<iframe src={src}
style={{ width: '100%', aspectRatio: '830/553', border: 'none' }}
allowFullScreen
sandbox="allow-scripts allow-same-origin allow-popups"
/>
);
}
복사 .env + Nuxt 3 (SSR)
# .env
BET14_API_KEY=YOUR_API_KEY
// nuxt.config.ts
export default defineNuxtConfig({
runtimeConfig: {
bet14ApiKey: process.env.BET14_API_KEY, // server-only
}
});
// pages/game/[slug].vue
<template>
<iframe :src="embedUrl"
style="width:100%;aspect-ratio:830/553;border:none"
allowfullscreen sandbox="allow-scripts allow-same-origin allow-popups" />
</template>
<script setup>
const route = useRoute();
const config = useRuntimeConfig();
const slug = ['dragontiger','baccarat','bigsixball'].includes(route.params.slug)
? route.params.slug : 'dragontiger';
const embedUrl = `https://bet14mini.com/embed/${slug}/?key=${config.bet14ApiKey}`;
</script>
복사 appsettings.json + Razor Page
// appsettings.json (or env var Bet14ApiKey)
{ "Bet14ApiKey": "YOUR_API_KEY" }
// Pages/Game.cshtml.cs
public class GameModel : PageModel
{
public string EmbedUrl { get; private set; } = "";
private readonly IConfiguration _cfg;
public GameModel(IConfiguration cfg) => _cfg = cfg;
public IActionResult OnGet(string slug = "dragontiger")
{
var allowed = new[] { "dragontiger", "baccarat", "bigsixball" };
if (!allowed.Contains(slug)) slug = "dragontiger";
EmbedUrl = $"https://bet14mini.com/embed/{slug}/?key={_cfg["Bet14ApiKey"]}";
return Page();
}
}
// Pages/Game.cshtml
<iframe src="@Model.EmbedUrl"
style="width:100%;aspect-ratio:830/553;border:none"
allowfullscreen sandbox="allow-scripts allow-same-origin allow-popups"></iframe>
💡 권장 비율: 가로 830 / 세로 553 px — 반응형: width:100%; aspect-ratio:830/553; border:none; 🔒 키는 .env에만 저장하고 Git에 커밋하지 마세요. (.gitignore에 .env 추가)
각 게임 서버는 300ms마다 폴링 가능한 상태 엔드포인트를 제공합니다. 베팅 사이트에서 이 데이터를 수신해 현재 라운드·페이즈·카드 결과를 자체 UI에 표시하거나 배당 계산에 활용할 수 있습니다.
엔드포인트
https://bet14mini.com/embed/{slug}/api/current ← 현재 라운드 상태https://bet14mini.com/embed/{slug}/api/results?limit=N ← 최근 N개 결과 이력
별도 인증 헤더 불필요. iframe 로드 시 키 검증이 선행된 이후 게임 서버 API는 자유롭게 호출됩니다.
공통 응답 필드
필드 타입 설명
roundinteger 전체 누적 라운드 번호
daily_roundinteger 오늘 날짜 기준 라운드 번호 (화면 표시용)
datestring 서버 기준 날짜 (YYYY-MM-DD)
phasestring 현재 페이즈 — 아래 표 참조
remainMsinteger 현재 페이즈 남은 시간 (밀리초). betting 페이즈에서만 유효
phase 값 및 사이클
phase 의미 이때 추가되는 필드
betting베팅 접수 중 (타이머 카운트다운) remainMs 유효
revealing카드/결과 공개 중 카드·점수 필드 등장
result결과 확정 — 최종 승패 result 필드 확정
waiting다음 라운드 대기 —
Dragon Tiger
Baccarat
Big Six Ball
GET /embed/dragontiger/api/current
{
"round": 13463,
"daily_round": 2280,
"date": "2026-05-17",
"phase": "result",
"remainMs": 0,
"dragon": { "suit": "S", "value": "4" },
"tiger": { "suit": "C", "value": "2" },
"result": "dragon"
}
필드 타입 설명
dragon.suitstring 드래곤 카드 문양: S(스페이드) D(다이아) H(하트) C(클럽)
dragon.valuestring 드래곤 카드 값: 2–10, J, Q, K, A
tiger.suit / tiger.valuestring 타이거 카드 (동일 구조)
resultstring "dragon" | "tiger" | "tie"
dragon·tiger 필드는 revealing 페이즈부터 등장합니다. betting 페이즈에서는 null.
GET /embed/baccarat/api/current
{
"round": 8821,
"daily_round": 1104,
"date": "2026-05-17",
"phase": "result",
"remainMs": 0,
"player_cards": [{"suit":"H","value":"5"}, {"suit":"D","value":"3"}],
"banker_cards": [{"suit":"C","value":"K"}, {"suit":"S","value":"7"}],
"player_total": 8,
"banker_total": 7,
"natural": true,
"result": "player"
}
필드 타입 설명
player_cardsarray 플레이어 패 (2~3장, 각 {suit, value})
banker_cardsarray 뱅커 패 (2~3장)
player_totalinteger 플레이어 합계 (0~9)
banker_totalinteger 뱅커 합계 (0~9)
naturalboolean 내추럴(8 or 9) 여부
resultstring "player" | "banker" | "tie"
카드 필드는 revealing 페이즈부터 등장. player_total이 null이면 아직 공개 전.
GET /embed/bigsixball/api/current
{
"round": 5201,
"daily_round": 420,
"date": "2026-05-17",
"phase": "result",
"remainMs": 0,
"result_map": {
"manu": 1,
"mancity": 2,
"liverpool": 3,
"chelsea": 4,
"arsenal": 5,
"tottenham": 6
}
}
필드 타입 설명
result_mapobject 팀 이름 → 순위(1=1등). result 페이즈에서 확정
team_orderarray 발사 순서 인덱스 배열 (애니메이션용, 통상 불필요)
Teams: manu / mancity / liverpool / chelsea / arsenal / tottenham
1등 팀 = result_map에서 값이 1인 키.
GET
/embed/{slug}/api/results?limit=N
— 최근 결과 이력
Dragon Tiger
[
{ "round":13463, "daily_round":2280, "date":"2026-05-17",
"dragon":{"suit":"S","value":"4"}, "tiger":{"suit":"C","value":"2"},
"result":"dragon" },
{ "round":13462, "daily_round":2279, "date":"2026-05-17",
"dragon":{"suit":"H","value":"A"}, "tiger":{"suit":"D","value":"9"},
"result":"tiger" },
...
]
최신 라운드가 배열 앞에 위치. 최대 limit개 반환.
💡
iframe postMessage 이벤트: 게임 iframe이 페이즈 변경 시 부모 페이지로 메시지를 전송합니다.
window.addEventListener('message', (e) => {
// e.data.type = 'dragontiger_phase' | 'baccarat_phase' | 'bigsix_phase'
const { type, round, daily_round, phase, remainMs } = e.data;
if (type === 'dragontiger_phase' && phase === 'result') {
// fetch /embed/dragontiger/api/current for card data
}
});
페이즈가 바뀔 때만 발생하므로, 카드 데이터는 이 이벤트 수신 후
/api/current를 추가 호출하여 얻어야 합니다.