API Lokal Aurorium v1

API Lokal memungkinkan skrip yang berjalan di komputer Anda mengelola profil Aurorium, sesi browser, folder, proxy, dan cookie. Server berjalan bersama aplikasi desktop dan hanya tersedia di komputer yang sama.

#Mulai cepat

  1. Jalankan Aurorium dan masuk ke akun Anda.
  2. Buka Otomatisasi → API dan buat kunci API.
  3. Segera simpan kunci: backend hanya menampilkannya sekali.
  4. Kirim kunci bersama setiap permintaan menggunakan Authorization: Bearer <api_key>.
bash
curl "http://127.0.0.1:50325/api/v1/health" \
  -H "Authorization: Bearer $AURORIUM_API_KEY"

URL dasar:

text
http://127.0.0.1:50325/api/v1

Server hanya mendengarkan pada 127.0.0.1, bukan pada antarmuka jaringan eksternal. Port tetap yang digunakan saat ini adalah 50325.

#Format respons

Hasil yang berhasil dan kesalahan aplikasi menggunakan pembungkus respons yang sama:

json
{
  "code": 0,
  "msg": "success",
  "data": {},
  "request_id": "req_0d30b83f3fbb43e6a2e1b255e21d24b8"
}
  • code = 0 berarti berhasil.
  • code != 0 berarti kesalahan aplikasi; memeriksa status HTTP saja tidak cukup.
  • Simpan request_id di log integrasi Anda untuk diagnostik.
  • Server biasanya mengembalikan HTTP 200 bahkan saat terjadi kesalahan aplikasi.
  • Jika badan JSON melebihi 5 MiB, API mengembalikan code: 1001 dan msg: "request body too large".

Contoh kesalahan:

json
{
  "code": 1201,
  "msg": "profile not found",
  "data": null,
  "request_id": "req_7f3ab37ea65048f99ebd0fdbe6f4da63"
}

#Parameter umum

Endpoint daftar menerima:

ParameterDefaultBatas
page1minimum 1
page_size50maksimum 200; nilai yang lebih besar dibatasi menjadi 200

Format data respons daftar:

json
{
  "list": [],
  "page": 1,
  "page_size": 50,
  "total": 0
}

#Ringkasan endpoint

MetodeJalurTujuan
GET/healthKesiapan aplikasi dan koneksi cloud
GET/versionVersi aplikasi dan API
GET/profileDaftar profil yang tidak diarsipkan
POST/profileBuat profil
GET/profile/:idDapatkan detail profil
PATCH/profile/:idPerbarui sebagian profil
DELETE/profile/:idHapus profil
GET/folderDaftar folder
POST/folderBuat folder
PUT/folder/:idGanti nama folder
DELETE/folder/:idHapus folder
GET/browser/statusDapatkan status peluncuran profil
GET/browser/activeDaftar profil yang berjalan
POST/browser/startJalankan profil dengan CDP
POST/browser/stopHentikan profil
POST/browser/stop-allHentikan profil lokal
POST/proxy/checkPeriksa proxy
PUT/profile/:id/proxyGanti proxy profil
GET/profile/:id/cookiesEkspor cookie
POST/profile/:id/cookies/importImpor cookie
GET/deviceDaftar perangkat akun
GET/catalogDapatkan nilai sidik jari yang diizinkan

#Sistem

#GET /health

Mengembalikan kesiapan aplikasi lokal, status koneksi cloud, dan ID perangkat saat ini.

json
{
  "ready": true,
  "cloud_connected": true,
  "device_id": "device-id-or-null"
}

Autentikasi diperlukan bahkan untuk pemeriksaan kesehatan.

#GET /version

json
{
  "app_version": "0.3.1",
  "core_version": null,
  "api_version": "v1"
}

core_version belum diimplementasikan dan selalu mengembalikan null.

#Profil

#GET /profile

Parameter kueri:

ParameterNilaiDeskripsi
folder_idObjectIdFilter berdasarkan folder
namestringCari berdasarkan nama
statusall, running, idleDefault adalah all
page, page_sizeintegerPaginasi

Item daftar:

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"
}

Profil yang diarsipkan tidak dikembalikan. Filter running|idle diterapkan pada klien hanya setelah halaman dimuat, sehingga total dan jumlah item pada halaman mungkin tidak sesuai dengan daftar yang difilter.

#POST /profile

Permintaan minimal:

json
{
  "name": "Automation profile"
}

Kolom yang didukung:

KolomTipeWajibCatatan
namestringyaNama tidak kosong
descriptionstringtidakDefault adalah ""
folder_idstring atau nulltidakMongo ObjectId; null berarti tanpa folder
tagsarraytidakDefault adalah []
osstringtidakwindows, macos, linux
os_versionstringtidakPetunjuk versi OS untuk menghasilkan sidik jari, seperti "11" atau "Tahoe"; lihat /catalog untuk nilai yang disarankan
is_armbooleantidakPetunjuk ARM; disimpulkan dari vendor GPU jika tidak diberikan
proxyobjecttidakProxy langsung dalam format di bawah
proxy_idstringtidakReferensi proxy yang ada; proxy diutamakan
launch_argumentsstringtidakArgumen peluncuran sebagai satu string
start_pagestringtidakHalaman awal
fingerprintobjecttidakPenggantian sebagian nilai sidik jari

Contoh dengan proxy:

json
{
  "name": "Profile with proxy",
  "os": "windows",
  "proxy": {
    "type": "socks5",
    "host": "127.0.0.1",
    "port": 1080,
    "user": "login",
    "password": "secret"
  }
}

Pembuatan profil berlangsung secara asinkron di backend. API Lokal menunggu peristiwa penyelesaian dan biasanya mengembalikan model profil lengkap. Jika pembacaan lanjutan gagal, hanya profile_id yang mungkin dikembalikan.

#GET /profile/:id

Mengembalikan item daftar dengan objek proxy dan fingerprint tambahan. Kata sandi proxy tidak pernah dikembalikan sebagai teks biasa; jika ada, kata sandi diganti dengan ******.

#PATCH /profile/:id

Memperbarui sebagian profil:

json
{
  "name": "New name",
  "description": "Updated through API",
  "folder_id": null,
  "fingerprint": {
    "timezone_mode": "manual",
    "timezone": "Europe/Moscow"
  }
}

Badan kosong berhasil tanpa melakukan perubahan. Metadata langsung diterapkan. Perubahan sidik jari langsung diterapkan saat profil dihentikan; untuk profil yang berjalan, perubahan ditunda hingga peluncuran berikutnya dan dicantumkan dalam deferred_fields.

json
{
  "profile_id": "507f1f77bcf86cd799439011",
  "deferred_fields": ["fingerprint.timezone_mode", "fingerprint.timezone"]
}

Untuk profil yang dihentikan, deferred_fields selalu kosong.

#DELETE /profile/:id

Kueri force=true menghentikan profil yang berjalan di perangkat saat ini sebelum penghapusan. Tanpa force, profil seperti itu mengembalikan 1203.

json
{
  "profile_id": "507f1f77bcf86cd799439011",
  "deleted": true
}

Penghapusan bersifat idempoten untuk ObjectId yang valid secara sintaksis: respons “tidak ditemukan” dari backend saat ini dianggap sebagai profil yang sudah dihapus.

#Sidik jari

Objek fingerprint dalam POST dan PATCH mendukung pembaruan sebagian pada kolom berikut:

KolomTipe atau nilai
timezone_modeauto, manual
timezonestring atau null
language_modeauto, manual
languagesstring[]; item pertama digunakan
languagestring; alternatif singkat
screen_resolutionstring
webrtc_modereal, replace
canvas_noiseboolean
webgl_image_noiseboolean
webgl_vendorstring atau null
webgl_rendererstring atau null
audio_noiseboolean
client_rects_noiseboolean
hardware_concurrencynumber
device_memorynumber
do_not_trackdefault, true
os_versionstring
dns_modereal, manual
dns_serverstring atau null
geolocation{mode, latitude, longitude, accuracy}
media_devices{audio_inputs, audio_outputs, video_inputs}

Gunakan /catalog untuk mendapatkan nilai OS, GPU, CPU, RAM, layar, zona waktu, dan bahasa yang kompatibel.

#Folder

#GET /folder

Mendukung name, page, dan 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

Profil tidak dihapus bersama folder. Backend memindahkan profil tim ke folder sistem dan profil pribadi ke status tanpa folder.

json
{
  "folder_id": "507f1f77bcf86cd799439012",
  "deleted": true,
  "moved_profiles": 3,
  "moved_to": null
}

moved_profiles dan moved_to dihitung sebelum penghapusan sejauh memungkinkan dan mungkin tidak akurat jika status cloud tidak dapat dibaca.

#Siklus hidup browser

#GET /browser/status?profile_id=:id

Mengembalikan idle atau running, perangkat peluncuran, dan koordinat proses yang tersedia secara lokal.

#GET /browser/active

Kueri scope menerima:

  • this_device — profil yang berjalan secara lokal; nilai default;
  • account — profil yang berjalan di semua perangkat akun menurut registri cloud.

