ไล่ดูและค้นหาสินค้า

GET/api/v1/products
สิทธิ์ที่ต้องใช้:catalog:read

ไล่ดูและค้นหาสินค้าในแคตตาล็อก ทีละ platform · สามเรื่องที่ต้องรู้ก่อนเขียนโค้ด: (1) platform เป็นพารามิเตอร์เดียวที่บังคับ และขอทุก platform พร้อมกันในคำขอเดียวไม่ได้ ถ้าจะดึงทั้งแคตตาล็อกต้องวนทีละ platform · (2) สินค้าทุกชิ้นมี type ซึ่งเป็นตัวบอกว่าคุณจะสั่งซื้อมันยังไง — cdkey (คีย์เกม) กับ account1 (บัญชีใหม่ที่ยังไม่เคยใช้) สั่งด้วย product_id อย่างเดียว ส่วน account2 (บัญชีมือสอง) ต้องไปเลือกบัญชีรายชิ้นมาก่อนแล้วส่ง item_id มาด้วย · (3) ราคาที่ได้จากหน้านี้เป็นเงินบาทและหักส่วนลดของคีย์คุณมาแล้ว แต่ยังไม่ใช่ราคาสุดท้าย เพราะหน้านี้ข้ามการคิดราคาขั้นต่ำรายสินค้า ราคาที่ได้จึงอาจต่ำกว่าราคาจริงเล็กน้อย — ก่อนสั่งซื้อต้องไปอ่านราคาจากเอนด์พอยต์รายชิ้นเสมอ

available ที่ไม่มีค่า แปลว่ายังไม่ได้ตรวจ ไม่ใช่ของหมด

ฟิลด์นี้มีได้แค่ false (ยืนยันแล้วว่าหมด) กับ null (ยังไม่ได้ตรวจกับต้นทาง) ไม่มีค่า true — ให้ถือว่าเป็นค่าที่ไม่มีอยู่ ไม่ใช่ค่าที่รอให้มันโผล่มา · เอนด์พอยต์แคตตาล็อกตอบจากข้อมูลที่ร้านมีอยู่แล้ว ไม่ได้ไปถามต้นทางทุกครั้งที่เรียก สินค้าส่วนใหญ่จึงกลับมาเป็น null ซึ่งเป็นความจริง คือรอบนี้ไม่มีใครไปตรวจสต็อกของสินค้าชิ้นนั้น · ห้ามเทียบ available === true และห้ามเขียนเงื่อนไขทำนองว่าไม่ใช่ true คือของหมด — อ่านแบบนั้นคือซ่อนแคตตาล็อกเกือบทั้งก้อน ซึ่งเป็นสินค้าที่ขายได้จริง ออกจากหน้าร้านของคุณเอง · ให้ซ่อนเฉพาะชิ้นที่เป็น false · สต็อกจริงถูกตรวจกับต้นทางอีกครั้ง ตอนสั่งซื้อ ซึ่งเป็นจุดเดียวที่คำตอบเรื่องของมีหรือไม่มีเชื่อถือได้

ราคาที่ได้กลับมาหักส่วนลดแล้ว ห้ามหักซ้ำอีกรอบ

price คือจำนวนบาทที่ คีย์ใบนี้ต้องจ่าย ไม่ใช่ราคาป้ายของร้าน และ discount_percent บอกว่าหักออกจากราคาป้ายไปแล้วกี่เปอร์เซ็นต์ · เอาส่วนลดของคุณไปหักซ้ำอีกรอบจะได้ราคาที่ระบบไม่มีวันยอมรับ แล้วทุกคำสั่งซื้อจะถูกปฏิเสธเรื่องราคาโดยไม่มีอะไรบอกว่าทำไม · ส่วนลดของคุณตั้งไว้เป็นตัวเลขเดียว แต่ สินค้าแต่ละประเภทมีเพดานของตัวเอง ส่วนลดที่ได้จริงคือค่าที่น้อยกว่าระหว่างขั้นส่วนลดของคุณกับเพดานของประเภทนั้น และคุณอ่านค่าที่คิดเสร็จแล้วรายประเภทได้จาก GET /api/v1/me ที่ฟิลด์ discount.effective_percentอย่าคำนวณราคาฝั่งคุณเองจากเลขส่วนลดดิบ · ราคายังขยับตลอดเวลาทั้งตามราคาขั้นต่ำที่เรารับได้และตามการตั้งราคาของร้านเอง จะเก็บไว้นานแค่ไหนก็ได้ แต่ต้องอ่านราคาใหม่ทุกครั้งก่อนสั่งซื้อ

