A Browser API entrega sessões de navegador headless (Chromium) rodando na infraestrutura da Veloz, com stealth garantido em toda sessão, prontas para você controlar via Playwright com chromium.connectOverCDP(...). Use para automação, scraping, testes end-to-end, geração de PDFs/screenshots ou qualquer fluxo que precise de um navegador real e isolado, sem manter Chromium na sua própria infraestrutura.
Você cria uma sessão, recebe uma connectUrl (um endpoint CDP sobre WebSocket) e conecta com o seu próprio playwright/playwright-core. A Veloz cuida do provisionamento, do isolamento e do encerramento.
Nota: a Browser API está em early access (acesso antecipado) e é liberada por organização. Se a seção Sessões de navegador ainda não aparece no seu dashboard, solicite acesso antecipado para habilitá-la na sua conta.
Chaves de API
Toda chamada usa uma chave bk_live_* no cabeçalho Authorization:
Authorization: Bearer bk_live_sua_chave
Gere e revogue chaves na seção Sessões de navegador → Chaves de API do dashboard. A chave é vinculada à sua organização e concede acesso para criar e controlar sessões.
Segurança: a chave é exibida uma única vez na criação. Copie nesse momento, trate como senha, defina em variável de ambiente (
VELOZ_BROWSER_TOKEN) e nunca commite no Git.
SDK @onveloz/browser
A forma recomendada de integrar a partir de Node. O SDK não embute o Playwright — ele entrega a connectUrl e você conecta com o seu próprio cliente.
npm install @onveloz/browser playwright-coreDefina o token no ambiente:
VELOZ_BROWSER_TOKEN=bk_live_sua_chave
Conectar para acordar (uma linha)
Nenhuma sessão é criada de antemão: um navegador quente é provisionado quando você abre o socket CDP e encerrado quando você desconecta. O limite de simultaneidade é checado no momento da conexão.
import { Onveloz } from "@onveloz/browser";
import { chromium } from "playwright-core";
const ov = new Onveloz(); // lê VELOZ_BROWSER_TOKEN do ambiente
const browser = await chromium.connectOverCDP(await ov.connect());
const page = await browser.contexts()[0].newPage();
await page.goto("https://exemplo.com");
console.log(await page.title());
await browser.close(); // ao desconectar, o navegador é encerradoSessão explícita
Quando você precisa do ciclo de vida na mão (criar agora, conectar depois, listar, encerrar):
import { Onveloz } from "@onveloz/browser";
import { chromium } from "playwright-core";
const ov = new Onveloz();
// O provisionamento roda fora da requisição, então a sessão nasce PENDING.
const session = await ov.sessions.create();
// Aguarda ficar RUNNING com connectUrl disponível (polling interno).
const ready = await ov.sessions.waitUntilReady(session.id);
const browser = await chromium.connectOverCDP(ready.connectUrl!);
const page = await browser.contexts()[0].newPage();
await page.goto("https://exemplo.com");
await browser.close();
await ov.sessions.close(session.id);Métodos disponíveis no namespace ov.sessions:
| Método | Descrição |
|---|---|
create(config?) |
Cria uma sessão (nasce PENDING, connectUrl: null) |
get(id) |
Busca uma sessão e seu connectUrl quando RUNNING |
list({ activeOnly? }) |
Lista as sessões da organização |
close(id) |
Encerra uma sessão |
waitUntilReady(id, opts?) |
Faz polling até RUNNING ou lança em estado terminal/timeout |
E no cliente ov:
| Método | Descrição |
|---|---|
connect(config?) |
Gera uma connectUrl de conectar-para-acordar (sem criar sessão) |
token(config?) |
Alias de connect() |
Para apontar a um ambiente alternativo, passe { apiUrl } ou defina VELOZ_BROWSER_API.
API REST
Para linguagens fora de Node, fale direto com a API. Base: https://platform.onveloz.com/api/browser. Todas as chamadas exigem o cabeçalho Authorization: Bearer bk_live_*.
| Método e rota | Descrição |
|---|---|
POST /v1/sessions |
Cria uma sessão (provisionamento roda em segundo plano) |
GET /v1/sessions |
Lista as sessões da organização (?activeOnly=true) |
GET /v1/sessions/:id |
Busca uma sessão e seu connectUrl |
DELETE /v1/sessions/:id |
Encerra uma sessão |
POST /v1/connect-token |
Gera uma connectUrl de conectar-para-acordar |
Criar e conectar
# 1) Cria a sessão — nasce PENDING.
curl -X POST https://platform.onveloz.com/api/browser/v1/sessions \
-H "Authorization: Bearer bk_live_sua_chave" \
-H "Content-Type: application/json" \
-d '{ "timeoutSec": 300 }'
# → { "id": "...", "status": "PENDING", "connectUrl": null, "expiresAt": "..." }
# 2) Faça polling até connectUrl aparecer (sessão RUNNING).
curl https://platform.onveloz.com/api/browser/v1/sessions/SESSION_ID \
-H "Authorization: Bearer bk_live_sua_chave"
# → { ..., "status": "RUNNING", "connectUrl": "wss://.../v1/connect?token=..." }Depois, conecte ao connectUrl com qualquer cliente CDP (Playwright, Puppeteer, ou o protocolo cru).
Estados da sessão
| Status | Descrição |
|---|---|
PENDING |
Provisionando — ainda sem connectUrl |
RUNNING |
Pronta — connectUrl disponível para conectar |
RELEASED |
Encerrada (por você ou por inatividade) |
EXPIRED |
Atingiu o TTL e foi encerrada |
FAILED |
Falhou ao provisionar |
Stealth
Toda sessão já roda com as proteções anti-detecção ativas — fingerprint coerente, WebGL via stack de GPU real e supressão de vazamentos do protocolo. O stealth é garantido e não configurável: não há nada para ligar, e não é possível desligar.
Use o seu próprio proxy
Por padrão o egresso é direto. Para sair por um proxy, traga o seu: informe o gateway em proxyServer (e credenciais, se houver). O proxyCountry mantém o fingerprint de stealth coerente com a geo de saída do seu proxy.
const session = await ov.sessions.create({
proxyServer: "http://gateway.seu-proxy.com:8080", // http, https ou socks5
proxyUsername: "usuario", // opcional (omita para proxy autorizado por IP)
proxyPassword: "senha", // opcional
proxyCountry: "US", // opcional — país de saída do seu proxy
});As credenciais são criptografadas em repouso e nunca retornadas nas respostas da API. O proxy próprio é aceito apenas em create() (não em conectar-para-acordar).
Configuração da sessão
Os campos abaixo valem tanto em ov.sessions.create() / ov.connect() quanto no corpo JSON da API REST. O stealth é sempre garantido (não é um campo).
| Campo | Tipo | Descrição |
|---|---|---|
proxyServer |
string | Seu gateway de proxy (scheme://host:porta — http, https ou socks5). Só em create(). |
proxyUsername |
string | Usuário do seu proxy (opcional — omita para proxy autorizado por IP) |
proxyPassword |
string | Senha do seu proxy (opcional). Criptografada em repouso; nunca retornada |
proxyCountry |
string | País de saída do seu proxy (ISO de 2 letras, ex: "US") — alinha o fingerprint |
region |
string | Região de provisionamento (servidor escolhe o padrão) |
timeoutSec |
number | TTL máximo da sessão em segundos (limitado ao teto do seu plano) |
Visualização ao vivo
No dashboard, abra uma sessão para ver o console Sessão ao vivo: a tela do navegador transmitida em tempo real enquanto a sessão roda — útil para acompanhar automações e depurar. A mesma transmissão é o screencast CDP padrão (Page.startScreencast), então você também pode consumi-la a partir do seu próprio cliente CDP.
Limites
As cotas dependem do seu plano:
| Plano | Sessões simultâneas | TTL padrão | TTL máximo |
|---|---|---|---|
| Padrão | 2 | 60s | 300s (5min) |
| SCALE | 10 | 300s | 900s (15min) |
Estourar o limite de sessões simultâneas retorna 429 (no SDK, BrowserQuotaError). Precisa de cotas maiores? Fale com o suporte.
Boas práticas
Importante: conecte assim que a
connectUrlaparecer. Uma sessãoRUNNINGsem nenhum cliente CDP conectado é liberada por inatividade em poucos segundos. Crie e conecte no mesmo processo — não busque aconnectUrlem um passo e conecte em outro muito depois.
- Encerre o que você abre. Chame
close()(ouDELETE) ao terminar para liberar a cota; não dependa só do TTL. - Use conectar-para-acordar para tarefas curtas. É o caminho mais simples: uma
connectUrl, conecta, trabalha, desconecta. - Use
timeoutSecpara tarefas longas. Suba o TTL até o teto do seu plano quando a automação leva mais que o padrão. - Trate
429com backoff. Ao bater no limite de simultaneidade, aguarde uma sessão liberar antes de tentar de novo.
Próximos passos
- Variáveis de Ambiente, para guardar
VELOZ_BROWSER_TOKENcom segurança - Segurança, boas práticas de chaves e segredos