https://arnon.site

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.onlinehttps://arnon.site/api/online/v1POST https://arnon.online/auth/tokenarnon_online_rtan_online_Session
arnon.workhttps://arnon.site/api/work/v1POST https://arnon.work/auth/tokenarnon_work_rtan_work_Session
arnon.worldhttps://arnon.site/api/world/v1POST https://arnon.world/auth/tokenarnon_world_rtan_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-apiKnowledge API ของ apollo — สาธารณะ อ่านอย่างเดียว (allowlist ที่ขอบ · ดูตารางด้านล่าง)
https://arnon.site/v11/line/callbackCallback 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 ไม่มีผล)

  1. เข้าสู่ระบบ — ลิงก์ https://arnon.site/auth/login?app=<app>&return=<URL ของหน้าปัจจุบัน> → LINE → กลับมาที่ https://<โดเมนของแอป>/auth/callback?code=… (รหัสใช้ครั้งเดียว · 60 วิ) · ล้ม/ยกเลิก = ?error=login_failed|login_cancelled
  2. แลกรหัส (ฝั่งเซิร์ฟเวอร์ของแอป) — 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)
  3. ใช้ — Authorization: Bearer <access_token> · credentials: 'omit' · access เป็น JWT อายุ 15 นาที
  4. หมุน — route POST /auth/token ของแอปเรียก POST …/auth/token/refresh {refresh_token} → คู่ใหม่ในสายเดียวกัน (คุกกี้ถูกเขียนใหม่ · เบราว์เซอร์ได้แค่ access) · refresh อายุ 14 วันและไม่เกินอายุเซสชัน · refresh ที่หมุนแล้วถูกใช้ซ้ำ = ทั้งสายถูกเพิกถอน (route ของแอปต้อง serialize คำขอพร้อมกัน)
  5. ออกจากระบบ — POST …/auth/token/logout {refresh_token} (เพิกถอนสาย + ลบแถวเซสชัน · 200 เสมอ) · ออกทุกเครื่อง = Bearer POST …/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 / นาที / IPIP = X-Real-IP หลัง nginx · env RATE_LIMIT_MAX
คำขอที่มี Bearer ที่ตรวจผ่าน120 / นาที / ผู้ใช้rate_limit_per_user · RATE_LIMIT_PER_USER
เพดานต่อ IP ของคำขอ Bearer1200 / นาที / IPrate_limit_bearer_ip_max · กันยิงถล่มจาก IP เดียว
หมุน/เพิกถอน (…/refresh · …/revoke)30 / นาที / สาย refreshapi_token_rate
เพดานต่อ IP ของ token endpoint600 / นาที / IP / actionapi_token_ip_rate
ล็อกอินกลาง (/auth/login · callback · …/auth/exchange · …/auth/liff · …/auth/token/logout)300 / นาที / IP / action / scopecentral_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)

