GoStream Docs
OpenAPI API v1

API pública v1

Automatize a operação do GoStream

Envie e organize conteúdos, monte playlists, edite a agenda dos canais, opere o playout, insira marcadores SCTE-35 e controle overlays.

Base URL

https://api.stream.goinnovation.ai/v1

Entradas não fazem parte da API pública

A ingestão e o ciclo de vida das instâncias de entrada permanecem sob controle da interface. Saídas são expostas somente para consulta.

Envie Accept-Language: pt-BR, en ou es para mensagens e relatórios traduzidos. Os códigos de erro, identificadores e valores técnicos permanecem estáveis.

Autenticação

Use uma API key criada em Ajustes > Credenciais. A chave herda a conta e as permissões do usuário que a criou.

Uso exclusivo no servidor

Guarde a chave em uma variável secreta como $STREAM_TOOLS_API_KEY. Nunca a exponha no frontend.

Cabeçalhos
X-API-Key: $STREAM_TOOLS_API_KEY
Content-Type: application/json

Authorization: Bearer $STREAM_TOOLS_API_KEY continua aceito para integrações existentes. Nunca inclua a chave no navegador ou em URLs.

Player

POST /player/credentials

Gera URLs HLS e DASH assinadas para um content, playlist ou channel. A validade aceita é de 300 a 604800 segundos; o padrão é 3600. A seção de rotação abaixo detalha renovação, revogação e respostas.

Conteúdos, perfis e upload

O upload é multipart e suporta metadados JSON, perfil de encoding, overlay de encoding e associação direta a uma biblioteca.

MétodoEndpointFunção
GET/contentLista conteúdos.
GET/content/{contentID}Detalhes, URLs e metadados.
GET/encoding-profilesPerfis disponíveis na conta.
GET/content/overlaysOverlays disponíveis no encoding.
GET/content/upload-librariesBibliotecas elegíveis no upload.
POST/content/uploads/initiateCria o conteúdo e inicia multipart.
PUT/content/{contentID}/uploads/{uploadID}/parts/{partNumber}Envia uma parte binária.
POST/content/{contentID}/uploads/{uploadID}/completeConclui e enfileira o encoding.
DELETE/content/{contentID}/uploads/{uploadID}Aborta o upload.
POST/content/{contentID}/reprocessReprocessa o conteúdo.
PATCH/content/{contentID}/auto-deleteAltera a exclusão automática.
DELETE/content/{contentID}Exclui conteúdo e derivados.

Fluxo multipart

  1. Consulte perfis, overlays e bibliotecas.
  2. Inicie com o libraryID escolhido e guarde contentID e uploadID. Omita libraryID para não associar o conteúdo a uma biblioteca.
  3. Envie cada parte binária e registre o ETag devolvido.
  4. Conclua com a lista ordenada de partNumber e etag.

Bibliotecas

Liste, crie, edite e defina o conjunto ordenado de conteúdos.

GET, POST /libraries GET, PUT, DELETE /libraries/{libraryID} PUT /libraries/{libraryID}/items

Playlists

Gerencie itens, playback e saltos operacionais da playlist.

GET, POST /playlists GET, PUT, DELETE /playlists/{playlistID} PUT /playlists/{playlistID}/items POST /playlists/{playlistID}/loop-jump PATCH /playlists/{playlistID}/playback-settings GET /playlists/{playlistID}/embed-html POST /playlists/{playlistID}/playback-token

Canais e agenda

A agenda é persistente. Toda alteração usa o fuso do canal e é refletida no read model do playout.

GET, POST /channels GET, PUT, DELETE /channels/{channelID} GET, POST /channels/{channelID}/agenda PUT, DELETE /channels/{channelID}/agenda/{itemID} PATCH /channels/{channelID}/agenda/{itemID}/move PATCH /channels/{channelID}/agenda/{itemID}/reorder POST /channels/{channelID}/agenda/copy-day PATCH /channels/{channelID}/tapume POST /channels/{channelID}/playback-token

Playout e SCTE-35

O playout é a visão operacional do dia. Comandos aceitam um commandID UUID para garantir idempotência em retentativas.

MétodoEndpointFunção
GET/channels/{channelID}/playout?dayStart={epoch}No ar, próximo, agenda operacional e revisão.
POST/channels/{channelID}/playout/commandsCue, tirar cue, colocar no ar, ignorar, manter e liberar.
GET/channels/{channelID}/playout/markers/openIntervalos abertos.
POST/channels/{channelID}/playout/markersInsere IN ou OUT agora ou agendado.
PATCH/channels/{channelID}/playout/markers/{markerID}Altera duração.
DELETE/channels/{channelID}/playout/markers/{markerID}Remove o par de marcadores.