ราคาจากลิสต์นี้ยังไม่ใช่ราคาสุดท้าย ต้องอ่านราคาจากเอนด์พอยต์รายชิ้นก่อนสั่ง

นอกจากเพดานส่วนลดรายประเภทแล้ว สินค้าแต่ละชิ้นยังมี ราคาขั้นต่ำ ของตัวเองอีกชั้น คือถ้าหักส่วนลดของคุณแล้วราคาจะต่ำกว่าที่เรารับได้ ระบบจะดันราคากลับขึ้นมาที่ขั้นต่ำนั้น (แต่ไม่เกินราคาป้าย) แล้วรายงาน discount_percent เป็นส่วนลดที่คุณได้จริง ซึ่งน้อยกว่าเพดาน · ⚠️ GET /api/v1/products ไม่ได้คิดราคาขั้นต่ำนี้ให้ ราคาที่ได้จากลิสต์จึงเป็นค่าประมาณ และ ต่ำกว่า ราคาจริงที่ระบบยอมรับได้ · ก่อนสั่งซื้อให้อ่านราคาจริงจาก GET /api/v1/products/{product_id} สำหรับ cdkey และ account1 หรือจาก GET /api/v1/products/{product_id}/items สำหรับ account2 แล้วส่งค่านั้นเป็น expected_price · ราคาที่ไม่ตรงกับที่ระบบคำนวณได้ตอนสั่งจะถูก ปฏิเสธ ไม่ใช่ถูกปรับให้เงียบ ๆ

การค้นหาไม่มีหน้าสอง — ส่ง search คู่กับ cursor จะถูกปฏิเสธ

การค้นแบบ ขึ้นต้นด้วย ใช้ตัวชี้ตำแหน่งควบคู่กับการเรียงลำดับด้วยฟิลด์อื่นไม่ได้ การค้นหาจึงไล่หน้าไม่ได้เลย · ส่ง search กับ cursor มาในคำขอเดียวกันจะถูกปฏิเสธด้วย 400 cursor_with_search ไม่ใช่ถูกตอบ ซึ่งตั้งใจ เพราะพฤติกรรมเดิมที่มองข้าม cursor ไปเงียบ ๆ ทำให้ลูป sync วนอยู่กับชุดเดิมไม่รู้จบ โดยไม่มีสถานะ error และไม่มีฟิลด์ไหนบอกว่าเกิดอะไรขึ้น · การค้นหาจึงคืนหน้าเดียว คือทุกอย่างที่แมตช์ ไปจนถึงเพดานที่ search_capped รายงาน · ถ้าชนเพดานนั้น ให้ค้นใหม่ด้วยคำที่ยาวและเจาะจงขึ้น อย่าพยายามเลื่อนหน้าข้ามมันไป · จะ sync ทั้งแคตตาล็อกให้เดิน cursor โดยไม่มี search ทีละ platform

การปฏิเสธที่ด่านยืนยันตัวตนเกิดกับเอนด์พอยต์นี้ด้วย

