Thử ngay

Tài liệu API tạo ảnh

Tương thích thư viện OpenAI. Đổi địa chỉ và key là chạy được: ảnh vuông, dọc 9:16, ngang 16:9, nền trong suốt, chữ tiếng Việt có dấu.

Dán key để các ví dụ trong tài liệu được điền sẵn. Key chỉ nằm trong trình duyệt của bạn.

Thông tin kết nối

Địa chỉ (Base URL)https://api.apivn.dev/v1
API keyDạng sk-…, do bên cung cấp gửi riêng
Model tạo ảnhgpt-image-2.5-flare
Xác thựcAuthorization: Bearer <API_KEY>

Bạn cần làm gì?

Bắt đầu nhanh

Từ lúc nhận key đến ảnh đầu tiên chỉ mất vài phút.

  1. Nhận API keyBên cung cấp gửi cho bạn một key dạng sk-…. Giữ kín key này.
  2. Cài thư viện
    pip install openai pillow
    npm install openai
  3. Gọi thử tạo ảnhẢnh trả về nằm trong data[0].b64_json.
import base64
from openai import OpenAI

client = OpenAI(
    base_url="https://api.apivn.dev/v1",
    api_key="<API_KEY>",
    timeout=300,      # mỗi ảnh có thể mất tới vài phút
    max_retries=0,    # không tự gửi lại khi lỗi
)

r = client.images.generate(
    model="gpt-image-2.5-flare",
    prompt="Một chú cáo trắng ngồi trên mây lúc hoàng hôn",
    size="1024x1792",     # ảnh dọc 9:16
)

with open("anh.bin", "wb") as f:
    f.write(base64.b64decode(r.data[0].b64_json))
import OpenAI from "openai";
import fs from "node:fs";

const client = new OpenAI({
  baseURL: "https://api.apivn.dev/v1",
  apiKey: "<API_KEY>",
  timeout: 300000,   // 300 giây
  maxRetries: 0,     // không tự gửi lại khi lỗi
});

const r = await client.images.generate({
  model: "gpt-image-2.5-flare",
  prompt: "Một chú cáo trắng ngồi trên mây lúc hoàng hôn",
  size: "1024x1792",   // ảnh dọc 9:16
});

fs.writeFileSync("anh.bin", Buffer.from(r.data[0].b64_json, "base64"));
curl https://api.apivn.dev/v1/images/generations \
  -H "Authorization: Bearer <API_KEY>" \
  -H "Content-Type: application/json" \
  --max-time 300 \
  -d '{
    "model": "gpt-image-2.5-flare",
    "prompt": "A white fox sitting on a cloud at sunset",
    "size": "1024x1792",
    "n": 1
  }'
Đặt timeout ít nhất 300 giâyMỗi ảnh thường mất 20–100 giây, đôi khi lâu hơn. Timeout mặc định 60 giây của nhiều thư viện sẽ báo lỗi trong khi ảnh vẫn đang được tạo.
Địa chỉ phải có /v1Base URL đúng là https://api.apivn.dev/v1: có /v1, không có dấu / ở cuối.

Tạo ảnh

POST /v1/images/generations, cùng định dạng với API ảnh của OpenAI.

Tham số

Tham sốBắt buộcMô tả
modelCógpt-image-2.5-flare: model nhanh, nên dùng mặc định.
promptCóMô tả ảnh, tiếng Việt hoặc tiếng Anh. Prompt dài hàng trăm từ vẫn chạy.
sizeKhôngChỉ nhận các giá trị ở Kích thước ảnh. Mặc định auto.
nKhôngLuôn là 1. Cần nhiều ảnh thì gửi nhiều yêu cầu song song.
backgroundKhông"transparent" cho nền trong suốt.
qualityKhônglow, medium, high. Hiện không khác nhau về giá và tốc độ.

Kết quả trả về

Ảnh luôn ở dạng base64 trong data[0].b64_json, không có link tải.

{
  "created": 1763000000,
  "data": [ { "b64_json": "iVBORw0KGgoAAAANSUhEUgAA..." } ]
}
Định dạng file là PNG hoặc WebPHệ thống quyết định, bạn không chọn được bằng output_format. Cần đúng một định dạng thì mở bằng Pillow rồi lưu lại:
import base64, io
from PIL import Image

img = Image.open(io.BytesIO(base64.b64decode(r.data[0].b64_json)))
img.convert("RGB").save("anh.jpg", quality=92)   # hoặc img.save("anh.png")

Nền trong suốt

r = client.images.generate(
    model="gpt-image-2.5-flare",
    prompt="Logo con mèo hoạt hình, nét đơn giản",
    size="1024x1024",
    background="transparent",
)

Tạo nhiều ảnh cùng lúc

Mỗi yêu cầu chỉ ra một ảnh. Muốn nhiều ảnh thì chạy song song, tối đa 5 yêu cầu cùng lúc.

import base64
from concurrent.futures import ThreadPoolExecutor
from openai import OpenAI

client = OpenAI(base_url="https://api.apivn.dev/v1", api_key="<API_KEY>",
                timeout=300, max_retries=0)