Overlays dinâmicos

Consulte instâncias e itens cadastrados e acione um item existente. A API pública não cria, edita, inicia ou encerra runtimes.

GET /dynamic-overlays GET /dynamic-overlays/{overlayID} GET /dynamic-overlays/{overlayID}/items POST /dynamic-overlays/{overlayID}/items/{itemID}/activate POST /dynamic-overlays/{overlayID}/items/{itemID}/deactivate

Saídas

Saídas são somente leitura. A conexão retorna URLs protegidas SRT, HLS, HLS TS, DASH ou RTMPS disponíveis para a saída.

GET /outputs GET /outputs/{outputID} GET /outputs/{outputID}/connection

Erros, permissões e limites

Erros incluem ok: false, code, message e o cabeçalho X-Request-ID. Guarde o ID ao abrir um chamado.

StatusSignificado
400Payload ou parâmetro inválido.
401API key ausente, inválida ou revogada.
403A credencial não possui a permissão necessária.
404Recurso não existe na conta autenticada.
405Operação não exposta pelo contrato público.
409Conflito de revisão ou estado operacional.

Consulte os payloads, parâmetros e respostas na especificação OpenAPI 3.1.

Player

Rotacionando a chave do player via API

Gere uma credencial temporária e uma URL HLS pronta para uso em um conteúdo, playlist ou canal.

Uso exclusivo no servidor

A API key da conta nunca deve ser incluída em JavaScript do navegador, aplicativos distribuídos ou URLs públicas.

Endpoint

POST https://api.stream.goinnovation.ai/v1/player/credentials

Autentique a solicitação com a API key disponível em Ajustes > Credenciais.

Authorization
Authorization: Bearer $STREAM_TOOLS_API_KEY
Content-Type: application/json

Parâmetros

Campo Tipo Obrigatório Descrição
resourceType string Sim content, playlist ou channel.
resourceID UUID Sim ID do recurso pertencente à mesma conta da API key.
expiresInSeconds integer Não De 300 a 604800 segundos. O padrão é 3600.

Exemplo com cURL

Shell
curl --request POST \
  --url https://api.stream.goinnovation.ai/v1/player/credentials \
  --header "Authorization: Bearer $STREAM_TOOLS_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
    "resourceType": "channel",
    "resourceID": "11111111-2222-4333-8444-555555555555",
    "expiresInSeconds": 3600
  }'

Exemplo em Node.js

JavaScript no servidor
const response = await fetch(
  'https://api.stream.goinnovation.ai/v1/player/credentials',
  {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.STREAM_TOOLS_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      resourceType: 'channel',
      resourceID: '11111111-2222-4333-8444-555555555555',
      expiresInSeconds: 3600,
    }),
  },
)

if (!response.ok) {
  throw new Error(`Falha ao gerar credencial: ${response.status}`)
}

const { data } = await response.json()

Resposta

200 OK
{
  "ok": true,
  "data": {
    "resourceType": "channel",
    "resourceID": "11111111-2222-4333-8444-555555555555",
    "playerKey": "eyJhbGciOi...exemplo",
    "playbackURL": "https://stream.goinnovation.ai/hls/channels/11111111-2222-4333-8444-555555555555/master.m3u8?token=eyJhbGciOi...exemplo",
    "issuedAt": "2026-07-27T18:00:00.000Z",
    "expiresAt": "2026-07-27T19:00:00.000Z",
    "renewAfter": "2026-07-27T18:48:00.000Z"
  }
}

Renovação sem interrupção

  1. Guarde a API key somente no backend da sua aplicação.
  2. Solicite uma credencial antes de iniciar o player.
  3. Agende a próxima solicitação para o instante indicado em renewAfter.
  4. Atualize a URL HLS do player antes de expiresAt.

Para uma rotina a cada 24 horas, use uma validade maior que o intervalo, como 172800 segundos, para preservar uma margem segura caso uma renovação atrase. A validade máxima é de sete dias.

Rotação de segurança

A rotação da chave do player feita em Ajustes > Credenciais faz com que novas solicitações com credenciais temporárias anteriores sejam recusadas. Conexões já abertas podem concluir os pequenos grants de mídia emitidos antes da rotação. Gere uma nova credencial por esta rota.

A rotação da chave do player não altera a sua API key. A API key possui uma operação separada de rotação e revogação.

Erros

