เอกสาร API

Paraphrase ตรวจไวยากรณ์ สรุปความ แปลภาษา และตรวจ Plagiarism ใน 56 ภาษา เป็น REST แบบเรียบง่ายที่ให้บริการจากขอบเครือข่ายของ Cloudflare

Same-origin
ขณะนี้ API รับคำขอจากเว็บไซต์ adeptwrite.com เท่านั้น (ไม่มีส่วนหัว CORS) การเข้าถึงจากภายนอกด้วยคีย์ API วางแผนไว้พร้อมกับแผน Pro เราเผยแพร่เอกสารนี้ล่วงหน้าเพื่อให้สัญญาของ API เปิดเผยและคุณเตรียมตัวได้
สรุป

API v1 ของ AdeptWrite มี endpoint ที่ใช้งานได้สามตัว POST /api/v1/run รับ JSON ที่มี task, mode, lang และ text (ไม่เกิน 6,000 ตัวอักษร) แล้วคืนข้อความธรรมดาจากโมเดล Cloudflare Workers AI ที่เลือกตามภาษา POST /api/v1/plagiarism เทียบข้อความกับแหล่งข้อมูลเปิดและแสดงรายการทุกแหล่งที่ค้น และ GET /api/v1/health คืนสถานะบริการ ข้อความไม่ถูกเก็บหรือบันทึก และคำขอ AI จำกัดที่ 30 ครั้งต่อนาทีต่อ IP

ข้อมูลพื้นฐาน

  • Base URL: https://adeptwrite.com/api/v1
  • รูปแบบ: คำขอและการตอบกลับเป็น JSON (Content-Type: application/json, UTF-8)
  • การยืนยันตัวตน: ยังไม่มี คำขอต้องมาจากหน้าเว็บ adeptwrite.com (same-origin) คีย์ API จะมาพร้อมแผน Pro
  • ความเป็นส่วนตัว: ฟิลด์ text ไม่ถูกเก็บหรือบันทึก การตอบกลับมี Cache-Control: no-store
  • เวอร์ชัน: เส้นทาง /v1/ จะไม่เปลี่ยนแบบที่ใช้ร่วมกันไม่ได้ การเปลี่ยนแปลงที่ทำให้เข้ากันไม่ได้จะใช้ /v2/

POST/api/v1/run

รันงาน AI หนึ่งงานกับข้อความและคืนผลลัพธ์เป็นข้อความธรรมดา (ไม่มีคำนำ ไม่มีเครื่องหมายครอบโค้ด Markdown)

คำขอ

FieldTypeRequiredNotes
taskstring✓ชื่องาน ดูรายการงานด้านล่าง
textstring✓ข้อความนำเข้า 1–6,000 ตัวอักษร
langstring✓ภาษาของผลลัพธ์: รหัสภาษาของเว็บไซต์ตัวใดตัวหนึ่งจาก 56 ภาษา (en, id, th, ja, pt-pt, zh-hant…; แท็ก BCP 47 เช่น pt-BR จะถูกแมปให้) หรือ auto หมายถึงใช้ภาษาเดียวกับข้อความนำเข้า
modestring—โหมดที่เครื่องมือนั้นมี เช่น Formal, Akademik, Ringkas, Poin-poin (ชื่อโหมดเป็นป้ายกำกับภาษาอินโดนีเซียตามทะเบียนเครื่องมือ) งานที่ไม่มีโหมดจะไม่สนใจฟิลด์นี้
optionsobject—ตัวเลือกเฉพาะงาน: from / to สำหรับ translate (ภาษาที่รองรับใด ๆ ไปยังภาษาอื่น from เป็น auto ได้ sr-Cyrl ขอภาษาเซอร์เบียอักษรซีริลลิก), platform (instagram / tiktok / linkedin) สำหรับ caption และ fields แบบมีป้ายกำกับที่ไม่บังคับสำหรับ bio, coverletter และ meta คีย์อื่นจะถูกละเว้น
POST /api/v1/run HTTP/1.1
Content-Type: application/json

{
  "task": "paraphrase",
  "mode": "Formal",
  "lang": "th",
  "text": "การเขียนที่ดีมีความสำคัญต่อนักศึกษามาก",
  "options": {}
}

การตอบกลับ

สถานะ 200 พร้อม ok: true ผลลัพธ์ใน output โมเดลที่ตอบจริงใน model (ต่างออกไปเมื่อโมเดลสำรองเข้ามาแทน) และเวลาประมวลผลเป็นมิลลิวินาที จะเพิ่ม truncated: true เมื่อคำตอบถึงงบความยาวหรือเวลาจำกัดแล้วถูกตัด

