엔드포인트
토정비결 유료
그 해 토정비결 괘는 무엇인가? (원문 준비 전 — 작괘 계산만)
POST https://api.supasaju.com/v2/saju/tojeong
무엇을 담나
그 해의 토정비결 괘 번호(상·중·하 세 자리, 144괘 중 하나)를 뽑습니다. 나이·태세수, 그해 생월의 날수·월건수, 생일·일진수로 작괘하며, 계산에 쓴 간지와 숫자를 모두 함께 냅니다. 보는 해는 음력(설날 기준)이고 그 해의 음력 달 목록이 함께 실립니다. **괘의 원문(총운 + 음력 12개월)은 출판사 계약 뒤에 실립니다** — 그 전까지 passage 는 null 이고 응답이 그렇게 말합니다.
| 포함 모듈 | tojeong |
| 핵심 모듈 | tojeong — 이것이 빠지면 이 토픽은 성립하지 않습니다 |
| 기준 시점 | year(정수)로 기준 해를 옮길 수 있습니다. 생략하면 올해입니다. |
| 상대 | 상대를 받지 않습니다. |
| 최소 플랜 | 유료 — Free 키는 샘플 프로필 입력일 때만 이 구성으로 응답합니다 |
| 응답 무게 | 약 8KB · 대략 3,573토큰 — 통째로 LLM 에 넣기 전에 줄이는 법을 보십시오 |
요청
curl -X POST https://api.supasaju.com/v2/saju/tojeong \
-H "x-api-key: $SAJU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"birthYear": 1988,
"birthMonth": 3,
"birthDay": 14,
"birthHour": 9,
"birthMinute": 20,
"isFemale": false,
"isLunar": false,
"birthCity": "서울",
"year": 2026
}'const res = await fetch('https://api.supasaju.com/v2/saju/tojeong', {
method: 'POST',
headers: {
'x-api-key': process.env.SAJU_API_KEY!,
'content-type': 'application/json',
},
body: JSON.stringify({
"birthYear": 1988,
"birthMonth": 3,
"birthDay": 14,
"birthHour": 9,
"birthMinute": 20,
"isFemale": false,
"isLunar": false,
"birthCity": "서울",
"year": 2026
}),
})
const { data } = await res.json()
// 판정 근거 문장만 모읍니다 — 이게 풀이의 재료입니다.
const facts: string[] = []
const walk = (v: unknown, path = ''): void => {
if (Array.isArray(v)) return v.forEach((x, i) => walk(x, `${path}[${i}]`))
if (v === null || typeof v !== 'object') return
for (const [k, x] of Object.entries(v)) {
if (typeof x === 'string' && ['reasoning', 'basis', 'meaning'].includes(k)) facts.push(x)
else walk(x, path ? `${path}.${k}` : k)
}
}
walk(data.modules)
// guide 와 glossary 를 함께 실어 넘깁니다.
const prompt = [
data.guide.purpose,
...data.guide.howToUse,
'',
'용어의 뜻:',
...Object.entries(data.glossary).map(([t, d]) => `- ${t}: ${d}`),
'',
'계산된 사실:',
...facts.map((f) => `- ${f}`),
'',
'위 사실만으로 존댓말 6문장으로 풀어 주세요.',
].join('\n')import os, json, requests
res = requests.post(
"https://api.supasaju.com/v2/saju/tojeong",
headers={"x-api-key": os.environ["SAJU_API_KEY"]},
json={
"birthYear": 1988,
"birthMonth": 3,
"birthDay": 14,
"birthHour": 9,
"birthMinute": 20,
"isFemale": False,
"isLunar": False,
"birthCity": "서울",
"year": 2026
},
)
data = res.json()["data"]
# 판정 근거 문장만 모읍니다 — 이게 풀이의 재료입니다.
FACT_KEYS = {"reasoning", "basis", "meaning"}
facts = []
def walk(v):
if isinstance(v, list):
for x in v:
walk(x)
elif isinstance(v, dict):
for k, x in v.items():
if isinstance(x, str) and k in FACT_KEYS:
facts.append(x)
else:
walk(x)
walk(data["modules"])
# guide 와 glossary 를 함께 실어 넘깁니다.
prompt = "\n".join([
data["guide"]["purpose"],
*data["guide"]["howToUse"],
"",
"용어의 뜻:",
*[f"- {t}: {d}" for t, d in data["glossary"].items()],
"",
"계산된 사실:",
*[f"- {f}" for f in facts],
"",
"위 사실만으로 존댓말 6문장으로 풀어 주세요.",
])공통 요청 필드는 문서 홈에 정리되어 있습니다. 위 예시의 생년월일은 샘플 프로필이라 Free 키로 그대로 재현됩니다.
응답
아래는 위 요청의 실제 응답입니다. 봉투를 먼저 보이고, 핵심 모듈
tojeong 을 펼쳐 실었습니다. 나머지 모듈은 접어 두었습니다 —
전체 형태는 스키마 파일과 OpenAPI에 있습니다.
봉투
{
"topic": "tojeong",
"guide": {
"purpose": "그 해 토정비결 괘는 무엇인가? (원문 준비 전 — 작괘 계산만) — 토정비결 토픽의 계산 결과입니다.",
"howToUse": [
"… 5줄"
]
},
"glossary": {
"토정비결": {
"definition": "그 해의 운수를 144괘로 풀이하는 조선 후기 이래의 민간 세시 문헌. 나이와 생년월일(음력)로 괘 번호를 뽑는다. 이지함의 저술로 전하나 확인되지 않았다.",
"name": "Tojeong Bigyeol",
"hanja": "土亭祕訣",
"en": "Tojeong Bigyeol (Korean New Year fortune book)"
},
"사주": {
"definition": "태어난 연·월·일·시를 각각 간지 두 글자로 적은 여덟 글자.",
"name": "Saju",
"hanja": "四柱",
"en": "Four Pillars (Korean astrology)"
},
"…": "외 7종"
},
"reference": {
"date": "2026-09-17",
"month": "2026-09",
"year": 2026,
"asOf": "2026-09-17T09:00:00+09:00",
"sajuYear": {
"year": 2026,
"ganji": "병오",
"ganjiHan": "丙午"
}
},
"input": {
"solar": {
"year": 1988,
"month": 3,
"day": 14,
"hour": 9,
"minute": 20
},
"lunar": {
"year": 1988,
"month": 1,
"day": 26,
"isLeapMonth": false
},
"isFemale": false,
"correctedHour": 8,
"correctedMinute": 38
},
"timezone": {
"cityId": "seoul",
"cityResolved": true,
"locationSource": "city",
"tzId": "Asia/Seoul",
"utcOffsetMinutes": 540,
"longitude": 126.978,
"mode": "trueSolar",
"longitudeCorrectionMinutes": -32.1,
"equationOfTimeMinutes": -9.3,
"totalCorrectionMinutes": -41.4,
"dstApplied": false
},
"modules": {
"tojeong": "…"
},
"diagnostics": [],
"ruleset": {
"version": "0.2.6",
"profile": "ko-standard",
"data": {
"tzdata": "2026c",
"tzdataBuild": "backzone",
"tzZones": 418,
"ephemeris": "DE440s",
"lunarVerifiedThrough": 2050,
"solarTermsVerifiedRange": "2000-2028"
}
}
}
핵심 모듈 — tojeong
{
"lunarYear": 2026,
"ganji": "병오",
"ganjiHan": "丙午",
"startsOn": "2026-02-17",
"endsOn": "2027-02-06",
"koreanAge": 39,
"code": "732",
"upper": 7,
"middle": 3,
"lower": 2,
"work": {
"taese": {
"ganji": "병오",
"ganjiHan": "丙午",
"value": 16
},
"wolgeon": {
"ganji": "경인",
"ganjiHan": "庚寅",
"value": 15,
"monthDays": 30
},
"iljin": {
"ganji": "정해",
"ganjiHan": "丁亥",
"value": 15,
"solarDate": "2026-03-14"
}
},
"assumptions": [],
"months": [
{
"lunarMonth": 1,
"isLeapMonth": false,
"startsOn": "2026-02-17",
"endsOn": "2026-03-18",
"ganji": "경인",
"ganjiHan": "庚寅",
"isCurrent": false,
"offsetFromCurrent": -7,
"relativeKo": "7개월 전"
},
{
"lunarMonth": 2,
"isLeapMonth": false,
"startsOn": "2026-03-19",
"endsOn": "2026-04-16",
"ganji": "신묘",
"ganjiHan": "辛卯",
"isCurrent": false,
"offsetFromCurrent": -6,
"relativeKo": "6개월 전"
},
"… 외 10건"
],
"passage": null,
"passageStatus": "unavailable",
"basis": [
"상괘 = (세는나이 39 + 태세수 16) ÷ 8 의 나머지 7, 중괘 = (그해 생월 날수 30 + 월건수 15) ÷ 6 의 나머지 3, 하괘 = (음력 생일 26 + 일진수 15) ÷ 3 의 나머지 2 → 732 (나머지 0 은 8·6·3으로 본다). 출처: 한국민족문화대백과 「토정비결」 작괘법.",
"태세수는 그해 간지 병오(丙午)의 중천수(천간 甲己11 乙庚10 丙辛9 丁壬8 戊癸7 + 지지 辰戌丑未11 申酉10 亥子9 寅卯8 巳午7), 월건수는 그해 생월 월건 경인(庚寅)의 선천수(천간 甲己9 乙庚8 丙辛7 丁壬6 戊癸5 + 지지 子午9 丑未8 寅申7 卯酉6 辰戌5 巳亥4), 일진수는 그해 생일 2026-03-14의 일진 정해(丁亥)의 선천수(천간) + 중천수(지지)다.",
"… 외 2건"
]
}
나머지 모듈 0종 펼치기
{}
반환 형식
모듈마다 최상위 필드입니다. 스키마는 실제 응답에서 생성되므로 손으로 쓴 설명과 달리 어긋날 수 없습니다.
tojeong
담기는 토픽: 토정비결 · 전체 스키마
| 필드 | 타입 | |
|---|---|---|
lunarYear | integer | |
ganji | string | |
ganjiHan | string | |
startsOn | string | |
endsOn | string | |
koreanAge | integer | |
code | string | |
upper | integer | |
middle | integer | |
lower | integer | |
work | object | 객체 · 하위 3개 |
assumptions | array | 배열 |
months | array | 배열 |
passage | null|object | |
passageStatus | string | |
basis | array | 배열 |
해설 문장
이 응답에는 해설 문장 0개와 용어 9종이 실립니다. 문장은 종류마다 하는 일이 다릅니다.
| 필드 | 문장 | 하는 일 |
|---|
활용 지침 — data.guide
응답에 이 지침이 함께 실립니다. 고객이 별도 시스템 프롬프트를 쓰지 않아도 활용법이 같이 전달됩니다.
목적: 그 해 토정비결 괘는 무엇인가? (원문 준비 전 — 작괘 계산만) — 토정비결 토픽의 계산 결과입니다.
1. passage 가 null(passageStatus "unavailable")이면 괘의 원문·풀이가 없는 것입니다 — 괘 번호(code)로 원문이나 풀이를 기억에서 꺼내거나 지어내지 마세요.
2. passage 가 있으면 그 글(general = 총운, months = 음력 1~12월)만 인용하세요. original 은 원문, modernKo 는 현대어 요지(없으면 null)이고, tone 은 원문의 표시일 뿐 점수가 아닙니다. 원문을 보일 때는 edition.attribution(출처 표시)을 함께 보이세요.
3. 사주(명리) 판정이 아니라 전통 문헌 『토정비결』의 괘 번호를 뽑는 셈법입니다. 계산 과정은 code·work·basis 필드에 있습니다 — 사주 풀이와 섞지 마세요.
4. 보는 해와 달은 음력(설날 기준)입니다. 다른 토픽의 세운(입춘)·월운(절기)과 "올해"·"이번 달" 이 다를 수 있으니 months·relativeKo 필드를 그대로 쓰세요.
5. 윤달생처럼 셈을 가정한 경우 assumptions 필드에 적혀 있습니다 — 그 가정을 함께 말하세요.
LLM 연동
판정을 LLM 에게 다시 시키지 마십시오. 응답의 문장을 요약하고 톤만 바꾸게 하십시오. 사주 판정을 LLM 이 하면 그럴듯한 오답이 나오고, 문장이 매끄러워서 틀린 줄을 모릅니다.
[시스템]
passage 가 null(passageStatus "unavailable")이면 괘의 원문·풀이가 없는 것입니다 — 괘 번호(code)로 원문이나 풀이를 기억에서 꺼내거나 지어내지 마세요.
아래 '계산된 사실' 밖의 내용을 말하지 마세요.
[사용자]
{"guide":"…","glossary":"…","modules":"…"}
존댓말로 6문장. 첫 문장은 결론, 마지막 문장은 주의점.