Status Código Quando ocorre
400 INVALID_RESOURCE_TYPE O tipo do recurso não é suportado.
400 INVALID_EXPIRATION A validade está fora do intervalo permitido.
401 API_KEY_INVALID A API key não existe, foi rotacionada ou revogada.
403 PERMISSION_REQUIRED O perfil não possui acesso a credenciais.
404 RESOURCE_NOT_FOUND O recurso não existe, não está pronto ou pertence a outra conta.
429 RATE_LIMITED O limite temporário de solicitações foi atingido.

Analytics

Métricas de audiência e distribuição

Consulte as mesmas métricas consolidadas do painel GoStream, limitadas à conta da API key e com o tráfego interno da plataforma excluído.

Permissão necessária

A API key precisa possuir a permissão analytics.view. Os recursos de outras contas nunca são retornados.

Dashboard

GET https://api.stream.goinnovation.ai/v1/analytics/dashboard

Sem filtros, retorna os últimos sete dias. start e end usam Unix time em segundos e aceitam períodos de até dois anos.

Parâmetro Valores Descrição
start, end integer Início e fim do período em Unix time.
grain auto, hour, day, month Granularidade da série temporal.
resourceType content, playlist, channel Tipo do recurso. Obrigatório ao informar resourceID.
resourceID UUID Recurso específico da conta.
Segmentação playerSource, domain, device, browser, operatingSystem, country, region e city.
Exemplo
curl --get \
  --url https://api.stream.goinnovation.ai/v1/analytics/dashboard \
  --header "Authorization: Bearer $STREAM_TOOLS_API_KEY" \
  --data-urlencode "grain=day" \
  --data-urlencode "resourceType=channel" \
  --data-urlencode "resourceID=11111111-2222-4333-8444-555555555555"

A resposta contém overview, timeline, audiência por canal, tráfego HLS/DASH/SRT, recursos, dimensões geográficas e técnicas, unavailableSections e o instante de retenção detalhada em detailAvailableFrom.

Recursos disponíveis

GET https://api.stream.goinnovation.ai/v1/analytics/resources

Lista conteúdos, playlists e canais da conta para montar seletores antes de consultar métricas por recurso.

Exemplo
curl \
  --url https://api.stream.goinnovation.ai/v1/analytics/resources \
  --header "Authorization: Bearer $STREAM_TOOLS_API_KEY"

Exportação CSV

GET https://api.stream.goinnovation.ai/v1/analytics/export.csv

Aceita os mesmos filtros do dashboard e devolve um CSV UTF-8 com resumo, séries temporais, recursos, protocolos e segmentações.

Exemplo
curl --get \
  --url https://api.stream.goinnovation.ai/v1/analytics/export.csv \
  --header "Authorization: Bearer $STREAM_TOOLS_API_KEY" \
  --data-urlencode "grain=day" \
  --output gostream-analytics.csv

Erros de Analytics

StatusCódigoQuando ocorre
400INVALID_GRAINGranularidade inválida.
400RESOURCE_TYPE_REQUIREDID sem tipo de recurso.
403PERMISSION_REQUIREDAPI key sem analytics.view.
404RESOURCE_NOT_FOUNDRecurso inexistente ou de outra conta.
429RATE_LIMITEDLimite de 120 solicitações por hora atingido.

Pause Ads API

Pause Ads no seu próprio player

Administre mídias e campanhas no backend, consulte resultados pela API e exiba a peça como uma camada HTML acessível sobre o player quando o público pausar.

A API key nunca vai para o navegador

Seu backend usa a API key para criar uma sessão curta e vinculada à origem. A página recebe somente essa sessão temporária e a entrega ao SDK.

Visão geral

  1. Liste os recursos que podem receber campanhas.
  2. Envie a imagem original e guarde o ID da mídia pronta.
  3. Crie a campanha com agenda, frequência, alvos e pesos.
  4. Seu backend cria uma sessão para a origem HTTPS exata da página.
  5. O SDK posiciona a camada HTML sem reparentar nem alterar o vídeo.
  6. Consulte impressões, cliques, duração visível e encerramentos.

O contrato completo e legível por ferramentas está em /openapi.json.

Autenticação

Use X-API-Key no backend. Authorization: Bearer continua aceito para integrações existentes. Toda resposta de erro possui code estável; guarde também o request ID retornado para suporte.

Backend
curl https://api.stream.goinnovation.ai/v1/pause-ads/resources \
  --header "X-API-Key: $STREAM_TOOLS_API_KEY"

Permissões: leitura usa content.view; criação e edição usam content.upload; relatórios usam analytics.view; sessões usam settings.credentials.

Recursos

GET/v1/pause-ads/resources

Retorna somente conteúdos, playlists e canais da conta. Filtre por type, status e search. Listagens usam limit de 1 a 100 e um cursor opaco; reutilize nextCursor sem modificá-lo.