{
  "ok": true,
  "output": "คุณภาพของงานเขียนเป็นสิ่งสำคัญสำหรับนักศึกษา",
  "model": "@cf/qwen/qwen3-30b-a3b-fp8",
  "ms": 812
}

ตัวอย่าง: curl

curl -X POST https://adeptwrite.com/api/v1/run \
  -H "Content-Type: application/json" \
  -d '{"task":"grammar","lang":"th","text":"ฉันไปห้องสมุดพรุ่งนี้เช้า"}'

ตัวอย่าง: JavaScript (fetch)

const res = await fetch('/api/v1/run', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ task: 'summarize', mode: 'Poin-poin', lang: 'th', text }),
});
const data = await res.json();
if (!data.ok) throw new Error(data.error.code + ': ' + data.error.message);
console.log(data.output);

POST/api/v1/plagiarism

เลือกวลีเด่น 4–8 วลีจากข้อความ ค้นในแหล่งข้อมูลเปิดตามภาษาของข้อความ (Wikipedia, Wikisource, ข้อความเต็มของ Internet Archive, Europe PMC, DOAJ, arXiv และผู้ให้บริการค้นเว็บเฉพาะเมื่อมีการตั้งค่าและร้องขอ) แล้วให้คะแนนส่วนที่ทับซ้อน มีเพียงวลีสั้นเหล่านั้นที่ออกจากเซิร์ฟเวอร์

คำขอ

FieldTypeRequiredNotes
textstring✓อย่างน้อย 30 คำ ไม่เกิน 6,000 ตัวอักษร
langstring✓รหัสภาษาของเว็บไซต์ หรือ auto
optionsobject—web: true จะค้นผ่านผู้ให้บริการค้นเว็บด้วย เมื่อผู้ดูแลระบบตั้งค่าไว้ ส่วน webSearched ในผลลัพธ์บอกว่าตอบจริงหรือไม่
POST /api/v1/plagiarism HTTP/1.1
Content-Type: application/json

{ "text": "…อย่างน้อย 30 คำ…", "lang": "th", "options": { "web": false } }

การตอบกลับ

สถานะ 200 พร้อม score (คำที่ตรง ÷ จำนวนคำ ค่า 0–1) matches แยกตามแหล่งพร้อม passages ที่ไฮไลต์ (ตำแหน่งตัวอักษรในข้อความของคุณ) sourcesSearched (ตรงกับแหล่งที่คำตอบอยู่ในผลลัพธ์เท่านั้น) sourcesSkipped พร้อมเหตุผล และ webSearched

{
  "ok": true,
  "score": 0.42,
  "words": 52,
  "matchedWords": 22,
  "matches": [{ "source": "wikipedia", "title": "…", "url": "https://th.wikipedia.org/wiki/…",
                "matchedWords": 22, "passages": [{ "start": 0, "end": 131, "text": "…" }] }],
  "sourcesSearched": ["wikipedia", "wikisource", "internet-archive-fts", "europepmc", "doaj"],
  "sourcesSkipped": [],
  "webSearched": false,
  "ms": 2310
}

ตัวอย่าง: curl

curl -X POST https://adeptwrite.com/api/v1/plagiarism \
  -H "Content-Type: application/json" \
  -d '{"lang":"th","text":"…อย่างน้อย 30 คำ…"}'

GET/api/v1/health

รายงานว่าบริการใดเปิดอยู่ ไม่มีเนื้อหาคำขอ และไม่นับรวมในโควตา

การตอบกลับ

สถานะ 200 ai เป็น false เมื่อสวิตช์ปิด AI ทำงานอยู่ plagiarism แสดงแหล่งที่เครื่องมือตรวจค้นได้ aidetect อธิบายการวิเคราะห์เชิงลึกฝั่งเซิร์ฟเวอร์ของเครื่องมือตรวจจับ AI ซึ่งยังไม่เปิดใช้ (POST /api/v1/aidetect ตอบ 503 disabled ส่วนเครื่องมือตรวจจับ AI บนเว็บไซต์ทำงานในเบราว์เซอร์ของคุณ)

{
  "ok": true,
  "ai": true,
  "plagiarism": { "enabled": true, "sources": ["wikipedia", "wikisource", "internet-archive-fts", "europepmc", "doaj", "arxiv"], "web": false },
  "aidetect": { "enabled": false, "judge": false }
}

ตัวอย่าง: curl

curl https://adeptwrite.com/api/v1/health

Task list