def make(prompt):
    r = client.images.generate(model="gpt-image-2.5-flare", prompt=prompt, size="1024x1792")
    return base64.b64decode(r.data[0].b64_json)

prompts = ["Một con mèo trên mái nhà", "Một con chó ở bãi biển", "Một chú chim trong rừng"]
with ThreadPoolExecutor(max_workers=5) as pool:
    for i, data in enumerate(pool.map(make, prompts)):
        open(f"anh_{i}.bin", "wb").write(data)

Chữ trong ảnh

Chữ tiếng Việt có dấu hiển thị đúng. Đặt phần chữ trong dấu ngoặc kép trong prompt để giữ nguyên nội dung.

Poster khuyến mãi nền đỏ, chữ trắng lớn ở giữa: "GIẢM GIÁ 50% - MUA 1 TẶNG 1"

Kích thước ảnh

Chỉ nhận các giá trị size dưới đây. Giá trị khác bị từ chối ngay và không tính phí.

1:1
Vuông1024x1024
9:16
Dọc 9:161024x1792TikTok, Reels, Story
16:9
Ngang 16:91792x1024YouTube, banner
3:2
Ngang 3:21536x1024
2:3
Dọc 2:31024x1536

Bảng chi tiết

Nhu cầusize gửi lênẢnh nhận được
Vuông 1:11024x1024Khoảng 1024–1254 px mỗi cạnh
Dọc 9:161024x17921008 × 1792 (đúng 9:16)
Ngang 16:91792x10241672 × 941 (đúng 16:9)
Ngang 3:21536x1024Đúng cỡ
Dọc 2:31024x1536Đúng cỡ
Tự chọnautoThường 1024 × 1024

Cần đúng 1080×1920 hoặc 1920×1080

Tạo ảnh ở cỡ gần nhất trong bảng rồi phóng hoặc cắt ở phía bạn. Các cỡ như 1080x1920, 720x1280, 1024x1280, 512x512 bị từ chối.

from PIL import Image
import io, base64

img = Image.open(io.BytesIO(base64.b64decode(r.data[0].b64_json)))   # 1008 x 1792
img = img.resize((1080, 1920), Image.LANCZOS)
img.convert("RGB").save("story_1080x1920.jpg", quality=92)
Chưa hỗ trợ ảnh 2K và 4KCác cỡ 2048x2048, 3840x2160, 1152x2048 mất quá lâu và bị ngắt. Cần ảnh lớn để in thì tạo ở 1024 rồi phóng to bằng công cụ khác.

Chat và đọc ảnh

Gửi ảnh vào chat để hỏi nội dung hoặc đọc chữ trong ảnh. POST /v1/chat/completions.

Xem model được dùng

curl https://api.apivn.dev/v1/models \
  -H "Authorization: Bearer <API_KEY>"

Kết quả liệt kê đúng những model key của bạn gọi được. Dùng tên trong danh sách này cho tham số model của chat.

Gửi ảnh để hỏi

resp = client.chat.completions.create(
    model="<MODEL_CHAT>",   # lấy từ /v1/models
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "Mô tả ảnh này bằng tiếng Việt."},
            {"type": "image_url", "image_url": {"url": "https://example.com/anh.png"}},
        ],
    }],
)
print(resp.choices[0].message.content)
import base64

b64 = base64.b64encode(open("anh.png", "rb").read()).decode()

resp = client.chat.completions.create(
    model="<MODEL_CHAT>",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "Đọc chữ trong ảnh này."},
            {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}},
        ],
    }],
)
print(resp.choices[0].message.content)
Nên thu nhỏ ảnh trước khi gửiẢnh quá lớn làm yêu cầu chậm và có thể bị từ chối vì vượt dung lượng cho phép (lỗi 413).

Giới hạn và tính năng

Biết trước cái gì làm được và cái gì chưa để khỏi mất công thử.

Đã hỗ trợ

Tính năngTình trạngGhi chú
Ảnh vuông, dọc 9:16, ngang 16:9, 3:2, 2:3Dùng đượcKích thước ảnh
Nền trong suốtDùng đượcbackground: "transparent"
Chữ tiếng Việt có dấu trong ảnhDùng đượcĐặt chữ trong ngoặc kép trong prompt
Prompt tiếng Việt, prompt dàiDùng đượcKhông cần dịch sang tiếng Anh
Ảnh sản phẩm, poster, minh họaDùng được
Gửi ảnh vào chat để mô tả, đọc chữDùng đượcChat và đọc ảnh
Thư viện openai chính thứcDùng đượcĐặt max_retries=0 và timeout 300 giây

Chưa hỗ trợ trong bản này

Tính năngTình trạngCách thay thế
Tạo ảnh từ ảnh có sẵn (đổi nền, đổi phong cách, ghép ảnh, xóa nền)Chưa cóMô tả cảnh mong muốn bằng chữ rồi tạo ảnh mới
Sửa một vùng bằng mặt nạChưa cóKhông có
Ảnh 2K, 4KChưa cóTạo cỡ 1024 rồi phóng to ở phía bạn
Nhiều ảnh trong một yêu cầu (n > 1)Chưa cóGửi nhiều yêu cầu song song, tối đa 5
Chọn định dạng đầu ra (output_format)Không đổi đượcMở bằng Pillow rồi lưu lại định dạng cần
Biến thể từ ảnh có sẵn (variations)Chưa cóKhông có