methodpathชั้นของคำขอhandler
GET/api/online/v1/knowledge/sourcesJSONKnowledgeController:sources
GET/api/online/v1/learn/tracksJSONOnline.LearnController:tracks
GET/api/online/v1/learn/coursesJSONOnline.LearnController:courses
GET/api/online/v1/learn/courses/:slugJSONOnline.LearnController:course
GET/api/online/v1/learn/courses/:slug/lessons/:lesson_slugJSONOnline.LearnController:lesson
GET/api/online/v1/learn/pathsJSONOnline.LearnController:paths
GET/api/online/v1/learn/paths/:slugJSONOnline.LearnController:path
GET/api/online/v1/learn/assessments/:idJSONOnline.LearnController:assessment
GET/api/online/v1/shop/productsJSONOnline.ShopController:products
GET/api/online/v1/shop/products/:slugJSONOnline.ShopController:product
POST/api/online/v1/docs/viewJSONOnline.DocStatsController:view
GET/api/online/v1/docs/statsJSONOnline.DocStatsController:stats
POST/api/online/v1/ai/chatเซสชัน online · สตรีม (SSE — ไม่บังคับ accepts json)Online.AiChatController:chat
GET/api/online/v1/auth/lineLoginUrlเซสชัน onlineOnline.AuthController:line_login_url
GET/api/online/v1/auth/lineCallbackเซสชัน onlineOnline.AuthController:line_callback
GET/api/online/v1/auth/sessionเซสชัน onlineOnline.AuthController:session
POST/api/online/v1/auth/logoutเซสชัน onlineOnline.AuthController:logout
POST/api/online/v1/auth/logoutEverywhereเซสชัน onlineOnline.AuthController:logout_everywhere
POST/api/online/v1/auth/token/refreshเซสชัน onlineApiTokenController:refresh
POST/api/online/v1/auth/token/revokeเซสชัน onlineApiTokenController:revoke
POST/api/online/v1/auth/exchangeเซสชัน onlineCentralLoginController:exchange
POST/api/online/v1/auth/liffเซสชัน onlineCentralLoginController:liff
POST/api/online/v1/auth/token/logoutเซสชัน onlineCentralLoginController:token_logout
GET/api/online/v1/bookmarksเซสชัน onlineOnline.UserDataController:list_bookmarks
POST/api/online/v1/bookmarksเซสชัน onlineOnline.UserDataController:add_bookmark
DELETE/api/online/v1/bookmarksเซสชัน onlineOnline.UserDataController:remove_bookmark
GET/api/online/v1/highlightsเซสชัน onlineOnline.UserDataController:list_highlights
POST/api/online/v1/highlightsเซสชัน onlineOnline.UserDataController:add_highlight
PUT/api/online/v1/highlights/:idเซสชัน onlineOnline.UserDataController:assign_highlight
DELETE/api/online/v1/highlights/:idเซสชัน onlineOnline.UserDataController:remove_highlight
GET/api/online/v1/projectsเซสชัน onlineOnline.UserDataController:list_projects
POST/api/online/v1/projectsเซสชัน onlineOnline.UserDataController:create_project
DELETE/api/online/v1/projects/:idเซสชัน onlineOnline.UserDataController:delete_project
GET/api/online/v1/notesเซสชัน onlineOnline.UserDataController:list_notes
POST/api/online/v1/notesเซสชัน onlineOnline.UserDataController:create_note
PUT/api/online/v1/notes/:idเซสชัน onlineOnline.UserDataController:update_note
DELETE/api/online/v1/notes/:idเซสชัน onlineOnline.UserDataController:delete_note
GET/api/online/v1/sitsเซสชัน onlineOnline.UserDataController:list_sits
GET/api/online/v1/sits/statsเซสชัน onlineOnline.UserDataController:practice_stats
POST/api/online/v1/sitsเซสชัน onlineOnline.UserDataController:record_sit
PUT/api/online/v1/sits/:idเซสชัน onlineOnline.UserDataController:journal_sit
DELETE/api/online/v1/sits/:idเซสชัน onlineOnline.UserDataController:delete_sit
POST/api/online/v1/learn/courses/:slug/enrollเซสชัน onlineOnline.LearnController:enroll
GET/api/online/v1/learn/meเซสชัน onlineOnline.LearnController:me
POST/api/online/v1/learn/lessons/:id/completeเซสชัน onlineOnline.LearnController:complete_lesson
POST/api/online/v1/learn/assessments/:id/attemptsเซสชัน onlineOnline.LearnController:submit_attempt
GET/api/online/v1/learn/assessments/:id/attemptsเซสชัน onlineOnline.LearnController:list_attempts
POST/api/online/v1/learn/assessments/:id/submissionsเซสชัน onlineOnline.LearnController:submit_submission
GET/api/online/v1/learn/assessments/:id/submissionsเซสชัน onlineOnline.LearnController:list_submissions
GET/api/online/v1/docs/voteเซสชัน onlineOnline.DocStatsController:my_vote
POST/api/online/v1/docs/voteเซสชัน onlineOnline.DocStatsController:vote
GET/api/online/v1/readเซสชัน onlineOnline.UserDataController:list_read
POST/api/online/v1/readเซสชัน onlineOnline.UserDataController:mark_read
DELETE/api/online/v1/readเซสชัน onlineOnline.UserDataController:unmark_read
DELETE/api/online/v1/read/allเซสชัน onlineOnline.UserDataController:clear_read
GET/api/online/v1/reading-planเซสชัน onlineOnline.UserDataController:reading_plan
PUT/api/online/v1/reading-planเซสชัน onlineOnline.UserDataController:put_reading_plan
DELETE/api/online/v1/reading-planเซสชัน onlineOnline.UserDataController:delete_reading_plan
GET/api/online/v1/consentsเซสชัน onlineOnline.UserDataController:list_consents
POST/api/online/v1/consentsเซสชัน onlineOnline.UserDataController:grant_consent
DELETE/api/online/v1/consents/:kindเซสชัน onlineOnline.UserDataController:revoke_consent
GET/api/online/v1/me/exportเซสชัน onlineOnline.UserDataController:export
POST/api/online/v1/me/eraseเซสชัน onlineOnline.UserDataController:erase
POST/api/online/v1/me/delete-accountเซสชัน onlineOnline.UserDataController:delete_account
GET/api/online/v1/me/auditเซสชัน onlineOnline.UserDataController:audit_trail

arnon.work (scope work) /api/work/v1

หน้าเว็บ arnon.work — ตัวตน · เครดิต · คำสั่งเติมเครดิต · คำอ่านที่บันทึก · เอกสารผู้ใช้ · ความยินยอม (สัญญาเดียวกับ scope world · ข้อมูลอยู่ตารางของ world ป้าย wellness)

