API local do Aurorium v1

A API local permite que scripts executados no seu computador gerenciem perfis do Aurorium, sessões do navegador, pastas, proxies e cookies. O servidor inicia com o aplicativo para desktop e fica disponível somente no mesmo computador.

#Início rápido

  1. Inicie o Aurorium e entre na sua conta.
  2. Abra Automação → API e gere uma chave de API.
  3. Salve a chave imediatamente: o backend a exibe apenas uma vez.
  4. Envie a chave em cada requisição usando Authorization: Bearer <api_key>.
bash
curl "http://127.0.0.1:50325/api/v1/health" \
  -H "Authorization: Bearer $AURORIUM_API_KEY"

URL base:

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

O servidor escuta apenas em 127.0.0.1, e não em uma interface de rede externa. A porta fixa atual é 50325.

#Formato de resposta

Resultados bem-sucedidos e erros da aplicação usam a mesma estrutura de resposta:

json
{
  "code": 0,
  "msg": "success",
  "data": {},
  "request_id": "req_0d30b83f3fbb43e6a2e1b255e21d24b8"
}
  • code = 0 significa sucesso.
  • code != 0 significa um erro da aplicação; verificar apenas o status HTTP não é suficiente.
  • Armazene request_id nos logs da sua integração para diagnóstico.
  • O servidor normalmente retorna HTTP 200 mesmo em caso de erro da aplicação.
  • Se o corpo JSON exceder 5 MiB, a API retornará code: 1001 e msg: "request body too large".

Exemplo de erro:

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

#Parâmetros comuns

Os endpoints de listagem aceitam:

ParâmetroPadrãoLimite
page1mínimo 1
page_size50máximo 200; valores maiores são limitados a 200

Formato de data na resposta de listagem:

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

#Visão geral dos endpoints

MétodoCaminhoFinalidade
GET/healthDisponibilidade da aplicação e da conexão com a nuvem
GET/versionVersões da aplicação e da API
GET/profileListar perfis não arquivados
POST/profileCriar um perfil
GET/profile/:idObter detalhes do perfil
PATCH/profile/:idAtualizar parcialmente um perfil
DELETE/profile/:idExcluir um perfil
GET/folderListar pastas
POST/folderCriar uma pasta
PUT/folder/:idRenomear uma pasta
DELETE/folder/:idExcluir uma pasta
GET/browser/statusObter o status de inicialização do perfil
GET/browser/activeListar perfis em execução
POST/browser/startIniciar um perfil com CDP
POST/browser/stopParar um perfil
POST/browser/stop-allParar perfis locais
POST/proxy/checkVerificar um proxy
PUT/profile/:id/proxySubstituir o proxy de um perfil
GET/profile/:id/cookiesExportar cookies
POST/profile/:id/cookies/importImportar cookies
GET/deviceListar dispositivos da conta
GET/catalogObter valores de impressão digital permitidos

#Sistema

#GET /health

Retorna a disponibilidade da aplicação local, o estado da conexão com a nuvem e o ID do dispositivo atual.

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

A autenticação é obrigatória mesmo na verificação de integridade.

#GET /version

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

core_version ainda não está implementado e sempre retorna null.

#Perfis

#GET /profile

Parâmetros de consulta:

ParâmetroValoresDescrição
folder_idObjectIdFiltrar por pasta
namestringPesquisar por nome
statusall, running, idleO padrão é all
page, page_sizeintegerPaginação

Item da lista:

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

Perfis arquivados não são retornados. O filtro running|idle é aplicado no cliente somente após o carregamento da página, portanto total e a quantidade de itens na página podem não corresponder à lista filtrada.

#POST /profile

Requisição mínima:

json
{
  "name": "Automation profile"
}

Campos compatíveis:

CampoTipoObrigatórioObservações
namestringsimNome não vazio
descriptionstringnãoO padrão é ""
folder_idstring ou nullnãoMongo ObjectId; null significa sem pasta
tagsarraynãoO padrão é []
osstringnãowindows, macos, linux
os_versionstringnãoIndicação da versão do sistema operacional para gerar a impressão digital, como "11" ou "Tahoe"; consulte /catalog para valores recomendados
is_armbooleannãoIndicação de ARM; inferida a partir do fabricante da GPU quando omitida
proxyobjectnãoProxy incluído no formato abaixo
proxy_idstringnãoReferência a proxy existente; proxy tem precedência
launch_argumentsstringnãoArgumentos de inicialização em uma única string
start_pagestringnãoPágina inicial
fingerprintobjectnãoSubstituições parciais da impressão digital

Exemplo com proxy:

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

A criação de perfis é assíncrona no backend. A API local aguarda o evento de conclusão e normalmente retorna o modelo completo do perfil. Se a leitura seguinte falhar, poderá retornar apenas profile_id.

#GET /profile/:id

Retorna um item de lista com os objetos adicionais proxy e fingerprint. A senha do proxy nunca é retornada em texto puro; quando presente, é substituída por ******.

#PATCH /profile/:id

Atualiza parcialmente um perfil:

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

Um corpo vazio é uma operação bem-sucedida sem efeito. Os metadados são aplicados imediatamente. As alterações de impressão digital são aplicadas imediatamente quando o perfil está parado; em um perfil em execução, são adiadas até a próxima inicialização e listadas em deferred_fields.

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

Para um perfil parado, deferred_fields está sempre vazio.

#DELETE /profile/:id

A consulta force=true para um perfil em execução no dispositivo atual antes de excluí-lo. Sem force, esse perfil retorna 1203.

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