ห้ารหัสของด่านยืนยันตัวตน — invalid_key (401) · key_revoked (401) · insufficient_scope (403) · quota_exceeded (429) · too_many_inflight (429) — เกิดได้กับทุกเอนด์พอยต์ รวมทั้งเอนด์พอยต์นี้ เพราะถูกโยนตั้งแต่ก่อนคำขอจะเดินไปถึงตรรกะของหน้านี้เลยสักบรรทัด (scope ที่ต้องมีคือค่าที่ประกาศไว้หัวหน้านี้) · แท็บคำตอบด้านบนจึงไล่เฉพาะสิ่งที่เอนด์พอยต์นี้เองตอบ ไม่ได้แปลว่าห้ารหัสนั้นเกิดที่นี่ไม่ได้ · รายละเอียดครบทุกตัวอยู่ที่ หน้าเอนด์พอยต์ตัวตนที่ /developers/access/me ที่เดียว ทั้ง HTTP status ของแต่ละตัว · ตัวไหนกินโควตารายวันบ้าง · header อะไรกลับมาบ้าง · และทำไม 429 สองตัวต้องรับมือคนละแบบ — จงใจไม่คัดลอกมาไว้ทุกหน้า เพราะสำเนาที่สองคือที่ที่ลืมแก้ตามในวันที่กติกาเปลี่ยน

ข้อมูลที่ต้องส่ง

Query string

ชื่อชนิดวิธีใช้
platformบังคับstring
platform ของสินค้า เทียบแบบตรงตัวรวมตัวพิมพ์ใหญ่เล็ก เช่น Steam
รายละเอียดและข้อควรระวัง
  • EA
  • Uplay
  • Minecraft
  • ไม่ส่งมาได้ 400 bad_request ซึ่งตั้งใจ แทนที่จะคืนลิสต์ว่าง เพราะลิสต์ว่างแยกไม่ออกจาก ร้านนี้ไม่มีสินค้าขายเลย
  • จะ sync ทั้งแคตตาล็อกต้องเดินทีละ platform
typeไม่บังคับstring
จะเอาสินค้าประเภทไหนในสามประเภท ค่าเริ่มต้นคือ all และค่าที่ไม่รู้จักถูกอ่านเป็น all ด้วย
รายละเอียดและข้อควรระวัง
  • cdkey = คีย์เกม
  • account1 = บัญชีเกมใหม่ที่ยังไม่เคยถูกใช้
  • account2 = บัญชีเกมมือสอง
  • สองประเภทแรกสั่งซื้อด้วย product_id อย่างเดียว ส่วน account2 ต้องแนบ item_id มาด้วย เพราะบัญชีมือสองแต่ละชิ้นไม่เหมือนกันเลย (คนละเกมในบัญชี คนละเลเวล คนละราคา) คุณจึงต้องเลือกชิ้นที่ต้องการเองจาก GET /api/v1/products/{product_id}/items
  • เส้นแบ่งนี้มีผลกับทุกขั้นตอนต่อจากนั้น ทั้งเรื่องว่าจะเอาราคาที่ใช้เป็น expected_price มาจากเอนด์พอยต์ไหน และเรื่องว่าตอนส่งมอบ delivery จะมาในรูปคีย์หรือรูปข้อมูลล็อกอิน
genreไม่บังคับstring
กรองด้วยค่าหนึ่งค่าจากฟิลด์ genres ของสินค้า
รายละเอียดและข้อควรระวัง
  • ไม่ส่งมาก็คือไม่กรอง และ ค่า all ก็แปลว่าไม่กรองเหมือนกัน (จะได้ส่งพารามิเตอร์นี้ติดมาตลอดโดยไม่ต้องถอดออกจาก query)
  • all จึงไม่ใช่ชื่อ genre ต่อให้มี genre ชื่อนี้อยู่ในข้อมูลจริงก็กรองด้วยมันไม่ได้
  • ค่าอื่นเทียบแบบตรงตัวรวมตัวพิมพ์ใหญ่เล็ก และ genre ที่ไม่มีสินค้าเลยคืนลิสต์ว่าง ซึ่งไม่ใช่ error