ยืนยันตัว: ร้านเซสชัน an_work_Session · Bearer ที่ออกจากเซสชันนั้น — token ของ scope อื่นใช้ที่นี่ไม่ได้ · ไม่มี LINE login ต่อโดเมน (ล็อกอินกลางเท่านั้น)

methodpathชั้นของคำขอhandler
GET/api/work/v1/knowledge/sourcesJSONKnowledgeController:sources
GET/api/work/v1/auth/sessionเซสชัน workWork.AuthController:session
POST/api/work/v1/auth/logoutเซสชัน workWork.AuthController:logout
POST/api/work/v1/auth/logoutEverywhereเซสชัน workWork.AuthController:logout_everywhere
GET/api/work/v1/getGuardStatusเซสชัน workWork.AuthController:guard_status
POST/api/work/v1/completeOnboardingเซสชัน workWork.AuthController:complete_onboarding
POST/api/work/v1/auth/token/refreshเซสชัน workApiTokenController:refresh
POST/api/work/v1/auth/token/revokeเซสชัน workApiTokenController:revoke
POST/api/work/v1/auth/exchangeเซสชัน workCentralLoginController:exchange
POST/api/work/v1/auth/liffเซสชัน workCentralLoginController:liff
POST/api/work/v1/auth/token/logoutเซสชัน workCentralLoginController:token_logout
GET/api/work/v1/getAccessStatusเซสชัน workWorld.BillingController:access_status
POST/api/work/v1/consumeCreditเซสชัน workWorld.BillingController:consume_credit
GET/api/work/v1/getTopupPackagesเซสชัน workWorld.BillingController:packages
POST/api/work/v1/createTopupOrderเซสชัน workWorld.BillingController:create_order
GET/api/work/v1/getTopupOrderStatusเซสชัน workWorld.BillingController:order_status
GET/api/work/v1/getMyTopupOrdersเซสชัน workWorld.BillingController:my_orders
GET/api/work/v1/divination/myReadingsเซสชัน workWorld.ReadingsController:my_readings
POST/api/work/v1/divination/saveReadingเซสชัน workWorld.ReadingsController:save_reading
POST/api/work/v1/divination/refundCreditเซสชัน workWorld.ReadingsController:refund_credit
GET/api/work/v1/data/doc/:namespaceเซสชัน workWorld.UserDataController:get_doc
PUT/api/work/v1/data/doc/:namespaceเซสชัน workWorld.UserDataController:put_doc
GET/api/work/v1/me/exportเซสชัน workWorld.UserDataController:export
DELETE/api/work/v1/data/docsเซสชัน workWorld.UserDataController:delete_all
DELETE/api/work/v1/data/docs/:namespaceเซสชัน workWorld.UserDataController:delete_doc
GET/api/work/v1/consentsเซสชัน workWorld.UserDataController:list_consents
POST/api/work/v1/consentsเซสชัน workWorld.UserDataController:grant_consent
DELETE/api/work/v1/consents/:kindเซสชัน workWorld.UserDataController:revoke_consent
GET/api/work/v1/me/auditเซสชัน workWorld.UserDataController:audit_trail
POST/api/work/v1/me/delete-accountเซสชัน workWorld.UserDataController:delete_account
POST/api/work/v1/me/eraseเซสชัน workWorld.UserDataController:erase

arnon.world (scope world) /api/world/v1

หน้าเว็บ arnon.world — ตัวตน LINE/LIFF · เครดิต · คำสั่งเติมเครดิต · คำอ่านที่บันทึก · เอกสารผู้ใช้ · ความยินยอม

ยืนยันตัว: ร้านเซสชัน an_world_Session · Bearer ที่ออกจากเซสชันนั้น — token ของ scope อื่นใช้ที่นี่ไม่ได้

