APIドキュメント
言い換え、文章校正、要約、翻訳、コピペチェックを、日本語を含む56言語でご自身のアプリに組み込めます。Cloudflareのエッジから提供するシンプルなREST APIです。
Same-origin/APIキー
ブラウザからは、adeptwrite.com自身のページからのリクエストだけを受け付けます(CORSヘッダーなし)。外部のアプリからの利用には、
Proプラン以上で発行できるAPIキーを使います。キーは
APIキーのページで作成し、
Authorization: Bearer ヘッダーで送ります。
要点
AdeptWrite API v1には、稼働中のエンドポイントが3つあります。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)。外部のアプリからは、Proプラン以上のAPIキーを
Authorization: Bearer aw_live_… で送ります。キーは1回しか表示されず、AdeptWriteにはそのハッシュだけが保存されます。 - プライバシー:
text は保存もログへの記録もされません。レスポンスには Cache-Control: no-store が付きます。 - バージョン:
/v1/ のパスは、互換性のない形では変更しません。大きな変更は /v2/ で行います。
POST/api/v1/run
文章に対してAIのタスクを1つ実行し、結果をプレーンテキスト(前置きやMarkdownのブロックなし)で返します。
リクエスト
| Field | Type | Required | Notes |
task | string | ✓ | タスク名。下のタスク一覧を参照してください。 |
text | string | ✓ | 入力する文章。1〜6,000文字。 |
lang | string | ✓ | 結果の言語。サイトの56のロケールコード(ja、en、id、pt-pt、zh-hant など。pt-BR のようなBCP 47タグも対応づけます)のいずれか、または「入力と同じ言語」を意味する auto。 |
mode | string | — | そのツールで使えるモード(例:Formal、Akademik、Ringkas、Poin-poin)。モードのないタスクでは無視されます。モード名はAPI上の識別子で、日本語には訳しません。 |
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": "ja",
"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 "Authorization: Bearer aw_live_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"task":"grammar","lang":"ja","text":"私は昨日、図書館え行って本お借りました。"}'
例: JavaScript (fetch)
// adeptwrite.comのページ上のスクリプトから呼び出す場合(キーは不要)
const res = await fetch('/api/v1/run', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ task: 'summarize', mode: 'Poin-poin', lang: 'ja', 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 が、そのプロバイダーが実際に応答したかを示します。 |
POST /api/v1/plagiarism HTTP/1.1
Content-Type: application/json
{ "text": "…30語以上の文章…", "lang": "ja", "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://ja.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 "Authorization: Bearer aw_live_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"lang":"ja","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
task | What it does |
paraphrase | 言い換え。mode:Standar、Formal、Santai、Akademik、Kreatif、Ringkas、Panjangkan(標準・フォーマル・カジュアル・アカデミック・クリエイティブ・短く・長く)。 |
grammar | 文章校正(誤字脱字、助詞の誤り、不自然な表現)。日本語では文化庁の表記ルールに沿います。 |
tone | 文体・敬語の変換。mode:Formal、Kantor、Santai(フォーマル・ビジネス・カジュアル)。 |
rewrite | 硬い文やねじれた文の推敲。mode:Standar、Formal。 |
resize | 文章を短く・長くする。mode:Ringkas、Panjangkan。 |
essay | メモから段落や作文・小論文の下書きを作る。mode:Akademik、Kreatif、Panjangkan。 |
summarize | 要約。mode:Poin-poin、Paragraf、Satu kalimat(箇条書き・文章・一文)。 |
translate | 対応する2つの言語間の翻訳。options.from(または auto)と options.to。mode:Alami(既定)、Formal、Santai。 |
thesis | 卒業論文のタイトル案と章立て。 |
abstract | 研究の概要から、構成の整った論文要旨を作る。 |
caption | SNSのキャプション。options.platform:instagram、tiktok、linkedin。 |
email | メールと手紙。mode:Lamaran kerja、Surat resmi、Follow-up(応募メール・ビジネス文書・フォローアップ)。 |
headline | 記事のタイトルと見出し。mode:Kreatif、Ringkas。 |
product | 商品説明文。mode:Marketplace、Toko online(ECモール・自社ネットショップ)。 |
synonym | 1つの言葉やフレーズの類語リスト。 |
humanize | 硬くて型どおりの文章を、より自然に読めるように書き直す。mode:Alami、Pribadi、Profesional(自然・パーソナル・ビジネス)。 |
meta | タイトルとメタディスクリプションの組を3つ。mode:Artikel、Produk、Halaman。 |
hashtag | ハッシュタグを1行で。mode:Instagram、TikTok、LinkedIn、X。 |
bio | プロフィール文を3つ。mode:Instagram、LinkedIn、X、TikTok。 |
outline | サブ項目つきの番号つき構成案。mode:Artikel、Esai、Skripsi、Presentasi(記事・小論文・卒業論文・プレゼン資料)。 |
slogan | スローガン案を10個。mode:Merek、Kampanye、Produk。 |
paragraph | テーマから段落を1つ。mode:Pembuka、Isi、Penutup(序論・本論・結論)。 |
coverletter | カバーレターの下書き。mode:Fresh graduate、Berpengalaman、Magang(新卒・経験者・インターン)。 |
poem | 短い詩。mode:Bebas、Berima、Akrostik、Haiku(自由詩・押韻・折句・俳句)。 |
制限
- 文章の長さ
- 1リクエストにつき最大6,000文字(超えると
413 too_long)。 - IPアドレスごと
- 1分あたり30リクエスト。
- サービス全体
- 1分あたり100リクエスト。AI機能には1日あたりの上限もあります。
- コピペチェック
- IPアドレスごとに1分あたり5回、サービス全体で1分あたり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のページから送られていない(有効なAPIキーもない)。 |
429 | rate_limited | IPアドレスごと、またはサービス全体の1分あたりの上限を超えた。Retry-After の秒数だけ待ってください。 |
429 | quota_exceeded | AI機能の1日の上限に達した。翌日(UTC)にもう一度お試しください。 |
502 | upstream | 予備を含むすべてのモデルが、時間内に応答しなかった。 |
502 | empty_output | モデルは応答したが、結果が空だった。 |
503 | disabled | 運営者によりサービスが一時的に停止されている、または(/api/v1/aidetect では)まだ導入されていない。 |
エラーの形式
すべてのエラーは、対応するHTTPステータスコードと同じ形のJSONで返ります。
{ "ok": false, "error": { "code": "rate_limited", "message": "リクエストが多すぎます。しばらくしてからもう一度お試しください。" } }
まず ok を確認し、プログラムで処理する場合は error.code を読んでください。error.message は、そのまま利用者に表示できます。
おすすめの使い方
- 長い文書を1回で送るより、段落などの単位に分けて送るほうが、速く、結果も確認しやすくなります。
429 には、すぐに再試行せず、指数的に間隔をあけて再試行してください。- 不要な個人情報や機密情報は送らないでください。当サイトは保存しませんが、データは最小限にするのが原則です。
- AIの出力には誤りがありえます。最終的な正解としてではなく、確認できる提案として表示してください。
- APIキーは、サーバー側で管理してください。ブラウザに配布するコードの中に書かないでください。
よくある質問
自分のアプリやドメインからAPIを使えますか?
使えます。ただし、外部からの利用にはAPIキーが必要です。Proプラン以上のアカウントでAPIキーのページからキーを作成し、サーバー側から Authorization: Bearer ヘッダーを付けて呼び出してください。キーのないリクエストは、adeptwrite.com自身のページからのものしか受け付けません。
APIに送った文章は保存されますか?
いいえ。文章はモデルに渡して結果を生成するためだけに使い、その後は破棄します。ログに残るのは、ステータスコード、タスク名、処理時間などのメタデータだけで、文章の内容は一切含まれません。詳しくはプライバシーポリシーをご覧ください。
なぜ結果が、構造化されたJSONではなくプレーンテキストなのですか?
どのタスクも、前置きやMarkdownのブロックのない、そのまま使える1つのテキストを返します。エディタにすぐ表示できるようにするためです。変更箇所の一覧のような追加の構造は、v1を変えずに次のバージョンで追加する予定です。
APIの利用料金はいくらですか?
adeptwrite.comのサイトから使う分は無料で、IPアドレスごとにAIのリクエストは1分あたり30回までです。外部からの利用に使うAPIキーは有償プランの機能で、料金は料金ページに記載のとおりです。
どのモデルがリクエストに応答しますか?
言語によって異なります。インドネシア語と英語はSEA-LION、日本語を含むほかの言語はQwen3-30Bが担当します。そのモデルが混雑していたり失敗したりした場合は、予備のモデルの順番で次のモデルが応答し、レスポンスの model フィールドに実際に応答したモデルが入ります。