Fellowi

開発者向けNSFW画像生成API

著者: Fellowiチーム · · 7 分で読めます

AI画像生成の開発者向けAPIを表す、暗い紫からインディゴへのグラデーションアートワーク。

ほとんどの画像生成APIは、技術的な制限にたどり着く前に、ポリシーとしてNSFWコンテンツを一律に 拒否します。汎用プラットフォームとしてはそれも妥当な判断ですが、成人向けコンテンツを許可する 生成器へのプログラムからのアクセスを本当に必要としている開発者にとっては、選択肢がほとんど ありません。Fellowiのパブリック API はそのために存在します。登録済みの成人アカウントに対して 露骨な表現の生成を許可しますが、決して変わらない厳格な制限のもとでです - 未成年が関わる コンテンツ、同意のない行為を描写するコンテンツは一切許可されません。これは切り替え可能な設定 ではなく、例外なく拒否されます。

それ以外は普通のREST APIです:キー、ジョブをキューに入れるPOST、ポーリング、 ダウンロード。他の非同期生成APIを使ったことがあれば、見覚えのある流れのはずです。

キーを取得する

アカウントを作成し、API ConsoleでAPIキーを作成します。キーは fk_live_<ランダムな文字列>という形をしていて、作成時に一度だけ全体が 表示されます。それ以降は、こちら側にはハッシュと短いプレビューしか保存されません - 紛失した場合は、失効させて新しく作り直してください。これまで使ったどのAPIキーとも同じ 扱いです。タブを閉じる前に、必ず安全な場所に保存してください。

すべてのリクエストは標準的なbearerヘッダーで認証します:

Authorization: Bearer fk_live_your_key_here

生成をキューに入れる

POST /v1/api/imagesにプロンプトとオプションを添えて送ります。呼び出しはすぐに HTTP 202を返し、レンダリングが終わるまでブロックすることはありません:

POST /v1/api/images
Content-Type: application/json
Authorization: Bearer fk_live_your_key_here
Idempotency-Key: a-key-you-generate-per-attempt

{
  "prompt": "a neon-lit rooftop at night, wide shot, cinematic lighting",
  "quality": "standard",
  "format": "png",
  "aspectRatio": "16:9"
}

レスポンスにはジョブID、etaMsの見積もり、そして課金後の残りコイン残高が含まれます。 任意のIdempotency-Keyヘッダーを使うと、リトライを安全に行えます - 再試行時に同じキーを送れば、同じ試行に対して二重課金されることはありません。

ジョブ本体はimageの下にあり、その隣にウォレット残高が並びます:

{
  "image": { "id": "0f9c...", "status": "queued", "etaMs": 42000, "coinsCharged": 40 },
  "coins": 360
}

ポーリングしてダウンロード

GET /v1/api/images/:idstatus"succeeded" "failed"になるまでポーリングします。成功したら、実際のバイト列を GET /v1/api/images/:id/contentから取得します。失敗した場合、使ったコインは 自動的に返金され、failureCodeは必ずTIMEOUTMODERATION_REJECTEDVENDOR_ERRORUNKNOWNの いずれか4つのうちの一つになります。5つ目のコードを処理する必要はなく、部分課金を 突き合わせる必要もありません - 詳しくはAPIの価格設定と生成失敗時の扱いについての記事をご覧ください。

curl(最初から最後まで)

API_KEY="fk_live_your_key_here"

# 1. ジョブをキューに入れる
JOB=$(curl -s https://fellowi.com/api/v1/api/images \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"a neon-lit rooftop at night","quality":"standard","format":"png","aspectRatio":"16:9"}')
ID=$(echo "$JOB" | jq -r .image.id)

# 2. 完了までポーリング
while true; do
  STATUS=$(curl -s https://fellowi.com/api/v1/api/images/$ID \
    -H "Authorization: Bearer $API_KEY" | jq -r .image.status)
  [ "$STATUS" = "succeeded" ] && break
  [ "$STATUS" = "failed" ] && { echo "generation failed"; exit 1; }
  sleep 3
done

# 3. 画像をダウンロード
curl -s https://fellowi.com/api/v1/api/images/$ID/content \
  -H "Authorization: Bearer $API_KEY" -o output.png

Node

const API_KEY = process.env.FELLOWI_API_KEY;
const base = "https://fellowi.com/api/v1/api";
const headers = { Authorization: `Bearer ${API_KEY}` };

const create = await fetch(`${base}/images`, {
  method: "POST",
  headers: { ...headers, "Content-Type": "application/json" },
  body: JSON.stringify({ prompt: "a neon-lit rooftop at night", quality: "standard", format: "png", aspectRatio: "16:9" }),
});
const { image } = await create.json();
const id = image.id;

let job;
do {
  await new Promise((r) => setTimeout(r, 3000));
  job = await fetch(`${base}/images/${id}`, { headers }).then((r) => r.json());
} while (job.image.status !== "succeeded" && job.image.status !== "failed");

if (job.image.status === "failed") throw new Error(job.image.failureCode);

const bytes = await fetch(`${base}/images/${id}/content`, { headers }).then((r) => r.arrayBuffer());
await Bun.write("output.png", bytes);

Python

import os, time, requests

API_KEY = os.environ["FELLOWI_API_KEY"]
base = "https://fellowi.com/api/v1/api"
headers = {"Authorization": f"Bearer {API_KEY}"}

job = requests.post(f"{base}/images", headers=headers, json={
    "prompt": "a neon-lit rooftop at night",
    "quality": "standard",
    "format": "png",
    "aspectRatio": "16:9",
}).json()

while True:
    time.sleep(3)
    status = requests.get(f"{base}/images/{job['image']['id']}", headers=headers).json()
    if status["image"]["status"] in ("succeeded", "failed"):
        break

if status["image"]["status"] == "failed":
    raise RuntimeError(status["image"]["failureCode"])

content = requests.get(f"{base}/images/{job['image']['id']}/content", headers=headers)
open("output.png", "wb").write(content.content)

モデル、価格、制限

すべてのレスポンスはモデルをfellowi-nsfw-image-1として報告します。表示される 名前はこれだけです - Fellowi Imagesのウェブ版を支えているのと 同じ生成器で、同じFellowiコインのウォレットから同じ価格で課金されます:標準画質(1.5K)が 40コイン、高画質(2K)が60コインです。ウェブ版と突き合わせる必要がある別のAPI専用価格表は ありません。

レート制限は乱用防止のためのものであり、本当の上限ではありません - デフォルトで生成呼び出しは 毎分20リクエスト、読み取りは毎分120リクエストです。GET /v1/api/meは現在の コイン残高、キーのレート制限、そして日次上限のもとで今日あと何枚生成できるかを返します - 上限にぶつかった後ではなく、バッチを送る前に確認してください。

完全なリファレンスドキュメント、最新の価格、キー管理はすべて API Consoleにあります。

実際に試してみる

あたたかく私的なAIコンパニオン。7日間無料、メッセージ30通、カード不要。

料金と上限

続けて読む