게임 · 로비 · 통화
이 오퍼레이터에 켜진 게임 목록과 통화 표를 조회하고, 게임별 사이트 베팅 한도와 게임 로비 출력(메뉴 · 테이블 · 배너)을 설정합니다.
GET /games
GET {API_BASE}/operator/v1/games?lang=en이 오퍼레이터에 켜진 게임 목록입니다. 사이트의 게임 메뉴를 만들 때 씁니다. 순서는 플랫폼이 정한 게임 정렬 순서입니다.
쿼리
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
lang | string | 게임 이름 언어. ko en zh ja th vi(POST /launch 의 lang 과 같은 규칙). 비우면 ko. 그 언어 이름이 없으면 영어 → 한국어 → 게임 코드 순으로 대신합니다. |
요청 예시
GET /operator/v1/games?lang=en HTTP/1.1
Host: {API_HOST}
X-Operator: acme
X-Api-Key: ak_5d2c9e0f7a1b3c4d5e6f708192a3b4c5d6e7f809
X-Timestamp: 1792368067512
X-Nonce: 1c7e5a9b3d2f4e6a8b0c1d2e
X-Signature: 7a0c…(64자리 16진수)응답
200 OK
{
"games": [
{
"game_code": "holdem_nlh",
"name": "Texas Hold'em",
"category": "poker",
"kind": "table",
"live": false,
"thumbnail": {
"square": "https://{GAME_ORIGIN}/thumbs/holdem_nlh.webp",
"wide": "https://{GAME_ORIGIN}/thumbs/holdem_nlh.webp"
},
"min_bet": 2000,
"max_bet": 100000,
"currency": "PHP",
"status": "open",
"bet_limits": { "PHP": { "min": 1000, "max": 100000 } },
"table_create": false,
"lobby": {}
},
{
"game_code": "live_baccarat",
"name": "Live Baccarat",
"category": "live",
"kind": "round",
"live": true,
"thumbnail": {
"square": "https://{GAME_ORIGIN}/thumbs/live_baccarat.webp",
"wide": "https://{GAME_ORIGIN}/thumbs/live_baccarat.webp"
},
"min_bet": 10000,
"max_bet": 5000000,
"currency": "PHP",
"status": "open",
"bet_limits": {},
"table_create": false,
"lobby": {
"hide_tables": true,
"banner": {
"sha256": "9b2f0c4e6a8d1b3f5e7a9c0b2d4f6e8a1c3e5b7d9f0a2c4e6b8d0f1a3c5e7b9d",
"title": "Weekend Baccarat Event",
"link_url": "https://www.acme.example/events/baccarat",
"width": 1920,
"height": 480
}
}
}
]
}| 필드 | 타입 | 설명 |
|---|---|---|
game_code | string | 게임 코드. 게임 코드 참고 |
name | string | lang 언어의 게임 이름 |
category | string | 분류: poker · card · board · live |
kind | string | table(P2P, 플레이어끼리) · round(뱅크형, 하우스와 대결). 연동 개요 참고 |
live | boolean | 딜러 영상이 있는 라이브 게임인지 |
thumbnail.square · thumbnail.wide | string | 썸네일 주소(현재 두 값이 같습니다). 아래 썸네일 참고 |
min_bet · max_bet | integer | 이 사이트 플레이어가 지금 들어갈 수 있는 테이블들의 베팅 크기 범위(기본 통화, 최소 단위). 아래 베팅 크기 참고. 들어갈 수 있는 테이블이 없으면 둘 다 0 |
currency | string | min_bet · max_bet 의 통화 = 오퍼레이터 기본 통화(사용 통화 중 첫 번째) |
status | string | open · maintenance(점검 중 — 실행하면 503 GAME_MAINTENANCE) |
bet_limits | object | 사이트 베팅 한도 {통화: {min?, max?}}. 정하지 않은 통화는 키가 없고, 0(제한 없음)인 쪽은 min · max 키가 빠집니다. PUT /games/{game_code}/bet-limits 로 정합니다. |
table_create | boolean | 이 게임으로 전용 테이블을 만들 수 있는지(독립운영이고 본사가 허용한 게임). POST /tables 참고 |
lobby | object | 게임 로비 출력. 기본값(모두 보임, 배너 없음)이면 {}. 아래 표 참고 |
lobby 객체 (값이 기본값이면 키가 빠집니다)
| 필드 | 타입 | 설명 |
|---|---|---|
hide_menu | boolean | true 면 게임 로비의 게임 목록에서 이 게임을 숨깁니다. |
hide_tables | boolean | true 면 게임 로비의 테이블 목록에서 이 게임의 테이블을 숨깁니다. |
banner | object | 게임 로비에서 이 게임의 테이블 목록 위에 보이는 배너. sha256 · title · link_url · width · height (PUT /games/{game_code}/lobby 의 값) |
베팅 크기
min_bet · max_bet, 그리고 사이트 베팅 한도는 테이블마다 정해진 베팅 크기 하나를 기준으로 비교합니다.
| 게임 종류 | 테이블의 베팅 크기 | 테이블 limits 키 |
|---|---|---|
| 뱅크형(바카라 · 블랙잭 · 레드독 등) | 최소 베팅 ~ 최대 베팅 구간 | min_bet ~ max_bet |
| 홀덤 · 오마하 · 라이브 홀덤 | 빅 블라인드 | bb |
| 스피드 홀덤 | 베팅 금액 | bet |
| 통잇 | 판돈 | stake |
| 맞고 · 고스톱 | 점당 금액 | point_value |
| 섯다 · 바둑이 | 앤티 | ante |
테이블 limits 의 키는 GET /tables 에서 볼 수 있습니다.
썸네일
thumbnail 은 게임 화면 오리진 아래의 /thumbs/{game_code}.webp 주소입니다. 인증 없이 열리는 공개 주소입니다.
협의 사항
게임 썸네일 · 아이콘 이미지의 제공 방식(크기 · 형식 · 제공 시기)은 계약 시 협의합니다. 사이트 게임 메뉴에는 협의한 이미지를 쓰고, 이 필드는 참고용으로만 쓰세요.
오류
인증 · 공통 오류만 있습니다(오류 코드).
GET /currencies
GET {API_BASE}/operator/v1/currencies플랫폼이 쓰는 통화 표입니다. 금액은 모두 통화의 최소 단위 정수이므로(공통 규약), 화면에 표시할 때 exponent 만큼 소수 자리를 나눕니다.
- 플랫폼의 모든 통화가 옵니다. 이 오퍼레이터가 쓸 수 있는 통화는 온보딩 때 등록한 사용 통화이며
GET /settings의currencies로 확인합니다. - 순서는 정해져 있지 않습니다. 코드로 찾아 쓰세요.
응답
200 OK
{
"currencies": [
{ "code": "KRW", "exponent": 0, "symbol": "₩" },
{ "code": "USD", "exponent": 2, "symbol": "$" },
{ "code": "PHP", "exponent": 2, "symbol": "₱" }
]
}| 필드 | 타입 | 설명 |
|---|---|---|
code | string | 통화 코드 |
exponent | integer | 소수 자리 수. 금액 12345 는 exponent: 2 면 123.45, 0 이면 12345 |
symbol | string | 표시용 기호 |
금액 1단위 = 10^exponent 최소 단위입니다(예: PHP 는 100 = ₱1). 사이트 베팅 한도 · 테이블 한도 · 레이크 상한처럼 설정으로 보내는 금액은 1단위의 배수만 받습니다(₱10.50 같은 소수 금액 불가).
오류
인증 · 공통 오류만 있습니다(오류 코드).
PUT /games/{game_code}/bet-limits
PUT {API_BASE}/operator/v1/games/{game_code}/bet-limits게임 하나의 사이트 베팅 한도를 통화별로 정합니다. 관리 화면용입니다.
사이트 베팅 한도는 어떤 테이블을 이 사이트 플레이어에게 줄지 정하는 범위입니다. 테이블의 베팅 크기가 범위 안에 드는 테이블만 이 사이트 플레이어의 로비에 보이고 들어갈 수 있습니다. 한 판 안의 베팅 검증은 테이블 자체 한도로 합니다.
- 한 번에 통화 하나를 바꿉니다. 다른 통화의 한도는 그대로 둡니다.
min·max를 둘 다0으로 보내면 그 통화의 한도를 지웁니다(제한 없음).- 이미 앉아 있는 플레이어는 자리를 뜰 때까지 계속합니다. 새 입장과 로비 목록에만 반영되며, 반영까지 최대 30초 걸릴 수 있습니다.
경로 · 요청 필드
| 필드 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
game_code | 경로 | string | 필수 | 이 오퍼레이터에 켜진 게임 코드 |
currency | 본문 | string | 필수 | 오퍼레이터 사용 통화 중 하나 |
min | 본문 | integer | 베팅 크기 하한(최소 단위). 0 = 하한 없음 | |
max | 본문 | integer | 베팅 크기 상한(최소 단위). 0 = 상한 없음 |
min·max는 0 이상이고, 둘 다 0 보다 크면min ≤ max여야 합니다.- 금액 1단위(
10^exponent)의 배수여야 합니다.
요청 예시
PUT /operator/v1/games/holdem_nlh/bet-limits HTTP/1.1
Host: {API_HOST}
Content-Type: application/json; charset=utf-8
X-Operator: acme
X-Api-Key: ak_5d2c9e0f7a1b3c4d5e6f708192a3b4c5d6e7f809
X-Timestamp: 1792368067512
X-Nonce: 5e8a1f3c7b9d2e4f6a0b1c2d
X-Signature: 0d9e…(64자리 16진수)
{ "currency": "PHP", "min": 1000, "max": 100000 }응답
200 OK — 그 게임의 바뀐 뒤 전체 한도
{
"game_code": "holdem_nlh",
"bet_limits": {
"PHP": { "min": 1000, "max": 100000 },
"USD": { "max": 2000 }
}
}오류
| HTTP | error.code | 원인 |
|---|---|---|
| 400 | INVALID_REQUEST | JSON 오류, 또는 details.fields: currency(사용 통화 아님) · min(음수, min > max, 1단위 배수 아님) · max(음수, 1단위 배수 아님) |
| 404 | GAME_NOT_FOUND | 이 오퍼레이터에 켜진 게임이 아님 |
PUT /games/{game_code}/lobby
PUT {API_BASE}/operator/v1/games/{game_code}/lobby게임 로비(게임 화면 안의 로비)에서 이 게임을 어떻게 보여 줄지 정합니다. 관리 화면용입니다. 저장하면 다음 로비 요청부터 바로 반영됩니다.
menu: false면 게임 로비의 게임 목록에서 이 게임이 빠집니다.tables: false면 게임 로비의 테이블 목록에서 이 게임의 테이블이 빠집니다.banner가 있으면 그 게임의 테이블 목록 위에 배너를 띄웁니다. 그림은 먼저PUT /lobby-banners로 올려sha256을 받아 둡니다.
세 값을 모두 보내세요
요청은 전체 교체입니다. menu · tables 를 빼면 false(숨김)로 저장되고, banner 를 빼면 배너가 지워집니다. 보이게 하려면 true 를 명시하세요.
경로 · 요청 필드
| 필드 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
game_code | 경로 | string | 필수 | 이 오퍼레이터에 켜진 게임 코드 |
menu | 본문 | boolean | 필수 | true = 게임 목록에 보임 |
tables | 본문 | boolean | 필수 | true = 테이블 목록에 보임 |
banner | 본문 | object | null | 배너. null 이면 배너 없음 | |
banner.sha256 | 본문 | string | 필수(배너가 있을 때) | PUT /lobby-banners 가 돌려준 값(소문자 16진수 64자) |
banner.title | 본문 | string | 배너 설명(대체 텍스트). 앞뒤 공백을 지우고 200자 이하 | |
banner.link_url | 본문 | string | 배너를 누르면 열 주소. http:// · https:// 주소이거나 빈 값(링크 없음) | |
banner.width · banner.height | 본문 | integer | 그림 크기(픽셀). PUT /lobby-banners 응답 값을 그대로 넣으세요. 0~4096 으로 맞춰 저장됩니다. |
요청 예시
{
"menu": true,
"tables": false,
"banner": {
"sha256": "9b2f0c4e6a8d1b3f5e7a9c0b2d4f6e8a1c3e5b7d9f0a2c4e6b8d0f1a3c5e7b9d",
"title": "Weekend Baccarat Event",
"link_url": "https://www.acme.example/events/baccarat",
"width": 1920,
"height": 480
}
}응답
200 OK — 저장한 값(GET /games 의 lobby 와 같은 모양)
{
"game_code": "live_baccarat",
"lobby": {
"hide_tables": true,
"banner": {
"sha256": "9b2f0c4e6a8d1b3f5e7a9c0b2d4f6e8a1c3e5b7d9f0a2c4e6b8d0f1a3c5e7b9d",
"title": "Weekend Baccarat Event",
"link_url": "https://www.acme.example/events/baccarat",
"width": 1920,
"height": 480
}
}
}오류
| HTTP | error.code | 원인 |
|---|---|---|
| 400 | INVALID_REQUEST | JSON 오류, 또는 details.fields: banner.title(200자 초과) · banner.link_url(http(s) 주소 아님) · banner.sha256(형식 오류) |
| 404 | BANNER_NOT_FOUND | 그 sha256 의 그림이 없음 — 먼저 PUT /lobby-banners 로 올리세요 |
| 404 | GAME_NOT_FOUND | 이 오퍼레이터에 켜진 게임이 아님 |
PUT /lobby-banners
PUT {API_BASE}/operator/v1/lobby-banners게임 로비 배너 그림을 올리고 그림 번호(sha256)를 받습니다. 관리 화면용입니다. 그림만 올리는 단계이며, 실제로 띄우려면 받은 값을 PUT /games/{game_code}/lobby 의 banner 에 넣습니다.
- 같은 그림을 다시 올리면 같은
sha256이 돌아옵니다(한 번만 저장). - 이 엔드포인트만 요청 본문 상한이 768KB 입니다(다른 엔드포인트는 64KB). base64 로 늘어난 크기를 포함한 값이므로, 원본 그림은 512KB 이하로 준비하세요.
요청 필드
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
image | string | 필수 | 그림의 base64 문자열, 또는 data URL(data:image/png;base64,…) |
그림 조건:
- 형식: JPEG · PNG · WebP · GIF (내용으로 판별)
- 크기: 디코딩한 원본 512KB 이하
- 가로 · 세로: 각각 1~4096 픽셀 (권장: 가로 1920 이하)
요청 예시
{ "image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgH…" }응답
200 OK
{
"sha256": "9b2f0c4e6a8d1b3f5e7a9c0b2d4f6e8a1c3e5b7d9f0a2c4e6b8d0f1a3c5e7b9d",
"width": 1920,
"height": 480
}| 필드 | 타입 | 설명 |
|---|---|---|
sha256 | string | 그림 번호(그림 내용의 SHA-256, 소문자 16진수 64자) |
width · height | integer | 그림 크기(픽셀) |
공개 주소
올린 그림은 게임 로비가 다음 주소로 받습니다. 인증 없이 열리는 공개 주소이며, 내용이 바뀌면 sha256 도 바뀌므로 1년 동안 캐시됩니다.
GET {API_BASE}/play/v1/lobby-banners/{sha256}공개해도 되는 그림만 올리세요
배너 그림은 sha256 을 아는 누구나 받을 수 있고, 올린 그림을 지우는 API 는 없습니다. 개인정보나 미공개 내용이 담긴 그림은 올리지 마세요.
오류
| HTTP | error.code | 원인 |
|---|---|---|
| 400 | INVALID_REQUEST | JSON 오류 |
| 400 | BAD_IMAGE | base64 가 아니거나, 지원하지 않는 형식, 512KB 초과, 가로 · 세로 4096 초과 |
| 401 | INVALID_SIGNATURE | 본문이 768KB 를 넘어 잘린 경우도 서명 불일치로 실패합니다 |