Ações em massa úteis com a API do Octo Browser
24/03/2026


Alex Phillips
Customer Service Specialist
API (Application Programming Interface) é uma interface que permite que vários aplicativos interajam entre si. No caso do Octo Browser, a API permite que você envie solicitações HTTP para os servidores da Octo e automatize o gerenciamento de perfis de navegador.
Anteriormente, explicamos em detalhes o que é uma API, cobrimos maneiras de executar scripts e explicamos a estrutura das requisições. Agora, vamos apresentar vários exemplos úteis que são os mais procurados entre nossos usuários. Depois de ler este artigo, você aprenderá como recuperar e salvar nomes de perfis, adicionar extensões em massa, páginas iniciais e favoritos aos perfis criados, e exportar dados de perfil para uma planilha. Abaixo você encontrará instruções detalhadas e código pronto para uso.
Índice
Preparação
Baixe e instale o VS Code.
Baixe e instale o Node.js.
Crie uma pasta em um local conveniente e nomeie-a, por exemplo, octo_api.
Abra esta pasta no VS Code.
Crie um arquivo com extensão .js. É melhor nomeá-lo de acordo com a ação que o código executará para evitar confusão: por exemplo, get_titles.js.
Abra o terminal e execute o comando npm install axios para instalar uma dependência para o Node.js.
Se o VS Code mostrar um erro, abra o Windows PowerShell como administrador, insira o comando Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned e confirme. Em seguida, repita a etapa anterior.
Inicie o Octo Browser.
Onde encontrar seu token API
Para interagir com o Octo Browser via API, você precisará de um token API. Ele está disponível para usuários com uma assinatura Base ou superior. O token API é exibido no Octo Browser nas configurações da conta mestre sob a aba “Adicional” (outros membros da equipe não podem ver o token API).

Limites da API (limites de taxa)
Lembre-se que a API do Octo Browser possui limites de solicitações. Os snippets fornecidos usam a função check_limits, que verifica os cabeçalhos de limite de taxa da API e pausa automaticamente se o número de solicitações restantes for baixo. Isso ajuda a evitar erros 429 Too Many Requests.
Ao fazer solicitações para a API Pública, 1 RPM e 1 RPH são consumidos por solicitação. Ao usar a API Local, RPM/RPH não são consumidos, exceto para POST Start Profile (1 RPM e 1 RPH) e POST One-time profile (4 RPM e 4 RPH).
O número exato de perfis que você pode iniciar, criar e excluir sob uma assinatura específica depende totalmente de seus scripts e sua lógica. Você pode calcular independentemente o número necessário de solicitações para seu fluxo de trabalho com base nas solicitações que afetam os limites de RPH e RPM.
Algumas solicitações de API podem requerer processamento mais complexo, o que significa que sua execução pode custar mais do que uma solicitação única. Isso é necessário para balancear a carga do servidor e garantir o desempenho ideal para todos os usuários.
RPM significa solicitações por minuto.
RPH significa solicitações por hora.
Os valores dos limites de solicitação dependem da sua assinatura.
Com a configuração concluída, vamos passar para snippets úteis.
Recuperando nomes de perfis e salvando em um arquivo .txt
Este snippet é útil quando você precisa coletar rapidamente uma lista de todos os perfis criados em um só lugar. Ele ajuda a simplificar o rastreamento de perfis, verificar sua existência real e realizar mais ações com eles.
Crie um arquivo get_titles.js na pasta octo_api e cole o código do snippet nele.
Substitua OCTO_API_TOKEN no campo octo_token com seu token API do Octo Browser.

Salve o arquivo.
Insira o comando node get_titles.js no terminal e execute o script.

