black-forest-labs/flux-2-max/edit12 點數起 /張· 編輯圖片

FLUX.2 Max 是 Black Forest Labs FLUX.2 系列裡畫質最高的模型。寫實人像是它的強項,布料有真實光澤、皮膚有真實質感;對鏡頭和光線的描述也跟得很緊,畫面裡的文字清晰可讀。改圖時最多合併三張參考照片,長邊最高 2048 畫素。

在 POST /jobs/createTask 把模型名稱填成 black-forest-labs/flux-2-max/edit 就能呼叫,12 點數/張起(US$0.12)。新帳戶送 30 點數,可以先在 Playground 免費試用。

  • 生成圖片
  • 編輯圖片
  • 最高 2K
  • 最多 3 張參考圖
  • 9 種畫面比例
模型名稱black-forest-labs/flux-2-max/edit
端點POST https://api.popnow.ai/api/v1/jobs/createTask
# 1. Create the task. Keep the Idempotency-Key if you retry after a network error.
export IDEMPOTENCY_KEY="$(uuidgen)"
curl -X POST https://api.popnow.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $POPNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $IDEMPOTENCY_KEY" \
  -d '{
  "model": "black-forest-labs/flux-2-max/edit",
  "input": {
    "prompt": "A ceramic teapot on a linen cloth, soft window light, muted palette",
    "image_urls": [
      "https://media.popnow.ai/influencer/examples/marco.webp"
    ],
    "aspect_ratio": "auto",
    "resolution": "1k"
  }
}'

# 2. Copy data.taskId from the response, then poll until state is succeeded, failed, canceled or expired.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.popnow.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $POPNOW_API_KEY"

input 依下方的 Schema 產生,原樣就能通過驗證。把提示詞和連結換成你自己的即可。

價格

選項點數 /張≈ 美元
標準11.42US$0.11

1 點數 = $0.01 · 全部選項及價格:GET /models/black-forest-labs/flux-2-max/edit

每個任務會無條件進位到整數點數,所以最低檔跑一次是 12 點數/張(US$0.12)。

限制

解析度
1K · 2K
畫面比例
auto · 1:1 · 16:9 · 9:16 · 4:3 · 3:4 +4
參考圖
3
提示詞長度(字元)
5,000
單一上傳上限
10 MB

參數

這些欄位來自我們驗證每個請求所用的同一份 Schema。沒列出的欄位會被拒絕。

  • promptstring必填

    Say what to change and what must stay the same.

    範圍
    1 – 5000 chars
  • image_urlsarray<string>必填

    要編輯或合成的照片。在提示詞裡說明每張的用途。

    範圍
    1 – 3 items · image/jpeg, image/png, image/webp, image/gif · ≤ 10 MB
  • aspect_ratiostring選填

    畫面形狀:橫式、方形或直式。

    預設值
    "auto"
    可用值
    "auto""1:1""16:9""9:16""4:3""3:4""3:2""2:3""21:9""9:21"
  • resolutionstring選填

    輸出尺寸。越大越清晰,價格也越高。

    預設值
    "1k"
    可用值
    "1k""2k"
  • seedinteger選填

    用同一個數字,結果就能重現。

    範圍
    0 – 2147483647
原始 JSON Schema
{
  "additionalProperties": false,
  "properties": {
    "aspect_ratio": {
      "default": "auto",
      "description": "Output aspect ratio; auto keeps the shape of the first source image.",
      "enum": [
        "auto",
        "1:1",
        "16:9",
        "9:16",
        "4:3",
        "3:4",
        "3:2",
        "2:3",
        "21:9",
        "9:21"
      ],
      "type": "string"
    },
    "image_urls": {
      "description": "One to three source images, in the order your prompt refers to them.",
      "items": {
        "contentMediaType": [
          "image/jpeg",
          "image/png",
          "image/webp",
          "image/gif"
        ],
        "format": "uri",
        "minLength": 1,
        "type": "string"
      },
      "maxItems": 3,
      "minItems": 1,
      "type": "array"
    },
    "prompt": {
      "description": "Say what to change and what must stay the same.",
      "maxLength": 5000,
      "minLength": 1,
      "type": "string"
    },
    "resolution": {
      "default": "1k",
      "description": "Output size tier when you choose an aspect ratio; with auto the result keeps the shape of the first source image.",
      "enum": [
        "1k",
        "2k"
      ],
      "type": "string"
    },
    "seed": {
      "description": "Random seed for controlled comparisons.",
      "maximum": 2147483647,
      "minimum": 0,
      "type": "integer"
    }
  },
  "required": [
    "prompt",
    "image_urls"
  ],
  "type": "object"
}

FLUX.2 Max 的真實成品