searchไม่บังคับstring
เทียบแบบ ขึ้นต้นด้วย กับชื่อที่ normalize แล้ว ซึ่งแปลว่าคุณต้อง normalize คำค้นเองมาก่อน เพราะสิ่งเดียวที่เราทำกับมันคือตัดช่องว่างหัวท้ายแล้วแปลงเป็นตัวพิมพ์เล็ก คำค้นที่ยังมีช่องว่างหรือเครื่องหมายวรรคตอนติดอยู่ (counter-strike, counter strike) จึงแมตช์ ไม่ได้เลยสักชิ้น และคืนลิสต์ว่างโดยไม่มี error ให้เห็น
รายละเอียดและข้อควรระวัง
  • ชื่อที่ normalize แล้วคือค่าเดียวกับฟิลด์ slug คือตัวพิมพ์เล็กล้วน มีแค่ a-z กับ 0-9 ไม่มีช่องว่างและเครื่องหมายวรรคตอน
  • counter แมตช์ counterstrike2 ส่วน strike ไม่แมตช์ เพราะไม่ได้อยู่ต้นคำ
  • ⚠️ search ใช้คู่กับ cursor ไม่ได้ ส่งมาด้วยกันจะถูกปฏิเสธด้วย 400 cursor_with_search ให้ใช้ search สำหรับค้นครั้งเดียวจบ และเดิน cursor โดยไม่มี search เวลา sync
  • ผลลัพธ์ ไม่ใช่การจัดอันดับความเกี่ยวข้อง มันคือชุดที่แมตช์เฉย ๆ ไม่มีการจัดว่าชิ้นไหนตรงกว่ากัน
sortไม่บังคับstring
ลำดับการเรียง ค่าเริ่มต้นคือ rating และค่าที่ไม่รู้จักถูกอ่านเป็น rating ด้วย
รายละเอียดและข้อควรระวัง
  • ค่าที่รับคือ rating
  • price (มากไปน้อย)
  • price-asc
  • recommendations
  • visitor
  • newest
  • ห้ามเปลี่ยนค่านี้ระหว่างที่กำลังเดิน cursor อยู่ เพราะ cursor ใช้ได้เฉพาะกับ sort และ platform ชุดที่มันถูกออกให้เท่านั้น เอาไปใช้กับชุดอื่นจะถูกปฏิเสธด้วย 400 invalid_cursor
limitไม่บังคับnumber
จำนวนต่อหน้า ค่าเริ่มต้น 30 สูงสุด 60
รายละเอียดและข้อควรระวัง
  • ค่าที่อ่านไม่ได้ (ไม่ใช่จำนวนเต็ม หรือน้อยกว่า 1) ตกกลับไปใช้ค่าเริ่มต้น ส่วนค่าที่เกินเพดานถูกบีบลงมาที่เพดาน ทั้งสองแบบไม่ได้ทำให้คำขอล้มเหลว
cursorไม่บังคับstring
ตัวชี้ตำแหน่งของหน้าถัดไป ให้คัดลอกค่า next_cursor ของหน้าก่อนมาใส่แบบตรงตัว
รายละเอียดและข้อควรระวัง
  • ถือว่ามันเป็นสตริงทึบ ห้ามถอดรหัสดูข้างในหรือประกอบขึ้นเอง เพราะรูปแบบข้างในเปลี่ยนได้โดยไม่แจ้งล่วงหน้า
  • ⚠️ cursor ที่ใช้ไม่ได้จะถูกปฏิเสธด้วย 400 invalid_cursor ไม่ใช่ตอบด้วยหน้าแรก ครอบทั้ง cursor ที่ยาวเกิน
  • ที่ถอดรหัสไม่ได้
  • ที่ถูกตัดกลางทาง
  • และที่ถูกออกให้ภายใต้ sort หรือ platform คนละชุดกับคำขอที่ถือมันมา
  • การตอบด้วยหน้าแรกแทนจะพางาน sync ย้อนกลับไปต้นแคตตาล็อกอย่างเงียบ ๆ การปฏิเสธจึงตั้งใจ
  • ให้รับมือกับ 400 นี้ อย่าคิดว่า cursor เสียแล้วไม่มีผลอะไร

