API ภายในเครื่อง Aurorium v1
API ภายในเครื่องช่วยให้สคริปต์ที่ทำงานบนคอมพิวเตอร์ของคุณจัดการโปรไฟล์ Aurorium เซสชันเบราว์เซอร์ โฟลเดอร์ พร็อกซี และคุกกี้ได้ เซิร์ฟเวอร์เริ่มทำงานพร้อมแอปเดสก์ท็อปและเข้าถึงได้จากคอมพิวเตอร์เครื่องเดียวกันเท่านั้น
#เริ่มต้นอย่างรวดเร็ว
- เปิด Aurorium และเข้าสู่ระบบบัญชีของคุณ
- เปิด ระบบอัตโนมัติ → API และสร้างคีย์ API
- บันทึกคีย์ทันที เพราะแบ็กเอนด์จะแสดงเพียงครั้งเดียว
- ส่งคีย์ไปกับทุกคำขอโดยใช้
Authorization: Bearer <api_key>
bashcurl "http://127.0.0.1:50325/api/v1/health" \
-H "Authorization: Bearer $AURORIUM_API_KEY"
URL ฐาน:
texthttp://127.0.0.1:50325/api/v1
เซิร์ฟเวอร์รับการเชื่อมต่อเฉพาะที่ 127.0.0.1 ไม่ใช่อินเทอร์เฟซเครือข่ายภายนอก พอร์ตคงที่ในปัจจุบันคือ 50325
#รูปแบบการตอบกลับ
ผลลัพธ์สำเร็จและข้อผิดพลาดของแอปใช้โครงสร้างครอบการตอบกลับแบบเดียวกัน:
json{
"code": 0,
"msg": "success",
"data": {},
"request_id": "req_0d30b83f3fbb43e6a2e1b255e21d24b8"
}
code = 0 หมายถึงสำเร็จcode != 0 หมายถึงข้อผิดพลาดของแอป การตรวจสอบเพียงสถานะ HTTP ยังไม่เพียงพอ- บันทึก
request_id ในบันทึกการเชื่อมต่อระบบเพื่อใช้วินิจฉัยปัญหา - โดยปกติเซิร์ฟเวอร์จะส่ง HTTP
200 แม้เกิดข้อผิดพลาดของแอป - หากเนื้อหา JSON เกิน 5 MiB API จะส่ง
code: 1001 และ msg: "request body too large"
ตัวอย่างข้อผิดพลาด:
json{
"code": 1201,
"msg": "profile not found",
"data": null,
"request_id": "req_7f3ab37ea65048f99ebd0fdbe6f4da63"
}
#พารามิเตอร์ร่วม
เอนด์พอยต์รายการยอมรับพารามิเตอร์ต่อไปนี้:
| พารามิเตอร์ | ค่าเริ่มต้น | ขีดจำกัด |
|---|
page | 1 | ขั้นต่ำ 1 |
page_size | 50 | สูงสุด 200 ค่าที่มากกว่าจะถูกจำกัดไว้ที่ 200 |
รูปแบบ data ของการตอบกลับรายการ:
json{
"list": [],
"page": 1,
"page_size": 50,
"total": 0
}
#ภาพรวมเอนด์พอยต์
| เมธอด | พาธ | วัตถุประสงค์ |
|---|
| GET | /health | ความพร้อมของแอปและการเชื่อมต่อคลาวด์ |
| GET | /version | เวอร์ชันแอปและ API |
| GET | /profile | แสดงรายการโปรไฟล์ที่ยังไม่เก็บถาวร |
| POST | /profile | สร้างโปรไฟล์ |
| GET | /profile/:id | รับรายละเอียดโปรไฟล์ |
| PATCH | /profile/:id | อัปเดตโปรไฟล์บางส่วน |
| DELETE | /profile/:id | ลบโปรไฟล์ |
| GET | /folder | แสดงรายการโฟลเดอร์ |
| POST | /folder | สร้างโฟลเดอร์ |
| PUT | /folder/:id | เปลี่ยนชื่อโฟลเดอร์ |
| DELETE | /folder/:id | ลบโฟลเดอร์ |
| GET | /browser/status | รับสถานะการเริ่มโปรไฟล์ |
| GET | /browser/active | แสดงรายการโปรไฟล์ที่กำลังทำงาน |
| POST | /browser/start | เริ่มโปรไฟล์พร้อม CDP |
| POST | /browser/stop | หยุดโปรไฟล์ |
| POST | /browser/stop-all | หยุดโปรไฟล์ภายในเครื่อง |
| POST | /proxy/check | ตรวจสอบพร็อกซี |
| PUT | /profile/:id/proxy | แทนที่พร็อกซีของโปรไฟล์ |
| GET | /profile/:id/cookies | ส่งออกคุกกี้ |
| POST | /profile/:id/cookies/import | นำเข้าคุกกี้ |
| GET | /device | แสดงรายการอุปกรณ์ของบัญชี |
| GET | /catalog | รับค่าลายนิ้วมือที่อนุญาต |
#ระบบ
#GET /health
ส่งคืนความพร้อมของแอปภายในเครื่อง สถานะการเชื่อมต่อคลาวด์ และ ID อุปกรณ์ปัจจุบัน
json{
"ready": true,
"cloud_connected": true,
"device_id": "device-id-or-null"
}
แม้แต่การตรวจสอบสถานะระบบก็ต้องยืนยันตัวตน
#GET /version
json{
"app_version": "0.3.1",
"core_version": null,
"api_version": "v1"
}
core_version ยังไม่ได้พัฒนาและจะส่งคืน null เสมอ
#โปรไฟล์
#GET /profile
พารามิเตอร์คิวรี:
| พารามิเตอร์ | ค่า | คำอธิบาย |
|---|
folder_id | ObjectId | กรองตามโฟลเดอร์ |
name | สตริง | ค้นหาตามชื่อ |
status | all, running, idle | ค่าเริ่มต้นคือ all |
page, page_size | จำนวนเต็ม | การแบ่งหน้า |
รายการแต่ละรายการ:
json{
"profile_id": "507f1f77bcf86cd799439011",
"name": "Automation profile",
"folder_id": null,
"status": "idle",
"location": null,
"os": "windows",
"os_version": "Windows 11",
"core": "chrome",
"core_version": "134",
"description": "",
"created_at": "2026-07-24T10:00:00Z",
"updated_at": "2026-07-24T10:00:00Z"
}
จะไม่ส่งคืนโปรไฟล์ที่เก็บถาวร ตัวกรอง running|idle ใช้เฉพาะฝั่งไคลเอนต์หลังโหลดหน้าแล้ว ดังนั้น total และจำนวนรายการบนหน้าอาจไม่ตรงกับรายการที่กรองแล้ว
#POST /profile
คำขอขั้นต่ำ:
json{
"name": "Automation profile"
}
ฟิลด์ที่รองรับ:
| ฟิลด์ | ชนิด | จำเป็น | หมายเหตุ |
|---|
name | สตริง | ใช่ | ชื่อที่ไม่ว่าง |
description | สตริง | ไม่ | ค่าเริ่มต้นคือ "" |
folder_id | สตริงหรือ null | ไม่ | Mongo ObjectId; null หมายถึงไม่มีโฟลเดอร์ |
tags | อาร์เรย์ | ไม่ | ค่าเริ่มต้นคือ [] |
os | สตริง | ไม่ | windows, macos, linux |
os_version | สตริง | ไม่ | ข้อมูลเวอร์ชันระบบปฏิบัติการเพื่อช่วยสร้างลายนิ้วมือ เช่น "11" หรือ "Tahoe"; ดูค่าที่แนะนำใน /catalog |
is_arm | บูลีน | ไม่ | ข้อมูลบ่งชี้ ARM หากไม่ระบุจะอนุมานจากผู้ผลิต GPU |
proxy | ออบเจ็กต์ | ไม่ | พร็อกซีที่ระบุโดยตรงตามรูปแบบด้านล่าง |
proxy_id | สตริง | ไม่ | การอ้างอิงพร็อกซีที่มีอยู่ โดย proxy มีลำดับความสำคัญสูงกว่า |
launch_arguments | สตริง | ไม่ | อาร์กิวเมนต์การเริ่มต้นในสตริงเดียว |
start_page | สตริง | ไม่ | หน้าเริ่มต้น |
fingerprint | ออบเจ็กต์ | ไม่ | เขียนทับค่าลายนิ้วมือบางส่วน |
ตัวอย่างที่ใช้พร็อกซี:
json{
"name": "Profile with proxy",
"os": "windows",
"proxy": {
"type": "socks5",
"host": "127.0.0.1",
"port": 1080,
"user": "login",
"password": "secret"
}
}
การสร้างโปรไฟล์ทำงานแบบอะซิงโครนัสในแบ็กเอนด์ API ภายในเครื่องจะรอเหตุการณ์เสร็จสมบูรณ์และโดยปกติส่งคืนโมเดลโปรไฟล์ทั้งหมด หากการอ่านข้อมูลต่อจากนั้นล้มเหลว อาจส่งคืนเฉพาะ profile_id
#GET /profile/:id
ส่งคืนรายการพร้อมออบเจ็กต์ proxy และ fingerprint เพิ่มเติม รหัสผ่านพร็อกซีจะไม่ถูกส่งคืนเป็นข้อความธรรมดา หากมีรหัสผ่านจะแทนด้วย ******
#PATCH /profile/:id
อัปเดตโปรไฟล์บางส่วน:
json{
"name": "New name",
"description": "Updated through API",
"folder_id": null,
"fingerprint": {
"timezone_mode": "manual",
"timezone": "Europe/Moscow"
}
}
เนื้อหาคำขอว่างจะถือว่าสำเร็จโดยไม่เปลี่ยนแปลงข้อมูล เมทาดาทามีผลทันที การเปลี่ยนลายนิ้วมือมีผลทันทีเมื่อโปรไฟล์หยุดอยู่ แต่หากกำลังทำงานจะเลื่อนไปใช้ในการเริ่มครั้งถัดไปและแสดงไว้ใน deferred_fields
json{
"profile_id": "507f1f77bcf86cd799439011",
"deferred_fields": ["fingerprint.timezone_mode", "fingerprint.timezone"]
}
สำหรับโปรไฟล์ที่หยุดอยู่ deferred_fields จะว่างเสมอ
#DELETE /profile/:id
คิวรี force=true จะหยุดโปรไฟล์ที่ทำงานบนอุปกรณ์ปัจจุบันก่อนลบ หากไม่มี force โปรไฟล์ดังกล่าวจะส่งคืน 1203
json{
"profile_id": "507f1f77bcf86cd799439011",
"deleted": true
}
การลบมีคุณสมบัติทำซ้ำแล้วได้ผลเดิมสำหรับ ObjectId ที่มีไวยากรณ์ถูกต้อง ปัจจุบันการตอบกลับว่า “ไม่พบ” จากแบ็กเอนด์จะถือว่าโปรไฟล์ถูกลบไปแล้ว
#ลายนิ้วมือ
ออบเจ็กต์ fingerprint ใน POST และ PATCH รองรับการอัปเดตฟิลด์ต่อไปนี้บางส่วน:
| ฟิลด์ | ชนิดหรือค่า |
|---|
timezone_mode | auto, manual |
timezone | สตริงหรือ null |
language_mode | auto, manual |
languages | อาร์เรย์สตริง ใช้รายการแรก |
language | สตริง ใช้เป็นรูปแบบย่อแทนได้ |
screen_resolution | สตริง |
webrtc_mode | real, replace |
canvas_noise | บูลีน |
webgl_image_noise | บูลีน |
webgl_vendor | สตริงหรือ null |
webgl_renderer | สตริงหรือ null |
audio_noise | บูลีน |
client_rects_noise | บูลีน |
hardware_concurrency | ตัวเลข |
device_memory | ตัวเลข |
do_not_track | default, true |
os_version | สตริง |
dns_mode | real, manual |
dns_server | สตริงหรือ null |
geolocation | {mode, latitude, longitude, accuracy} |
media_devices | {audio_inputs, audio_outputs, video_inputs} |
ใช้ /catalog เพื่อรับค่าระบบปฏิบัติการ GPU, CPU, RAM, หน้าจอ เขตเวลา และภาษาที่เข้ากันได้
#โฟลเดอร์
#GET /folder
รองรับ name, page และ page_size
json{
"folder_id": "507f1f77bcf86cd799439012",
"name": "QA",
"profile_count": 3,
"system": false
}
#POST /folder
#PUT /folder/:id
json{ "name": "QA automation" }
#DELETE /folder/:id
การลบโฟลเดอร์ไม่ลบโปรไฟล์ แบ็กเอนด์จะย้ายโปรไฟล์ทีมไปยังโฟลเดอร์ระบบ และเปลี่ยนโปรไฟล์ส่วนตัวเป็นสถานะไม่มีโฟลเดอร์
json{
"folder_id": "507f1f77bcf86cd799439012",
"deleted": true,
"moved_profiles": 3,
"moved_to": null
}
moved_profiles และ moved_to คำนวณก่อนลบตามข้อมูลที่หาได้ดีที่สุด และอาจคลาดเคลื่อนหากอ่านสถานะคลาวด์ไม่ได้
#วงจรการทำงานของเบราว์เซอร์
#GET /browser/status?profile_id=:id
ส่งคืน idle หรือ running อุปกรณ์ที่เริ่มโปรไฟล์ และข้อมูลการเชื่อมต่อกับตัวระบุกระบวนการที่หาได้ภายในเครื่อง
#GET /browser/active
คิวรี scope ยอมรับ:
this_device — โปรไฟล์ที่ทำงานภายในเครื่อง เป็นค่าเริ่มต้น;account — โปรไฟล์ที่ทำงานบนอุปกรณ์ทั้งหมดของบัญชีตามทะเบียนบนคลาวด์
รองรับการแบ่งหน้ามาตรฐาน
#POST /browser/start
json{
"profile_id": "507f1f77bcf86cd799439011",
"headless": false,
"open_urls": ["https://example.com"],
"launch_args": ["--window-size=1280,800"],
"load_extensions": true
}
การตอบกลับเมื่อสำเร็จ:
json{
"profile_id": "507f1f77bcf86cd799439011",
"already_running": false,
"debug_port": 51432,
"ws": "ws://127.0.0.1:51432/devtools/browser/...",
"webdriver": null,
"pid": 12345,
"lease": {
"device_id": "device-id",
"device_name": "Workstation",
"is_current_device": true
}
}
การเริ่มโปรไฟล์ซ้ำบนอุปกรณ์ปัจจุบันให้ผลเดิม หากโปรไฟล์ทำงานบนอุปกรณ์อื่นจะส่งคืน 1204 หากไม่มีคอร์เบราว์เซอร์ที่ต้องใช้หรือกำลังดาวน์โหลด API ภายในเครื่องจะส่งคืน 1304 เมธอดนี้จะไม่ดาวน์โหลดคอร์ให้อัตโนมัติ
#POST /browser/stop
json{ "profile_id": "507f1f77bcf86cd799439011" }
การหยุดซ้ำให้ผลเดิมและส่งคืน was_running
#POST /browser/stop-all
หยุดทุกโปรไฟล์บนอุปกรณ์ปัจจุบัน:
json{
"stopped": ["507f1f77bcf86cd799439011"],
"count": 1
}
#พร็อกซี
รูปแบบพร็อกซีที่ระบุโดยตรง:
| ฟิลด์ | ชนิด | หมายเหตุ |
|---|
type | สตริง | http, socks4, socks5, ssh, no_proxy |
host | สตริง | จำเป็น ยกเว้น no_proxy |
port | จำนวนเต็ม/สตริง | 1..65535 ยกเว้น no_proxy |
user | สตริง | ไม่บังคับ |
password | สตริง | ไม่บังคับ |
refresh_url | สตริง | ไม่บังคับ |
#POST /proxy/check
ระบุแหล่งข้อมูลเพียงหนึ่งอย่างเท่านั้น: proxy หรือ profile_id
json{
"proxy": {
"type": "http",
"host": "proxy.example.com",
"port": 8080
}
}
json{
"ok": true,
"exit_ip": "203.0.113.10",
"country": "DE",
"city": "Frankfurt",
"latitude": 50.11,
"longitude": 8.68,
"timezone": null,
"latency_ms": null
}
#PUT /profile/:id/proxy
เนื้อหาคำขอคือออบเจ็กต์พร็อกซีโดยตรง ไม่ต้องครอบด้วย proxy:
json{
"type": "no_proxy"
}
สำหรับโปรไฟล์ที่กำลังทำงาน การเปลี่ยนแปลงจะเลื่อนไปใช้เมื่อเริ่มครั้งถัดไป และการตอบกลับมี deferred_fields: ["proxy"]
#คุกกี้
คุกกี้ใช้รูปแบบแบน:
json{
"domain": ".example.com",
"name": "session",
"value": "value",
"path": "/",
"expires": 1790000000,
"http_only": true,
"secure": true,
"same_site": "lax"
}
expires คือเวลา Unix หน่วยวินาที; 0 หรือ null หมายถึงคุกกี้เซสชัน same_site ยอมรับ unspecified, no_restriction, lax หรือ strict
#GET /profile/:id/cookies
อ่านฐานข้อมูล Chromium SQLite ภายในเครื่องก่อน และใช้คุกกี้ที่เก็บบนคลาวด์แทนหากฐานข้อมูลไม่พร้อมใช้งาน
#POST /profile/:id/cookies/import
json{
"clear": true,
"cookies": [
{
"domain": ".example.com",
"name": "session",
"value": "value"
}
]
}
clear=true แทนที่คุกกี้ และเป็นค่าเริ่มต้น;clear=false รวมเข้ากับสำเนาที่มีอยู่บนคลาวด์;- ต้องหยุดโปรไฟล์บนอุปกรณ์ทุกเครื่อง;
- คุกกี้แต่ละรายการที่ยอมรับต้องมีอย่างน้อย
domain และ name
#อุปกรณ์
#GET /device
ส่งคืนรายการแบบแบ่งหน้า:
json{
"device_id": "device-id",
"device_name": "Workstation",
"platform": "windows",
"is_current_device": true,
"online": true,
"last_seen": "2026-07-24T10:00:00Z",
"running_profiles": 1,
"running_profile_ids": ["507f1f77bcf86cd799439011"]
}
#แค็ตตาล็อก
#GET /catalog
ส่งคืนค่าลายนิ้วมือที่อนุญาตและความสัมพันธ์ GPU → CPU/RAM/หน้าจอ ใช้ os=windows|macos|linux เพื่อจำกัดผลลัพธ์ไว้ที่ระบบปฏิบัติการเดียว
แค็ตตาล็อกพึ่งพาคลาวด์ และส่งคืน 1701 เมื่อคลาวด์ไม่พร้อมใช้งาน
#รหัสข้อผิดพลาด
| รหัส | ความหมาย |
|---|
| 0 | สำเร็จ |
| 1001 | JSON ไม่ถูกต้องหรือเนื้อหาคำขอใหญ่เกินไป |
| 1002 | ไม่รู้จักเอนด์พอยต์หรือเมธอด HTTP |
| 1003 | ไม่มีคีย์ API หรือคีย์ไม่ถูกต้อง |
| 1101 | ไม่มีพารามิเตอร์ที่จำเป็น |
| 1103 | ค่าหรือรูปแบบพารามิเตอร์ไม่ถูกต้อง |
| 1201 | ไม่พบโปรไฟล์ |
| 1202 | โปรไฟล์ถูกเก็บถาวรแล้ว |
| 1203 | โปรไฟล์กำลังทำงานบนอุปกรณ์นี้ |
| 1204 | โปรไฟล์กำลังทำงานบนอุปกรณ์อื่น |
| 1301 | เริ่มคอร์เบราว์เซอร์ไม่สำเร็จ |
| 1304 | ไม่มีคอร์เบราว์เซอร์หรือกำลังดาวน์โหลด |
| 1401 | การกำหนดค่าพร็อกซีไม่ถูกต้อง |
| 1402 | การตรวจสอบพร็อกซีล้มเหลว |
| 1501 | ไม่พบโฟลเดอร์ |
| 1503 | ไม่สามารถลบโฟลเดอร์ระบบ |
| 1601 | รูปแบบคุกกี้ไม่ถูกต้อง |
| 1602 | ไม่สามารถนำเข้าคุกกี้ในโปรไฟล์ที่กำลังทำงาน |
| 1701 | คลาวด์ไม่พร้อมใช้งาน |
| 1901 | ข้อผิดพลาดภายใน |
#ตัวอย่าง JavaScript ขั้นต่ำ
jsconst baseUrl = "http://127.0.0.1:50325/api/v1";
const token = process.env.AURORIUM_API_KEY;
async function aurorium(path, options = {}) {
const response = await fetch(`${baseUrl}${path}`, {
...options,
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
...options.headers,
},
});
const result = await response.json();
if (result.code !== 0) {
throw new Error(`[${result.code}] ${result.msg}; ${result.request_id}`);
}
return result.data;
}
const profiles = await aurorium("/profile?page_size=10");
console.log(profiles.list);
#ความเข้ากันได้
- เวอร์ชัน API อยู่ใน URL:
/api/v1 - รหัสข้อผิดพลาดแบบตัวเลขคงที่ภายใน API เวอร์ชันหลักเดียวกัน
- ไคลเอนต์ควรมองข้ามฟิลด์ที่ไม่รู้จัก เพราะอาจมีการเพิ่มฟิลด์ตอบกลับที่ไม่บังคับโดยไม่ทำลายความเข้ากันได้
- การเปลี่ยนแปลงที่ไม่เข้ากันกับรุ่นเดิมต้องใช้ URL เวอร์ชันหลักใหม่ เช่น
/api/v2 หรือมีช่วงย้ายระบบที่ตกลงไว้อย่างชัดเจน