API Docs

สร้าง API token แล้วดึง แพ็กเกจ, โควต้า token ที่เหลือ และ ยอดการใช้งาน จากสคริปต์ / CLI / ระบบอื่นได้

1. สร้าง API token

  1. เข้าสู่ระบบ (หรือสมัคร) แล้วไปที่ My Keys → 🎟 API Tokens
  2. ตั้งชื่อ token (เช่น codex-cli-mac) และเลือกสิทธิ์ — read ดูข้อมูลอย่างเดียว, read,write บันทึก usage เข้ามาได้ด้วย
  3. กด สร้าง token — ระบบจะแสดง token รูปแบบ llmk_… ครั้งเดียว (เก็บเป็น SHA-256 hash เท่านั้น) คัดลอกเก็บไว้ทันที
  4. เก็บไว้ใน env:
    export LLMHUB_TOKEN="llmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    export LLMHUB_URL=""
  5. เพิกถอนได้ทุกเมื่อจากหน้าเดิม — token ที่ถูกเพิกถอนจะได้ 401 ทันที

2. วิธียืนยันตัวตน

ทุก endpoint ใต้ /api/v1/* รับ header Authorization: Bearer <token> (จะใช้ session cookie จากเบราว์เซอร์ก็ได้)

curl -s "$LLMHUB_URL/api/v1/me" -H "Authorization: Bearer $LLMHUB_TOKEN"
{
  "user":  { "id": "…", "email": "you@company.com", "display_name": "You", "org_id": "…", "role": "member", "package_id": "pro" },
  "quota": { "package": { "id": "pro", "name": "Pro", "monthly_tokens": 5000000, "price_usd": 20 },
             "period_start": "2026-09-01T00:00:00.000Z", "period_end": "2026-10-01T00:00:00.000Z",
             "used_tokens": 182340, "used_cost_usd": 0.91, "requests": 57,
             "remaining_tokens": 4817660, "percent_used": 3.6 }
}

3. แพ็กเกจ & โควต้า token ที่เหลือ

GET/api/v1/quota

คืนแพ็กเกจปัจจุบัน, limit ต่อเดือน, ยอดที่ใช้ไปตั้งแต่ต้นเดือน (UTC) และ remaining_tokens

curl -s "$LLMHUB_URL/api/v1/quota" -H "Authorization: Bearer $LLMHUB_TOKEN" | jq .remaining_tokens

ตัวอย่างใช้ใน shell script เพื่อเช็คก่อนรันงานใหญ่:

remaining=$(curl -s "$LLMHUB_URL/api/v1/quota" -H "Authorization: Bearer $LLMHUB_TOKEN" | jq .remaining_tokens)
if [ "$remaining" -lt 100000 ]; then echo "โควต้าใกล้หมด ($remaining tokens)"; exit 1; fi

Python:

import os, requests
r = requests.get(f"{os.environ['LLMHUB_URL']}/api/v1/quota",
                 headers={"Authorization": f"Bearer {os.environ['LLMHUB_TOKEN']}"})
q = r.json()
print(q["package"]["name"], q["used_tokens"], "/", q["package"]["monthly_tokens"], "→ เหลือ", q["remaining_tokens"])

4. ยอดการใช้งาน

GET/api/v1/usage?days=30&group_by=day

group_by = day | provider | model | profile · days สูงสุด 365

curl -s "$LLMHUB_URL/api/v1/usage?days=7&group_by=model" -H "Authorization: Bearer $LLMHUB_TOKEN"
{
  "days": 7, "group_by": "model",
  "totals": { "total_tokens": 48210, "cost_usd": 0.31, "requests": 19 },
  "rows": [
    { "key": "kimi-k2-0905-preview", "prompt_tokens": 30100, "completion_tokens": 9800, "total_tokens": 39900, "cost_usd": 0.0426, "requests": 15 },
    { "key": "gpt-5-codex",          "prompt_tokens": 6000,  "completion_tokens": 2310, "total_tokens": 8310,  "cost_usd": 0.0306, "requests": 4 }
  ]
}
GET/api/v1/profiles

รายการ profile ของคุณ (ไม่มี key — มีแค่ 4 ตัวท้าย)

5. บันทึก usage เข้ามา (ต้องมีสิทธิ์ write)

POST/api/v1/usage

ใช้เมื่อคุณเรียก LLM เองนอกระบบ (Codex CLI, สคริปต์, n8n ฯลฯ) แล้วอยากให้ยอดมารวมบน dashboard/โควต้า

curl -s -X POST "$LLMHUB_URL/api/v1/usage" \
  -H "Authorization: Bearer $LLMHUB_TOKEN" -H "Content-Type: application/json" \
  -d '{ "provider": "codex", "model": "gpt-5-codex", "prompt_tokens": 1200, "completion_tokens": 400,
        "external_id": "codex-session-abc123", "source": "codex-cli" }'
fieldความหมาย
providerชื่อ provider (kimi, codex, openai, anthropic, …)
modelใช้คำนวณ cost_usd อัตโนมัติจากราคา list (ส่ง cost_usd เองได้ถ้ารู้ค่าจริง)
prompt_tokens / completion_tokensจำนวน token (ถ้าไม่ส่ง total_tokens ระบบจะบวกให้)
external_idid ไม่ซ้ำจากฝั่งคุณ — ส่งซ้ำจะถูก ignore (idempotent) เหมาะกับการ import ซ้ำได้ปลอดภัย
profile_idผูกกับ profile (ไม่บังคับ)

6. ดึงยอดจริงจาก GPT / Claude มาแสดง (แนะนำ)

วิธีที่แม่นที่สุด: ให้ระบบดึงตัวเลขจาก Usage & Cost API ของผู้ให้บริการโดยตรง ต้องใช้ Admin API key (คนละชนิดกับ key ที่ใช้เรียกโมเดล) — ใส่ครั้งเดียวที่ การใช้งานของฉัน → 🔗 GPT / Claude (ยอดส่วนตัว) หรือ หน้าองค์กร (ยอดทั้งทีม จับคู่รายคนด้วยอีเมล) ระบบจะ sync ทุกชั่วโมงอัตโนมัติ

6.1 OpenAI — GPT / Codex (Admin key sk-admin-…)

  1. เข้า platform.openai.com → Settings → Organization → Admin keys — ต้องเป็น Owner ขององค์กร (ถ้าไม่เห็นเมนู ให้ Owner สร้างให้)
  2. กด Create admin key ตั้งชื่อ เช่น llm-key-hub → คัดลอก key ที่ขึ้นต้นด้วย sk-admin- (แสดงครั้งเดียว)
  3. วางในช่อง Admin API key ของหน้านี้ เลือก provider OpenAI ใส่ budget ต่อเดือน (USD) แล้วกดเชื่อมต่อ
  4. ระบบเรียก GET /v1/organization/usage/completions (group by user_id, model, project_id รายวัน) และ GET /v1/organization/costs สำหรับยอดบิลจริง แล้วเทียบ user_id กับ GET /v1/organization/users เพื่อได้อีเมลของแต่ละคน

ครอบคลุม: ทุก request ที่ใช้ API key ขององค์กร รวม Codex CLI / Codex IDE ที่ login ด้วย API key · ไม่ครอบคลุม: ChatGPT Plus/Pro/Team ที่ Codex login ด้วยบัญชี ChatGPT (ยอดพวกนั้นไม่มี API — ใช้ข้อ 7 แทน)

6.2 Anthropic — Claude / Claude Code (Admin key sk-ant-admin01-…)

  1. เข้า platform.claude.com → Settings → Admin keys — ต้องมี role admin ขององค์กรใน Claude Console (บัญชีเดี่ยวไม่มี Admin API ต้องสร้าง Organization ก่อนที่ Settings → Organization)
  2. กด Create key ตั้งชื่อ เลือกวันหมดอายุ → คัดลอก key ที่ขึ้นต้นด้วย sk-ant-admin01- (แสดงครั้งเดียว)
  3. วางในหน้านี้ เลือก provider Anthropic ใส่ budget แล้วกดเชื่อมต่อ
  4. ระบบเรียก GET /v1/organizations/usage_report/messages (group by model, account_id, api_key_id รายวัน — นับ uncached input, cache read, cache creation, output แยกกัน) และ GET /v1/organizations/cost_report (ยอดบิลจริง, หน่วยเซนต์) แล้วเทียบ account_id กับ /v1/organizations/users หรือเจ้าของ key จาก /v1/organizations/api_keys

ครอบคลุม: ทุก request ผ่าน Claude API ขององค์กร รวม Claude Code ที่ login ด้วยบัญชี Console ขององค์กร (ยอดติด account_id → จับคู่อีเมลได้เลย) · ไม่ครอบคลุม: Claude Pro/Max ส่วนตัว และ Bedrock/Vertex/Foundry · ข้อมูลมาช้าประมาณ 5 นาที · ถ้าใช้ Claude Code ทั้งทีมยังมี GET /v1/organizations/usage_report/claude_code?starting_at=YYYY-MM-DD ที่ให้ค่าใช้จ่ายรายคน + จำนวน session/บรรทัดโค้ด/commit ด้วย (เพิ่มได้ใน src/sync.js)

6.3 การจับคู่คน ("แข่งกัน")

กรณีทำอย่างไร
แต่ละคนมี org ของตัวเอง (บัญชีส่วนตัว)แต่ละคนใส่ Admin key ของตัวเองที่หน้า "การใช้งานของฉัน" — ยอดทั้งหมดจาก key นั้นนับเป็นของเขา
ทีมใช้ org เดียวกันadmin ใส่ Admin key ครั้งเดียวที่หน้าองค์กร — ระบบจับคู่ยอดกับสมาชิกที่สมัครด้วยอีเมลเดียวกันกับใน OpenAI/Anthropic; ที่ยังไม่มีคนสมัครจะเห็นเป็น actor ✘ ในหน้าองค์กร พอเขาสมัครแล้ว sync รอบถัดไปย้ายยอดให้อัตโนมัติ
อยากนับเฉพาะบางโปรเจกต์/บาง keyใส่ตัวกรอง project_ids (OpenAI) หรือ workspace_ids / api_key_ids (Anthropic) ตอนเชื่อมต่อ

อ่านโควต้าจากสคริปต์: GET /api/v1/connections (ต้องใช้ API token ข้อ 1) คืน quota.spend_usd, budget_usd, remaining_usd, percent_used และ by_model ของแต่ละ connection

curl -s "$LLMHUB_URL/api/v1/connections" -H "Authorization: Bearer $LLMHUB_TOKEN" | jq '.connections[] | {provider, spend: .quota.spend_usd, remaining: .quota.remaining_usd}'

7. ดึงยอดจาก Codex CLI / Claude Code (กรณีใช้ subscription)

Codex CLI เก็บ session log ไว้ที่ ~/.codex/sessions/ (JSONL) ซึ่งมี token_count ของแต่ละ turn — สคริปต์นี้อ่านไฟล์ทั้งหมดแล้วส่งเข้ามาแบบ idempotent (รันซ้ำได้ ไม่นับซ้ำ):

#!/usr/bin/env bash
# sync-codex.sh — ส่งยอด token จาก Codex CLI เข้า LLM Key Hub
set -euo pipefail
for f in ~/.codex/sessions/**/*.jsonl; do
  id=$(basename "$f" .jsonl)
  read -r p c <<<"$(jq -rs '
     [ .[] | select(.type=="event_msg" and .payload.type=="token_count") | .payload.info.total_token_usage ]
     | (last // {}) | "\(.input_tokens // 0) \(.output_tokens // 0)"' "$f")"
  [ "$p" = "0" ] && [ "$c" = "0" ] && continue
  curl -s -X POST "$LLMHUB_URL/api/v1/usage" \
    -H "Authorization: Bearer $LLMHUB_TOKEN" -H "Content-Type: application/json" \
    -d "{\"provider\":\"codex\",\"model\":\"gpt-5-codex\",\"prompt_tokens\":$p,\"completion_tokens\":$c,\"external_id\":\"codex:$id\",\"source\":\"codex-cli\"}" >/dev/null
  echo "synced $id  in=$p out=$c"
done

ตั้ง cron/launchd ให้รันทุกชั่วโมงก็พอ (ส่งซ้ำได้ — ระบบ upsert ตาม external_id) · ถ้าใช้ Codex ผ่าน API key ขององค์กร ยอดจะโผล่ใน OpenAI Admin API อยู่แล้ว (ข้อ 6) ไม่ต้องรันสคริปต์นี้

7.1 โควต้าที่เหลือของ Codex (ChatGPT plan) — ดึงจาก codex app-server

Codex CLI/Desktop มี JSON-RPC app-server ในเครื่องที่ตอบ account/rateLimits/read (ใช้ไปกี่ % ของ window 5 ชม./รายสัปดาห์ + เวลารีเซ็ต + เครดิตเสริม) และ account/usage/read (token รายวัน) โดยใช้ login เดิมของคุณ ไม่ต้องมี API key สคริปต์ codex-quota-sync.mjs ดึงค่าเหล่านี้แล้วส่งขึ้น POST /api/v1/quota/snapshot:

LLMHUB_URL=$LLMHUB_URL LLMHUB_TOKEN=$LLMHUB_TOKEN node codex-quota-sync.mjs punyapat-codex
# ✔ punyapat-codex (prolite) → https://team.specificimpulse.co
#   weekly: used 100% · remaining 0% · resets 26/9/2026 20:29
#   today 1,234,567 tokens · lifetime 2,500,511,518

payload: { source, label, plan, account, windows:[{name, used_percent, window_minutes, resets_at}], credits:{balance,has_credits,unlimited}, usage:{lifetime_tokens, today_tokens, daily:[{date,tokens}]} } — ส่ง source: "claude-code" พร้อม windows ของคุณเองได้ด้วยรูปแบบเดียวกัน · ค่าจะแสดงในหน้า "การใช้งานของฉัน", หน้าแรก และ dashboard (ถ้าเปิด public stats) และ daily ถูกนับเป็น usage ของคุณบน leaderboard (provider codex)

7.2 Claude แบบส่วนตัว (Pro / Max / Team ที่ไม่มี Admin key) — claude-quota-sync.mjs

ทางลัด: หน้า /connect สร้าง token แล้วให้คำสั่งเดียว curl -fsSL …/setup/install.sh | LLMHUB_TOKEN=… bash ซึ่งดาวน์โหลดสคริปต์ทั้งสอง, รันครั้งแรก และตั้ง launchd (macOS) / cron (Linux) ทุก 30 นาทีให้เอง — ด้านล่างคือรายละเอียดถ้าจะทำมือ

บัญชีเดี่ยวไม่มี Admin API แต่ Claude Code เก็บ log ไว้ที่ ~/.claude/projects/*/*.jsonl (ทุกคำตอบมี message.usage พร้อม model) สคริปต์ claude-quota-sync.mjs รวมยอดรายวัน × model (input / output / cache read / cache write → ระบบคิดค่าใช้จ่ายให้) และดึง % ของ window 5 ชม. / 7 วัน จาก session login ของ Claude Code เอง (/api/oauth/usage) แล้วส่งขึ้นเว็บ:

LLMHUB_URL=$LLMHUB_URL LLMHUB_TOKEN=$LLMHUB_TOKEN node claude-quota-sync.mjs punyapat-claude
# ✔ punyapat-claude (team) → https://team.specificimpulse.co · 490 log files, 41 day×model rows
#   5h: used 37% · remaining 63% · resets 22/9/2026 14:00
#   weekly: used 71% · remaining 29% · resets 25/9/2026 09:00
#   today 54,000,000 tokens · last 30 days 305,000,000 tokens

ใส่ --no-windows ถ้าไม่ต้องการให้สคริปต์แตะ credential ของ Claude Code (จะได้เฉพาะยอด token) · --days=90 เปลี่ยนช่วง · ตั้ง cron ทุก 30 นาทีเหมือน Codex · ยอดขึ้นฝั่ง Claude ใน ⚔️ GPT vs Claude และการ์ด 📟 โควต้า subscription

8. แบบองค์กร — ดูรวมทั้งบริษัทได้ไหม?

ได้ 2 ทาง ใช้ร่วมกันได้:

  1. รวมจากสมาชิก — owner สร้างองค์กรที่ หน้าองค์กร แล้วแจกรหัสเชิญ ทุก request ผ่านหน้า chat และทุก usage ที่ส่งเข้ามาผ่าน API จะติด org_id อัตโนมัติ → admin เห็นตารางรายคน, กราฟรายวัน, ตั้งแพ็กเกจ/role ให้สมาชิกได้ และเลือกเปิดให้ยอดรวม org โชว์บน dashboard สาธารณะ
  2. Sync จาก provider โดยตรง — admin ใส่ Admin key ของ OpenAI และ/หรือ Anthropic ในหน้าองค์กร (ข้อ 6): ระบบดึงยอดของทุกคนใน org แล้วจับคู่รายคนด้วยอีเมล ยอดที่จับคู่ไม่ได้แสดงเป็น actor ระดับ org และ cron sync ให้ทุกชั่วโมง
  3. SSO — ถ้าต้องการให้พนักงาน login ด้วยบัญชีบริษัท ให้ครอบ Worker ด้วย Cloudflare Access (Google Workspace / Entra ID / Okta) ได้เลยโดยไม่แก้โค้ด

provider cloudflare = Workers AI ผ่าน AI binding ของ Worker (ไม่ต้องมี key, free tier 10,000 neurons/วัน) — ฟรี: gpt-oss-120b (default), Llama 4 Scout, Llama 3.3 70B, Qwen3.8, Gemma 4, Mistral Small ฯลฯ · ต้อง Workers Paid ($5/เดือน): Kimi K2.6/K2.7-code, DeepSeek V4, GLM-5.x · ยอด token/ค่าใช้จ่ายถูกนับเข้าระบบเหมือน provider อื่น

Moonshot (Kimi) มี balance endpoint (/v1/users/me/balance) — เพิ่ม provider อื่นได้ใน src/sync.js ด้วยโครงสร้างเดียวกัน

9. Error codes

statusความหมาย
401ไม่มี/ผิด token หรือ session หมดอายุ
402โควต้า token ของเดือนนี้หมด (ตอบพร้อม quota)
403token ไม่มีสิทธิ์ write / ไม่ใช่ admin ขององค์กร
502provider ปลายทาง (Kimi/OpenAI/…) ตอบ error — ดู error ใน body

10. ความปลอดภัย

  • API key ของ provider เข้ารหัส AES-256-GCM ด้วย MASTER_KEY (Worker secret) ก่อนลง D1 — ไม่มี endpoint ไหนคืน key กลับมา
  • รหัสผ่านใช้ PBKDF2-SHA256 100,000 รอบ + salt ต่อคน; session เป็น cookie HttpOnly; Secure; SameSite=Lax
  • API token เก็บเป็น SHA-256 hash; แสดง prefix 12 ตัวไว้ให้จำได้
  • สถิติสาธารณะแสดงเฉพาะคนที่เปิด public stats (ปิดได้ใน Settings) และแสดงเฉพาะยอดรวม ไม่มีเนื้อหาข้อความ