Header

ชื่อชนิดวิธีใช้
Authorizationบังคับstring
คีย์ของคุณในรูป Bearer <คีย์> ต้องส่งมาทุกคำขอ ไม่มีวิธียืนยันตัวตนทางอื่น

ข้อมูลที่ได้รับ

ชื่อชนิดวิธีใช้
productsอาร์เรย์
สินค้าในหน้านี้ เรียงตาม sort ที่ขอมา · จำนวนน้อยกว่า limit ได้เสมอ และเป็นลิสต์ว่างได้โดยไม่ใช่ error
products.idสตริง หรือ null
รหัสสินค้า · เป็นค่าเดียวกับ product_id ที่ใช้ตอนสั่งซื้อ และใช้ตอนขอรายการบัญชีมือสองรายชิ้น — เวลาไล่หน้าให้ใช้ค่านี้ตัดสินค้าที่ซ้ำกันออก
products.gameสตริง หรือ null
ชื่อสินค้าที่แสดงให้ลูกค้าเห็น
products.platformสตริง หรือ null
platform ของสินค้า — ค่าเดียวกับที่ส่งเป็นพารามิเตอร์ platform
products.typeสตริง หรือ null
ประเภทสินค้า: cdkey · account1 · account2 — เป็นตัวตัดสินว่าจะสั่งซื้ออย่างไร ดูพารามิเตอร์ type ข้างบน
products.slugสตริง หรือ null
ชื่อที่ normalize แล้ว ใช้ประกอบลิงก์หน้าร้าน และเป็นค่าเดียวกับที่พารามิเตอร์ search เทียบด้วย
products.imageสตริง หรือ null
URL ปกแนวตั้ง · เป็น null เมื่อไม่มีรูปที่ใช้ได้ ซึ่งเกิดกับสินค้าจริงบ่อยพอที่คุณต้องมีรูปสำรองของตัวเอง
products.ratingตัวเลข หรือ null
คะแนนของเกมจากแหล่งข้อมูลของเรา — ไม่ใช่คะแนนรีวิวของร้าน และไม่ได้บ่งบอกว่าสินค้ามีของ
products.genresอาร์เรย์ของสตริง
แนวเกม · ค่าไหนในนี้ก็ใช้เป็นพารามิเตอร์ genre ได้ · อาร์เรย์ว่างแปลว่าไม่มีการบันทึกแนวไว้ ไม่ใช่แปลว่าไม่มีแนวไหนตรง
products.availablefalse หรือ null
สถานะของในสต็อก มีแค่สองค่าเท่านั้น
รายละเอียดและข้อควรระวัง
  • false = ยืนยันแล้วว่าหมด
  • null = ยังไม่ได้ตรวจ ไม่ได้แปลว่าหมด
  • ฟิลด์นี้ไม่มีค่า true ให้ซ่อนเฉพาะชิ้นที่เป็น false และห้ามเขียนเงื่อนไขที่รอค่า true
products.priceตัวเลข
ยอดที่คีย์นี้ต้องจ่าย หน่วยบาท หักส่วนลดของคุณมาแล้ว
รายละเอียดและข้อควรระวัง
  • ⚠️ ราคาจากลิสต์นี้ยังไม่ได้คิดราคาขั้นต่ำรายสินค้า จึงอาจต่ำกว่าราคาจริงที่ระบบยอมรับ ห้ามเอาไปส่งเป็น expected_price ตรง ๆ ให้ไปอ่านราคาจากเอนด์พอยต์รายชิ้นก่อนสั่งซื้อเสมอ
