API 문서

문장 바꾸기, 문법·맞춤법 검사, 요약, 번역, 표절 검사를 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회로 제한됩니다.

기본 정보

  • 기본 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개 로케일 코드 중 하나(ko, en, id, ja, pt-pt, zh-hant 등. pt-BR 같은 BCP 47 태그도 대응됩니다) 또는 "입력과 같은 언어"를 뜻하는 auto.
modestring—해당 도구에서 쓸 수 있는 모드입니다. 예: Formal(격식), Akademik(학술), Ringkas(줄이기), Poin-poin(글머리표). 모드 이름은 인도네시아어 레지스트리 라벨 그대로입니다. 모드가 없는 작업에서는 무시됩니다.
optionsobject—작업별 추가 옵션입니다. 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. 웹 검색 제공자는 설정되어 있고 요청했을 때만)에서 검색하고 겹치는 정도를 점수로 냅니다. 서버 밖으로 나가는 것은 그 짧은 구절뿐입니다.

요청

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": "ko", "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://ko.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":"ko","text":"…30단어 이상…"}'

GET/api/v1/health

어떤 서비스가 켜져 있는지 알려 줍니다. 요청 본문이 필요 없고 한도에도 포함되지 않습니다.

응답

상태 200. AI 긴급 차단 스위치가 켜져 있으면 ai가 false입니다. plagiarism은 검사기가 질의할 수 있는 출처를 보여 줍니다. aidetect는 아직 배포되지 않은 AI 탐지기의 서버 쪽 심층 분석을 설명합니다(POST /api/v1/aidetect는 503 disabled로 답하며, 사이트의 탐지기는 이용자의 브라우저에서 동작합니다).

{
  "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문장 바꾸기. 모드: Standar(표준), Formal(격식), Santai(캐주얼), Akademik(학술), Kreatif(창의적), Ringkas(줄이기), Panjangkan(늘리기).
grammar문법·맞춤법 교정(한국어는 한글 맞춤법 기준).
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연구 요약으로 구조화된 초록 쓰기.
captionSNS 캡션. options.platform: instagram, tiktok, linkedin.
email이메일과 편지. 모드: Lamaran kerja(입사 지원), Surat resmi(공식 편지), Follow-up(후속 메일).
headline글 제목과 헤드라인. 모드: Kreatif(창의적), Ringkas(줄이기).
product상품 설명. 모드: Marketplace(오픈마켓), Toko online(쇼핑몰).
synonym단어나 표현 하나의 유의어 목록.
humanize딱딱하고 평이한 글을 더 자연스럽게 바꾸기. 모드: Alami(자연스럽게), Pribadi(개인적), Profesional(전문적).
meta메타 제목과 설명 3쌍. 모드: Artikel(기사), Produk(제품), Halaman(웹페이지).
hashtag해시태그 한 줄. 모드: Instagram, TikTok, LinkedIn, X.
bio프로필 소개 3개. 모드: Instagram, LinkedIn, X, TikTok.
outline번호가 붙은 하위 항목 포함 개요. 모드: Artikel(기사), Esai(에세이), Skripsi(학위논문), Presentasi(발표).
slogan슬로건 아이디어 10개. 모드: 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 기능의 하루 한도.
표절 검사
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 필드는 언제나 실제로 답한 모델을 알려 줍니다.

오류 코드

상태코드발생 조건
400invalid_requestJSON이 올바르지 않거나, 필수 필드가 없거나, 알 수 없는 task 또는 lang.
413too_longtext가 6,000자를 넘음.
403forbidden요청이 adeptwrite.com 페이지에서 오지 않음.
429rate_limitedIP당 또는 전체 분당 한도 초과. Retry-After에 적힌 초만큼 기다리세요.
429quota_exceededAI 기능의 하루 한도를 모두 썼음. 다음 날(UTC)에 다시 시도하세요.
502upstream사슬의 모든 모델이 제때 답하지 못함.
502empty_output모델이 답했지만 결과가 비어 있음.
503disabled운영자가 서비스를 일시적으로 꺼 두었거나, (/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 필드가 실제로 답한 모델을 알려 줍니다.