Os nomes dos perfis serão salvos linha por linha no arquivo profiles_titles.txt na mesma pasta do script.
Snippet para salvar nomes de perfis em um arquivo .txt
const fs = require('fs').promises; const axios = require('axios'); //This is the configuration. Specify your Octo API Token here const config = { octo_token: "OCTO_API_TOKEN", // Specify your API token here octo_api_base_url: "https://app.octobrowser.net/api/v2/automation/", } const OCTO_REMOTE_API = axios.create({ baseURL: config.octo_api_base_url, timeout: 10000, headers: { 'X-Octo-Api-Token': config.octo_token, 'Content-Type': "application/json" } }); async function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms * 1000)); } async function check_limits(response) { function parse_int_safe(value) { const parsed = parseInt(value, 10); return isNaN(parsed) ? 0 : parsed; } const ratelimit_header = response.headers.ratelimit; if (!ratelimit_header) { console.warn('No ratelimit header found!'); return; } const limit_entries = ratelimit_header.split(',').map(entry => entry.trim()); for (const entry of limit_entries) { const name_match = entry.match(/^([^;]+)/); const r_match = entry.match(/;r=(\d+)/); const t_match = entry.match(/;t=(\d+)/); if (!r_match || !t_match) { console.warn(`Invalid ratelimit format: ${entry}`); continue; } const limit_name = name_match ? name_match[1] : 'unknown_limit'; const remaining_quantity = parse_int_safe(r_match[1]); const window_seconds = parse_int_safe(t_match[1]); if (remaining_quantity < 5) { const wait_time = window_seconds + 1; console.log(`Waiting ${wait_time} seconds due to ${limit_name} limit`); await sleep(wait_time); } } } async function get_total_pages() { const response = await OCTO_REMOTE_API.get('/profiles?page=0&page_len=10'); const total_profiles = response.data.total_count; const total_pages = Math.ceil(response.data.total_count / 100); console.log(`Total Profiles: ${total_profiles}\nTotal Pages: ${total_pages}`); await check_limits(response); return total_pages; } async function get_all_profiles_titles(total_pages) { let profiles = []; for (let i = 0; i < total_pages; i++) { let response = await OCTO_REMOTE_API.get(`/profiles?page=${i}&page_len=100&fields=title`); await check_limits(response); profiles.push(...response.data.data); } return profiles; } async function write_file(profiles) { const titles = profiles.map(item => item.title).filter(Boolean); try { await fs.writeFile('./profiles_titles.txt', titles.join('\n'), 'utf-8'); } catch (error) { console.error(`ERROR: While trying writing the file some error occured:\n${error}`); } } (async () => { const total_pages = await get_total_pages(); const profiles = await get_all_profiles_titles(total_pages); await write_file(profiles); console.log('Finished. Check profiles_titles.txt file...'); })()
const fs = require('fs').promises; const axios = require('axios'); //This is the configuration. Specify your Octo API Token here const config = { octo_token: "OCTO_API_TOKEN", // Specify your API token here octo_api_base_url: "https://app.octobrowser.net/api/v2/automation/", } const OCTO_REMOTE_API = axios.create({ baseURL: config.octo_api_base_url, timeout: 10000, headers: { 'X-Octo-Api-Token': config.octo_token, 'Content-Type': "application/json" } }); async function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms * 1000)); } async function check_limits(response) { function parse_int_safe(value) { const parsed = parseInt(value, 10); return isNaN(parsed) ? 0 : parsed; } const ratelimit_header = response.headers.ratelimit; if (!ratelimit_header) { console.warn('No ratelimit header found!'); return; } const limit_entries = ratelimit_header.split(',').map(entry => entry.trim()); for (const entry of limit_entries) { const name_match = entry.match(/^([^;]+)/); const r_match = entry.match(/;r=(\d+)/); const t_match = entry.match(/;t=(\d+)/); if (!r_match || !t_match) { console.warn(`Invalid ratelimit format: ${entry}`); continue; } const limit_name = name_match ? name_match[1] : 'unknown_limit'; const remaining_quantity = parse_int_safe(r_match[1]); const window_seconds = parse_int_safe(t_match[1]); if (remaining_quantity < 5) { const wait_time = window_seconds + 1; console.log(`Waiting ${wait_time} seconds due to ${limit_name} limit`); await sleep(wait_time); } } } async function get_total_pages() { const response = await OCTO_REMOTE_API.get('/profiles?page=0&page_len=10'); const total_profiles = response.data.total_count; const total_pages = Math.ceil(response.data.total_count / 100); console.log(`Total Profiles: ${total_profiles}\nTotal Pages: ${total_pages}`); await check_limits(response); return total_pages; } async function get_all_profiles_titles(total_pages) { let profiles = []; for (let i = 0; i < total_pages; i++) { let response = await OCTO_REMOTE_API.get(`/profiles?page=${i}&page_len=100&fields=title`); await check_limits(response); profiles.push(...response.data.data); } return profiles; } async function write_file(profiles) { const titles = profiles.map(item => item.title).filter(Boolean); try { await fs.writeFile('./profiles_titles.txt', titles.join('\n'), 'utf-8'); } catch (error) { console.error(`ERROR: While trying writing the file some error occured:\n${error}`); } } (async () => { const total_pages = await get_total_pages(); const profiles = await get_all_profiles_titles(total_pages); await write_file(profiles); console.log('Finished. Check profiles_titles.txt file...'); })()
Preparação
Baixe e instale o VS Code.
Baixe e instale o Node.js.
Crie uma pasta em um local conveniente e nomeie-a, por exemplo, octo_api.
Abra esta pasta no VS Code.
Crie um arquivo com extensão .js. É melhor nomeá-lo de acordo com a ação que o código executará para evitar confusão: por exemplo, get_titles.js.
Abra o terminal e execute o comando npm install axios para instalar uma dependência para o Node.js.
Se o VS Code mostrar um erro, abra o Windows PowerShell como administrador, insira o comando Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned e confirme. Em seguida, repita a etapa anterior.
Inicie o Octo Browser.
Onde encontrar seu token API
Para interagir com o Octo Browser via API, você precisará de um token API. Ele está disponível para usuários com uma assinatura Base ou superior. O token API é exibido no Octo Browser nas configurações da conta mestre sob a aba “Adicional” (outros membros da equipe não podem ver o token API).