products.discount_percentตัวเลข
ส่วนลดที่คุณได้จริงกับสินค้าชิ้นนี้ หน่วยเปอร์เซ็นต์ · หักออกจาก price ไปเรียบร้อยแล้ว ฟิลด์นี้มีไว้บอกให้รู้เฉย ๆ ไม่ใช่ส่วนลดที่รอให้คุณเอาไปหักเองอีกรอบ
has_moreboolean
true = ยังมีหน้าถัดไป ให้ไล่ต่อ
รายละเอียดและข้อควรระวัง
  • false = จบแล้ว หยุดได้
  • ⚠️ เราตั้งค่านี้เป็น false (พร้อม next_cursor เป็น null) ในอีกกรณีหนึ่งด้วย คือเมื่อเราตรวจพบว่าไล่หน้าต่อไม่ได้เพราะข้อมูลบางรายการมีปัญหา
  • เราเลือกที่จะ หยุดคุณ แทนที่จะปล่อยให้วนอยู่กับหน้าเดิมไม่รู้จบ
  • สองกรณีนี้หน้าตาเหมือนกันเป๊ะจากฝั่งคุณ ถ้าดึงข้อมูลแล้วได้สินค้ามาน้อยกว่าที่คาดไว้มาก ให้แจ้งร้าน
next_cursorสตริง หรือ null
ส่งค่านี้กลับมาเป็น cursor ของคำขอถัดไป
รายละเอียดและข้อควรระวัง
  • เป็น null เมื่อไปต่อไม่ได้แล้ว ซึ่งมาคู่กับ has_more เป็น false เสมอ
  • เป็นสตริงทึบ ห้ามถอดรหัสดูข้างในหรือประกอบขึ้นเอง
  • ⚠️ แคตตาล็อกเปลี่ยนได้ระหว่างที่คุณกำลังเลื่อนหน้า สินค้าที่ถูกเพิ่มหรือถูกถอดกลางทางจึงทำให้สินค้าบางชิ้นโผล่ซ้ำหรือถูกข้ามได้
  • ให้ตัดของซ้ำด้วย id ฝั่งคุณเสมอ
search_cappedboolean
true = ผลที่ตรงกับคำค้นมีมากเกินกว่าที่เราอ่านให้ได้ในคำขอเดียว จึงมีบางส่วนถูกตัดออกไป (ให้ค้นใหม่ด้วยคำที่เจาะจงขึ้น) · เป็น false เสมอเมื่อไม่ได้ส่ง search มา

สถานะที่อาจได้รับ

สถานะรหัสความหมาย
200
หนึ่งหน้า และยังมีหน้าถัดไป
has_more เป็น true และ next_cursor มีตัวชี้ตำแหน่งของคำขอถัดไปมาให้
รายละเอียดและข้อควรระวัง
  • สินค้าทุกชิ้นมีฟิลด์ครบชุดเสมอ คือ id
  • game
  • platform
  • type
  • slug
  • image
  • rating
  • genres
  • available
  • price
  • discount_percent
  • ฟิลด์ที่เป็น null แปลว่า ค่านั้นอ่านไม่ได้หรือไม่มีอยู่ ไม่ใช่ค่าว่างที่มีความหมาย
  • รายการที่สามในตัวอย่างจงใจโชว์ค่าที่อ่านไม่ได้ (image กับ rating เป็น null ส่วน genres เป็นอาร์เรย์ว่าง) ทั้งสามแบบเกิดกับสินค้าจริงเป็นประจำ ไม่ใช่กรณีพิเศษ
  • ทุกตัวอย่างในหน้านี้คือคำตอบที่คีย์สมมติซึ่งตั้งส่วนลดไว้ 12% ได้รับ ทุกรายการจึงรายงาน discount_percent เป็น 12
  • สินค้าแต่ละประเภทยังมีเพดานของตัวเองที่จำกัดว่าขั้นส่วนลดถูกใช้จริงได้แค่ไหน ค่าที่คิดเสร็จแล้วรายประเภทอ่านได้จาก GET /api/v1/me
  • รหัสสินค้า รูป ชื่อเกม และตัวเลขทั้งหมดเป็นของสมมติ ไม่มีอันไหนเป็นข้อมูลจริงของร้าน
