API ของ ARNON
arnon.site คือ ผู้ให้บริการ API ของทุกโดเมน — arnon.online · arnon.work · arnon.world เรียกข้อมูลที่นี่ตรง ๆ ด้วย Authorization: Bearer (ADR-018) · หน้าเว็บของ ARNON อยู่ที่ arnon.online · โฮสต์นี้เสิร์ฟ API เอกสารหน้านี้ และหลังบ้านของผู้ดูแล (ADR-019)
ปลายทาง (base URL)
แต่ละโปรเจกต์มี scope และร้านเซสชันของตัวเอง (ADR-020) — base เดียวกันทั้งเบราว์เซอร์และฝั่งเซิร์ฟเวอร์ของแอป · token ผูกกับ scope: token ของ /api/world/v1 ใช้กับ /api/work/v1 หรือ /api/online/v1 ไม่ได้ และกลับกัน
| แอป | API base (Bearer · เบราว์เซอร์ + SSR) | ออก token (route ของแอป · same-origin) | คุกกี้ refresh ของแอป | ร้านเซสชัน |
|---|---|---|---|---|
| arnon.online | https://arnon.site/api/online/v1 | POST https://arnon.online/auth/token | arnon_online_rt | an_online_Session |
| arnon.work | https://arnon.site/api/work/v1 | POST https://arnon.work/auth/token | arnon_work_rt | an_work_Session |
| arnon.world | https://arnon.site/api/world/v1 | POST https://arnon.world/auth/token | arnon_world_rt | an_world_Session |
| ปลายทาง | ใช้ทำอะไร |
|---|---|
https://arnon.site/auth/login?app=&return= | ล็อกอินกลางของทุกแอป (ลิงก์นำทาง ไม่ใช่ fetch) — app = online · work · world · return = URL เต็มบนโดเมนของแอปนั้น |
https://arnon.site/api/v1 | สุขภาพระบบ · ทะเบียนความรู้สาธารณะ · ชำระเงิน/แต้ม/สมาชิก (JWT บริการจาก POST /api/v1/auth/login) · webhook ของผู้ให้บริการ |
https://arnon.site/knowledge-api | Knowledge API ของ apollo — สาธารณะ อ่านอย่างเดียว (allowlist ที่ขอบ · ดูตารางด้านล่าง) |
https://arnon.site/v11/line/callback | Callback URL ของ LINE Login ที่ลงทะเบียนในคอนโซลของทุก channel — จบการล็อกอินกลาง/หลังบ้านที่นี่ แล้วส่งเบราว์เซอร์กลับหน้าของแอป |
การยืนยันตัว
ผู้ใช้เข้าสู่ระบบ ที่ arnon.site ที่เดียว (ADR-020) — แอปเก็บแค่คุกกี้ refresh first-party ของตัวเอง (HttpOnly · Secure · SameSite=Lax · Path=/auth) · หน้าเว็บขอ access token จาก route /auth/token ของแอปเอง แล้วเรียก arnon.site ด้วย Bearer · ไม่มีคุกกี้ข้ามไซต์เลย (Safari ITP · LINE webview ไม่มีผล)
- เข้าสู่ระบบ — ลิงก์
https://arnon.site/auth/login?app=<app>&return=<URL ของหน้าปัจจุบัน>→ LINE → กลับมาที่https://<โดเมนของแอป>/auth/callback?code=…(รหัสใช้ครั้งเดียว · 60 วิ) · ล้ม/ยกเลิก =?error=login_failed|login_cancelled - แลกรหัส (ฝั่งเซิร์ฟเวอร์ของแอป) —
POST …/auth/exchange {code}→{access_token, token_type, expires_in, refresh_token, refresh_expires_in, user, return}→ เก็บ refresh ในคุกกี้ของแอป → ไปreturn· ใน LINE webview:POST …/auth/liff {id_token}(รูปคำตอบเดียวกัน ไม่มี return) - ใช้ —
Authorization: Bearer <access_token>·credentials: 'omit'· access เป็น JWT อายุ 15 นาที - หมุน — route
POST /auth/tokenของแอปเรียกPOST …/auth/token/refresh {refresh_token}→ คู่ใหม่ในสายเดียวกัน (คุกกี้ถูกเขียนใหม่ · เบราว์เซอร์ได้แค่ access) · refresh อายุ 14 วันและไม่เกินอายุเซสชัน · refresh ที่หมุนแล้วถูกใช้ซ้ำ = ทั้งสายถูกเพิกถอน (route ของแอปต้อง serialize คำขอพร้อมกัน) - ออกจากระบบ —
POST …/auth/token/logout {refresh_token}(เพิกถอนสาย + ลบแถวเซสชัน · 200 เสมอ) · ออกทุกเครื่อง = BearerPOST …/auth/logoutEverywhere· ลบบัญชี · ผู้ดูแลเพิกถอนเซสชัน = token ของเซสชันนั้นตาย ทันที
เก็บ access ในหน่วยความจำของแท็บเท่านั้น — ห้าม localStorage · sessionStorage · IndexedDB · คุกกี้ที่ JS อ่านได้ · โหลดหน้าใหม่ = ขอใหม่จาก /auth/token (lazy · ครั้งเดียว) · ได้ 401 = ขอใหม่หนึ่งครั้งแล้วส่งซ้ำหนึ่งครั้ง · คำตอบ token มี cache-control: no-store
// ตัวอย่าง (arnon.online) — ทุกค่าจากตารางข้างบน
const { access_token } = await (await fetch('/auth/token', { method: 'POST' })).json(); // route ของแอป · คุกกี้ refresh ไปเอง
const r = await fetch('https://arnon.site/api/online/v1/highlights', {
headers: { Authorization: `Bearer ${access_token}` },
credentials: 'omit',
});CORS
เปิดเฉพาะ path ของ API (/v11/ · /api/v1/ · /api/online/v1/ · /api/work/v1/ · /api/world/v1/) และ Origin ในรายการ: https://arnon.online · https://arnon.work · https://arnon.world · preflight → 204 · access-control-allow-headers: Authorization, Content-Type · max-age: 600 · vary: Origin · ไม่ส่ง access-control-allow-credentials (Bearer ไม่ใช้คุกกี้) · expose x-ratelimit-* · retry-after · x-request-id
Rate limit
มือถือไทยใช้ CGNAT — คนนับพันออก IP เดียว ⇒ คำขอที่มี Bearer ที่ตรวจผ่านนับ ต่อผู้ใช้ ไม่ใช่ต่อ IP (คนแปลกหน้าบนเสาเดียวกันไม่โดน 429 กันเอง) · ออก token นับต่อเซสชัน · หมุน/เพิกถอนนับต่อสาย · ทุกคำตอบที่ไม่ถูกจำกัดมี x-ratelimit-limit · x-ratelimit-remaining · x-ratelimit-reset
| อะไร | เพดาน | หมายเหตุ |
|---|---|---|
| คำขอทั่วไป (ไม่มี token · คุกกี้ · token เสีย) | 120 / นาที / IP | IP = X-Real-IP หลัง nginx · env RATE_LIMIT_MAX |
| คำขอที่มี Bearer ที่ตรวจผ่าน | 120 / นาที / ผู้ใช้ | rate_limit_per_user · RATE_LIMIT_PER_USER |
| เพดานต่อ IP ของคำขอ Bearer | 1200 / นาที / IP | rate_limit_bearer_ip_max · กันยิงถล่มจาก IP เดียว |
| หมุน/เพิกถอน (…/refresh · …/revoke) | 30 / นาที / สาย refresh | api_token_rate |
| เพดานต่อ IP ของ token endpoint | 600 / นาที / IP / action | api_token_ip_rate |
| ล็อกอินกลาง (/auth/login · callback · …/auth/exchange · …/auth/liff · …/auth/token/logout) | 300 / นาที / IP / action / scope | central_login_ip_rate (ADR-020) |
| /knowledge-api/* | 10 / วินาที / IP (burst 20) | limit_req ที่ nginx · เกิน = 429 |
รหัสข้อผิดพลาด
| สถานะ | ตัวตอบ | เมื่อไร |
|---|---|---|
| 400 | {"error":"invalid_status"} · {"success":false,"error":"Missing code or state"} | พารามิเตอร์ผิดรูป |
| 400 | {"error":"invalid_code"} | แลกรหัสล็อกอินกลางไม่ผ่าน — ทุกกรณี (ผิด · หมดอายุ 60 วิ · scope ไม่ตรง · ใช้ซ้ำ = ลบเซสชันนั้นด้วย) |
| 400 | {"error":"invalid_app"} · {"error":"invalid_return"} · {"error":"missing_id_token"} | GET /auth/login: app ไม่รู้จัก · return ไม่อยู่บนโดเมนของแอป (ไม่ redirect) · POST …/auth/liff ไม่มี id_token |
| 401 | {"error":"not_signed_in"} | route /auth/token ของแอปเมื่อไม่มีคุกกี้ refresh |
| 401 | {"error":"invalid_id_token"} | ID token ของ LIFF ไม่ผ่านการตรวจกับ channel ของ scope |
| 401 | {"error":"invalid_token"} | refresh token ไม่ถูก/หมดอายุ/ถูกใช้ซ้ำ (ใช้ซ้ำ = ทั้งสายถูกเพิกถอน) |
| 401 | {"error":"Not authenticated"} | endpoint ที่ต้องมีผู้ใช้ แต่คุกกี้/Bearer ไม่ให้ผู้ใช้ |
| 402 | {"error":"insufficient credits"} | หักเครดิตไม่พอ (scope world) |
| 403 | {"error":"Not authorized"} | มีผู้ใช้ แต่ไม่มีสิทธิ์ทำสิ่งนั้น · {"error":"origin_not_allowed"} = คำสั่งหลังบ้านที่ใช้คุกกี้จาก Origin นอกรายการ |
| 404 | {"error":"not-found"} | ไม่มีของ — และทุกคำขอหลังบ้านของ scope online จากคนที่ไม่ใช่ผู้ดูแล (หลังบ้านไม่ประกาศตัวเอง) |
| 409 | {"error":"order_expired"} · {"error":"order_cancelled"} | สถานะคำสั่งซื้อไม่อนุญาตการกระทำนั้น |
| 410 | (ว่าง) | arnon.online/api/work/v1/* — ไม่มีใครเรียก scope work ที่โฮสต์นั้น (ที่ arnon.site เปิดแล้ว · ADR-020) |
| 429 | {"statusCode":429,"message":"Rate limit exceeded, retry in 1 minute"} · {"error":"rate_limited"} | เกินโควตา — ดู retry-after · x-ratelimit-* |
| 500 | {"statusCode":500,"message":"Internal server error"} | Origin ของเบราว์เซอร์ไม่อยู่ในรายการที่รับ (ชั้น CORS เดิมแบบ NestJS) — ไม่ใช่ความผิดของเซิร์ฟเวอร์ |
| 503 | {"error":"unavailable"} · {"error":"audit_unavailable"} · {"error":"LINE login is not configured"} | ระบบย่อยยังไม่ตั้งค่า/ล่ม — ไม่มีการทำงานครึ่งทาง |
ตารางเส้นทาง
แสดง 161 เส้นทาง
arnon.online (scope online) /api/online/v1
หน้าเว็บ arnon.online — บัญชีผู้อ่าน · ที่คั่น · ไฮไลต์ · บันทึก · แผนการอ่าน · การเรียนรู้ (คอร์ส · บทเรียน · เส้นทาง · แบบประเมิน · ความก้าวหน้า — ADR-022) · สิทธิ์ PDPA
ยืนยันตัว: ร้านเซสชัน an_online_Session · Authorization: Bearer ที่ออกจากเซสชันนั้น (คุกกี้ arnon_online_session ใช้เฉพาะหลังบ้าน same-origin ที่ arnon.site)
| method | path | ชั้นของคำขอ | handler |
|---|---|---|---|
| GET | /api/online/v1/knowledge/sources | JSON | KnowledgeController:sources |
| GET | /api/online/v1/learn/tracks | JSON | Online.LearnController:tracks |
| GET | /api/online/v1/learn/courses | JSON | Online.LearnController:courses |
| GET | /api/online/v1/learn/courses/:slug | JSON | Online.LearnController:course |
| GET | /api/online/v1/learn/courses/:slug/lessons/:lesson_slug | JSON | Online.LearnController:lesson |
| GET | /api/online/v1/learn/paths | JSON | Online.LearnController:paths |
| GET | /api/online/v1/learn/paths/:slug | JSON | Online.LearnController:path |
| GET | /api/online/v1/learn/assessments/:id | JSON | Online.LearnController:assessment |
| GET | /api/online/v1/shop/products | JSON | Online.ShopController:products |
| GET | /api/online/v1/shop/products/:slug | JSON | Online.ShopController:product |
| POST | /api/online/v1/docs/view | JSON | Online.DocStatsController:view |
| GET | /api/online/v1/docs/stats | JSON | Online.DocStatsController:stats |
| POST | /api/online/v1/ai/chat | เซสชัน online · สตรีม (SSE — ไม่บังคับ accepts json) | Online.AiChatController:chat |
| GET | /api/online/v1/auth/lineLoginUrl | เซสชัน online | Online.AuthController:line_login_url |
| GET | /api/online/v1/auth/lineCallback | เซสชัน online | Online.AuthController:line_callback |
| GET | /api/online/v1/auth/session | เซสชัน online | Online.AuthController:session |
| POST | /api/online/v1/auth/logout | เซสชัน online | Online.AuthController:logout |
| POST | /api/online/v1/auth/logoutEverywhere | เซสชัน online | Online.AuthController:logout_everywhere |
| POST | /api/online/v1/auth/token/refresh | เซสชัน online | ApiTokenController:refresh |
| POST | /api/online/v1/auth/token/revoke | เซสชัน online | ApiTokenController:revoke |
| POST | /api/online/v1/auth/exchange | เซสชัน online | CentralLoginController:exchange |
| POST | /api/online/v1/auth/liff | เซสชัน online | CentralLoginController:liff |
| POST | /api/online/v1/auth/token/logout | เซสชัน online | CentralLoginController:token_logout |
| GET | /api/online/v1/bookmarks | เซสชัน online | Online.UserDataController:list_bookmarks |
| POST | /api/online/v1/bookmarks | เซสชัน online | Online.UserDataController:add_bookmark |
| DELETE | /api/online/v1/bookmarks | เซสชัน online | Online.UserDataController:remove_bookmark |
| GET | /api/online/v1/highlights | เซสชัน online | Online.UserDataController:list_highlights |
| POST | /api/online/v1/highlights | เซสชัน online | Online.UserDataController:add_highlight |
| PUT | /api/online/v1/highlights/:id | เซสชัน online | Online.UserDataController:assign_highlight |
| DELETE | /api/online/v1/highlights/:id | เซสชัน online | Online.UserDataController:remove_highlight |
| GET | /api/online/v1/projects | เซสชัน online | Online.UserDataController:list_projects |
| POST | /api/online/v1/projects | เซสชัน online | Online.UserDataController:create_project |
| DELETE | /api/online/v1/projects/:id | เซสชัน online | Online.UserDataController:delete_project |
| GET | /api/online/v1/notes | เซสชัน online | Online.UserDataController:list_notes |
| POST | /api/online/v1/notes | เซสชัน online | Online.UserDataController:create_note |
| PUT | /api/online/v1/notes/:id | เซสชัน online | Online.UserDataController:update_note |
| DELETE | /api/online/v1/notes/:id | เซสชัน online | Online.UserDataController:delete_note |
| GET | /api/online/v1/sits | เซสชัน online | Online.UserDataController:list_sits |
| GET | /api/online/v1/sits/stats | เซสชัน online | Online.UserDataController:practice_stats |
| POST | /api/online/v1/sits | เซสชัน online | Online.UserDataController:record_sit |
| PUT | /api/online/v1/sits/:id | เซสชัน online | Online.UserDataController:journal_sit |
| DELETE | /api/online/v1/sits/:id | เซสชัน online | Online.UserDataController:delete_sit |
| POST | /api/online/v1/learn/courses/:slug/enroll | เซสชัน online | Online.LearnController:enroll |
| GET | /api/online/v1/learn/me | เซสชัน online | Online.LearnController:me |
| POST | /api/online/v1/learn/lessons/:id/complete | เซสชัน online | Online.LearnController:complete_lesson |
| POST | /api/online/v1/learn/assessments/:id/attempts | เซสชัน online | Online.LearnController:submit_attempt |
| GET | /api/online/v1/learn/assessments/:id/attempts | เซสชัน online | Online.LearnController:list_attempts |
| POST | /api/online/v1/learn/assessments/:id/submissions | เซสชัน online | Online.LearnController:submit_submission |
| GET | /api/online/v1/learn/assessments/:id/submissions | เซสชัน online | Online.LearnController:list_submissions |
| GET | /api/online/v1/docs/vote | เซสชัน online | Online.DocStatsController:my_vote |
| POST | /api/online/v1/docs/vote | เซสชัน online | Online.DocStatsController:vote |
| GET | /api/online/v1/read | เซสชัน online | Online.UserDataController:list_read |
| POST | /api/online/v1/read | เซสชัน online | Online.UserDataController:mark_read |
| DELETE | /api/online/v1/read | เซสชัน online | Online.UserDataController:unmark_read |
| DELETE | /api/online/v1/read/all | เซสชัน online | Online.UserDataController:clear_read |
| GET | /api/online/v1/reading-plan | เซสชัน online | Online.UserDataController:reading_plan |
| PUT | /api/online/v1/reading-plan | เซสชัน online | Online.UserDataController:put_reading_plan |
| DELETE | /api/online/v1/reading-plan | เซสชัน online | Online.UserDataController:delete_reading_plan |
| GET | /api/online/v1/consents | เซสชัน online | Online.UserDataController:list_consents |
| POST | /api/online/v1/consents | เซสชัน online | Online.UserDataController:grant_consent |
| DELETE | /api/online/v1/consents/:kind | เซสชัน online | Online.UserDataController:revoke_consent |
| GET | /api/online/v1/me/export | เซสชัน online | Online.UserDataController:export |
| POST | /api/online/v1/me/erase | เซสชัน online | Online.UserDataController:erase |
| POST | /api/online/v1/me/delete-account | เซสชัน online | Online.UserDataController:delete_account |
| GET | /api/online/v1/me/audit | เซสชัน online | Online.UserDataController:audit_trail |
arnon.work (scope work) /api/work/v1
หน้าเว็บ arnon.work — ตัวตน · เครดิต · คำสั่งเติมเครดิต · คำอ่านที่บันทึก · เอกสารผู้ใช้ · ความยินยอม (สัญญาเดียวกับ scope world · ข้อมูลอยู่ตารางของ world ป้าย wellness)
ยืนยันตัว: ร้านเซสชัน an_work_Session · Bearer ที่ออกจากเซสชันนั้น — token ของ scope อื่นใช้ที่นี่ไม่ได้ · ไม่มี LINE login ต่อโดเมน (ล็อกอินกลางเท่านั้น)
| method | path | ชั้นของคำขอ | handler |
|---|---|---|---|
| GET | /api/work/v1/knowledge/sources | JSON | KnowledgeController:sources |
| GET | /api/work/v1/auth/session | เซสชัน work | Work.AuthController:session |
| POST | /api/work/v1/auth/logout | เซสชัน work | Work.AuthController:logout |
| POST | /api/work/v1/auth/logoutEverywhere | เซสชัน work | Work.AuthController:logout_everywhere |
| GET | /api/work/v1/getGuardStatus | เซสชัน work | Work.AuthController:guard_status |
| POST | /api/work/v1/completeOnboarding | เซสชัน work | Work.AuthController:complete_onboarding |
| POST | /api/work/v1/auth/token/refresh | เซสชัน work | ApiTokenController:refresh |
| POST | /api/work/v1/auth/token/revoke | เซสชัน work | ApiTokenController:revoke |
| POST | /api/work/v1/auth/exchange | เซสชัน work | CentralLoginController:exchange |
| POST | /api/work/v1/auth/liff | เซสชัน work | CentralLoginController:liff |
| POST | /api/work/v1/auth/token/logout | เซสชัน work | CentralLoginController:token_logout |
| GET | /api/work/v1/getAccessStatus | เซสชัน work | World.BillingController:access_status |
| POST | /api/work/v1/consumeCredit | เซสชัน work | World.BillingController:consume_credit |
| GET | /api/work/v1/getTopupPackages | เซสชัน work | World.BillingController:packages |
| POST | /api/work/v1/createTopupOrder | เซสชัน work | World.BillingController:create_order |
| GET | /api/work/v1/getTopupOrderStatus | เซสชัน work | World.BillingController:order_status |
| GET | /api/work/v1/getMyTopupOrders | เซสชัน work | World.BillingController:my_orders |
| GET | /api/work/v1/divination/myReadings | เซสชัน work | World.ReadingsController:my_readings |
| POST | /api/work/v1/divination/saveReading | เซสชัน work | World.ReadingsController:save_reading |
| POST | /api/work/v1/divination/refundCredit | เซสชัน work | World.ReadingsController:refund_credit |
| GET | /api/work/v1/data/doc/:namespace | เซสชัน work | World.UserDataController:get_doc |
| PUT | /api/work/v1/data/doc/:namespace | เซสชัน work | World.UserDataController:put_doc |
| GET | /api/work/v1/me/export | เซสชัน work | World.UserDataController:export |
| DELETE | /api/work/v1/data/docs | เซสชัน work | World.UserDataController:delete_all |
| DELETE | /api/work/v1/data/docs/:namespace | เซสชัน work | World.UserDataController:delete_doc |
| GET | /api/work/v1/consents | เซสชัน work | World.UserDataController:list_consents |
| POST | /api/work/v1/consents | เซสชัน work | World.UserDataController:grant_consent |
| DELETE | /api/work/v1/consents/:kind | เซสชัน work | World.UserDataController:revoke_consent |
| GET | /api/work/v1/me/audit | เซสชัน work | World.UserDataController:audit_trail |
| POST | /api/work/v1/me/delete-account | เซสชัน work | World.UserDataController:delete_account |
| POST | /api/work/v1/me/erase | เซสชัน work | World.UserDataController:erase |
arnon.world (scope world) /api/world/v1
หน้าเว็บ arnon.world — ตัวตน LINE/LIFF · เครดิต · คำสั่งเติมเครดิต · คำอ่านที่บันทึก · เอกสารผู้ใช้ · ความยินยอม
ยืนยันตัว: ร้านเซสชัน an_world_Session · Bearer ที่ออกจากเซสชันนั้น — token ของ scope อื่นใช้ที่นี่ไม่ได้
| method | path | ชั้นของคำขอ | handler |
|---|---|---|---|
| POST | /api/world/v1/cta | JSON | CrossProductController:click |
| GET | /api/world/v1/knowledge/sources | JSON | KnowledgeController:sources |
| GET | /api/world/v1/auth/session | เซสชัน world | World.AuthController:session |
| POST | /api/world/v1/auth/logout | เซสชัน world | World.AuthController:logout |
| POST | /api/world/v1/auth/logoutEverywhere | เซสชัน world | World.AuthController:logout_everywhere |
| GET | /api/world/v1/getGuardStatus | เซสชัน world | World.AuthController:guard_status |
| POST | /api/world/v1/completeOnboarding | เซสชัน world | World.AuthController:complete_onboarding |
| POST | /api/world/v1/auth/token/refresh | เซสชัน world | ApiTokenController:refresh |
| POST | /api/world/v1/auth/token/revoke | เซสชัน world | ApiTokenController:revoke |
| POST | /api/world/v1/auth/exchange | เซสชัน world | CentralLoginController:exchange |
| POST | /api/world/v1/auth/liff | เซสชัน world | CentralLoginController:liff |
| POST | /api/world/v1/auth/token/logout | เซสชัน world | CentralLoginController:token_logout |
| GET | /api/world/v1/getAccessStatus | เซสชัน world | World.BillingController:access_status |
| POST | /api/world/v1/consumeCredit | เซสชัน world | World.BillingController:consume_credit |
| GET | /api/world/v1/getTopupPackages | เซสชัน world | World.BillingController:packages |
| POST | /api/world/v1/createTopupOrder | เซสชัน world | World.BillingController:create_order |
| GET | /api/world/v1/getTopupOrderStatus | เซสชัน world | World.BillingController:order_status |
| GET | /api/world/v1/getMyTopupOrders | เซสชัน world | World.BillingController:my_orders |
| GET | /api/world/v1/divination/myReadings | เซสชัน world | World.ReadingsController:my_readings |
| POST | /api/world/v1/divination/saveReading | เซสชัน world | World.ReadingsController:save_reading |
| POST | /api/world/v1/divination/refundCredit | เซสชัน world | World.ReadingsController:refund_credit |
| GET | /api/world/v1/data/doc/:namespace | เซสชัน world | World.UserDataController:get_doc |
| PUT | /api/world/v1/data/doc/:namespace | เซสชัน world | World.UserDataController:put_doc |
| GET | /api/world/v1/me/export | เซสชัน world | World.UserDataController:export |
| DELETE | /api/world/v1/data/docs | เซสชัน world | World.UserDataController:delete_all |
| DELETE | /api/world/v1/data/docs/:namespace | เซสชัน world | World.UserDataController:delete_doc |
| GET | /api/world/v1/consents | เซสชัน world | World.UserDataController:list_consents |
| POST | /api/world/v1/consents | เซสชัน world | World.UserDataController:grant_consent |
| DELETE | /api/world/v1/consents/:kind | เซสชัน world | World.UserDataController:revoke_consent |
| GET | /api/world/v1/me/audit | เซสชัน world | World.UserDataController:audit_trail |
| POST | /api/world/v1/me/delete-account | เซสชัน world | World.UserDataController:delete_account |
| POST | /api/world/v1/me/erase | เซสชัน world | World.UserDataController:erase |
ล็อกอินกลาง (arnon.site) /auth
GET /auth/login?app=online|work|world&return=<URL บนโดเมนของแอป> — ปุ่ม "เข้าสู่ระบบ" ของทุกแอปเป็นลิงก์มาที่นี่ → LINE → /v11/line/callback → <แอป>/auth/callback?code=
ยืนยันตัว: สาธารณะ (เบราว์เซอร์นำทางมาเอง) · return ต้องอยู่บนโดเมนของแอปนั้นเป๊ะ ไม่งั้น 400 · state เซ็น + nonce cookie arnon_site_login + PKCE S256
| method | path | ชั้นของคำขอ | handler |
|---|---|---|---|
| GET | /auth/login | เบราว์เซอร์ (HTML/JSON) | CentralLoginController:start |
บริการร่วม (/api/v1 · ชื่อเล่น /v11) /api/v1
สุขภาพระบบ · ทะเบียนความรู้สาธารณะ · ชำระเงิน/แต้ม/สมาชิก · LINE callback และ webhook
ยืนยันตัว: ต่อ endpoint — สาธารณะ (health · ทะเบียน · แผนสมาชิก) · JWT บริการ (POST /auth/login) · ลายเซ็นของผู้ให้บริการ (webhook)
| method | path | ชั้นของคำขอ | handler |
|---|---|---|---|
| GET | /api/v1/health | JSON | HealthController:index |
| GET | /api/v1/knowledge/sources | JSON | KnowledgeController:sources |
| POST | /api/v1/auth/login | JSON | AuthController:login |
| GET | /api/v1/subscriptions/plans/:site | JSON | SubscriptionsController:plans |
| GET | /api/v1/subscriptions/me | JSON | SubscriptionsController:me |
| POST | /api/v1/subscriptions | JSON | SubscriptionsController:create |
| POST | /api/v1/subscriptions/:id/cancel | JSON | SubscriptionsController:cancel |
| GET | /api/v1/points/:site | JSON | PointsController:balance |
| GET | /api/v1/points/:site/transactions | JSON | PointsController:transactions |
| POST | /api/v1/points/topup | JSON | PointsController:topup |
| GET | /api/v1/payments/:paymentId | JSON | PaymentsController:show |
| POST | /api/v1/payments/create | JSON | PaymentsController:create |
| POST | /api/v1/payments/webhook/:provider | JSON | PaymentsController:webhook |
| POST | /api/v1/content/in-th/line/webhook | JSON | LineBotController:webhook |
| POST | /api/v1/line/webhook | JSON | World.LineBotController:webhook |
| GET | /api/v1/line/callback | เบราว์เซอร์ (HTML/JSON) | LineCallbackController:callback |
ชื่อเล่น /v11 (arnon.site) /v11
ที่ arnon.site: /v11/health · /v11/line/callback (callback ของ LINE) · /v11/line/webhook → บริการร่วม · /v11/* อื่น → scope online · ADR-020 phase 3: /v11 ของ arnon.online|work|world ปิดแล้ว (410) เหลือ webhook ของ LINE OA และ /v11/cta (work · world)
ยืนยันตัว: client เรียก https://arnon.site/api/<scope>/v1 ตรงด้วย Bearer — /v11 ไม่ใช่ทางของ client
| method | path | ชั้นของคำขอ | handler |
|---|---|---|---|
| GET | /v11/health | JSON | HealthController:index |
| GET | /v11/knowledge/sources | JSON | KnowledgeController:sources |
| POST | /v11/auth/login | JSON | AuthController:login |
| GET | /v11/subscriptions/plans/:site | JSON | SubscriptionsController:plans |
| GET | /v11/subscriptions/me | JSON | SubscriptionsController:me |
| POST | /v11/subscriptions | JSON | SubscriptionsController:create |
| POST | /v11/subscriptions/:id/cancel | JSON | SubscriptionsController:cancel |
| GET | /v11/points/:site | JSON | PointsController:balance |
| GET | /v11/points/:site/transactions | JSON | PointsController:transactions |
| POST | /v11/points/topup | JSON | PointsController:topup |
| GET | /v11/payments/:paymentId | JSON | PaymentsController:show |
| POST | /v11/payments/create | JSON | PaymentsController:create |
| POST | /v11/payments/webhook/:provider | JSON | PaymentsController:webhook |
| POST | /v11/content/in-th/line/webhook | JSON | LineBotController:webhook |
| POST | /v11/line/webhook | JSON | World.LineBotController:webhook |
| GET | /v11/line/callback | เบราว์เซอร์ (HTML/JSON) | LineCallbackController:callback |
Knowledge API (apollo · อ่านอย่างเดียว) /knowledge-api
สาธารณะ ไม่ต้องยืนยันตัว · GET / HEAD เท่านั้น (อื่น = 405) · นอกรายการ = 404 · ไม่มี endpoint ที่เรียก AI · allowlist ที่ขอบ: ^/knowledge-api/(v1/(summary|toc|refs|search)|v1/node/[^/]+(/meta)?|v2/(collections|search|sources)|v2/[A-Za-z]+/(editions|tree)|v2/[A-Za-z]+/(doc|book)/[^/]+)$
- GET /knowledge-api/v1/summary
- GET /knowledge-api/v1/toc
- GET /knowledge-api/v1/refs
- GET /knowledge-api/v1/search
- GET /knowledge-api/v1/node/{id}/meta
- GET /knowledge-api/v1/node/{id}
- GET /knowledge-api/v2/collections
- GET /knowledge-api/v2/search
- GET /knowledge-api/v2/sources
- GET /knowledge-api/v2/{collection}/editions
- GET /knowledge-api/v2/{collection}/tree
- GET /knowledge-api/v2/{collection}/doc/{id}
- GET /knowledge-api/v2/{collection}/book/{id}
ข้อความและตัวเลขในหน้านี้สกัดอัตโนมัติจาก apollo/arnon/lib/arnon_api_web/router.ex + infra/nginx-production/arnon.site.conf — 161 เส้นทางของ Phoenix (ไม่รวมหลังบ้าน) · 13 เส้นทางของ Knowledge API