Limites da API (limites de taxa)
Lembre-se que a API do Octo Browser possui limites de solicitações. Os snippets fornecidos usam a função check_limits, que verifica os cabeçalhos de limite de taxa da API e pausa automaticamente se o número de solicitações restantes for baixo. Isso ajuda a evitar erros 429 Too Many Requests.
Ao fazer solicitações para a API Pública, 1 RPM e 1 RPH são consumidos por solicitação. Ao usar a API Local, RPM/RPH não são consumidos, exceto para POST Start Profile (1 RPM e 1 RPH) e POST One-time profile (4 RPM e 4 RPH).
O número exato de perfis que você pode iniciar, criar e excluir sob uma assinatura específica depende totalmente de seus scripts e sua lógica. Você pode calcular independentemente o número necessário de solicitações para seu fluxo de trabalho com base nas solicitações que afetam os limites de RPH e RPM.
Algumas solicitações de API podem requerer processamento mais complexo, o que significa que sua execução pode custar mais do que uma solicitação única. Isso é necessário para balancear a carga do servidor e garantir o desempenho ideal para todos os usuários.
RPM significa solicitações por minuto.
RPH significa solicitações por hora.
Os valores dos limites de solicitação dependem da sua assinatura.
Com a configuração concluída, vamos passar para snippets úteis.
Recuperando nomes de perfis e salvando em um arquivo .txt
Este snippet é útil quando você precisa coletar rapidamente uma lista de todos os perfis criados em um só lugar. Ele ajuda a simplificar o rastreamento de perfis, verificar sua existência real e realizar mais ações com eles.
Crie um arquivo get_titles.js na pasta octo_api e cole o código do snippet nele.
Substitua OCTO_API_TOKEN no campo octo_token com seu token API do Octo Browser.

