Renderqo Public API — คู่มือการใช้งาน (สำหรับผู้ใช้)
คู่มือนี้คือ API สาธารณะ (ไม่เข้ารหัส) สำหรับเรียกใช้งาน Renderqo จากภายนอก เช่น n8n, script,
backend ของคุณเอง ครอบคลุม ทุก provider และทุกโหมด — ใช้เส้นทางเวอร์ชัน /api/v1/*
🔀 เลือก Local / Public ที่ปุ่มด้านบนของหน้านี้ เพื่อสลับ base URL ของตัวอย่างทั้งหมด
— endpoint, พารามิเตอร์ และ response เหมือนกันทุกอย่าง ต่างแค่ host:
- Local —http://127.0.0.1:6699: เรียก Renderqo บนเครื่องเดียวกัน (dev / n8n ในเครื่อง)
- Public —https://api.renderqo.com: เรียกจากภายนอก (production) ผ่าน cloud relay
*(job ยังทำงานบน Renderqo ที่เครื่องของคุณเสมอ — cloud แค่รับคำขอแล้วส่งต่อไปเครื่องที่ระบุด้วยX-Device-Id,
รอผลแล้วส่งกลับ; เครื่องนั้นต้องเปิดแอปและสถานะ Running + ล็อกอินไลเซนส์อยู่. ไม่ต้องเปิดเครื่องออกเน็ตเอง)*
(ไฟล์ผลลัพธ์เมื่อเรียกผ่าน Public จะเสิร์ฟจากhttps://api.renderqo.com/api/v1/files/...แทน host ในเครื่อง — เก็บมากสุด 10 งานต่อ Device ID)
- Base URL (ค่าเริ่มต้น):
http://127.0.0.1:6699 - เส้นทาง:
/api/v1/* - รูปแบบ: JSON ธรรมดา (ไม่เข้ารหัส) · ต้องแนบ API key + X-Device-Id ทุก request (ดู §0)
- ข้อกำหนด: Renderqo (แอป Desktop) ต้องเปิดและสถานะ Running
⚠️ ทุก provider ต้องมี Chrome Extension เชื่อมต่ออยู่ (รวมgoogle_image_search) — แค่เปิดเบราว์เซอร์ที่ติดตั้งส่วนขยายไว้ ไม่ต้องเปิดหน้าต่างใดของส่วนขยาย
ระบบถือว่า "ออนไลน์สมบูรณ์" ก็ต่อเมื่อ แอป Renderqo เปิด (Running) + Extension เชื่อมต่อ
ถ้า extension ไม่ได้เปิด การสร้างงานจะถูกปฏิเสธพร้อมข้อความ "ระบบยังออนไลน์ไม่สมบูรณ์ กรุณาตรวจสอบอีกครั้ง" (no_extension_connected)
0) Authentication — ต้องมี API key + Device ID 🔑
ทุก request ไปยัง /api/v1/* ต้องแนบ 2 header:
Authorization: Bearer rqo_live_xxxxxxxxxxxx
X-Device-Id: dev-xxxxxxxxxxxxxxxx
API key (Authorization)
- สร้าง/จัดการ key ที่ me.renderqo.com → API Keys — สร้างได้หลายอัน ตั้งชื่อแยก และดู สถิติแยกต่อ key ได้
- key จะแสดง ครั้งเดียว ตอนสร้าง — เก็บไว้ให้ดี (เก็บเฉพาะ hash ในระบบ)
- ไม่มี / ผิด / ถูกเพิกถอน → ตอบ
401(api_key_requiredหรือapi_key_invalid) - เพิกถอน key แล้วมีผลภายในไม่กี่นาที (sync ลง renderqo-server อัตโนมัติ)
- รองรับ
X-API-Key: <key>แทน Bearer ได้เช่นกัน
Device ID (X-Device-Id) — ระบุ "เครื่องปลายทาง"
- API key เป็นของ สมาชิก จึงใช้ได้กับ ทุกเครื่อง ที่ลง license เดียวกัน —
X-Device-Idคือสิ่งที่บอกว่า trigger นี้ให้วิ่งที่ เครื่องไหน - หา Device ID ได้ใน Renderqo Extension → ไอคอนผู้ใช้ (มุมขวาบน) → คัดลอก Device ID (ค่ารูปแบบ
dev-…) - เครื่องจะรับงานเฉพาะเมื่อ
X-Device-Idตรงกับเครื่องนั้น - ไม่ส่ง header →
400(device_id_required) · ส่งมาไม่ตรงเครื่อง →403(device_mismatch)
ℹ️ ตัวอย่างcurlในเอกสารนี้ละAuthorization+X-Device-Idเพื่อความกระชับ — ของจริงต้องแนบทั้ง 2 ทุกครั้ง
ตัวอย่างเต็ม (คัดลอกไปใช้ได้ทันที — เติม key + device id ของคุณ):
curl -X POST http://127.0.0.1:6699/api/v1/jobs \
-H "Authorization: Bearer rqo_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "X-Device-Id: dev-xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"provider":"chatgpt","type":"image","prompt":"a red sports car","ratio":"4:3"}'
ℹ️ ตัวอย่างใช้ async (/api/v1/jobs) — สร้างงานแล้วได้jobIdกลับมาทันที จากนั้น pollGET /api/v1/jobs/:idจนได้status:"done"
🔎 เจอ 401/400 ทั้งที่มี key แล้ว? เช็ค 4 ข้อนี้ (เป็นสาเหตุเกือบทั้งหมด เพราะตัวอย่างcurlด้านล่างตัด 2 header นี้ออก):
1. มีBearerนำหน้า ในAuthorization(เว้นวรรค 1 ช่อง) — ไม่มี →api_key_required
2. key เต็มขึ้นต้นrqo_live_และยาว 49 ตัวอักษร (rqo_live_+ 40 hex) — copy ไม่ครบ/ตก prefix →api_key_invalid(แม้ 4 ตัวท้ายตรงก็ตาม)
3. มีX-Device-Id— key ผ่านแต่ไม่มี header นี้ →400 device_id_required
4. device id ตรงกับเครื่องที่ Renderqo รันอยู่ (ดูใน Extension → ไอคอนผู้ใช้) — ไม่ตรง →403 device_mismatch
ลำดับการตรวจ: key ก่อน (api_key_*) → แล้วค่อย device (device_*) — แก้ทีละชั้น
0.5) Browser Profile (หลายเบราว์เซอร์) 🌐
เปิดส่วนขยาย Renderqo ได้ หลาย browser profile พร้อมกัน — แต่ละโปรไฟล์มี Browser ID ของตัวเอง
(รูปแบบ br- + 6 hex เช่น br-3f8a2c) และมีสถานะ login ต่อ provider แยกกัน งาน**รันขนานกันได้
โปรไฟล์ละ 1 งาน**
หา Browser ID ได้ 3 ทาง:
- แดชบอร์ดในแอป Renderqo — การ์ดส่วนขยายแสดงทุกเบราว์เซอร์ที่เชื่อมต่อ พร้อมปุ่มคัดลอก id
- popup ของส่วนขยาย (คลิกไอคอน Renderqo ในเบราว์เซอร์นั้น) — แสดง id ของตัวเอง
- ทาง API:
curl -s http://127.0.0.1:6699/api/v1/browsers \
-H "Authorization: Bearer rqo_live_xxx" -H "X-Device-Id: dev-xxx"
{ "ok": true, "browsers": [
{ "id": "br-0a8a9d", "label": "หลัก", "version": "0.0.100", "connectedAt": "2026-08-02T01:00:00.000Z",
"busy": false, "debuggerBlocked": false,
"providers": { "google_flow": "in", "meta_ai": "in", "chatgpt": "in", "grok": "out", "google_image_search": "in" } },
{ "id": "br-0f70a6", "label": null, "version": "0.0.100", "connectedAt": "2026-08-02T01:02:00.000Z",
"busy": true, "debuggerBlocked": false,
"providers": { "google_flow": "in", "meta_ai": "in", "chatgpt": "in", "grok": "in", "google_image_search": "in" } }
] }
Public (https://api.renderqo.com) ตอบเส้นนี้จาก snapshot ล่าสุดที่เครื่องส่งขึ้นมา (เครื่อง
แนบรายการเบราว์เซอร์ไปกับ heartbeat ทุกครั้งที่ poll ~3 วินาที) — ข้อมูลจึงช้ากว่าของจริงได้ไม่เกิน
~1 รอบ poll · ถ้าแอปบนเครื่องไม่ออนไลน์ =503 device_offline(โค้ดเดียวกับตอนสร้างงาน)
การเลือกเบราว์เซอร์ตอนสร้างงาน:
- ไม่ส่ง
browser(ค่าปกติ) → ระบบจัดคิวอัตโนมัติ: เลือกเบราว์เซอร์ที่ว่าง + ล็อกอิน provider นั้นอยู่
(ตัวที่ login แล้วถูกเลือกก่อน · ตัวที่ logout ถูกข้าม · กระจายงานแบบ least-recently-used)
- ส่ง
browser: "br-xxxxxx"→ งานรันบนเบราว์เซอร์ตัวนั้นเท่านั้น — ถ้าไม่ว่างงานจะรอคิวของตัวนั้น ·
ถ้าไม่ได้เชื่อมต่อ = 503 browser_not_connected ทันที (ไม่เข้าคิวรอ)
- ผลลัพธ์ของงานบอกเสมอว่ารันที่ไหน:
GET /api/v1/jobs/:idฝั่ง Local (/private/jobs/:id) มี
browser (ที่ขอ) + browserId (ที่รันจริง)
# ตัวอย่าง: บังคับรันบนโปรไฟล์ br-0f70a6
curl -s -X POST http://127.0.0.1:6699/api/v1/jobs \
-H "Content-Type: application/json" \
-H "Authorization: Bearer rqo_live_xxx" -H "X-Device-Id: dev-xxx" \
-d '{"provider":"grok","type":"image","prompt":"a red umbrella","ratio":"1:1","browser":"br-0f70a6"}'
1) สรุป Endpoints
| Method | Path | ใช้ทำอะไร |
|---|---|---|
POST | http://127.0.0.1:6699/api/v1/jobs | สร้างงาน (async) → ได้ jobId กลับมาทันที แล้วไป poll สถานะเอง |
GET | http://127.0.0.1:6699/api/v1/jobs/:id | ดูสถานะ + ผลลัพธ์ของงาน — poll ทุก 5 วินาทีขึ้นไป (ระบบ cache สถานะ 5 วินาที) |
POST | http://127.0.0.1:6699/api/v1/jobs/:id/cancel | ยกเลิกงาน ที่ยังอยู่ในคิว/กำลังสร้าง → งานหยุดทันที สถานะเป็น canceled |
GET | http://127.0.0.1:6699/api/v1/browsers | รายชื่อ browser profile ที่เชื่อมต่ออยู่ (id, ชื่อ, สถานะ login ต่อ provider, ว่าง/ไม่ว่าง) — ใช้หา id สำหรับฟิลด์ browser |
GET | http://127.0.0.1:6699/files/:jobId/:fileName | ดาวน์โหลดไฟล์ผลลัพธ์ (ไม่ต้อง auth) |
2) พารามิเตอร์ของการสร้างงาน (POST /api/v1/jobs)
คอลัมน์ รองรับโดย = provider ที่ใช้ฟิลด์นั้น (provider อื่นส่งมาจะถูกเมิน ไม่ error). ตัวย่อ:
Flow=google_flow · Meta=meta_ai · GPT=chatgpt · ImgSearch=google_image_search · Grok=grok
| ฟิลด์ | ชนิด | จำเป็น | รองรับโดย | คำอธิบาย |
|---|---|---|---|---|
provider | string | ✅ | ทุกตัว | google_flow | meta_ai | chatgpt | google_image_search | grok |
type | string | ✅ | ทุกตัว | image | video — GPT/ImgSearch รองรับ image เท่านั้น · Flow/Meta/Grok รองรับทั้ง image+video |
prompt | string | ✅ | ทุกตัว | คำอธิบายภาพ/วิดีโอ · ImgSearch = คีย์เวิร์ดค้นหา · สูงสุด 10000 ตัวอักษร |
count | number | ❌ | Flow, GPT, ImgSearch | 1-10 (ค่าเริ่มต้น 1) — Flow/GPT: 1-4 (GPT ล็อก 1) · ImgSearch: 1-10 · Meta: เมิน (สร้าง ~4 อัตโนมัติ) · Grok: เมิน (คืน 1 เสมอ) |
ratio | string | ❌ | Flow, Meta, GPT, Grok | 1:1|9:16|16:9|4:3|3:4|2:3|3:2 (ค่าเริ่มต้น 9:16) — Grok: 2:3/3:2/1:1/9:16/16:9 · ImgSearch: ไม่ใช้ |
model | string | ❌ | Flow, Grok | Flow: ชื่อโมเดล (ดูตารางด้านล่าง) · Grok image: โหมด speed|quality (ค่าเริ่มต้น quality) · provider อื่นไม่ใช้ |
videoMode | string | ❌ | Flow (video) | ingredients (วิดีโอปกติ, ภาพแนบไม่บังคับ — ค่าเริ่มต้น) | frames (วิดีโอจากเฟรม, ต้องมี startFrame). เฉพาะ type=video |
startFrame | string(URL) | ❌* | Flow (frames) | เฟรมเริ่ม — จำเป็นเมื่อ videoMode=frames |
endFrame | string(URL) | ❌ | Flow (frames) | เฟรมสุดท้าย (ไม่บังคับ, videoMode=frames) |
image_ref | string[] | ❌ | Flow, Meta, Grok | URL ภาพอ้างอิง — Flow: ≤6 (image mode หรือ video ingredients) · Grok: ≤5 (image+video) · Meta: รองรับ · ค่าเริ่มต้น: ไม่แนบ |
resolution | string | ❌ | Grok (video) | 720p|1080p (ค่าเริ่มต้น 720p) · 1080p=สร้าง 480p แล้ว upscale (รับ 720/1080 ด้วย) |
duration | string | ❌ | Flow, Grok (video) | Grok: 6s|10s (ค่าเริ่มต้น 10s) · Flow: 4s|6s|8s (Veo 3.1) หรือ 4s|6s|8s|10s (Omni Flash) — ขึ้นกับ model; ค่าที่โมเดลไม่รองรับ Flow ใช้ค่าเริ่มต้นแทน |
extend | boolean | ❌ | Grok (video) | ต่อความยาววิดีโอ 1 ครั้งหลังสร้างเสร็จ — ค่าเริ่มต้น false |
reuseSession | boolean | ❌ | Flow | ใช้โปรเจคเดิมล่าสุดแทนการสร้างใหม่ — ค่าเริ่มต้น false |
project_name | string | ❌ | Flow | ชื่อโปรเจค — ระบบ find-or-create: ถ้ามีโปรเจคชื่อตรงกันใช้ตัวนั้น, ถ้าไม่มีสร้างใหม่แล้วตั้งชื่อนี้ · ถ้าไม่ส่ง = สร้างใหม่ทุกครั้ง |
downloadQuality | string | ❌ | Flow | original|720p|1080p|4k|1k|2k — ค่าเริ่มต้น original |
deleteChat | boolean | ❌ | GPT | ลบ conversation บน ChatGPT ทิ้งหลังงานจบ (ทั้งสำเร็จและล้มเหลว) — ค่าเริ่มต้น false · best-effort (ลบไม่ได้ไม่ทำให้งานพัง) |
browser | string | ❌ | ทุกตัว | ระบุ browser profile ที่ให้รันงาน (รูปแบบ br-xxxxxx — ดู §0.5 Browser Profile) · ไม่ส่ง = ระบบเลือกเบราว์เซอร์ที่ว่าง+ล็อกอินให้อัตโนมัติ · ระบุแล้วเบราว์เซอร์นั้นไม่ได้เชื่อมต่อ = 503 browser_not_connected |
callbackUrl | string(URL) | ❌ | ทุกตัว | เมื่องานเสร็จ/ล้มเหลว ระบบจะ POST ผลลัพธ์ไปที่ URL นี้ |
clientRequestId | string | ❌ | ทุกตัว | ไอดีอ้างอิงฝั่งคุณ (จะถูกส่งกลับใน callback) |
โมเดลของ google_flow
ส่ง model เป็น ชื่อโมเดลตรงตามที่ Flow แสดงใน dropdown (จับคู่แบบตรงตัว — แยก Veo 3.1 - Lite
กับ Veo 3.1 - Lite [Lower Priority] ออกจากกันได้). ถ้าไม่ส่ง model จะใช้ค่าเริ่มต้นของ Flow ตามบัญชี.
รายการที่ใช้ได้ ขึ้นกับ tier ของบัญชี + lineup ปัจจุบันของ Flow (เปลี่ยนได้) — ถ้าส่งชื่อที่บัญชีนั้นไม่มี
ระบบจะคงค่าเริ่มต้นไว้แทนที่จะล้มงาน. ตัวอย่างที่พบบ่อย:
| ประเภท | ค่าที่ใช้ได้ (ตาม dropdown ของ Flow) |
|---|---|
| video | Omni Flash, Veo 3.1 - Lite, Veo 3.1 - Fast, Veo 3.1 - Quality, Veo 3.1 - Lite [Lower Priority] |
| image | Nano Banana Pro, Nano Banana 2, Nano Banana 2 Lite |
รองรับ shorthand ด้วย (จับคู่คีย์เวิร์ด):fast/quality/lite→ Veo 3.1 ตัวนั้น ·omni/flash→ Omni Flash ·nano/banana→ Nano Banana Pro
3) รูปแบบการตอบกลับ (v1)
สร้างงาน (POST /api/v1/jobs)
{
"ok": true,
"jobId": "cmpz...",
"status": "queued"
}
(ถ้าส่ง callbackUrl มาด้วย จะมี "callbackUrl": "..." กลับมาด้วย)
ดูสถานะ/ผลลัพธ์ (GET /api/v1/jobs/:id)
{
"ok": true,
"status": "done",
"message": "job is done",
"media_urls": [
"http://127.0.0.1:6699/files/cmpz.../chatgpt_0.png"
]
}
status:running\|done\|fail\|canceled— จบแล้ว =done/fail/canceled(หยุด poll ได้)
· queued โผล่เฉพาะใน response ตอน สร้างงาน (POST /api/v1/jobs) เท่านั้น — ตอน poll งานที่ยังรอคิวตอบเป็น running
- ขณะยังไม่เสร็จ (รอคิว/กำลังสร้าง) →
status:"running",media_urls: [] - ล้มเหลว →
ok:false,status:"fail" - ถูกยกเลิก (ผ่าน
POST /api/v1/jobs/:id/cancel) →status:"canceled",ok:true,media_urls: [] - ไฟล์ผลลัพธ์เสิร์ฟผ่าน
http://127.0.0.1:6699/files/:jobId/:fileName(เปิด/ดาวน์โหลดได้ตรง ไม่ต้อง auth)
ภาพ thumbnail ของงานวิดีโอ
งาน type:"video" จะมีภาพ thumbnail แถมมาด้วย — ระบบดึงเฟรมที่ วินาทีที่ 2 ของแต่ละคลิปมาเก็บเป็นไฟล์
.jpg (สั่ง 3 คลิป = ได้ 3 ภาพ) เพื่อให้เอาไปแสดงในหน้ารายการได้โดยไม่ต้องโหลดวิดีโอทั้งไฟล์
{
"ok": true,
"status": "done",
"media_urls": ["https://api.renderqo.com/files/cmpz.../google_flow_0.mp4"],
"thumbnail_urls": ["https://api.renderqo.com/files/cmpz.../google_flow_0_thumb.jpg"]
}
thumbnail_urlsอยู่ ระดับเดียวกับmedia_urlsและ index ตรงกัน —thumbnail_urls[i]คือภาพของmedia_urls[i]- งานภาพจะไม่มีคีย์นี้เลย (ไม่ใช่อาเรย์ว่าง) — เช็คด้วยการมี/ไม่มีคีย์ได้
- คลิปที่ดึงเฟรมไม่สำเร็จจะเป็น
nullในตำแหน่งนั้น เพื่อรักษาลำดับให้ตรงกับmedia_urls
⇒ อย่าใช้ thumbnail_urls[i] โดยไม่เช็ค null
- คลิปที่สั้นกว่า 2 วินาที ระบบถอยไปดึงที่วินาที 1 หรือวินาทีแรกให้อัตโนมัติ
- ⚠️ ดึงเฟรมไม่สำเร็จไม่ทำให้งานล้มเหลว — งานยังเป็น
doneและได้วิดีโอครบ
เปลี่ยนจากสเปกเดิม (2026-08-04): เดิมเก็บซ้ำ 2 ที่ (result.thumbnail_urls+result.files[].thumbnail
+thumbnailAtSec) ตอนนี้เหลือthumbnail_urlsที่ระดับบนสุดที่เดียว ·result.files[]ไม่มีฟิลด์
เกี่ยวกับ thumbnail แล้ว
4) ตัวอย่างตาม provider/โหมด
4.1 ChatGPT — สร้างรูป (image เท่านั้น)
curl -X POST http://127.0.0.1:6699/api/v1/jobs \
-H "Content-Type: application/json" \
-d '{
"provider": "chatgpt",
"type": "image",
"prompt": "a cute corgi puppy in a field, studio lighting",
"ratio": "4:3",
"deleteChat": true
}'
- รองรับ
ratio:1:1,3:4,9:16,4:3,16:9(ค่าเริ่มต้นแนะนำ4:3) - แนบภาพอ้างอิงได้สูงสุด 6 ภาพผ่าน
image_ref countถูกล็อกที่ 1deleteChat: true= ลบ conversation ที่สร้างขึ้นบน ChatGPT ทิ้งหลังงานจบ (ทั้งสำเร็จและล้มเหลว) เพื่อไม่ให้แชทค้างสะสมในบัญชี · ค่าเริ่มต้นfalse· เป็น best-effort — ถ้าลบไม่สำเร็จงานยังคืนผลปกติ
# แนบภาพอ้างอิง
curl -X POST http://127.0.0.1:6699/api/v1/jobs \
-H "Content-Type: application/json" \
-d '{
"provider": "chatgpt", "type": "image",
"prompt": "turn this into a watercolor painting",
"ratio": "1:1",
"image_ref": ["https://example.com/photo.jpg"]
}'
4.2 Google Flow — สร้างรูป
curl -X POST http://127.0.0.1:6699/api/v1/jobs \
-H "Content-Type: application/json" \
-d '{
"provider": "google_flow",
"type": "image",
"prompt": "a minimal product photo of a perfume bottle",
"ratio": "1:1",
"count": 2,
"model": "Nano Banana Pro",
"image_ref": ["https://example.com/ref1.jpg"]
}'
4.3 Google Flow — สร้างวิดีโอปกติ (videoMode = ingredients, ค่าเริ่มต้น)
curl -X POST http://127.0.0.1:6699/api/v1/jobs \
-H "Content-Type: application/json" \
-d '{
"provider": "google_flow",
"type": "video",
"prompt": "a cinematic rainy street at night with neon reflections",
"ratio": "16:9",
"count": 1,
"model": "Veo 3.1 - Fast"
}'
วิดีโอปกติใช้videoMode=ingredientsเป็นค่าเริ่มต้น (ไม่ต้องส่งก็ได้) — ภาพแนบ (image_ref) ไม่บังคับ
4.4 Google Flow — วิดีโอจากเฟรม (videoMode = frames)
curl -X POST http://127.0.0.1:6699/api/v1/jobs \
-H "Content-Type: application/json" \
-d '{
"provider": "google_flow",
"type": "video",
"videoMode": "frames",
"prompt": "camera slowly pushes in as the character smiles",
"ratio": "16:9",
"startFrame": "https://example.com/first.jpg",
"endFrame": "https://example.com/last.jpg",
"project_name": "My Project"
}'
type=video+videoMode=frames—startFrameจำเป็น,endFrameไม่บังคับstartFrame/endFrameรับได้ทั้ง URL ภายนอก และ URL ของ server ตัวเอง (http://127.0.0.1:6699/uploads/…หรือhttp://127.0.0.1:6699/files/…) — ระบบจะอ่านไฟล์จาก disk โดยตรงโดยไม่ต้อง HTTP roundtripproject_name— ถ้าส่งมา ระบบจะ find-or-create โปรเจคชื่อนี้ใน Flow และเปลี่ยนชื่อโปรเจคหลังสร้างเสร็จ; ถ้าไม่ส่ง = สร้างโปรเจคใหม่ทุกครั้ง
4.5 Google Flow — Ingredients to Video
curl -X POST http://127.0.0.1:6699/api/v1/jobs \
-H "Content-Type: application/json" \
-d '{
"provider": "google_flow",
"type": "video",
"videoMode": "ingredients",
"prompt": "blend these references into a dynamic scene",
"ratio": "16:9",
"image_ref": [
"https://example.com/a.jpg",
"https://example.com/b.jpg"
]
}'
image_refไม่บังคับ สำหรับโหมด Ingredients — ถ้าไม่ใส่ จะสร้างวิดีโอจาก prompt ล้วน (ต่างจากโหมด Frames ที่startFrameจำเป็น)
4.6 Google Flow — ดาวน์โหลดความละเอียดสูง (Upscale)
curl -X POST http://127.0.0.1:6699/api/v1/jobs \
-H "Content-Type: application/json" \
-d '{
"provider": "google_flow", "type": "video",
"prompt": "a golden retriever running on the beach",
"ratio": "16:9",
"downloadQuality": "1080p"
}'
- video:
original(720p) \|1080p(ฟรี) \|4k(เสีย credit) - image:
original(1k) \|2k\|4k
4.7 Meta AI — รูป/วิดีโอ
curl -X POST http://127.0.0.1:6699/api/v1/jobs \
-H "Content-Type: application/json" \
-d '{
"provider": "meta_ai",
"type": "image",
"prompt": "a futuristic cyberpunk city skyline",
"ratio": "9:16"
}'
type:imageหรือvideoratio:1:1,9:16,16:9- ไม่ต้องส่ง
count— Meta AI กำหนดจำนวนไม่ได้ ระบบจะสร้าง ~4 รายการอัตโนมัติ และคืนผลลัพธ์ทุกรายการในmedia_urls(ถ้าส่งcountมาจะถูกเมิน) image_ref(ไม่บังคับ): แนบภาพอ้างอิงได้ สูงสุด 6 URL — ระบบแนบผ่านตัวเลือกอัปโหลดของ composer ให้อัตโนมัติ
4.8 Google Image Search — ค้นหารูปตามคีย์เวิร์ด
curl -X POST http://127.0.0.1:6699/api/v1/jobs \
-H "Content-Type: application/json" \
-d '{
"provider": "google_image_search",
"type": "image",
"prompt": "golden retriever puppy",
"count": 5
}'
prompt= คีย์เวิร์ดที่ต้องการค้นหาcount= จำนวนรูป1-10- ระบบจะค้นหาบน Google Images แล้วดาวน์โหลดภาพต้นทางมาเก็บ → คืนเป็น
media_urls - ไม่ต้องใช้
ratio/model/image_ref
⚠️ ข้อควรรู้: ต้องมี Extension เชื่อมต่ออยู่ เช่นเดียวกับ provider อื่น (ไม่ได้เชื่อมต่อ →no_extension_connected)
และต้อง login Google ในเบราว์เซอร์ที่ติดตั้งส่วนขยาย — การค้นหาทำบนแท็บจริงในเบราว์เซอร์นั้น จึงไม่โดนระบบกันบอท (/sorry/ unusual traffic)
บางเว็บต้นทางห้าม hotlink ระบบจะข้ามรูปนั้นและใช้รูปถัดไปจนครบจำนวน
4.9 Grok — สร้างรูป (โหมดเร็ว/คุณภาพ)
curl -X POST http://127.0.0.1:6699/api/v1/jobs \
-H "Content-Type: application/json" \
-d '{
"provider": "grok",
"type": "image",
"prompt": "a neon cyberpunk fox, highly detailed",
"model": "quality",
"ratio": "2:3"
}'
model= โหมดสร้างรูป:speed(เร็ว) หรือquality(คุณภาพ) — ค่าเริ่มต้นqualityratio=2:3\|3:2\|1:1\|9:16\|16:9- ไม่ต้องส่ง
count— ผลลัพธ์ 1 รายการเสมอ (ถ้าส่งcountมาจะถูกเมิน) - สร้างเสร็จระบบเปิดภาพแรก → กดปุ่ม Download → ได้ไฟล์จริงแล้วตอบกลับทันที
- ⏱️ timeout การสร้าง 15 นาที (รูป) — เกินแล้วยังไม่เสร็จ งานจะ
fail
4.10 Grok — สร้างวิดีโอ (resolution + duration + extend)
curl -X POST http://127.0.0.1:6699/api/v1/jobs \
-H "Content-Type: application/json" \
-d '{
"provider": "grok",
"type": "video",
"prompt": "a paper boat sailing down a rainy street, cinematic",
"resolution": "1080p",
"duration": "10s",
"ratio": "16:9",
"extend": true
}'
resolution=720p(สร้าง 720p ตรง) \|1080p(สร้าง 480p แล้ว upscale อัตโนมัติ) — ค่าเริ่มต้น720pduration=6s\|10s— ค่าเริ่มต้น10sextend=true/false— ต่อความยาว 1 ครั้งหลังสร้างเสร็จ (ค่าเริ่มต้นfalse)ratio=2:3\|3:2\|1:1\|9:16\|16:9- ไม่ต้องส่ง
count— ผลลัพธ์ 1 รายการเสมอ (ถ้าส่งcountมาจะถูกเมิน) - สร้างเสร็จระบบกดปุ่ม Download ดาวน์โหลดไฟล์จริงแล้วตอบกลับทันที
- ⏱️ timeout การสร้าง 25 นาที (วิดีโอ) — เกินแล้วยังไม่เสร็จ งานจะ
fail· เวลา upscale/extend/ดาวน์โหลด ไม่นับรวม ในนี้ (มีงบแยกให้อีก)
⚠️ ต้องมี Extension เชื่อมต่ออยู่ + logingrok.comในเบราว์เซอร์ (ไม่งั้นno_extension_connected/provider_not_logged_in)
🖼️ ภาพต้นฉบับ (full-res): ระบบ ตามไปหน้าต้นทาง (source page) ของแต่ละผลลัพธ์ → ดึงog:image(ภาพต้นฉบับ);
ถ้าไม่ได้ → upgrade URL ของภาพ (Twitter/Pinterest/Wikimedia/Imgur/YouTube/Reddit แก้ขนาดตรงๆ ได้แม่น) → สุดท้ายคือ thumbnail
(API สาธารณะคืนmedia_urlsเท่านั้น — ไม่มี metadata ต่อไฟล์ / source URL รายรูป)
5) การติดตามงาน (Polling)
สำหรับงานที่ใช้เวลานาน (โดยเฉพาะวิดีโอ) แนะนำ (poll ทุก 5 วินาทีขึ้นไป — ระบบ cache สถานะ 5 วินาที):
# 1) สร้างงาน
RESP=$(curl -s -X POST http://127.0.0.1:6699/api/v1/jobs \
-H "Content-Type: application/json" \
-d '{"provider":"google_flow","type":"video","prompt":"a calm ocean at sunset","ratio":"16:9"}')
JOB_ID=$(echo "$RESP" | python3 -c "import sys,json;print(json.load(sys.stdin)['jobId'])")
# 2) วน poll จนกว่าจะ done/fail
while true; do
J=$(curl -s http://127.0.0.1:6699/api/v1/jobs/$JOB_ID)
STATUS=$(echo "$J" | python3 -c "import sys,json;print(json.load(sys.stdin)['status'])")
echo "status: $STATUS"
[ "$STATUS" = "done" ] && echo "$J" && break
[ "$STATUS" = "fail" ] && echo "$J" && break
sleep 5
done
หรือใช้ callbackUrl ให้ระบบยิงผลลัพธ์กลับมาหาคุณเองเมื่อเสร็จ:
curl -X POST http://127.0.0.1:6699/api/v1/jobs \
-H "Content-Type: application/json" \
-d '{
"provider":"chatgpt","type":"image","prompt":"a red sports car",
"callbackUrl":"https://your-server.com/renderqo-callback"
}'
Payload ที่ยิงไปยัง callbackUrl (เมื่องานเสร็จ/ล้มเหลว) — มี media_urls ของผลลัพธ์:
{
"ok": true,
"jobId": "cmpz...",
"status": "done",
"media_urls": ["http://127.0.0.1:6699/files/.../chatgpt_0.png"],
"clientRequestId": "your-ref-123",
"error": null
}
งานวิดีโอจะมี thumbnail_urls เพิ่มมาข้าง media_urls (index ตรงกัน) แบบเดียวกับ GET /api/v1/jobs/:id
6) Error & ข้อผิดพลาดที่พบบ่อย
ทุก error ตอบกลับรูปแบบ:
{ "ok": false, "error": { "code": "...", "message": "...", "retryable": true } }
| HTTP | code | ความหมาย / วิธีแก้ |
|---|---|---|
| 400 | validation_error | พารามิเตอร์ไม่ถูกต้อง (ดู message) |
| 401 | api_key_required / api_key_invalid | ไม่มี / ผิด / ถูกเพิกถอน API key |
| 401 | license_required | ไลเซนส์ไม่ถูกต้อง หมดอายุ หรือบัญชีถูกระงับ |
| 400 / 403 | device_id_required / device_mismatch | ไม่ส่ง X-Device-Id / ส่งมาไม่ตรงเครื่อง |
| 503 | service_stopped | Renderqo หยุดอยู่ → เปิดแอปแล้วกด Start |
| 503 | device_offline | (Public) เครื่องปลายทางไม่ออนไลน์ (แอปปิด/ไม่ได้รันอยู่) → "ระบบยังออนไลน์ไม่สมบูรณ์ กรุณาตรวจสอบอีกครั้ง" |
| 503 | no_extension_connected | แอปออนไลน์แต่ Extension ไม่ได้เชื่อมต่อ (ทุก provider) — เบราว์เซอร์ที่ติดตั้งส่วนขยายปิดอยู่ หรือส่วนขยายถูกปิด/ต้อง reload → "ระบบยังออนไลน์ไม่สมบูรณ์ กรุณาตรวจสอบอีกครั้ง" |
| 503 | provider_not_logged_in | Extension เชื่อมต่ออยู่แต่ provider ที่ระบุยังไม่ได้เข้าสู่ระบบ (ตรวจจาก login sweep ทุก ~5 นาที) → "ยังไม่ได้เข้าสู่ระบบ {Provider} กรุณาเข้าสู่ระบบก่อนสร้างงาน" — เข้าสู่ระบบ provider นั้นในเบราว์เซอร์แล้วลองใหม่ (retryable:true) · ถ้าระบุ browser มาด้วย = ตรวจเฉพาะเบราว์เซอร์ตัวนั้น |
| 503 | browsers_unavailable | (Public) เฉพาะ GET /api/v1/browsers — เครื่องออนไลน์อยู่ แต่ แอปเวอร์ชันเก่ายังไม่ได้รายงานรายชื่อเบราว์เซอร์ → อัปเดตแอป Renderqo บนเครื่องปลายทาง (ระหว่างนี้ดู Browser ID จากแดชบอร์ดในแอป หรือ popup ของส่วนขยาย) · ไม่ตอบเป็นรายการว่าง เพราะจะแยกไม่ออกจาก "ไม่มีเบราว์เซอร์เชื่อมต่อ" |
| 503 | browser_not_connected | ระบุ browser มาแต่ เบราว์เซอร์ตัวนั้นไม่ได้เชื่อมต่ออยู่ → เปิดเบราว์เซอร์นั้น หรือเช็ค id จาก GET /api/v1/browsers แล้วลองใหม่ (retryable:true) |
| 503 | browser_debugger_blocked | เบราว์เซอร์เชื่อมต่ออยู่ แต่ Chrome ปิดกั้นการควบคุมของส่วนขยาย (แบนเนอร์ "กำลังดีบักเบราว์เซอร์นี้" ถูกกดปิด — มีผลทั้ง session) → ปิด Chrome แล้วเปิดใหม่จากปุ่มในแอป Renderqo (แอปเปิดด้วย --silent-debugger-extension-api แบนเนอร์จึงไม่ขึ้นอีก) · เช็คสถานะได้จากฟิลด์ debuggerBlocked ใน GET /api/v1/browsers |
| 429 | rate_limit | ส่งคำขอถี่เกินไป (จำกัด 10 งาน/นาที) |
| 429 | quota_exceeded | เกินโควต้ารายวันของแพ็ก (เช่น ทดลองใช้งาน = 100 งาน/วัน) → อัปเกรดแพ็กเพื่อใช้งานต่อ (retryable:false) |
| 404 | not_found | ไม่พบงานตาม jobId (เช่นตอนเรียก cancel) · ใช้ jobId ให้ตรงปลายทาง: งานที่สร้างผ่าน Public (https://api.renderqo.com) ต้อง cancel/เช็คสถานะที่ Public เท่านั้น ส่วนงานที่สร้างผ่าน Local (http://127.0.0.1:6699) ก็ใช้ Local — id คนละชุดกัน (Local ยอมรับ id ของ Public ให้ด้วยเฉพาะงานที่เครื่องนี้กำลังรันอยู่) · อีกสาเหตุ: งานจบไปแล้ว หรือเซิร์ฟเวอร์รีสตาร์ต (รายการงานอยู่ในหน่วยความจำ) |
| 409 | already_done / already_failed / already_canceled | ยกเลิกไม่ได้ — งานจบไปแล้ว (POST /api/v1/jobs/:id/cancel) |
| 500 | internal_error | ข้อผิดพลาดภายใน (ดู message) |
ตัวอย่างเฉพาะ google_image_search:
Google blocked the automated search (/sorry)→ เปิด Extension + login GoogleFound images but could not download any→ เว็บต้นทางบล็อก hotlink (ลอง keyword อื่น/เพิ่ม count)
7) ตารางสรุปความสามารถต่อ provider
| Provider | type | ratio | count | model | image_ref | frames | quality |
|---|---|---|---|---|---|---|---|
google_flow | image, video | 5 แบบ | 1-4 | ✅ | ✅ (≤6) | ✅ (videoMode=frames) | ✅ |
meta_ai | image, video | image: 1:1 (ค่าเริ่มต้น 1280×1280) / 16:9 / 9:16 — ระบบสั่งผ่าน prompt ให้ ได้พิกเซลตรงจริง (เช่น 16:9 → 1440×810) · video: 1:1 (624×624) เท่านั้น ระบุ ratio ไม่มีผล | 1 ต่อครั้ง (กำหนดไม่ได้ — เดิม ~4, Meta เปลี่ยนเป็น 1 ตั้งแต่ ส.ค. 2026) | — | ✅ (≤6) | — | วิดีโอ ~5 วินาที/คลิป · สร้างบน meta.ai (ฟีเจอร์ Vibes) — Meta กำลังทดสอบแยก Vibes เป็นแอปต่างหากในบางประเทศ หากย้ายออกจริง provider นี้อาจเหลือเฉพาะรูป |
chatgpt | image | 5 แบบ | 1 (ล็อก) | — | ✅ (≤6) | — | deleteChat = ลบ conversation ทิ้งหลังงานจบ (ทุกกรณี, best-effort) |
google_image_search | image | — | 1-10 | — | — | — | — |
grok | image, video | 2:3/3:2/1:1/9:16/16:9 | 1 เสมอ (fix) — count ถูกเมิน | ✅ (image: speed/quality — ค่าเริ่มต้น quality) | ✅ (≤5, optional) | — | video: resolution 720p/1080p (1080p=480p+upscale) · duration 6s/10s · extend · ภาพอ้างอิง = รูปเท่านั้น · ⏱️ timeout การสร้าง 15 นาที (รูป) / 25 นาที (วิดีโอ) · ดาวน์โหลดผ่านปุ่ม Download แล้วตอบกลับทันที |
Grok — โหมด + ตัวเลือก
| ประเภท | ตัวเลือก | ค่าที่ใช้ได้ | ค่าเริ่มต้น |
|---|---|---|---|
| image | model (โหมด) | speed (เร็ว), quality (คุณภาพ) | quality |
| image | ratio | 2:3, 3:2, 1:1, 9:16, 16:9 | 9:16 |
| video | resolution | 720p, 1080p | 720p |
| video | duration | 6s, 10s | 10s |
| video | extend | true/false — ต่อความยาว 1 ครั้ง | false |
| video | ratio | 2:3, 3:2, 1:1, 9:16, 16:9 | 9:16 |
| image + video | ผลลัพธ์ | 1 รายการเสมอ (count ถูกเมิน — Grok กำหนดจำนวนไม่ได้) | 1 |
| image + video | image_ref (ภาพอ้างอิง) | URL รูปสูงสุด 5 — option (ไม่บังคับ) · รับเฉพาะรูป: jpg/jpeg/png/gif/webp/bmp/tiff | ไม่มี (ไม่แนบ) |
ภาพอ้างอิง (input references) ของ Grok: เป็นตัวเลือกเสริม ไม่จำเป็นต้องแนบ · แนบได้สูงสุด 5 รูป · รองรับ ไฟล์รูปภาพเท่านั้น (ไม่รับวิดีโอ) · ใช้ได้ทั้งโหมด image และ video · รูปความละเอียดต่ำอาจทำให้คุณภาพผลลัพธ์ลดลง
Grok video — resolution / upscale / extend:
-resolution: "720p"→ สร้างที่ 720p ตรงๆ
-resolution: "1080p"→ สร้างที่ 480p แล้ว upscale อัตโนมัติ (Grok ให้ upscale เฉพาะวิดีโอที่สร้างด้วย 480p) → ได้ผลลัพธ์ความละเอียดสูงขึ้น · ใช้เวลานานกว่า
-extend: true→ หลังสร้างเสร็จจะกด Extend ต่อความยาวให้ 1 ครั้ง (ใช้ได้ทุก resolution)
- ผลลัพธ์ 1 รายการเสมอ ทั้งภาพและวิดีโอ · สร้างเสร็จระบบกดปุ่ม Download ดาวน์โหลดไฟล์จริงแล้วตอบกลับทันที
ตัวอย่าง: Grok image พร้อมภาพอ้างอิง
curl -X POST http://127.0.0.1:6699/api/v1/jobs \
-H "Content-Type: application/json" \
-d '{
"provider": "grok",
"type": "image",
"prompt": "blend these into a surreal poster",
"model": "quality",
"ratio": "1:1",
"image_ref": ["https://example.com/a.png", "https://example.com/b.jpg"]
}'
8) หมายเหตุสำคัญ
- ต้องออนไลน์สมบูรณ์ = แอป Running + Extension เชื่อมต่อ (แค่เปิดเบราว์เซอร์ที่ติดตั้งส่วนขยายไว้ ส่วนขยายเชื่อมต่อเอง) — บังคับ ทุก provider (รวม
google_image_search). ถ้า extension ไม่ได้เชื่อมต่อ การสร้างงานถูกปฏิเสธทันทีด้วยno_extension_connected("ระบบยังออนไลน์ไม่สมบูรณ์ กรุณาตรวจสอบอีกครั้ง") - Public (cloud relay): cloud ตรวจสถานะเครื่องปลายทาง (
X-Device-Id) จาก heartbeat ของ relay poll ก่อนรับงาน — แอปไม่ออนไลน์ →503 device_offline; แอปออนไลน์แต่ extension ปิด →503 no_extension_connected(ทั้งคู่ตอบทันทีตอนเรียก ไม่ปล่อยให้งานค้าง) - Rate limit: 10 งาน/นาที, 100 คำขอ/นาที (เชิงเทคนิค) — แยกจาก โควต้ารายวันของแพ็ก (เช่น ทดลองใช้งาน 100 งาน/วัน →
429 quota_exceeded) - ไฟล์ผลลัพธ์ (Public) เก็บมากสุด 10 งานต่อ Device ID — งานเก่าสุดถูกลบเมื่อมีงานใหม่เกินจำนวน; ดาวน์โหลดไว้เองถ้าต้องใช้ระยะยาว
- วิดีโอใช้เวลานาน (หลายนาที) — ใช้ async + poll (
GET /api/v1/jobs/:idทุก 5 วินาทีขึ้นไป) หรือcallbackUrl
