> ## Documentation Index
> Fetch the complete documentation index at: https://developers.googa.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Metadados de áudio de uma novela (por capítulo)

> Espelha as tabelas reais `novel_chapters` (metadado do catálogo: título, duração estimada) e `chapter_audio` (metadado do áudio pré-renderizado: voz usada, duração real, status) do mesmo grafo de narrativa do NovelAI — mesma obra, mesmos finais (ver [NovelAI — catálogo](/novelai/reference/catalog/lista-o-catálogo-de-novelas)), agora com uma trilha de áudio por capítulo.
Honestidade sobre `audio_status`: hoje **15 novelas** têm narração real gravada (capítulos + final) no bucket `chapter-audio` — é a flag `novels.has_real_audio` que marca quais são, e é ela que controla o catálogo do app oficial do NovelAudio. Para o resto do catálogo este campo retornaria `not_rendered`. Um pipeline de renderização em lote (TTS → arquivo → upload → linha em `chapter_audio`) é pré-requisito de roadmap para este endpoint valer para o catálogo inteiro.



## OpenAPI

````yaml /novelaudio/openapi.yaml get /novels/{id}/audio
openapi: 3.1.0
info:
  title: Googa NovelAudio API
  version: 1.0.0
  summary: >-
    Catálogo em áudio, streaming de capítulo e posição de reprodução do
    NovelAudio. Vive no MESMO domínio e no MESMO backend físico do NovelAI —
    NovelAI e NovelAudio compartilham um único projeto Supabase ("Novel"), e
    esta API só existe como uma superfície de recursos diferente (áudio, não
    texto) dentro dele. Não existe `api.novelaudio.com.br`.
  description: >-
    Hoje o único cliente do NovelAudio é o próprio app oficial, falando
    diretamente com o Supabase do projeto "Novel" (PostgREST + Edge Functions +
    Storage). Esta especificação é o contrato para um parceiro (ex: uma
    operadora) embutir o player de áudio no próprio app ou puxar métricas de
    escuta sem acesso direto ao banco.

    Por que o domínio é `api.novelai.com.br` e não um domínio próprio: ver
    [Visão geral do NovelAudio](/novelaudio/overview) e [Modelo de autenticação
    sobre Supabase](/architecture/supabase-auth-model). Em resumo — NovelAI e
    NovelAudio são dois apps sobre o mesmo projeto Supabase; a Edge Function
    resolve por rota/recurso (texto vs. áudio), não por domínio, então um
    `api.novelaudio.com.br` separado bateria na mesma infraestrutura sem
    necessidade.

    Honestidade sobre o gap entre o prometido e o real (importante para quem for
    implementar contra este contrato): a proposta técnica original (RFP Livros
    Digitais 2026) promete narração neural com múltiplas vozes selecionáveis e
    streaming adaptativo HLS/DASH. O que existe hoje é bem mais modesto — ver a
    descrição de cada endpoint abaixo, e a seção "Como o áudio é produzido hoje"
    em [/novelaudio/overview](/novelaudio/overview).

    Esta especificação é um **contrato proposto, ainda não implementado** —
    nenhum destes endpoints existe em produção.

    Autenticação: o token de parceiro é emitido **uma única vez, pela Platform
    API** (`POST https://api.googa.com.br/v1/oauth2/token` — ver [Platform —
    OAuth2](/platform/reference/oauth2/troca-client-credentials-por-um-token-de-acesso-de-parceiro));
    nem o NovelAudio nem o NovelAI têm endpoint de token próprio. Este arquivo
    não repete essa operação; ele só declara os escopos `novelaudio:*` que
    também podem ser solicitados nessa mesma troca, ao lado dos escopos
    `novelai:*`. Um parceiro que integra catálogo de texto e áudio no mesmo
    cliente pede os dois conjuntos de escopo numa única chamada ao endpoint de
    token da Platform.
  contact:
    name: Googa — Suporte a parceiros
    email: developers@googa.com.br
  license:
    name: Uso restrito — ver Política de Uso da API
    url: https://developers.googa.com.br/security/api-usage-policy
servers:
  - url: https://api.novelai.com.br/v1
    description: >-
      Produção (proposto). Mesmo domínio e mesmo backend físico do NovelAI — NÃO
      é um domínio separado do NovelAudio. Roteamento por recurso, não por host.
  - url: https://sandbox.novelai.com.br/v1
    description: Sandbox (proposto) — dados fictícios, sem impacto em billing real.
security:
  - partnerOAuth2: []