Salve o arquivo.
Insira o comando node get_titles.js no terminal e execute o script.

Os nomes dos perfis serão salvos linha por linha no arquivo profiles_titles.txt na mesma pasta do script.
Snippet para salvar nomes de perfis em um arquivo .txt
const fs = require('fs').promises; const axios = require('axios'); //This is the configuration. Specify your Octo API Token here const config = { octo_token: "OCTO_API_TOKEN", // Specify your API token here octo_api_base_url: "https://app.octobrowser.net/api/v2/automation/", } const OCTO_REMOTE_API = axios.create({ baseURL: config.octo_api_base_url, timeout: 10000, headers: { 'X-Octo-Api-Token': config.octo_token, 'Content-Type': "application/json" } }); async function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms * 1000)); } async function check_limits(response) { function parse_int_safe(value) { const parsed = parseInt(value, 10); return isNaN(parsed) ? 0 : parsed; } const ratelimit_header = response.headers.ratelimit; if (!ratelimit_header) { console.warn('No ratelimit header found!'); return; } const limit_entries = ratelimit_header.split(',').map(entry => entry.trim()); for (const entry of limit_entries) { const name_match = entry.match(/^([^;]+)/); const r_match = entry.match(/;r=(\d+)/); const t_match = entry.match(/;t=(\d+)/); if (!r_match || !t_match) { console.warn(`Invalid ratelimit format: ${entry}`); continue; } const limit_name = name_match ? name_match[1] : 'unknown_limit'; const remaining_quantity = parse_int_safe(r_match[1]); const window_seconds = parse_int_safe(t_match[1]); if (remaining_quantity < 5) { const wait_time = window_seconds + 1; console.log(`Waiting ${wait_time} seconds due to ${limit_name} limit`); await sleep(wait_time); } } } async function get_total_pages() { const response = await OCTO_REMOTE_API.get('/profiles?page=0&page_len=10'); const total_profiles = response.data.total_count; const total_pages = Math.ceil(response.data.total_count / 100); console.log(`Total Profiles: ${total_profiles}\nTotal Pages: ${total_pages}`); await check_limits(response); return total_pages; } async function get_all_profiles_titles(total_pages) { let profiles = []; for (let i = 0; i < total_pages; i++) { let response = await OCTO_REMOTE_API.get(`/profiles?page=${i}&page_len=100&fields=title`); await check_limits(response); profiles.push(...response.data.data); } return profiles; } async function write_file(profiles) { const titles = profiles.map(item => item.title).filter(Boolean); try { await fs.writeFile('./profiles_titles.txt', titles.join('\n'), 'utf-8'); } catch (error) { console.error(`ERROR: While trying writing the file some error occured:\n${error}`); } } (async () => { const total_pages = await get_total_pages(); const profiles = await get_all_profiles_titles(total_pages); await write_file(profiles); console.log('Finished. Check profiles_titles.txt file...'); })()
Mantenha-se atualizado com as últimas notícias do Octo Browser
Ao clicar no botão, você concorda com a nossa Política de Privacidade.
Mantenha-se atualizado com as últimas notícias do Octo Browser
Ao clicar no botão, você concorda com a nossa Política de Privacidade.
Mantenha-se atualizado com as últimas notícias do Octo Browser
Ao clicar no botão, você concorda com a nossa Política de Privacidade.

Junte-se ao Octo Browser agora mesmo
Ou entre em contato com a equipe de suporte no chat para tirar dúvidas a qualquer momento.

Junte-se ao Octo Browser agora mesmo
Ou entre em contato com a equipe de suporte no chat para tirar dúvidas a qualquer momento.
Junte-se ao Octo Browser agora mesmo
Ou entre em contato com a equipe de suporte no chat para tirar dúvidas a qualquer momento.