Paginasi standar didukung.

#POST /browser/start

json
{
  "profile_id": "507f1f77bcf86cd799439011",
  "headless": false,
  "open_urls": ["https://example.com"],
  "launch_args": ["--window-size=1280,800"],
  "load_extensions": true
}

Respons berhasil:

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
  }
}

Menjalankan kembali profil di perangkat saat ini bersifat idempoten. Profil yang berjalan di perangkat lain mengembalikan 1204. Jika inti browser yang diperlukan tidak ada atau sedang diunduh, API Lokal mengembalikan 1304; metode ini tidak mengunduhnya secara otomatis.

#POST /browser/stop

json
{ "profile_id": "507f1f77bcf86cd799439011" }

Penghentian bersifat idempoten dan mengembalikan was_running.

#POST /browser/stop-all

Menghentikan setiap profil di perangkat saat ini:

json
{
  "stopped": ["507f1f77bcf86cd799439011"],
  "count": 1
}

#Proxy

Format proxy langsung:

KolomTipeCatatan
typestringhttp, socks4, socks5, ssh, no_proxy
hoststringWajib kecuali untuk no_proxy
portinteger/string1..65535, kecuali untuk no_proxy
userstringOpsional
passwordstringOpsional
refresh_urlstringOpsional

#POST /proxy/check

Berikan tepat satu sumber: proxy atau 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

Badan permintaan adalah objek proxy itu sendiri, tanpa pembungkus proxy:

json
{
  "type": "no_proxy"
}

Untuk profil yang berjalan, perubahan ditunda hingga peluncuran berikutnya dan respons memuat deferred_fields: ["proxy"].

#Cookie

Cookie menggunakan format datar:

json
{
  "domain": ".example.com",
  "name": "session",
  "value": "value",
  "path": "/",
  "expires": 1790000000,
  "http_only": true,
  "secure": true,
  "same_site": "lax"
}

expires adalah waktu Unix dalam detik; 0 atau null berarti cookie sesi. same_site menerima unspecified, no_restriction, lax, atau strict.

#GET /profile/:id/cookies

Membaca database SQLite Chromium lokal terlebih dahulu dan menggunakan cookie yang disimpan di cloud jika database tidak tersedia.

#POST /profile/:id/cookies/import

json
{
  "clear": true,
  "cookies": [
    {
      "domain": ".example.com",
      "name": "session",
      "value": "value"
    }
  ]
}
  • clear=true menggantikan cookie dan merupakan default;
  • clear=false menggabungkannya dengan salinan cloud yang ada;
  • profil harus dihentikan di setiap perangkat;
  • setiap cookie yang diterima harus memuat setidaknya domain dan name.

#Perangkat

#GET /device

Mengembalikan daftar dengan paginasi:

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"]
}

#Katalog

#GET /catalog

Mengembalikan nilai sidik jari yang diizinkan dan dependensi GPU → CPU/RAM/layar. Gunakan os=windows|macos|linux untuk membatasi hasil ke satu sistem operasi.

Katalog bergantung pada cloud dan mengembalikan 1701 ketika cloud tidak tersedia.

#Kode kesalahan

KodeArti
0Berhasil
1001JSON tidak valid atau badan permintaan terlalu besar
1002Endpoint atau metode HTTP tidak dikenal
1003Kunci API tidak ada atau tidak valid
1101Parameter wajib tidak ada
1103Nilai atau format parameter tidak valid
1201Profil tidak ditemukan
1202Profil diarsipkan
1203Profil berjalan di perangkat ini
1204Profil berjalan di perangkat lain
1301Inti browser gagal dimulai
1304Inti browser tidak ada atau sedang diunduh
1401Konfigurasi proxy tidak valid
1402Pemeriksaan proxy gagal
1501Folder tidak ditemukan
1503Folder sistem tidak dapat dihapus
1601Format cookie tidak valid
1602Cookie tidak dapat diimpor ke profil yang berjalan
1701Cloud tidak tersedia
1901Kesalahan internal

#Contoh JavaScript minimal

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);

#Kompatibilitas

  • Versi API tercantum dalam URL: /api/v1.
  • Kode kesalahan numerik stabil dalam satu versi mayor API.
  • Klien sebaiknya mengabaikan kolom yang tidak dikenal karena kolom respons opsional dapat ditambahkan tanpa merusak kompatibilitas.
  • Perubahan yang merusak kompatibilitas memerlukan URL mayor baru seperti /api/v2, atau masa migrasi yang disepakati secara eksplisit.