Bookshop two portraits
提示詞Place the woman from image 1 and the woman from image 2 together in the bookshop from image 3. The woman from image 1 sits on the green leather sofa reading an open hardback book; the woman from image 2 sits on the arm of the sofa beside her, leaning in to read over her shoulder and laughing. Keep both faces, hairstyles and outfits exactly as in their photos. Match the warm lamp light of the bookshop on their faces and clothes, with natural shadows on the sofa. Realistic photograph.
透過 API 送出的同一個請求
{
  "model": "black-forest-labs/flux-2-max/edit",
  "input": {
    "prompt": "Place the woman from image 1 and the woman from image 2 together in the bookshop from image 3. The woman from image 1 sits on the green leather sofa reading an open hardback book; the woman from image 2 sits on the arm of the sofa beside her, leaning in to read over her shoulder and laughing. Keep both faces, hairstyles and outfits exactly as in their photos. Match the warm lamp light of the bookshop on their faces and clothes, with natural shadows on the sofa. Realistic photograph.",
    "image_urls": [
      "https://media.popnow.ai/influencer/examples/marco.webp"
    ],
    "aspect_ratio": "16:9",
    "resolution": "2k",
    "seed": 5
  }
}

這則是從上傳的檔案開始的:把範例連結換成你自己的檔案連結。

回應、輪詢與回呼

所有模型的用法都一樣:先建立任務,再輪詢,或等待回呼。

先報價

cURL
curl -X POST https://api.popnow.ai/api/v1/jobs/quote \
  -H "Authorization: Bearer $POPNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "black-forest-labs/flux-2-max/edit",
  "input": {
    "prompt": "A ceramic teapot on a linen cloth, soft window light, muted palette",
    "image_urls": [
      "https://media.popnow.ai/influencer/examples/marco.webp"
    ],
    "aspect_ratio": "auto",
    "resolution": "1k"
  }
}'

請求內容和 createTask 相同。它回傳預估扣款和最高可能扣款,不會真的執行。

已受理

HTTP
HTTP/1.1 202 Accepted

{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "task_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued"
  },
  "request_id": "req_example_create"
}

HTTP 202 代表任務已受理,點數先凍結、尚未扣除。最終扣款不會超過凍結額。

查詢狀態

cURL
curl "https://api.popnow.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $POPNOW_API_KEY"

每隔幾秒查詢一次並逐步拉長間隔,state 變成 succeeded、failed、canceled 或 expired 時停止。

完成的任務

JSON
{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "task_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "black-forest-labs/flux-2-max/edit",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "url": "https://cdn.popnow.ai/tasks/task_01k3m8x9q2z4v7n5p6r8s0t1w3/output.png?signature=FROM_RESPONSE",
          "expiresAt": "2026-10-17T12:20:00Z",
          "mime": "image/png",
          "width": 1024,
          "height": 1024
        }
      ]
    },
    "settled": true
  },
  "request_id": "req_example_record"
}

請在 expiresAt 之前從 url 下載。之後需要新連結,請呼叫 POST /common/download-url。

驗證回呼

Node.js
import { createHash, createHmac, timingSafeEqual } from "node:crypto";
import express from "express";

const app = express();
// express.raw keeps the exact bytes that were signed; express.json would not match.
app.post("/hooks/popnow", express.raw({ type: "application/json" }), (req, res) => {
  const timestamp = req.header("X-Webhook-Timestamp");
  const signature = req.header("X-Webhook-Signature") ?? "";
  const body = JSON.parse(req.body.toString("utf8"));
  const taskId = body.data?.taskId ?? body.task_id;
  const digest = createHash("sha256").update(req.body).digest("hex");
  const expected = createHmac("sha256", process.env.POPNOW_WEBHOOK_SECRET)
    .update(`${taskId}.${timestamp}.${digest}`)
    .digest("base64");
  const ok = expected.length === signature.length && timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
  // Check the signature first, then reject anything older than five minutes.
  if (!ok || Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return res.status(401).end();
  res.status(200).end(); // answer fast, then fetch the task and store its files
});

設定 callBackUrl 後,我們會把完成的任務送給你。先用原始請求內容驗證簽名,再信任它。

上傳本機檔案

cURL
curl -X POST https://api.popnow.ai/api/v1/common/upload-url \
  -H "Authorization: Bearer $POPNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contentType": "image/png", "bytes": 482113}'

# PUT the file bytes to data.uploadUrl with every header in data.headers, then commit it:
curl -X POST https://api.popnow.ai/api/v1/files/$FILE_ID/commit \
  -H "Authorization: Bearer $POPNOW_API_KEY"
# The commit returns a popnow://f/... reference. Put it in any image, video or
# audio field of the task input instead of a public https URL.

公開的 https 連結可以直接用。本機檔案要先經過 upload-url 和 commit。