Mídias

POST/v1/pause-ads/creatives

Envie apenas o arquivo original JPEG, PNG ou WebP em multipart/form-data. Ele deve ter proporção 16:9, pelo menos 1280×720 e no máximo 15 MiB. O GoStream gera o WebP 1280×720 de entrega; não envie uma segunda versão otimizada.

Upload original
curl --request POST \
  --url https://api.stream.goinnovation.ai/v1/pause-ads/creatives \
  --header "X-API-Key: $STREAM_TOOLS_API_KEY" \
  --header "Idempotency-Key: creative-launch-2026-08" \
  --form "original=@pause-ad.png;type=image/png" \
  --form "name=Campanha institucional" \
  --form "altText=Conheça nossa programação" \
  --form "destinationURL=https://customer.example/campanha" \
  --form "fitMode=contain"
OperaçãoRotaResultado
ListarGET /creativesPágina de metadados.
ConsultarGET /creatives/{creativeID}Metadados da mídia.
ImagemGET /creatives/{creativeID}/mediaWebP autenticado.
EditarPATCH /creatives/{creativeID}Nome, alt, destino e fit.
ArquivarDELETE /creatives/{creativeID}204; não apaga campanha ativa.

Criações exigem Idempotency-Key de 8 a 128 caracteres. A mesma requisição pode ser repetida por 24 horas; reutilizar a chave com outro corpo retorna 409 IDEMPOTENCY_CONFLICT.

Campanhas

POST/v1/pause-ads/campaigns

Campanhas definem agenda, timezone, prioridade, tempo mínimo, fechamento, cooldown, limite por sessão, pesos das mídias e alvos. Uma campanha ACTIVE precisa ter ao menos uma mídia pronta e um alvo da conta.

JSON
{
  "name": "Intervalo institucional",
  "status": "ACTIVE",
  "priority": 100,
  "startsAt": "2026-08-28T00:00:00.000Z",
  "endsAt": "2026-09-30T23:59:59.000Z",
  "timezone": "America/Sao_Paulo",
  "minWatchSeconds": 2,
  "cooldownSeconds": 300,
  "sessionCap": 3,
  "closeAfterSeconds": 15,
  "creatives": [{ "creativeID": "UUID-DA-MIDIA", "weight": 1 }],
  "targets": [{ "resourceType": "channel", "resourceID": "UUID-DO-CANAL" }]
}

Use GET /campaigns, GET /campaigns/{campaignID}, PATCH /campaigns/{campaignID} e DELETE /campaigns/{campaignID} para o ciclo completo.

Sessões do navegador

POST/v1/pause-ads/sessions

Esta chamada acontece no seu backend. embedDomain é a origem HTTPS exata da página, inclusive porta não padrão. A resposta dura 15 minutos e pode ser devolvida ao navegador; ela não contém a API key.

Rota do seu backend
app.post('/pause-ads/session', async (request, response) => {
  const upstream = await fetch(
    'https://api.stream.goinnovation.ai/v1/pause-ads/sessions',
    {
      method: 'POST',
      headers: {
        'X-API-Key': process.env.STREAM_TOOLS_API_KEY,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        resourceType: 'channel',
        resourceID: request.body.resourceID,
        embedDomain: 'https://player.customer.example',
      }),
    },
  )
  const payload = await upstream.json()
  response.status(upstream.status).json(payload.data ?? payload)
})

Use a opção locale do SDK: pt-BR (padrão), en ou es. Ela traduz rótulos, acessibilidade e contagem regressiva; o texto da campanha é preservado.

SDK e HTML

A versão do módulo oficial com suporte a idiomas está em https://docs.stream.goinnovation.ai/sdk/pause-ads-v1.js?v=20260918-i18n. O container deve conter o vídeo e ter o mesmo tamanho visual do player. O SDK adiciona apenas uma camada irmã; ele não envolve o vídeo, não chama pause() e não troca src.

HTML e CSS
<div class="player-shell">
  <video id="stream" controls playsinline></video>
</div>
<style>
  .player-shell { position: relative; aspect-ratio: 16 / 9; background: #000; }
  .player-shell video { display: block; width: 100%; height: 100%; }
</style>
Navegador
import { mountPauseAds } from
  'https://docs.stream.goinnovation.ai/sdk/pause-ads-v1.js?v=20260918-i18n'

const sessionResponse = await fetch('/pause-ads/session', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ resourceID: 'UUID-DO-CANAL' }),
})
const session = await sessionResponse.json()
const pauseAds = await mountPauseAds({
  container: document.querySelector('.player-shell'),
  media: document.querySelector('#stream'),
  locale: 'pt-BR',
  session,
})

