Tài liệu API

Viết lại văn bản, kiểm tra ngữ pháp, tóm tắt, dịch và kiểm tra đạo văn trong 56 ngôn ngữ. REST đơn giản, phục vụ từ mạng biên của Cloudflare.

Cùng nguồn gốc
Hiện API chỉ phục vụ yêu cầu từ chính adeptwrite.com (không có tiêu đề CORS). Quyền truy cập bên ngoài bằng khóa API được lên kế hoạch cùng gói Pro. Tài liệu này được công bố sớm để bạn nắm hợp đồng và chuẩn bị trước.
Tóm tắt

API AdeptWrite v1 có ba điểm cuối đang hoạt động. POST /api/v1/run nhận JSON gồm task, mode, lang và text (tối đa 6.000 ký tự) rồi trả văn bản từ một mô hình Cloudflare Workers AI chọn theo ngôn ngữ; POST /api/v1/plagiarism so văn bản với các nguồn mở và liệt kê mọi nguồn đã tra; GET /api/v1/health trả trạng thái dịch vụ. Văn bản không được lưu hay ghi nhật ký; giới hạn 30 yêu cầu AI mỗi phút cho mỗi IP.

Thông tin cơ bản

  • Địa chỉ gốc: https://adeptwrite.com/api/v1
  • Định dạng: yêu cầu và phản hồi đều là JSON (Content-Type: application/json, UTF-8).
  • Xác thực: chưa có; yêu cầu phải đến từ các trang adeptwrite.com (cùng nguồn gốc). Khóa API sẽ có cùng gói Pro.
  • Quyền riêng tư: trường text không bao giờ được lưu hay ghi nhật ký; phản hồi mang tiêu đề Cache-Control: no-store.
  • Phiên bản: đường dẫn /v1/ sẽ không thay đổi theo cách làm hỏng tương thích; thay đổi phá vỡ sẽ dùng /v2/.

POST/api/v1/run

Chạy một tác vụ AI trên văn bản và trả kết quả dạng văn bản thuần (không lời dẫn, không khung mã Markdown).

Yêu cầu

FieldTypeRequiredNotes
taskstring✓Tên tác vụ; xem danh sách tác vụ bên dưới.
textstring✓Văn bản đầu vào, từ 1 đến 6.000 ký tự.
langstring✓Ngôn ngữ của kết quả: một trong 56 mã ngôn ngữ của trang (en, id, vi, pt-pt, zh-hant…; thẻ BCP 47 như pt-BR được ánh xạ) hoặc auto nghĩa là “cùng ngôn ngữ với đầu vào”.
modestring—Một chế độ có sẵn cho công cụ đó, ví dụ Formal, Akademik, Ringkas, Poin-poin (tên chế độ là nhãn tiếng Indonesia của registry). Bị bỏ qua với tác vụ không có chế độ.
optionsobject—Tùy chọn riêng theo tác vụ: from / to cho translate (từ bất kỳ ngôn ngữ được hỗ trợ sang bất kỳ ngôn ngữ nào khác; from có thể là auto; sr-Cyrl yêu cầu tiếng Serbia chữ Cyrillic), platform (instagram / tiktok / linkedin) cho caption, và các fields có nhãn tùy chọn cho bio, coverletter và meta. Các khóa khác bị bỏ qua.
POST /api/v1/run HTTP/1.1
Content-Type: application/json

{
  "task": "paraphrase",
  "mode": "Formal",
  "lang": "vi",
  "text": "Viết tốt thật sự quan trọng với sinh viên.",
  "options": {}
}

Phản hồi

Trạng thái 200 với ok: true, kết quả trong output, mô hình thực sự đã trả lời trong model (khác đi khi một mô hình dự phòng thay thế) và thời gian xử lý tính bằng mili giây. truncated: true được thêm vào khi câu trả lời chạm giới hạn độ dài hoặc thời gian và bị cắt.

{
  "ok": true,
  "output": "Kỹ năng viết có vai trò thiết yếu đối với sinh viên.",
  "model": "@cf/qwen/qwen3-30b-a3b-fp8",
  "ms": 812
}

Ví dụ: curl

curl -X POST https://adeptwrite.com/api/v1/run \
  -H "Content-Type: application/json" \
  -d '{"task":"grammar","lang":"vi","text":"Chúng tôi sẽ gữi báo cáo vào ngày mai."}'

Ví dụ: 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: 'vi', 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

Chọn 4–8 cụm từ đặc trưng trong văn bản, tìm chúng trong các nguồn mở theo ngôn ngữ của văn bản (Wikipedia, Wikisource, toàn văn Internet Archive, Europe PMC, DOAJ, arXiv; nhà cung cấp tìm kiếm web chỉ khi được cấu hình và được yêu cầu) rồi chấm mức trùng lặp. Chỉ những cụm từ ngắn đó rời khỏi máy chủ.

Yêu cầu

