Uptime do servidor
--
Desde a última inicialização
ACESSO RESTRITO · FLUXO DE RUA
Use sua conta para continuar.
A senha será protegida com hash e guardada apenas neste servidor. Não reutilize sua senha do Google ou da ONErpm.
Centro de operações / distribuição
Saúde do serviço, sessão de distribuição e atividade dos lançamentos.
Selo conectado: verificando...
Atualizando status...
Uptime do servidor
--
Desde a última inicialização
Memória do processo
--
RSS do serviço Node.js
Lançamentos salvos
0
Rascunhos no banco local
Em atenção
0
Erros que precisam de revisão
API do aplicativo
Rotas locais e banco de dados
Sessão ONErpm
Perfil Chromium persistente
Automação
Aguardando tarefa
Carregando atividade...
Faixas do catálogo ordenadas pela última atualização; não representa dados de reprodução.
Carregando faixas...
Faixas e lançamentos agrupados por selo cadastrado.
Carregando dados dos selos...
Mostra artistas associados a lançamentos que precisam de atenção; não atribui a causa do erro ao artista.
Carregando ocorrências...
Contagem dos erros registrados agrupados pela etapa em que ocorreram.
Carregando problemas...
Cadastro / metadados
Organize os dados antes de preencher o painel de distribuição.
Importe um CSV com uma faixa por linha. Performer e feat têm colunas próprias; áudios e capa são adicionados depois em Editar.
Sessão ONErpm não verificada0 lançamentos
A integração ainda não foi configurada.
O sistema só solicita leitura das mensagens. O JSON OAuth e o token de acesso são guardados no armazenamento local deste computador.
Carregando...
Carregando status...
Com erro
0
Requerem revisão
Aguardando login
0
Sessão ONErpm
Aguardando ação
0
Confirmação ou assets
Atividade registrada
0
Lançamentos com histórico
Carregando logs...
Aguardando conexão com o navegador ONErpm.
As três páginas usam a mesma sessão persistente. A primeira abre para login; as páginas 2 e 3 ficam disponíveis quando a sessão ONErpm está autenticada. Shares do mesmo selo podem rodar em paralelo, um por página; as demais automações continuam em fila, uma por vez, com intervalo mínimo de cinco segundos. A tela é transmitida em tempo real; comandos manuais ficam pausados durante a automação, exceto quando uma confirmação humana é solicitada. Isso não contorna nem garante aprovação pelos controles da ONErpm. Nunca compartilhe esta view; ela pode mostrar dados privados da sua conta.
O ID identifica o lançamento; o nome detectado e o link Grab Smart Link ficam associados no resultado.
O sistema abrirá o lançamento aprovado, capturará o nome, copiará o Grab Smart Link e salvará o resultado localmente.
Carregando links salvos...
Todos os endpoints v1 usam HTTPS e autenticação Bearer. Integre sistema-a-sistema pelo backend; nunca coloque tokens em código frontend, navegador, repositório ou logs.
https://api.fluxoderua.com
Armazenamento local: esta instalação grava metadados no SQLite e áudio/capa em armazenamento local gerenciado pelo app; os arquivos só seguem para a ONErpm depois do comando de automação. O domínio público ainda exige DNS, HTTPS e proxy/túnel direcionados ao servidor que mantém o banco e a sessão ONErpm. Não exponha a porta local diretamente.
Cada token é criado para um usuário/sistema, com permissões mínimas e validade configurável. O segredo completo aparece apenas uma vez; revogue e gere outro se ele for perdido. Chamadas incluem Authorization: Bearer SEU_TOKEN.
Carregando autorizações...
O outro sistema salva os metadados e arquivos como rascunho (visível em Faixas), e a primeira confirmação inicia o preenchimento ONErpm, que para para revisão humana. Também pode solicitar Shares vinculados a faixas do catálogo. Depois que o administrador aprovar a análise, uma segunda rota, com permissão separada, muda para o selo e envia o comando final de distribuição.
GET/api/v1/onerpm/sessionConsulta se o navegador ONErpm está autenticado e o aviso de renovação. O servidor estima a duração em 44 horas a partir do primeiro status autenticado observado; warning fica ativo nas últimas 24 horas e nextReminderAt avança em intervalos de 30 minutos. O prazo é estimado, não garantido. Exige catalog:read.
GET/api/v1/onerpm/queueConsulta a tarefa ONErpm em execução, a fila FIFO, páginas do navegador e o intervalo mínimo de cinco segundos entre tarefas. Exige catalog:read.
POST/api/v1/sharesSolicita um Share e o coloca na fila ONErpm global. Shares consecutivos do mesmo selo podem rodar em paralelo em até três páginas; outros tipos de automação continuam FIFO e exclusivos. Envie {"label":"MANDELA HITS","songName":"Nome da faixa","participants":[{"email":"nome@exemplo.com","percent":"33,3"}]}; percentuais aceitam vírgula decimal e a soma máxima é 100. Retorna 202 com ID e status. Exige catalog:write. Se o webhook global estiver configurado, envia eventos de progresso e o resultado final do Share.
GET/api/v1/shares?limit=50&offset=0Consulta o histórico paginado e os resultados dos Shares. A resposta inclui hasMore para indicar se há outra página; avance offset pelo número de itens retornados. Exige catalog:read.
GET/api/v1/shares/{id}Consulta status, progresso, errorCode e erros de uma solicitação. Se a ONErpm informar Total share percentage is more than 100%, o erro share_total_percentage_exceeded é registrado e a página Royalty Shares é reaberta após 2 segundos. Se mais de uma faixa corresponder ao nome, share_track_ambiguous é registrado sem salvar o Share. Os estados possíveis incluem queued, running, sent, duplicate, failed e uncertain. Com o webhook global configurado, esses resultados também são enviados nos eventos share.sent, share.total_percentage_exceeded e share.duplicate.
POST/api/v1/releasesCriar lançamento em rascunho. Retorna 201 e o ID interno.
GET/api/v1/releases?limit=50&offset=0Lista lançamentos e estados do processamento. Exige catalog:read.
GET / PUT/api/v1/releases/{id}Consultar o resultado/erros/ID ONErpm ou atualizar metadados.
GET/api/v1/release-status-events?after=0&limit=100Consultar mudanças incrementais de status de distribuição. Use nextAfter como cursor na próxima consulta; exige catalog:read.
GET/api/v1/labelsListar os selos que podem ser escolhidos em label, incluindo quais estão habilitados na conta ONErpm. Exige catalog:read.
DELETE/api/v1/releases/{id}Excluir rascunho e arquivos locais associados. Responde 204; exige catalog:write.
PUT/api/v1/releases/{id}/assets/audioEnviar WAV binário, até 3 GB; usar X-File-Name e Content-Length.
PUT/api/v1/releases/{id}/assets/track-audio-{index}Enviar o WAV de cada faixa de Álbum ou EP (índice começando em 0, até 29); por exemplo, track-audio-0 para a primeira faixa. Exige assets:write.
DELETE/api/v1/releases/{id}/assets/audio ou /assets/track-audio-{index}Remover somente o WAV local indicado e informar o espaço liberado, sem excluir os metadados, deslocar os arquivos das outras faixas ou afetar a cópia já enviada à ONErpm. Exige assets:write; bloqueado enquanto a automação ou distribuição estiver em andamento ou incerta.
PUT/api/v1/releases/{id}/assets/coverEnviar PNG/JPG binário de 3000 × 3000 pixels, até 35 MB.
POST/api/v1/releases/{id}/automationComandar o preenchimento ONErpm. Retorna 202; consulte o GET do lançamento para status, etapa, progresso, erros, ID e presença dos arquivos.
POST/api/v1/releases/{id}/distribution-confirmationConfirmação do sistema integrador para iniciar o preenchimento ONErpm depois de salvar os dados e arquivos. Exige automation:start, retorna 202 na primeira confirmação e não inicia duas vezes se a confirmação for repetida durante ou após a automação.
POST/api/v1/releases/{id}/distributeComando final após a análise e aprovação do administrador. Envie { "label": "FLUXO DE RUA", "onerpmId": "1234567" }; o sistema troca para esse selo e abre /distribution-tools/my-catalog/upload-music/{onerpmId}?step=distribution-preferences. Para Single, aplica a shortClipStart opcional se informada no lançamento; se omitida ou vazia, mantém a seleção padrão da ONErpm e segue sem arrastar a waveform. Depois clica em ALBUM PREVIEW, confirma o ID ONErpm e clica em Distribute Album. Exige o escopo separado distribution:submit; confirmação repetida não clica novamente. HTTP 202 confirma apenas que o comando foi aceito: consulte o statusUrl para acompanhar o resultado e erros. As etapas também podem ser enviadas por webhook global HTTPS configurado no servidor; a confirmação final de distribuição chega quando a aprovação da ONErpm é recebida.
Configure DISTRIBUTION_WEBHOOK_URL e DISTRIBUTION_WEBHOOK_SECRET no arquivo .env e reinicie o servidor. O endpoint recebe eventos de etapa, progresso, erros e aprovação de lançamentos e também eventos de Share: share.progress, share.sent, share.total_percentage_exceeded, share.duplicate, share.uncertain e share.failed. O evento share.total_percentage_exceeded também é enviado quando a soma é recusada pela validação da API; erros incluem errorCode e a mensagem, e e-mails dos participantes nunca são incluídos. Valide a assinatura HMAC-SHA256 X-ONErpm-Signature usando o corpo HTTP bruto e o mesmo segredo; use X-ONErpm-Delivery para deduplicar reenvios. Entregas são tentadas em segundo plano, com repetição automática até 12 tentativas; o receptor deve responder com HTTP 2xx. O webhook não substitui consultas à API para recuperar o estado atual.
{
"id": "uuid-da-entrega",
"type": "release.progress",
"occurredAt": "2026-10-16T11:09:48.128Z",
"data": {
"releaseId": "id-interno",
"title": "Nome do lançamento",
"status": "needs_attention",
"step": "artist_profile_selection_unconfirmed",
"onerpmId": null,
"distributionStatus": "not_submitted",
"progressMessage": "A automação parou nesta etapa.",
"errorMessage": "Revise a seleção de perfil na ONErpm.",
"updatedAt": "2026-10-16T11:09:48.128Z"
}
}
const created = await fetch(`${base}/releases`, {
method: "POST", headers,
body: JSON.stringify(releaseMetadata)
});
const { data: draft } = await created.json();
// Envie a capa e os WAVs usando draft.id; eles e os metadados
// ficam salvos no catálogo e aparecem na área Faixas.
// Só quando o outro sistema autorizar o envio:
const confirmation = await fetch(
`${base}/releases/${draft.id}/distribution-confirmation`,
{ method: "POST", headers }
); // 202: preenchimento iniciado; 200: confirmação repetida já processada
// Após análise/aprovação humana no outro sistema:
const distribution = await fetch(`${base}/releases/${draft.id}/distribute`, {
method: "POST", headers,
body: JSON.stringify({ label: "FLUXO DE RUA", onerpmId: "1234567" })
}); // exige token separado com distribution:submit
Além do título obrigatório na criação, o comando de automação valida todos estes campos. Use os nomes exatos no JSON; data em MM/DD/AAAA, explicit como string "true"/"false", instrumento VOCALS/DJ.
{
"releaseTitle": "Nova música",
"releaseType": "single",
"genre": "FUNK",
"subgenre": "BAILE FUNK",
"language": "PORTUGUÊS",
"label": "CENTRAL MANDELA",
"releaseCopyright": "2026 CENTRAL MANDELA",
"recordingCopyright": "2026 CENTRAL MANDELA",
"trackTitle": "Nova música",
"trackProducer": "Nome do produtor",
"producerRole": "Producer",
"composer": "Nome do compositor",
"musician": "Nome do músico",
"instrument": "VOCALS",
"lyrics": "Letra da música (opcional)",
"aiMaterials": "Human Created, No AI",
"trackLanguage": "PORTUGUÊS",
"explicit": "false",
"territory": "World",
"releaseDate": "12/31/2026",
"shortClipStart": "01:23"
}
Para Single, envie opcionalmente shortClipStart no formato MM:SS (por exemplo 01:23). Quando informado, o valor será aplicado na etapa final de envio, definindo o início do corte de 30 segundos para TikTok/ringtones; o corte precisa caber na duração da faixa.
Para um Álbum ou EP com várias faixas, envie releaseType: "album" ou "EP" e uma lista tracks com 1 a 30 objetos. Cada objeto usa os mesmos campos de faixa do exemplo acima; o primeiro item também alimenta os campos de faixa legados para manter compatibilidade. Envie cada WAV para o índice correspondente em assets/track-audio-{index}, uma única capa em assets/cover e uma data compartilhada no lançamento. A versão alternativa é configurada individualmente em cada objeto de tracks: inclua "alternateVersion": true e "alternateVersionOther": "Slowed Reverb" somente nas faixas que terão essa versão. As demais faixas podem omitir esses campos, como no exemplo abaixo.
{
"releaseTitle": "Meu álbum",
"releaseType": "album",
"mainArtist": "Artista principal",
"genre": "FUNK",
"subgenre": "BAILE FUNK",
"language": "PORTUGUÊS",
"label": "CENTRAL MANDELA",
"releaseCopyright": "2026 CENTRAL MANDELA",
"recordingCopyright": "2026 CENTRAL MANDELA",
"territory": "World",
"releaseDate": "12/31/2026",
"tracks": [
{
"trackTitle": "Faixa 1",
"trackProducer": "Nome do produtor",
"producerRole": "Producer",
"composer": "Nome do compositor",
"musician": "Nome do músico",
"instrument": "VOCALS",
"lyrics": "Letra da primeira faixa (opcional)",
"aiMaterials": "Human Created, No AI",
"trackLanguage": "PORTUGUÊS",
"explicit": "false"
},
{
"trackTitle": "Faixa 2",
"alternateVersion": true,
"alternateVersionOther": "Slowed Reverb",
"trackProducer": "Nome do produtor",
"producerRole": "Producer",
"composer": "Nome do compositor",
"musician": "Nome do músico",
"instrument": "VOCALS",
"lyrics": "Letra da segunda faixa (opcional)",
"aiMaterials": "Human Created, No AI",
"trackLanguage": "PORTUGUÊS",
"explicit": "false"
}
]
}
import { createReadStream, statSync } from "node:fs";
import { basename, extname } from "node:path";
const base = "https://api.fluxoderua.com/api/v1";
const token = process.env.FLUXO_API_TOKEN;
const jsonHeaders = {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
};
async function uploadAsset(releaseId, kind, filePath) {
const size = statSync(filePath).size;
const isAudio = kind === "audio";
const response = await fetch(
`${base}/releases/${releaseId}/assets/${kind}`,
{
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Length": String(size),
"X-File-Name": encodeURIComponent(basename(filePath)),
"Content-Type": isAudio ? "audio/wav" :
(extname(filePath).toLowerCase() === ".png" ? "image/png" : "image/jpeg")
},
body: createReadStream(filePath),
duplex: "half"
}
);
if (!response.ok) throw new Error(`Upload ${kind} falhou: ${await response.text()}`);
return response.json();
}
const response = await fetch(`${base}/releases`, {
method: "POST", headers: jsonHeaders,
body: JSON.stringify(releaseMetadata)
});
if (!response.ok) throw new Error(await response.text());
const { data: release } = await response.json();
// A automação só começa depois que ambos os arquivos foram armazenados.
await Promise.all([
uploadAsset(release.id, "audio", audioPath),
uploadAsset(release.id, "cover", coverPath)
]);
const started = await fetch(
`${base}/releases/${release.id}/automation`,
{ method: "POST", headers: jsonHeaders }
); // 202 Accepted
if (!started.ok) throw new Error(await started.text());
// Consulte GET /releases/{id}: status, step, progresso, erros,
// onerpmId, assets locais e oneRpmAssetStatus.
POST/api/v1/presavesEnfileira a busca do Smart Link nas contas ONErpm habilitadas e retorna 202 com a posição e o endereço de status. Quando encontrar, grava nome/link no SQLite; se o ID não existir, o status termina em failed com presave_release_not_found.
POST/api/v1/presaves/batchEnfileira até 100 IDs em onerpmIds; busca até três lançamentos simultaneamente em páginas separadas e retorna um status URL por ID. Exige presaves:fetch.
GET/api/v1/presaves/status?onerpmId={id}Acompanha a fila e a busca (queued, searching, found ou failed), incluindo nome/link encontrados e mensagem do selo atual; exige presaves:read.
GET/api/v1/presaves/status?onerpmIds={id1},{id2}Consulta em uma resposta os estados de vários IDs; exige presaves:read.
GET/api/v1/presaves?onerpmId={id}Consulta um PRE SAVE salvo; sem ID, lista os resultados.
GET/api/v1/healthVerifica se a API v1 está disponível.
const base = "https://api.fluxoderua.com/api/v1";
const headers = {
Authorization: `Bearer ${process.env.FLUXO_API_TOKEN}`,
"Content-Type": "application/json"
};
const response = await fetch(
`${base}/presaves`,
{ method: "POST", headers,
body: JSON.stringify({ onerpmId: "9222000" }) }
);
// data retorna onerpmId, trackName, smartLink e updatedAt.
O estado do catálogo devolve ID interno e ONErpm, status, step, progresso/erro, data e metadados de áudio/capa local. oneRpmAssetStatus.audio e .cover informam uploading, uploaded, manual_required, failed ou unknown. Status da automação: draft, queued, running, waiting_for_manual_action, waiting_for_manual_assets, needs_attention ou login_required.
| Status | Significado |
|---|---|
| 200 | OK — solicitação concluída |
| 201 | Criado — recurso criado |
| 202 | Aceito — enfileirado para processamento assíncrono; consulte o recurso |
| 204 | Sem conteúdo — sucesso sem corpo de resposta |
| 400 | Solicitação inválida — corpo ou consulta malformada |
| 401 | Não autorizado — token ausente, inválido ou revogado |
| 403 | Proibido — token válido, sem permissão exigida |
| 404 | Não encontrado — recurso inexistente ou indisponível |
| 409 | Conflito — tarefa ONErpm ocupada ou sessão não pronta |
| 413 | Carga muito grande — arquivo excede o limite |
| 422 | Entidade não processável — validação falhou; confira error.details |
| 429 | Muitas solicitações — limite atingido; respeite Retry-After |
| 500 | Erro interno; informe o cabeçalho X-Request-Id |
| 503 | Serviço temporariamente indisponível |
Carregando...
Os eventos são mantidos por 180 dias. Endereços IP e localização aproximada, quando disponível, ficam somente neste servidor.
Carregando auditoria...
Localização aproximada usa apenas um banco GeoLite2 local opcional. Nenhum IP é enviado a terceiros.
Carregando sessões...
Carregando...
Adicione uma foto de perfil para identificar cada selo no seletor de troca e na Visão geral. PNG, JPG ou WebP de até 5 MB.