tags:
  - name: Audio Metadata
    description: >-
      Metadados de áudio por novela e por capítulo — vozes, duração, status de
      renderização.
  - name: Streaming
    description: >-
      Emissão de URL de reprodução de um capítulo específico, com verificação de
      entitlement.
  - name: Playback
    description: Posição de reprodução do assinante, para retomar entre dispositivos.
  - name: Voices
    description: >-
      Catálogo de vozes de narração disponíveis. Hoje inteiramente Roadmap — ver
      descrição do endpoint.
paths:
  /novels/{id}/audio:
    get:
      tags:
        - Audio Metadata
      summary: Metadados de áudio de uma novela (por capítulo)
      description: >-
        Espelha as tabelas reais `novel_chapters` (metadado do catálogo: título,
        duração estimada) e `chapter_audio` (metadado do áudio pré-renderizado:
        voz usada, duração real, status) do mesmo grafo de narrativa do NovelAI
        — mesma obra, mesmos finais (ver [NovelAI —
        catálogo](/novelai/reference/catalog/lista-o-catálogo-de-novelas)),
        agora com uma trilha de áudio por capítulo.

        Honestidade sobre `audio_status`: hoje **15 novelas** têm narração real
        gravada (capítulos + final) no bucket `chapter-audio` — é a flag
        `novels.has_real_audio` que marca quais são, e é ela que controla o
        catálogo do app oficial do NovelAudio. Para o resto do catálogo este
        campo retornaria `not_rendered`. Um pipeline de renderização em lote
        (TTS → arquivo → upload → linha em `chapter_audio`) é pré-requisito de
        roadmap para este endpoint valer para o catálogo inteiro.
      operationId: getNovelAudioMetadata
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
          description: >-
            Identificador da novela no catálogo Googa (o mesmo `novel_id` usado
            pela API do NovelAI).
      responses:
        '200':
          description: Metadados de áudio da novela.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NovelAudioMetadata'
        '404':
          description: Novela inexistente no catálogo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    NovelAudioMetadata:
      type: object
      properties:
        novel_id:
          type: string
        chapters:
          type: array
          items:
            $ref: '#/components/schemas/ChapterAudioMeta'
    Error:
      type: object
      description: >-
        Mesmo formato de erro (estilo OAuth2, RFC 6749 §5.2) usado pela Platform
        API.
      properties:
        error:
          type: string
          example: invalid_request
        error_description:
          type: string
          example: Capítulo ainda não liberado pela cadência de drip
    ChapterAudioMeta:
      type: object
      properties:
        chapter_number:
          type: integer
        title:
          type: string
          nullable: true
          description: >-
            Título real do capítulo, quando cadastrado. `null` significa "exibir
            'Capítulo N'" — nunca um nome inventado.
        duration_seconds:
          type: integer
          nullable: true
          description: >-
            Duração real (quando o áudio já foi renderizado) ou estimada. Ver
            `audio_status`.
        voice:
          type: string
          nullable: true
          description: >-
            Identificador da voz usada na renderização deste capítulo específico
            — não é um catálogo selecionável (ver `GET /voices`), é só o
            registro de qual voz gerou este arquivo.
        audio_status:
          type: string
          enum:
            - not_rendered
            - pending
            - ready
            - failed
          description: >-
            `not_rendered`: sem linha em `chapter_audio` — nenhum áudio existe
            para este capítulo ainda (estado da grande maioria do catálogo
            hoje). `ready`: áudio existe e pode ser transmitido via `/stream`.
  securitySchemes:
    partnerOAuth2:
      type: oauth2
      description: >-
        Client credentials — emitido **uma única vez**, de forma centralizada,
        pela Platform API (`POST https://api.googa.com.br/v1/oauth2/token`, ver
        [Platform —
        OAuth2](/platform/reference/oauth2/troca-client-credentials-por-um-token-de-acesso-de-parceiro)).
        Este domínio (`api.novelai.com.br`, que também atende NovelAudio) só
        valida o token — via a chave pública do projeto Platform — nunca emite
        um token próprio. Este arquivo não redefine a operação de emissão, só
        declara os escopos `novelaudio:*` que também podem ser pedidos na mesma
        troca, ao lado dos `novelai:*`.
      flows:
        clientCredentials:
          tokenUrl: https://api.googa.com.br/v1/oauth2/token
          scopes:
            novelaudio:audio:read: Consultar metadados de áudio e emitir URLs de streaming
            novelaudio:playback:read: Consultar posição de reprodução
            novelaudio:playback:write: Atualizar posição de reprodução
            novelaudio:voices:read: >-
              Consultar o catálogo de vozes de narração (roadmap — ver `GET
              /voices`)

````