FieldTypeRequiredNotes
textstring✓Tối thiểu 30 từ, tối đa 6.000 ký tự.
langstring✓Một mã ngôn ngữ của trang hoặc auto.
optionsobject—web: true truy vấn thêm nhà cung cấp tìm kiếm web khi bên vận hành đã cấu hình; webSearched trong phản hồi cho biết nó có thực sự trả lời hay không.
POST /api/v1/plagiarism HTTP/1.1
Content-Type: application/json

{ "text": "…ít nhất 30 từ…", "lang": "vi", "options": { "web": false } }

Phản hồi

Trạng thái 200 với score (số từ trùng ÷ số từ, từ 0 đến 1), matches theo từng nguồn kèm các đoạn passages được tô sáng (vị trí ký tự trong văn bản của bạn), sourcesSearched (đúng những nguồn có câu trả lời nằm trong kết quả), sourcesSkipped kèm lý do, và webSearched.

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

Ví dụ: curl

curl -X POST https://adeptwrite.com/api/v1/plagiarism \
  -H "Content-Type: application/json" \
  -d '{"lang":"vi","text":"…ít nhất 30 từ…"}'

GET/api/v1/health

Cho biết những dịch vụ nào đang bật. Không có nội dung gửi kèm và không tính vào hạn mức.

Phản hồi

Trạng thái 200. ai là false khi công tắc tắt AI đang bật; plagiarism liệt kê các nguồn mà công cụ kiểm tra đạo văn có thể truy vấn; aidetect mô tả phần phân tích sâu phía máy chủ của công cụ nhận diện AI, hiện chưa triển khai (POST /api/v1/aidetect trả 503 disabled; công cụ nhận diện trên trang chạy ngay trong trình duyệt của bạn).

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

Ví dụ: curl

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

Task list

taskWhat it does
paraphraseViết lại văn bản; chế độ: Standar, Formal, Santai, Akademik, Kreatif, Ringkas, Panjangkan.
grammarSửa lỗi ngữ pháp và chính tả (với tiếng Indonesia theo EYD V).
toneĐổi giọng văn; chế độ: Formal (trang trọng), Kantor (công sở), Santai (thân mật).
rewriteSửa câu cứng hoặc lủng củng; chế độ: Standar, Formal.
resizeRút gọn hoặc mở rộng câu; chế độ: Ringkas (rút gọn), Panjangkan (mở rộng).
essayPhát triển đoạn văn hoặc bài văn từ các ý gạch đầu dòng; chế độ: Akademik, Kreatif, Panjangkan.
summarizeTóm tắt; chế độ: Poin-poin (gạch đầu dòng), Paragraf (đoạn văn), Satu kalimat (một câu).
translateDịch giữa hai ngôn ngữ được hỗ trợ bất kỳ; options.from (hoặc auto) và options.to; chế độ: Alami (tự nhiên, mặc định), Formal (trang trọng), Santai (thân mật).
thesisGợi ý tên đề tài khóa luận và dàn ý các chương.
abstractAbstract có cấu trúc từ bản tóm tắt nghiên cứu.
captionCaption mạng xã hội; options.platform: instagram, tiktok, linkedin.
emailEmail và thư từ; chế độ: Lamaran kerja (ứng tuyển), Surat resmi (thư trang trọng), Follow-up.
headlineTiêu đề bài viết; chế độ: Kreatif (sáng tạo), Ringkas (ngắn gọn).
productMô tả sản phẩm; chế độ: Marketplace (sàn TMĐT), Toko online (website bán hàng).
synonymDanh sách từ đồng nghĩa cho một từ hoặc cụm từ.
humanizeViết lại văn bản cứng, chung chung cho tự nhiên hơn; chế độ: Alami (tự nhiên), Pribadi (cá nhân), Profesional (chuyên nghiệp).
metaBa cặp tiêu đề và mô tả meta; chế độ: Artikel (bài viết), Produk (sản phẩm), Halaman (trang web bất kỳ).
hashtagMột dòng hashtag; chế độ: Instagram, TikTok, LinkedIn, X.
bioBa bản bio hồ sơ; chế độ: Instagram, LinkedIn, X, TikTok.
outlineDàn ý đánh số kèm ý nhỏ; chế độ: Artikel (bài viết), Esai (bài văn), Skripsi (khóa luận), Presentasi (thuyết trình).
sloganMười gợi ý slogan; chế độ: Merek (thương hiệu), Kampanye (chiến dịch), Produk (sản phẩm).
paragraphMột đoạn văn từ chủ đề; chế độ: Pembuka (mở bài), Isi (thân bài), Penutup (kết bài).
coverletterBản nháp thư xin việc; chế độ: Fresh graduate (mới ra trường), Berpengalaman (có kinh nghiệm), Magang (thực tập).
poemThơ ngắn; chế độ: Bebas (thơ tự do), Berima (có vần), Akrostik (chữ đầu dòng), Haiku.

Giới hạn

