API ภายในเครื่อง Aurorium v1

API ภายในเครื่องช่วยให้สคริปต์ที่ทำงานบนคอมพิวเตอร์ของคุณจัดการโปรไฟล์ Aurorium เซสชันเบราว์เซอร์ โฟลเดอร์ พร็อกซี และคุกกี้ได้ เซิร์ฟเวอร์เริ่มทำงานพร้อมแอปเดสก์ท็อปและเข้าถึงได้จากคอมพิวเตอร์เครื่องเดียวกันเท่านั้น

#เริ่มต้นอย่างรวดเร็ว

  1. เปิด Aurorium และเข้าสู่ระบบบัญชีของคุณ
  2. เปิด ระบบอัตโนมัติ → API และสร้างคีย์ API
  3. บันทึกคีย์ทันที เพราะแบ็กเอนด์จะแสดงเพียงครั้งเดียว
  4. ส่งคีย์ไปกับทุกคำขอโดยใช้ Authorization: Bearer <api_key>
bash
curl "http://127.0.0.1:50325/api/v1/health" \
  -H "Authorization: Bearer $AURORIUM_API_KEY"

URL ฐาน:

text
http://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"
}

#พารามิเตอร์ร่วม

เอนด์พอยต์รายการยอมรับพารามิเตอร์ต่อไปนี้:

พารามิเตอร์ค่าเริ่มต้นขีดจำกัด
page1ขั้นต่ำ 1
page_size50สูงสุด 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_idObjectIdกรองตามโฟลเดอร์
nameสตริงค้นหาตามชื่อ
statusall, 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_modeauto, manual
timezoneสตริงหรือ null
language_modeauto, manual
languagesอาร์เรย์สตริง ใช้รายการแรก
languageสตริง ใช้เป็นรูปแบบย่อแทนได้
screen_resolutionสตริง
webrtc_modereal, replace
canvas_noiseบูลีน
webgl_image_noiseบูลีน
webgl_vendorสตริงหรือ null
webgl_rendererสตริงหรือ null
audio_noiseบูลีน
client_rects_noiseบูลีน
hardware_concurrencyตัวเลข
device_memoryตัวเลข
do_not_trackdefault, true
os_versionสตริง
dns_modereal, 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

json
{ "name": "QA" }

#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สำเร็จ
1001JSON ไม่ถูกต้องหรือเนื้อหาคำขอใหญ่เกินไป
1002ไม่รู้จักเอนด์พอยต์หรือเมธอด HTTP
1003ไม่มีคีย์ API หรือคีย์ไม่ถูกต้อง
1101ไม่มีพารามิเตอร์ที่จำเป็น
1103ค่าหรือรูปแบบพารามิเตอร์ไม่ถูกต้อง
1201ไม่พบโปรไฟล์
1202โปรไฟล์ถูกเก็บถาวรแล้ว
1203โปรไฟล์กำลังทำงานบนอุปกรณ์นี้
1204โปรไฟล์กำลังทำงานบนอุปกรณ์อื่น
1301เริ่มคอร์เบราว์เซอร์ไม่สำเร็จ
1304ไม่มีคอร์เบราว์เซอร์หรือกำลังดาวน์โหลด
1401การกำหนดค่าพร็อกซีไม่ถูกต้อง
1402การตรวจสอบพร็อกซีล้มเหลว
1501ไม่พบโฟลเดอร์
1503ไม่สามารถลบโฟลเดอร์ระบบ
1601รูปแบบคุกกี้ไม่ถูกต้อง
1602ไม่สามารถนำเข้าคุกกี้ในโปรไฟล์ที่กำลังทำงาน
1701คลาวด์ไม่พร้อมใช้งาน
1901ข้อผิดพลาดภายใน

#ตัวอย่าง JavaScript ขั้นต่ำ

js
const 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 หรือมีช่วงย้ายระบบที่ตกลงไว้อย่างชัดเจน