문장 바꾸기, 문법·맞춤법 검사, 요약, 번역, 표절 검사를 56개 언어로, 내 앱에서 쓸 수 있습니다. Cloudflare 엣지에서 제공하는 단순한 REST API입니다.
Same-origin
현재 API는 adeptwrite.com 자체의 요청만 받습니다(CORS 헤더 없음). API 키를 통한 외부 접근은 Pro 요금제와 함께 제공될 예정입니다. 계약 내용을 미리 열어 두어 준비하실 수 있도록 이 문서를 먼저 공개합니다.
요약
AdeptWrite v1 API에는 세 개의 엔드포인트가 열려 있습니다. POST /api/v1/run은 task, mode, lang, text(최대 6,000자)를 담은 JSON을 받아 언어에 맞게 고른 Cloudflare Workers AI 모델의 결과를 일반 텍스트로 돌려줍니다. POST /api/v1/plagiarism은 글을 공개 출처와 대조하고 검색한 모든 출처를 알려 줍니다. GET /api/v1/health는 서비스 상태를 돌려줍니다. 글은 저장도 기록도 되지 않으며 AI 요청은 IP당 분당 30회로 제한됩니다.
인증: 아직 없습니다. 요청은 adeptwrite.com 페이지(same-origin)에서 와야 합니다. API 키는 Pro와 함께 제공됩니다.
개인정보:text 값은 저장도 기록도 되지 않으며 응답에는 Cache-Control: no-store가 붙습니다.
버전:/v1/ 경로는 호환되지 않게 바뀌지 않습니다. 호환되지 않는 변경은 /v2/를 씁니다.
POST/api/v1/run
글 하나에 AI 작업 하나를 실행하고 결과를 일반 텍스트로 돌려줍니다(머리말도 Markdown 코드 블록도 없음).
요청
Field
Type
Required
Notes
task
string
✓
작업 이름입니다. 아래 작업 목록을 보세요.
text
string
✓
입력 글, 1~6,000자.
lang
string
✓
결과 언어입니다. 사이트의 56개 로케일 코드 중 하나(ko, en, id, ja, pt-pt, zh-hant 등. pt-BR 같은 BCP 47 태그도 대응됩니다) 또는 "입력과 같은 언어"를 뜻하는 auto.
mode
string
—
해당 도구에서 쓸 수 있는 모드입니다. 예: Formal(격식), Akademik(학술), Ringkas(줄이기), Poin-poin(글머리표). 모드 이름은 인도네시아어 레지스트리 라벨 그대로입니다. 모드가 없는 작업에서는 무시됩니다.
options
object
—
작업별 추가 옵션입니다. translate의 from / to(지원하는 어느 언어에서 어느 언어로든 가능, from은 auto 가능, sr-Cyrl은 키릴 문자 세르비아어), caption의 platform(instagram / tiktok / linkedin), bio, coverletter, meta의 이름 붙은 fields(선택). 다른 키는 무시됩니다.
POST /api/v1/run HTTP/1.1
Content-Type: application/json
{
"task": "paraphrase",
"mode": "Formal",
"lang": "ko",
"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":"ko","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: 'ko', 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. 웹 검색 제공자는 설정되어 있고 요청했을 때만)에서 검색하고 겹치는 정도를 점수로 냅니다. 서버 밖으로 나가는 것은 그 짧은 구절뿐입니다.
요청
Field
Type
Required
Notes
text
string
✓
30단어 이상, 6,000자 이하.
lang
string
✓
사이트 로케일 코드 또는 auto.
options
object
—
web: true는 운영자가 웹 검색 제공자를 설정해 둔 경우 그 제공자에게도 질의합니다. 실제로 답했는지는 응답의 webSearched가 알려 줍니다.
상태 200과 함께 score(겹친 단어 ÷ 전체 단어, 0~1), 출처별 matches와 강조된 passages(입력 글에서의 문자 오프셋), sourcesSearched(답이 결과에 반영된 출처 전부), 이유가 붙은 sourcesSkipped, webSearched를 돌려줍니다.
어떤 서비스가 켜져 있는지 알려 줍니다. 요청 본문이 필요 없고 한도에도 포함되지 않습니다.
응답
상태 200. AI 긴급 차단 스위치가 켜져 있으면 ai가 false입니다. plagiarism은 검사기가 질의할 수 있는 출처를 보여 줍니다. aidetect는 아직 배포되지 않은 AI 탐지기의 서버 쪽 심층 분석을 설명합니다(POST /api/v1/aidetect는 503 disabled로 답하며, 사이트의 탐지기는 이용자의 브라우저에서 동작합니다).
짧은 시. 모드: Bebas(자유시), Berima(운율시), Akrostik(삼행시), Haiku(하이쿠).
한도
글 길이
요청당 최대 6,000자(넘으면 413 too_long).
IP 주소당
분당 요청 30회.
전체
서비스 전체에 분당 요청 100회, 그리고 AI 기능의 하루 한도.
표절 검사
IP당 분당 5회, 서비스 전체 분당 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 필드는 언제나 실제로 답한 모델을 알려 줍니다.
오류 코드
상태
코드
발생 조건
400
invalid_request
JSON이 올바르지 않거나, 필수 필드가 없거나, 알 수 없는 task 또는 lang.
413
too_long
text가 6,000자를 넘음.
403
forbidden
요청이 adeptwrite.com 페이지에서 오지 않음.
429
rate_limited
IP당 또는 전체 분당 한도 초과. Retry-After에 적힌 초만큼 기다리세요.
429
quota_exceeded
AI 기능의 하루 한도를 모두 썼음. 다음 날(UTC)에 다시 시도하세요.
502
upstream
사슬의 모든 모델이 제때 답하지 못함.
502
empty_output
모델이 답했지만 결과가 비어 있음.
503
disabled
운영자가 서비스를 일시적으로 꺼 두었거나, (/api/v1/aidetect의 경우) 아직 배포되지 않음.
오류 형식
모든 오류는 해당하는 HTTP 상태 코드와 같은 모양의 JSON으로 돌아옵니다.
{ "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에서는 무료이며 IP당 분당 AI 요청 30회로 제한됩니다. 외부 접근 요금은 Pro 요금제와 함께 공지하며, 그 전에는 아무것도 청구하지 않습니다.
제 요청에는 어떤 모델이 답하나요?
언어에 따라 다릅니다. 영어와 인도네시아어는 SEA-LION, 한국어를 포함한 나머지 언어는 Qwen3-30B가 맡습니다. 그 모델이 바쁘거나 실패하면 대체 모델 사슬의 다음 모델이 답하고, 응답의 model 필드가 실제로 답한 모델을 알려 줍니다.