API ドキュメント

クイックスタート

キーの取得から最初の 1 枚まで、3 ステップ。

ステップ 1:キーを作成する

「アカウント → API プラットフォーム」を開き、右上の「キーを作成」を押して、用途がわかる名前を付けます。作成と同時にキーはクリップボードへコピーされ、以降も一覧のコピーボタンからいつでも取得できます。

キーはアカウントと同義で、あなたのクレジットを直接消費します。一覧からいつでも再コピーできるので、控えをあちこちに残す必要はありません。控えが増えるほど漏洩の面が広がります。

ステップ 2:利用できるモデルを確認する

キーを環境変数に入れ、まずモデル一覧を取得します。レスポンスの id が、後で model パラメータに渡す値です。

bash
curl https://open.pikpikgo.com/v1/models \
  -H "Authorization: Bearer $PIKPIK_API_KEY"

ステップ 3:画像を 1 枚生成する

bash
curl https://open.pikpikgo.com/v1/images/generations \
  -H "Authorization: Bearer $PIKPIK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "雨のサイバーパンクな夜の街、ネオンの反射",
    "size": "16:9",
    "quality": "2k",
    "n": 1
  }'

既定は同期です。画像ができるまで待ってから応答し、data[0].url がそのまま画像の URL になります。タスクを照会する必要はありません。1 枚あたり 30 秒以上かかるため、クライアントのタイムアウトは 300 秒まで延ばしてください。

json
{
  "created": 1786000246,
  "data": [
    { "url": "https://cdn.pikpikgo.com/ai/xxxx.png", "revised_prompt": "雨のサイバーパンクな夜の街、ネオンの反射" }
  ],
  "id": "2608101909450810293847",
  "object": "image.generation",
  "model": "img-std-1",
  "status": "succeeded",
  "n": 1,
  "credits": 10,
  "tasks": [
    {
      "id": "2608101909450810293847",
      "status": "succeeded",
      "data": [{ "url": "https://cdn.pikpikgo.com/ai/xxxx.png", "revised_prompt": "雨のサイバーパンクな夜の街、ネオンの反射" }]
    }
  ]
}

ステップ 4:待ちたくないときは非同期に

async: true を足すと、すぐに応答が返り、status は queued、data はまだ空です。まだ何も描かれていません。tasks[0].id を控えてください。

bash
curl https://open.pikpikgo.com/v1/images/generations \
  -H "Authorization: Bearer $PIKPIK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "雨のサイバーパンクな夜の街、ネオンの反射",
    "size": "16:9",
    "quality": "2k",
    "n": 1,
    "async": true
  }'
json
{
  "id": "2608101909450810293847",
  "object": "image.generation",
  "created": 1786000185,
  "model": "img-std-1",
  "status": "queued",
  "n": 1,
  "credits": 10,
  "tasks": [
    { "id": "2608101909450810293847", "status": "queued", "data": [] }
  ],
  "data": []
}

その id をポーリングし、status が succeeded になれば data[0].url が画像の URL です。動画生成はこの方法のみです。

bash
curl https://open.pikpikgo.com/v1/tasks/2608101909450810293847 \
  -H "Authorization: Bearer $PIKPIK_API_KEY"
json
{
  "id": "2608101909450810293847",
  "object": "image.generation",
  "created": 1786000185,
  "model": "img-std-1",
  "status": "succeeded",
  "prompt": "雨のサイバーパンクな夜の街、ネオンの反射",
  "size": "16:9",
  "quality": "2k",
  "credits": 10,
  "error": "",
  "data": [
    { "url": "https://cdn.pikpikgo.com/ai/xxxx.png", "revised_prompt": "雨のサイバーパンクな夜の街、ネオンの反射" }
  ]
}

完全なサンプル

同期のほうは OpenAI 公式 SDK をそのまま使えます。変えるのは baseURL だけです:

javascript
import OpenAI from 'openai'

const client = new OpenAI({
  apiKey: process.env.PIKPIK_API_KEY,
  baseURL: 'https://open.pikpikgo.com/v1',
  timeout: 300 * 1000,
})

// 同期生成:1 往復で URL が返る。タイムアウトは 300 秒まで延長
const res = await client.images.generate({
  model: 'img-std-1',
  prompt: '雨のサイバーパンクな夜の街、ネオンの反射',
  size: '1792x1024',
  n: 1,
})

console.log(res.data[0].url)

非同期のほうは送信とポーリングを自分でつなぎます。Node.js の例:

javascript
const BASE = 'https://open.pikpikgo.com/v1'
const KEY = process.env.PIKPIK_API_KEY

async function call(path, body) {
  const res = await fetch(BASE + path, {
    method: body ? 'POST' : 'GET',
    headers: {
      Authorization: `Bearer ${KEY}`,
      'Content-Type': 'application/json',
    },
    body: body ? JSON.stringify(body) : undefined,
  })
  const json = await res.json()
  if (json.error) throw new Error(json.error.message)
  return json
}

// 送信して完了まで待つ:3 秒ごとにポーリングし、10 分で打ち切る
async function generateImage(prompt) {
  const job = await call('/images/generations', { prompt, size: '16:9', async: true })
  const id = job.tasks[0].id

  for (let i = 0; i < 200; i++) {
    const task = await call(`/tasks/${id}`)
    if (task.status === 'succeeded') return task.data[0].url
    if (task.status === 'failed') throw new Error(task.error || '生成に失敗しました')
    await new Promise((r) => setTimeout(r, 3000))
  }
  throw new Error('待機がタイムアウトしました')
}

generateImage('雨のサイバーパンクな夜の街、ネオンの反射').then(console.log)

Python の例(こちらは動画生成、ポーリング間隔は 5 秒):

python
import os, time, requests

BASE = "https://open.pikpikgo.com/v1"
KEY = os.environ["PIKPIK_API_KEY"]
HEAD = {"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"}


def call(path, body=None):
    if body is None:
        r = requests.get(BASE + path, headers=HEAD, timeout=30)
    else:
        r = requests.post(BASE + path, headers=HEAD, json=body, timeout=60)
    data = r.json()
    if "error" in data:
        raise RuntimeError(data["error"]["message"])
    return data


def generate_video(prompt, seconds=5):
    job = call("/video/generations", {"prompt": prompt, "duration": seconds})

    # 動画は通常 1〜5 分。ポーリングは 5 秒間隔で十分で、短くしてもレート制限を消費するだけ
    for _ in range(200):
        task = call(f"/video/generations/{job['task_id']}")
        if task["status"] == "succeeded":
            return task["url"]
        if task["status"] == "failed":
            raise RuntimeError(task["error"] or "生成に失敗しました")
        time.sleep(5)
    raise TimeoutError("待機がタイムアウトしました")


print(generate_video("ゆっくり寄るカメラ、少女が振り返って微笑む"))