A exclusão é idempotente para um ObjectId sintaticamente válido: uma resposta “não encontrado” do backend é atualmente tratada como um perfil já excluído.

#Impressão digital

O objeto fingerprint em POST e PATCH aceita atualizações parciais destes campos:

CampoTipo ou valores
timezone_modeauto, manual
timezonestring ou null
language_modeauto, manual
languagesstring[]; o primeiro item é usado
languagestring; alternativa abreviada
screen_resolutionstring
webrtc_modereal, replace
canvas_noiseboolean
webgl_image_noiseboolean
webgl_vendorstring ou null
webgl_rendererstring ou null
audio_noiseboolean
client_rects_noiseboolean
hardware_concurrencynúmero
device_memorynúmero
do_not_trackdefault, true
os_versionstring
dns_modereal, manual
dns_serverstring ou null
geolocation{mode, latitude, longitude, accuracy}
media_devices{audio_inputs, audio_outputs, video_inputs}

Use /catalog para obter valores compatíveis de sistema operacional, GPU, CPU, RAM, tela, fuso horário e idioma.

#Pastas

#GET /folder

Aceita name, page e 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

Os perfis não são excluídos com a pasta. O backend move perfis de equipe para a pasta do sistema e deixa os perfis pessoais sem pasta.

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

moved_profiles e moved_to são calculados antes da exclusão com as informações disponíveis e podem ser imprecisos quando não é possível ler o estado da nuvem.

#Ciclo de vida do navegador

#GET /browser/status?profile_id=:id

Retorna idle ou running, o dispositivo de inicialização e as coordenadas do processo disponíveis localmente.

#GET /browser/active

A consulta scope aceita:

  • this_device: perfis em execução localmente; é o padrão;
  • account: perfis em execução em todos os dispositivos da conta, conforme o registro na nuvem.

A paginação padrão é compatível.

#POST /browser/start

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

Resposta bem-sucedida:

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

Iniciar novamente um perfil no dispositivo atual é idempotente. Um perfil em execução em outro dispositivo retorna 1204. Se o núcleo do navegador necessário estiver ausente ou sendo baixado, a API local retornará 1304; este método não o baixa automaticamente.

#POST /browser/stop

json
{ "profile_id": "507f1f77bcf86cd799439011" }

A parada é idempotente e retorna was_running.

#POST /browser/stop-all

Para todos os perfis no dispositivo atual:

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

#Proxy

Formato do proxy incluído:

CampoTipoObservações
typestringhttp, socks4, socks5, ssh, no_proxy
hoststringObrigatório, exceto para no_proxy
portinteger/string1..65535, exceto para no_proxy
userstringOpcional
passwordstringOpcional
refresh_urlstringOpcional

#POST /proxy/check

Forneça exatamente uma origem: proxy ou 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

O corpo é o próprio objeto do proxy, sem um invólucro proxy:

json
{
  "type": "no_proxy"
}

Para um perfil em execução, a alteração é adiada até a próxima inicialização e a resposta contém deferred_fields: ["proxy"].

#Cookies

Um cookie usa um formato plano:

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

expires é o horário Unix em segundos; 0 ou null significa um cookie de sessão. same_site aceita unspecified, no_restriction, lax ou strict.

#GET /profile/:id/cookies

Primeiro lê o banco SQLite local do Chromium e, se ele não estiver disponível, usa os cookies armazenados na nuvem.

#POST /profile/:id/cookies/import

json
{
  "clear": true,
  "cookies": [
    {
      "domain": ".example.com",
      "name": "session",
      "value": "value"
    }
  ]
}
  • clear=true substitui os cookies e é o padrão;
  • clear=false mescla os cookies com a cópia existente na nuvem;
  • o perfil deve estar parado em todos os dispositivos;
  • cada cookie aceito deve incluir pelo menos domain e name.

#Dispositivos

#GET /device

Retorna uma lista paginada:

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

#Catálogo

#GET /catalog

Retorna os valores de impressão digital permitidos e as dependências GPU → CPU/RAM/tela. Use os=windows|macos|linux para limitar o resultado a um sistema operacional.

O catálogo depende da nuvem e retorna 1701 quando ela está indisponível.

#Códigos de erro

CódigoSignificado
0Sucesso
1001JSON inválido ou corpo da requisição muito grande
1002Endpoint ou método HTTP desconhecido
1003Chave de API ausente ou inválida
1101Parâmetro obrigatório ausente
1103Valor ou formato de parâmetro inválido
1201Perfil não encontrado
1202O perfil está arquivado
1203O perfil está em execução neste dispositivo
1204O perfil está em execução em outro dispositivo
1301Falha ao iniciar o núcleo do navegador
1304O núcleo do navegador está ausente ou sendo baixado
1401Configuração de proxy inválida
1402Falha na verificação do proxy
1501Pasta não encontrada
1503Não é possível excluir uma pasta do sistema
1601Formato de cookie inválido
1602Não é possível importar cookies para um perfil em execução
1701A nuvem está indisponível
1901Erro interno

#Exemplo mínimo em 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);

#Compatibilidade

  • A versão da API faz parte da URL: /api/v1.
  • Os códigos numéricos de erro são estáveis dentro de uma versão principal da API.
  • Os clientes devem ignorar campos desconhecidos, pois campos opcionais podem ser adicionados à resposta sem quebrar a compatibilidade.
  • Mudanças incompatíveis exigem uma nova URL de versão principal, como /api/v2, ou um período de migração explicitamente acordado.