Thời gian và số yêu cầu

Thời gian mỗi ảnh20–100 giây, đôi khi lâu hơn
Timeout nên đặtÍt nhất 300 giây
Số yêu cầu cùng lúcTối đa 5
Tự động gửi lại khi lỗiTắt (max_retries=0)
Chất lượng cùng giáChọn quality low, medium hay high đều có giá và thời gian như nhau, cứ để high.

Quy định sử dụng

  • Bạn chịu trách nhiệm về nội dung do mình yêu cầu tạo và cách sử dụng ảnh.
  • Không dùng để tạo ảnh giả mạo người thật, nội dung lừa đảo, xâm phạm bản quyền hoặc nội dung trái pháp luật.
  • Giữ kín API key. Nghi key bị lộ thì báo ngay để được cấp key mới.

Thử tạo ảnh

Tạo một ảnh thử ngay trên trình duyệt. Mỗi lần bấm tính một ảnh vào hạn mức của key bạn.

Ảnh sẽ hiện ở đây. Thường mất 20–100 giây.

Mã tương ứng

Lệnh cURL này tạo đúng ảnh như trên, cập nhật theo các ô phía trên.

Đừng đóng tab khi đang tạoẢnh có thể mất tới vài phút. Báo lỗi hết thời gian thì xem Lỗi thường gặp.

Lỗi thường gặp

Triệu chứng, nguyên nhân và cách sửa.

Bảng tra nhanh

Mã / thông báoThường là doCách sửa
401 Invalid / UnauthorizedKey sai, thiếu ký tự khi copy, hoặc đã bị thu hồiCopy lại key, kiểm tra không có khoảng trắng thừa; liên hệ hỗ trợ nếu vẫn lỗi
404 Not FoundBase URL thiếu /v1 hoặc thành /v1/v1Đặt đúng https://api.apivn.dev/v1
400 Tham số không hợp lệsize không có trong bảng, hoặc n khác 1Sửa theo Kích thước ảnh và Tạo ảnh
413 Request too largeDữ liệu gửi lên quá lớn (thường là ảnh gửi vào chat)Thu nhỏ ảnh trước khi gửi
503 Dịch vụ không sẵn sàngHệ thống tạm thời không nhận yêu cầuChờ vài phút rồi thử lại; liên hệ hỗ trợ nếu kéo dài
524, 504, hết thời gian chờYêu cầu chạy quá lâu (cỡ ảnh quá lớn hoặc đang quá tải)Dùng cỡ 1024; thử lại một lần sau ít phút
Thư viện báo TimeoutTimeout phía bạn quá ngắnĐặt timeout=300 (Python) hoặc timeout: 300000 (Node.js)

Câu hỏi hay gặp

Vì sao nên đặt max_retries=0?

Thư viện OpenAI tự gửi lại yêu cầu khi gặp lỗi. Với ảnh, yêu cầu đầu có thể đã tạo xong nên gửi lại sẽ tạo thêm ảnh ngoài ý muốn. Hãy tự quyết định có thử lại hay không.

Ảnh trả về là PNG hay WebP?

Có thể là một trong hai và bạn không chọn được. Đọc ảnh bằng Pillow (Python) hoặc sharp (Node.js) rồi lưu lại đúng định dạng cần.

Ảnh dọc cho TikTok phải gửi cỡ nào?

Gửi size: "1024x1792", nhận ảnh 1008×1792 đúng tỉ lệ 9:16, rồi phóng lên 1080×1920 nếu cần. Không gửi trực tiếp 1080×1920.

Yêu cầu bị lỗi thì có bị tính phí không?

Yêu cầu bị từ chối ngay vì tham số sai (lỗi 400) không bị tính. Với yêu cầu bị ngắt giữa chừng, hãy liên hệ hỗ trợ kèm thời điểm gửi để được kiểm tra.

Dùng một key trên nhiều máy được không?

Được, nhưng giữ tổng số yêu cầu chạy cùng lúc trên mọi máy không quá 5.

Có sửa ảnh có sẵn được không?

Bản này chưa hỗ trợ tạo ảnh từ ảnh. Xem Giới hạn và tính năng.

Vẫn không chạy?

  1. Gọi thẳng bằng cURL để loại trừ lỗi do mã của bạn:
    curl https://api.apivn.dev/v1/models \
      -H "Authorization: Bearer <API_KEY>"
    Lệnh này chạy mà mã của bạn không chạy thì lỗi nằm ở cấu hình trong mã.
  2. Soi lại ba thứ: Base URL có /v1, key dán đủ ký tự, tên model đúng.
  3. Liên hệ hỗ trợ: [ĐIỀN LIÊN HỆ HỖ TRỢ]. Gửi ảnh chụp lỗi và 4 ký tự cuối của key, không gửi cả key.
↑ ↓ chọnEnter mởEsc đóng