// Ao remover o player:
pauseAds.destroy()

A camada aparece apenas depois de uma pausa deliberada e estável. O X e o timeout mantêm o vídeo pausado; a reprodução volta somente pelo Play do próprio player. Em fullscreen nativo do elemento video, o navegador pode impedir overlays; prefira colocar o container em fullscreen.

Video.js

const player = videojs('stream')
const pauseAds = await mountPauseAds({
  container: player.el(),
  media: player.el().querySelector('video'),
  session,
  isAdBreakActive: () => player.ads?.isInAdMode?.() ?? false,
})
player.on('dispose', () => pauseAds.destroy())

HLS.js

const media = document.querySelector('#stream')
const hls = new Hls()
hls.loadSource(playbackURL)
hls.attachMedia(media)
const pauseAds = await mountPauseAds({
  container: media.parentElement,
  media,
  session,
})
hls.on(Hls.Events.DESTROYING, () => pauseAds.destroy())

Shaka Player

const media = document.querySelector('#stream')
const player = new shaka.Player(media)
await player.load(playbackURL)
const pauseAds = await mountPauseAds({
  container: media.parentElement,
  media,
  session,
})
player.addEventListener('unloading', () => pauseAds.destroy())

Google IMA

Informe o estado do intervalo linear para nunca sobrepor Pause Ads ao anúncio. A callback também funciona com videojs-ima e outros gerenciadores.

let imaActive = false
const pauseAds = await mountPauseAds({
  container,
  media,
  session,
  isAdBreakActive: () => imaActive,
})
adsManager.addEventListener('CONTENT_PAUSE_REQUESTED', () => {
  imaActive = true
  pauseAds.setAdBreakActive(true)
})
adsManager.addEventListener('CONTENT_RESUME_REQUESTED', () => {
  imaActive = false
  pauseAds.setAdBreakActive(false)
})

Eventos

EventoSignificado
pause_ad_impressionPeça visível continuamente por um segundo.
pause_ad_clickClique no destino assinado.
pause_ad_close_manualFechamento explícito.
pause_ad_close_autoFechamento pelo tempo configurado.
pause_ad_resumeRetorno pelo Play nativo com a peça visível.
pause_ad_no_fillNenhuma campanha elegível.
pause_ad_errorFalha de configuração, imagem ou telemetria.

Tokens permanecem apenas em memória; o SDK não usa cookies, localStorage ou IndexedDB.

Relatórios e CSV

GET/v1/pause-ads/reports

Filtre por start, end, resourceType, resourceID, campaignID e creativeID. O JSON retorna resumo, série, campanhas e mídias com impressões, sessões únicas, cliques, CTR, duração visível média, fechamentos, retomadas, no-fill e erros. A série é horária para até dois dias e diária nos períodos maiores, com limite máximo de 89 dias.

CSV
curl --get \
  --url https://api.stream.goinnovation.ai/v1/pause-ads/reports/export.csv \
  --header "X-API-Key: $STREAM_TOOLS_API_KEY" \
  --data-urlencode "start=2026-08-01" \
  --data-urlencode "end=2026-08-28" \
  --output pause-ads.csv

Erros

StatusCódigo comumAção
400INVALID_*Corrija corpo, filtro, cursor ou idempotência.
401API_KEY_INVALIDRevise a credencial do backend.
403PERMISSION_REQUIREDConceda somente a permissão necessária.
404NOT_FOUNDConfirme conta, ID e estado pronto.
409IDEMPOTENCY_CONFLICTUse nova chave para outro corpo.
413/415/422INVALID_UPLOADRevise tamanho, MIME, dimensão e proporção.
429RATE_LIMITEDRespeite Retry-After.

Rate limits

Por API key: 600 leituras a cada 10 minutos; 120 mutações por hora; 30 uploads por hora; 120 relatórios por hora; e 6000 sessões a cada 10 minutos. Um 429 informa o tempo real em Retry-After.

Solução de problemas

  • Sem overlay: confirme campanha ativa, alvo, agenda, cooldown e limite da sessão.
  • 401/403 no config: a origem deve coincidir exatamente com embedDomain e estar autorizada.
  • Imagem bloqueada: permita https://stream.goinnovation.ai em img-src e connect-src.
  • SDK bloqueado: permita https://docs.stream.goinnovation.ai em script-src e style-src.
  • Fullscreen: solicite fullscreen no container do player, não diretamente no vídeo.
  • Troca de fonte: destrua o controller ao descartar o player; uma nova montagem cria estado limpo.
Falhas do caminho publicitário são fail-open: não pausam, retomam nem trocam a fonte do conteúdo do cliente.