taskWhat it does
paraphraseเรียบเรียงใหม่ (Paraphrase) โหมด: Standar (ทั่วไป), Formal, Santai, Akademik, Kreatif, Ringkas, Panjangkan
grammarแก้ไวยากรณ์และคำสะกด (ภาษาไทยอ้างอิงพจนานุกรมฉบับราชบัณฑิตยสถาน พ.ศ. 2554)
toneปรับน้ำเสียง โหมด: Formal, Kantor (งานออฟฟิศ), Santai (กันเอง)
rewriteแก้ประโยคที่แข็งหรือฟังแปร่ง โหมด: Standar, Formal
resizeย่อหรือขยายประโยค โหมด: Ringkas, Panjangkan
essayสร้างย่อหน้าหรือเรียงความจากประเด็นย่อย โหมด: Akademik, Kreatif, Panjangkan
summarizeสรุปความ โหมด: Poin-poin (เป็นข้อ ๆ), Paragraf (ย่อหน้า), Satu kalimat (ประโยคเดียว)
translateแปลระหว่างสองภาษาที่รองรับใด ๆ ใช้ options.from (หรือ auto) และ options.to โหมด: Alami (เป็นธรรมชาติ ค่าเริ่มต้น), Formal, Santai (กันเอง)
thesisไอเดียชื่อวิทยานิพนธ์และโครงร่างรายบท
abstractบทคัดย่อแบบมีโครงสร้างจากสรุปงานวิจัย
captionแคปชั่นโซเชียลมีเดีย options.platform: instagram, tiktok, linkedin
emailอีเมลและจดหมาย โหมด: Lamaran kerja (สมัครงาน), Surat resmi (จดหมายทางการ), Follow-up (ติดตามผล)
headlineชื่อบทความและพาดหัว โหมด: Kreatif, Ringkas
productคำอธิบายสินค้า โหมด: Marketplace, Toko online (ร้านค้าออนไลน์)
synonymรายการคำพ้องความหมายของคำหรือวลีหนึ่ง
humanizeปรับข้อความที่แข็งหรือเป็นแบบแผนให้อ่านเป็นธรรมชาติขึ้น โหมด: Alami, Pribadi (เป็นส่วนตัว), Profesional
metaTitle และ meta description สามคู่ โหมด: Artikel, Produk, Halaman (หน้าเว็บทั่วไป)
hashtagแฮชแท็กหนึ่งบรรทัด โหมด: Instagram, TikTok, LinkedIn, X
bioไบโอโปรไฟล์สามแบบ โหมด: Instagram, LinkedIn, X, TikTok
outlineโครงร่างมีเลขลำดับพร้อมประเด็นย่อย โหมด: Artikel, Esai, Skripsi (วิทยานิพนธ์), Presentasi
sloganไอเดียสโลแกนสิบข้อ โหมด: Merek (แบรนด์), Kampanye (แคมเปญ), Produk
paragraphหนึ่งย่อหน้าจากหัวข้อ โหมด: Pembuka (ย่อหน้านำ), Isi (เนื้อหา), Penutup (สรุป)
coverletterร่างจดหมายสมัครงาน โหมด: Fresh graduate (จบใหม่), Berpengalaman (มีประสบการณ์), Magang (ฝึกงาน)
poemบทกวีสั้น โหมด: Bebas (กลอนเปล่า), Berima (มีสัมผัส), Akrostik (อักษรนำ), Haiku

ข้อจำกัด

ความยาวข้อความ
ไม่เกิน 6,000 ตัวอักษรต่อคำขอ (เกินจะได้ 413 too_long)
ต่อที่อยู่ IP
30 คำขอต่อนาที
ทั้งระบบ
100 คำขอต่อนาทีทั่วทั้งบริการ และมีเพดานรายวันสำหรับฟีเจอร์ AI
ตรวจ Plagiarism
5 ครั้งต่อนาทีต่อ IP และ 60 ครั้งต่อนาทีทั้งบริการ ขั้นต่ำ 30 คำ
ผลลัพธ์
มีงบความยาวตามแต่ละงาน ไม่เกิน 2,048 โทเค็น คำตอบที่ถูกตัดจะมี truncated: true
โมเดล
เลือกตามภาษา: ภาษาอังกฤษและภาษาอินโดนีเซียใช้ @cf/aisingapore/gemma-sea-lion-v4-27b-it ภาษาอื่นทั้งหมดใช้ @cf/qwen/qwen3-30b-a3b-fp8 เมื่อโมเดลไม่ว่าง ถูกจำกัดอัตรา ช้า หรือล้มเหลว คำขอจะย้ายไปโมเดลถัดไปในลำดับสำรอง (Qwen3-30B จากนั้น @cf/google/gemma-4-26b-a4b-it แล้ว @cf/meta/llama-3.3-70b-instruct-fp8-fast) ฟิลด์ model ระบุโมเดลที่ตอบจริงเสมอ

รหัสข้อผิดพลาด