Độ dài văn bản
Tối đa 6.000 ký tự mỗi yêu cầu (vượt quá sẽ nhận 413 too_long).
Theo địa chỉ IP
30 yêu cầu mỗi phút.
Toàn cục
100 yêu cầu mỗi phút trên toàn dịch vụ, cộng với một trần theo ngày cho các tính năng AI.
Kiểm tra đạo văn
5 lượt mỗi phút cho mỗi IP và 60 lượt mỗi phút trên toàn dịch vụ; tối thiểu 30 từ.
Đầu ra
Giới hạn độ dài riêng cho từng tác vụ, không bao giờ quá 2.048 token; câu trả lời bị cắt sẽ mang truncated: true.
Mô hình
Chọn theo ngôn ngữ: tiếng Anh và tiếng Indonesia chạy trên @cf/aisingapore/gemma-sea-lion-v4-27b-it, mọi ngôn ngữ khác, trong đó có tiếng Việt, chạy trên @cf/qwen/qwen3-30b-a3b-fp8. Khi một mô hình bận, bị giới hạn tần suất, chậm hoặc lỗi, yêu cầu được chuyển sang mô hình kế tiếp trong chuỗi (Qwen3-30B, rồi @cf/google/gemma-4-26b-a4b-it, rồi @cf/meta/llama-3.3-70b-instruct-fp8-fast). Trường model luôn ghi tên mô hình đã trả lời.

Mã lỗi

Trạng tháiMãKhi nào xảy ra
400invalid_requestJSON không hợp lệ, thiếu trường bắt buộc, hoặc task hay lang không xác định.
413too_longtext vượt quá 6.000 ký tự.
403forbiddenYêu cầu không đến từ một trang adeptwrite.com.
429rate_limitedVượt giới hạn mỗi phút theo IP hoặc toàn cục. Hãy chờ số giây ghi trong Retry-After.
429quota_exceededĐã dùng hết trần theo ngày của các tính năng AI. Hãy thử lại vào ngày hôm sau (UTC).
502upstreamMọi mô hình trong chuỗi đều không trả lời kịp thời.
502empty_outputCác mô hình đã trả lời nhưng kết quả rỗng.
503disabledBên vận hành đã tạm tắt dịch vụ, hoặc (với /api/v1/aidetect) chưa được triển khai.

Định dạng lỗi

Mọi lỗi đều trả về dạng JSON với mã trạng thái HTTP tương ứng và cùng một cấu trúc:

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

Hãy kiểm tra ok trước, rồi đọc error.code để xử lý bằng chương trình; error.message có thể hiển thị cho người dùng một cách an toàn.

Cách dùng khuyến nghị

  • Gửi văn bản theo từng phần (ví dụ từng đoạn) thay vì cả tài liệu dài; kết quả về nhanh hơn và dễ rà soát hơn.
  • Xử lý 429 bằng cách chờ tăng dần (exponential back-off), không thử lại ngay.
  • Đừng gửi dữ liệu cá nhân hay bí mật không cần thiết, dù chúng tôi không lưu; nguyên tắc tối thiểu hóa dữ liệu vẫn áp dụng.
  • Kết quả AI có thể sai; hãy trình bày nó như gợi ý để xem lại, không phải sự thật cuối cùng.

Câu hỏi thường gặp

Tôi có thể gọi API từ ứng dụng hoặc tên miền của mình không?

Hiện chưa. Worker hiện không gửi tiêu đề CORS và chỉ phục vụ các trang adeptwrite.com. Quyền truy cập bên ngoài bằng khóa API được lên kế hoạch cùng gói Pro; tài liệu này sẽ được cập nhật khi có.

Văn bản gửi tới API có được lưu không?

Không. Văn bản được chuyển cho mô hình để tạo câu trả lời rồi bị bỏ đi. Nhật ký chỉ chứa siêu dữ liệu (mã trạng thái, tác vụ, thời gian xử lý). Xem chính sách quyền riêng tư để biết đầy đủ chi tiết.

Tại sao kết quả là văn bản thuần chứ không phải JSON có cấu trúc?

Mỗi tác vụ tạo ra một văn bản dùng ngay, không lời dẫn hay khung mã Markdown, để hiển thị thẳng trong trình soạn thảo. Cấu trúc bổ sung (ví dụ danh sách thay đổi) được lên kế hoạch cho phiên bản sau mà không đổi v1.

API có tốn phí không?

Gọi từ adeptwrite.com thì miễn phí, giới hạn 30 yêu cầu AI mỗi phút cho mỗi IP. Giá cho truy cập bên ngoài sẽ được công bố cùng gói Pro; trước đó không tính khoản nào.

Mô hình nào trả lời yêu cầu của tôi?

Tùy ngôn ngữ: tiếng Anh và tiếng Indonesia đi tới SEA-LION, các ngôn ngữ khác, trong đó có tiếng Việt, đi tới Qwen3-30B. Nếu mô hình đó bận hoặc lỗi, mô hình kế tiếp trong chuỗi dự phòng sẽ trả lời, và trường model trong phản hồi ghi tên mô hình đã trả lời.