200
หน้าสุดท้าย — หยุดได้
has_more เป็น false พร้อมกับ next_cursor เป็น null คือหยุดได้แล้ว
รายละเอียดและข้อควรระวัง
  • ขั้นตอนการเลื่อนหน้าทั้งหมดคือ ยิงคำขอแรกโดยไม่มี cursor แล้วส่ง next_cursor ที่ได้แต่ละรอบกลับไปเป็น cursor ของคำขอถัดไป และหยุดเมื่อ has_more เป็น false หรือ next_cursor เป็น null
200
ไม่มีอะไรตรงตัวกรอง — ไม่ใช่ error
ลิสต์ว่างคือคำตอบปกติของตัวกรองที่แคบเกินไป (genre ที่ไม่มีสินค้า หรือ type ที่ platform นั้นไม่ได้ขาย)
รายละเอียดและข้อควรระวัง
  • มัน ไม่ใช่ error และไม่ได้แปลว่าคีย์ของคุณมีปัญหา
  • สินค้าที่เราคิดราคาให้ไม่ได้ก็ถูกตัดออกจากลิสต์เงียบ ๆ เหมือนกัน แทนที่จะคืนออกมาที่ราคา 0
200
ผลค้นหาเยอะเกิน — ถูกตัดออกบางส่วน
search_capped เป็น true แปลว่ามีสินค้าที่ตรงกับคำค้นของคุณอยู่ แต่ถูกตัดไม่ได้ส่งมา เพราะจำนวนที่ตรงเกินกว่าที่เราจะอ่านให้ได้ในคำขอเดียว
รายละเอียดและข้อควรระวัง
  • ทางแก้คือค้นใหม่ด้วยคำที่ยาวและเจาะจงขึ้น ไม่ใช่พยายามเลื่อนหน้า เพราะการค้นหาไม่มีหน้าสอง
400bad_request
ไม่ได้ส่ง platform มา
platform เป็นพารามิเตอร์เดียวที่เอนด์พอยต์นี้บังคับ · เติมค่าให้ถูกแล้วยิงใหม่ได้เลย ไม่มีอะไรค้างอยู่กลางทาง
400invalid_cursor
cursor ที่ส่งมาใช้กับคำขอนี้ไม่ได้
ให้เริ่มไล่หน้าใหม่ตั้งแต่หน้าแรกโดยไม่ส่ง cursor
รายละเอียดและข้อควรระวัง
  • คุณจะเจอรหัสนี้เมื่อ cursor ถูกตัดหรือถูกแก้ระหว่างทาง เมื่อมันยาวเกินกว่าที่เรารับ หรือเมื่อคุณเปลี่ยน sort/platform ระหว่างที่ยังไล่หน้าอยู่ (cursor ใบหนึ่งใช้ได้กับชุดพารามิเตอร์ที่มันถูกออกให้เท่านั้น)
  • เราปฏิเสธไปตรง ๆ แทนที่จะตอบหน้าแรกให้เงียบ ๆ เพราะแบบหลังจะทำให้งานดึงข้อมูลของคุณย้อนกลับไปเริ่มต้นใหม่วนไปเรื่อย ๆ โดยไม่มีใครรู้ตัว
400cursor_with_search
ส่ง cursor มาพร้อม search (ใช้ด้วยกันไม่ได้)
ให้ส่งอย่างใดอย่างหนึ่ง ห้ามส่งพร้อมกัน
รายละเอียดและข้อควรระวัง
  • การค้นหาไม่มีหน้าสอง จึงไม่มี cursor ให้ใช้
  • ใช้ search เวลาค้นหาครั้งเดียวจบ และใช้ cursor (โดยไม่มี search) ทีละ platform เวลาดึงแคตตาล็อกทั้งก้อน
อัปเดตล่าสุด 2026-09-07