สถานะรหัสเกิดขึ้นเมื่อ
400invalid_requestJSON ไม่ถูกต้อง ขาดฟิลด์ที่จำเป็น หรือ task หรือ lang ที่ไม่รู้จัก
413too_longtext เกิน 6,000 ตัวอักษร
403forbiddenคำขอไม่ได้มาจากหน้าเว็บ adeptwrite.com
429rate_limitedเกินขีดจำกัดต่อนาทีรายไอพีหรือทั้งระบบ รอตามจำนวนวินาทีใน Retry-After
429quota_exceededใช้เพดานรายวันของฟีเจอร์ AI หมดแล้ว ลองใหม่วันถัดไป (UTC)
502upstreamทุกโมเดลในลำดับสำรองตอบไม่ทันเวลา
502empty_outputโมเดลตอบแต่ผลลัพธ์ว่างเปล่า
503disabledผู้ดูแลระบบปิดบริการชั่วคราว หรือ (สำหรับ /api/v1/aidetect) ยังไม่เปิดใช้

รูปแบบข้อผิดพลาด

ข้อผิดพลาดทุกกรณีคืนเป็น JSON พร้อมรหัสสถานะ HTTP ที่ตรงกัน และมีรูปแบบเดียวกัน

{ "ok": false, "error": { "code": "rate_limited", "message": "Too many requests. Please try again shortly." } }

ตรวจ ok ก่อน แล้วอ่าน error.code เพื่อจัดการในโปรแกรม ส่วน error.message แสดงให้ผู้ใช้เห็นได้อย่างปลอดภัย

แนวปฏิบัติที่แนะนำ

  • ส่งข้อความเป็นส่วน ๆ (เช่นทีละย่อหน้า) แทนการส่งเอกสารยาวทั้งฉบับ ผลลัพธ์จะกลับมาเร็วกว่าและตรวจทานง่ายกว่า
  • จัดการ 429 ด้วยการหน่วงแบบเอ็กซ์โพเนนเชียล ไม่ลองซ้ำทันที
  • อย่าส่งข้อมูลส่วนบุคคลหรือข้อมูลลับที่ไม่จำเป็น แม้เราจะไม่เก็บข้อมูลนั้น หลักการใช้ข้อมูลเท่าที่จำเป็นก็ยังใช้อยู่
  • ผลลัพธ์จาก AI อาจผิดพลาด ควรนำเสนอเป็นข้อเสนอให้ตรวจทาน ไม่ใช่ความจริงขั้นสุดท้าย

คำถามที่พบบ่อย

เรียก API จากแอปหรือโดเมนของฉันเองได้หรือไม่

ยังไม่ได้ ขณะนี้ Worker ไม่ส่งส่วนหัว CORS และให้บริการเฉพาะหน้าเว็บ adeptwrite.com การเข้าถึงจากภายนอกด้วยคีย์ API วางแผนไว้พร้อมกับแผน Pro และเราจะปรับเอกสารนี้เมื่อพร้อมใช้งาน

ข้อความที่ส่งไปยัง API ถูกเก็บหรือไม่

ไม่ ข้อความถูกส่งต่อให้โมเดลเพื่อสร้างคำตอบแล้วทิ้ง ล็อกมีเฉพาะข้อมูลประกอบ (รหัสสถานะ งาน ระยะเวลา) ดูรายละเอียดทั้งหมดในนโยบายความเป็นส่วนตัว

ทำไมผลลัพธ์เป็นข้อความธรรมดา ไม่ใช่ JSON ที่มีโครงสร้าง

แต่ละงานสร้างข้อความพร้อมใช้หนึ่งชิ้น ไม่มีคำนำหรือเครื่องหมายครอบโค้ด Markdown เพื่อแสดงในตัวแก้ไขได้ทันที โครงสร้างเพิ่มเติม (เช่นรายการจุดที่แก้) วางแผนไว้ในเวอร์ชันถัดไปโดยไม่เปลี่ยน v1

API คิดค่าบริการเท่าไร

เมื่อเรียกจาก adeptwrite.com ใช้ได้ฟรี จำกัด 30 คำขอ AI ต่อนาทีต่อ IP ราคาสำหรับการเข้าถึงจากภายนอกจะประกาศพร้อมแผน Pro และจะไม่มีการเรียกเก็บก่อนหน้านั้น

โมเดลใดตอบคำขอของฉัน

ขึ้นกับภาษา ภาษาอังกฤษและภาษาอินโดนีเซียไปที่ SEA-LION ภาษาอื่นไปที่ Qwen3-30B หากโมเดลนั้นไม่ว่างหรือล้มเหลว โมเดลถัดไปในลำดับสำรองจะตอบแทน และฟิลด์ model ในผลลัพธ์ระบุโมเดลที่ตอบจริง