methodpathชั้นของคำขอhandler
POST/api/world/v1/ctaJSONCrossProductController:click
GET/api/world/v1/knowledge/sourcesJSONKnowledgeController:sources
GET/api/world/v1/auth/sessionเซสชัน worldWorld.AuthController:session
POST/api/world/v1/auth/logoutเซสชัน worldWorld.AuthController:logout
POST/api/world/v1/auth/logoutEverywhereเซสชัน worldWorld.AuthController:logout_everywhere
GET/api/world/v1/getGuardStatusเซสชัน worldWorld.AuthController:guard_status
POST/api/world/v1/completeOnboardingเซสชัน worldWorld.AuthController:complete_onboarding
POST/api/world/v1/auth/token/refreshเซสชัน worldApiTokenController:refresh
POST/api/world/v1/auth/token/revokeเซสชัน worldApiTokenController:revoke
POST/api/world/v1/auth/exchangeเซสชัน worldCentralLoginController:exchange
POST/api/world/v1/auth/liffเซสชัน worldCentralLoginController:liff
POST/api/world/v1/auth/token/logoutเซสชัน worldCentralLoginController:token_logout
GET/api/world/v1/getAccessStatusเซสชัน worldWorld.BillingController:access_status
POST/api/world/v1/consumeCreditเซสชัน worldWorld.BillingController:consume_credit
GET/api/world/v1/getTopupPackagesเซสชัน worldWorld.BillingController:packages
POST/api/world/v1/createTopupOrderเซสชัน worldWorld.BillingController:create_order
GET/api/world/v1/getTopupOrderStatusเซสชัน worldWorld.BillingController:order_status
GET/api/world/v1/getMyTopupOrdersเซสชัน worldWorld.BillingController:my_orders
GET/api/world/v1/divination/myReadingsเซสชัน worldWorld.ReadingsController:my_readings
POST/api/world/v1/divination/saveReadingเซสชัน worldWorld.ReadingsController:save_reading
POST/api/world/v1/divination/refundCreditเซสชัน worldWorld.ReadingsController:refund_credit
GET/api/world/v1/data/doc/:namespaceเซสชัน worldWorld.UserDataController:get_doc
PUT/api/world/v1/data/doc/:namespaceเซสชัน worldWorld.UserDataController:put_doc
GET/api/world/v1/me/exportเซสชัน worldWorld.UserDataController:export
DELETE/api/world/v1/data/docsเซสชัน worldWorld.UserDataController:delete_all
DELETE/api/world/v1/data/docs/:namespaceเซสชัน worldWorld.UserDataController:delete_doc
GET/api/world/v1/consentsเซสชัน worldWorld.UserDataController:list_consents
POST/api/world/v1/consentsเซสชัน worldWorld.UserDataController:grant_consent
DELETE/api/world/v1/consents/:kindเซสชัน worldWorld.UserDataController:revoke_consent
GET/api/world/v1/me/auditเซสชัน worldWorld.UserDataController:audit_trail
POST/api/world/v1/me/delete-accountเซสชัน worldWorld.UserDataController:delete_account
POST/api/world/v1/me/eraseเซสชัน worldWorld.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

methodpathชั้นของคำขอhandler
GET/auth/loginเบราว์เซอร์ (HTML/JSON)CentralLoginController:start

บริการร่วม (/api/v1 · ชื่อเล่น /v11) /api/v1

สุขภาพระบบ · ทะเบียนความรู้สาธารณะ · ชำระเงิน/แต้ม/สมาชิก · LINE callback และ webhook

ยืนยันตัว: ต่อ endpoint — สาธารณะ (health · ทะเบียน · แผนสมาชิก) · JWT บริการ (POST /auth/login) · ลายเซ็นของผู้ให้บริการ (webhook)

methodpathชั้นของคำขอhandler
GET/api/v1/healthJSONHealthController:index
GET/api/v1/knowledge/sourcesJSONKnowledgeController:sources
POST/api/v1/auth/loginJSONAuthController:login
GET/api/v1/subscriptions/plans/:siteJSONSubscriptionsController:plans
GET/api/v1/subscriptions/meJSONSubscriptionsController:me
POST/api/v1/subscriptionsJSONSubscriptionsController:create
POST/api/v1/subscriptions/:id/cancelJSONSubscriptionsController:cancel
GET/api/v1/points/:siteJSONPointsController:balance
GET/api/v1/points/:site/transactionsJSONPointsController:transactions
POST/api/v1/points/topupJSONPointsController:topup
GET/api/v1/payments/:paymentIdJSONPaymentsController:show
POST/api/v1/payments/createJSONPaymentsController:create
POST/api/v1/payments/webhook/:providerJSONPaymentsController:webhook
POST/api/v1/content/in-th/line/webhookJSONLineBotController:webhook
POST/api/v1/line/webhookJSONWorld.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

methodpathชั้นของคำขอhandler
GET/v11/healthJSONHealthController:index
GET/v11/knowledge/sourcesJSONKnowledgeController:sources
POST/v11/auth/loginJSONAuthController:login
GET/v11/subscriptions/plans/:siteJSONSubscriptionsController:plans
GET/v11/subscriptions/meJSONSubscriptionsController:me
POST/v11/subscriptionsJSONSubscriptionsController:create
POST/v11/subscriptions/:id/cancelJSONSubscriptionsController:cancel
GET/v11/points/:siteJSONPointsController:balance
GET/v11/points/:site/transactionsJSONPointsController:transactions
POST/v11/points/topupJSONPointsController:topup
GET/v11/payments/:paymentIdJSONPaymentsController:show
POST/v11/payments/createJSONPaymentsController:create
POST/v11/payments/webhook/:providerJSONPaymentsController:webhook
POST/v11/content/in-th/line/webhookJSONLineBotController:webhook
POST/v11/line/webhookJSONWorld.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