{
"error": "invalid_request",
"error_description": "Novela inexistente ou removida do catálogo"
}
{
"error": "invalid_request",
"error_description": "Novela inexistente ou removida do catálogo"
}
Progress
Progresso de leitura consolidado de um assinante
Uma linha por novela que o assinante já abriu — em andamento ou concluída. Nomeado no singular (subscriber, não subscribers) para seguir a mesma convenção de GET /subscriber-status/{id} na Platform API.
active_novel_count nunca passa de active_novel_limit (hoje fixo em 3): é o limite de novelas simultâneas não finalizadas, aplicado no servidor por enforce_reading_rules() — o assinante precisa terminar (ou remover) uma novela em andamento antes de abrir uma quarta. Um parceiro que queira, por exemplo, avisar “sua base já está no limite” numa tela própria tem esse dado aqui sem precisar hardcodar o número 3.
Client credentials — emitido uma única vez, de forma centralizada, pela Platform API (POST https://api.googa.com.br/v1/oauth2/token, ver aba API Platform). Este domínio (api.novelai.com.br) só valida o token — via a chave pública do projeto Supabase "Platform" — nunca emite um token próprio. Isso evita duplicar a verificação de client_id/client_secret em três projetos Supabase diferentes: o parceiro autentica uma vez, e o mesmo token (com os escopos certos) funciona em qualquer domínio de produto. Ver "Roteamento cross-projeto" em Modelo de autenticação sobre Supabase.
Toda novela que o assinante já abriu, em andamento ou concluída.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Googa Developers","description":"Documentação técnica das APIs da Googa — NovelAI, HistorinhAI e NovelÁudio. Integração via API, SSO, entitlements, billing, webhooks, segurança e LGPD.","colors":{"primary":"#6C63FF","light":"#8B85FF","dark":"#4A42D6"},"logo":{"light":"https://mintcdn.com/googa/57u-aPav27DBtVfv/logo/googa-developers-light.svg?fit=max\u0026auto=format\u0026n=57u-aPav27DBtVfv\u0026q=85\u0026s=e0a6a2555878f598d4b895ecab0626c0","dark":"https://mintcdn.com/googa/57u-aPav27DBtVfv/logo/googa-developers-dark.svg?fit=max\u0026auto=format\u0026n=57u-aPav27DBtVfv\u0026q=85\u0026s=e50f9a3861ec2af103639483e042c04d"},"favicon":"https://mintcdn.com/googa/57u-aPav27DBtVfv/logo/favicon.svg?fit=max\u0026auto=format\u0026n=57u-aPav27DBtVfv\u0026q=85\u0026s=d9042418fb793602eda9ca5cfab1fa4f","footer":{"socials":{"linkedin":"https://www.linkedin.com/company/googa"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"googa","hasAudioNarration":false,"actualSubdomain":"googa","customDomains":["developers.googa.com.br"],"gitSource":{"type":"github","owner":"googa-tech","repo":"googa-developers","deployBranch":"master","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6a875455e849cdeb6400f984","collectionId":"4d9e9a1e-c88d-4710-a739-cc3adf0090b3","liveDeploymentHistoryId":"6a875455e849cdeb6400f984","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6a875455e849cdeb6400f984:success","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"Referência","count":23},{"language":"default","tag":"NovelAI","count":9},{"language":"default","tag":"API Platform","count":9},{"language":"default","tag":"Segurança \u0026 LGPD","count":8},{"language":"default","tag":"NovelÁudio","count":6},{"language":"default","tag":"Guias","count":5},{"language":"default","tag":"Visão geral","count":4},{"language":"default","tag":"Arquitetura \u0026 modelo de dados","count":3},{"language":"default","tag":"HistorinhAI","count":3},{"language":"default","tag":"Privacidade \u0026 LGPD","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante","slug":"/novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante","pageMetadata":{"title":"Progresso de leitura consolidado de um assinante","description":"Uma linha por novela que o assinante já abriu — em andamento ou concluída. Nomeado no singular (`subscriber`, não `subscribers`) para seguir a mesma convenção de `GET /subscriber-status/{id}` na Platform API.\n\n`active_novel_count` nunca passa de `active_novel_limit` (hoje fixo em 3): é o limite de novelas simultâneas não finalizadas, aplicado no servidor por `enforce_reading_rules()` — o assinante precisa terminar (ou remover) uma novela em andamento antes de abrir uma quarta. Um parceiro que queira, por exemplo, avisar \"sua base já está no limite\" numa tela própria tem esse dado aqui sem precisar hardcodar o número 3.","deprecated":null,"version":null,"openapi":"/novelai/openapi.yaml get /subscriber/{id}/reading-progress","href":"/novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Uma linha por novela que o assinante já abriu — em andamento ou concluída. Nomeado no singular (\", _jsx(_components.code, {\n children: \"subscriber\"\n }), \", não \", _jsx(_components.code, {\n children: \"subscribers\"\n }), \") para seguir a mesma convenção de \", _jsx(_components.code, {\n children: \"GET /subscriber-status/{id}\"\n }), \" na Platform API.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"active_novel_count\"\n }), \" nunca passa de \", _jsx(_components.code, {\n children: \"active_novel_limit\"\n }), \" (hoje fixo em 3): é o limite de novelas simultâneas não finalizadas, aplicado no servidor por \", _jsx(_components.code, {\n children: \"enforce_reading_rules()\"\n }), \" — o assinante precisa terminar (ou remover) uma novela em andamento antes de abrir uma quarta. Um parceiro que queira, por exemplo, avisar “sua base já está no limite” numa tela própria tem esse dado aqui sem precisar hardcodar o número 3.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Progresso de leitura consolidado de um assinante","description":"Uma linha por novela que o assinante já abriu — em andamento ou concluída. Nomeado no singular (`subscriber`, não `subscribers`) para seguir a mesma convenção de `GET /subscriber-status/{id}` na Platform API.\n\n`active_novel_count` nunca passa de `active_novel_limit` (hoje fixo em 3): é o limite de novelas simultâneas não finalizadas, aplicado no servidor por `enforce_reading_rules()` — o assinante precisa terminar (ou remover) uma novela em andamento antes de abrir uma quarta. Um parceiro que queira, por exemplo, avisar \"sua base já está no limite\" numa tela própria tem esse dado aqui sem precisar hardcodar o número 3.","deprecated":null,"version":null,"openapi":"/novelai/openapi.yaml get /subscriber/{id}/reading-progress","href":"/novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"getSubscriberReadingProgress","tags":["Progress"],"summary":"Progresso de leitura consolidado de um assinante","description":"Uma linha por novela que o assinante já abriu — em andamento ou concluída. Nomeado no singular (`subscriber`, não `subscribers`) para seguir a mesma convenção de `GET /subscriber-status/{id}` na Platform API.\n\n`active_novel_count` nunca passa de `active_novel_limit` (hoje fixo em 3): é o limite de novelas simultâneas não finalizadas, aplicado no servidor por `enforce_reading_rules()` — o assinante precisa terminar (ou remover) uma novela em andamento antes de abrir uma quarta. Um parceiro que queira, por exemplo, avisar \"sua base já está no limite\" numa tela própria tem esse dado aqui sem precisar hardcodar o número 3.","parameters":["65de92e6-9522-459e-9760-6529bdfbac7d"],"responses":{"200":"2790b2fe-8ef3-4b7b-8ae2-64b267d6754d","401":"2e51e4ea-654a-47c1-9b97-487d4f5501e0","404":"61937bfa-4663-4c02-b72c-d36b8252c8ee"},"method":"get","type":"path","servers":["f303cc12-7330-4b6c-a4ba-64967536b7aa","0cb75b40-9acf-48cd-8da4-5e07e5e19685"],"security":["70f66fb0-118f-4ca1-b98e-5457737f61ad"],"path":"/subscriber/{id}/reading-progress","baseUrlOptions":["https://api.novelai.com.br/v1","https://sandbox.novelai.com.br/v1"],"title":"Progresso de leitura consolidado de um assinante","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"65de92e6-9522-459e-9760-6529bdfbac7d":{"name":"id","in":"path","required":true,"schema":{"type":"string","isRequired":true,"description":"Identificador do assinante no sistema do parceiro.","uniqueKey":"","typeLabel":"string"},"description":"Identificador do assinante no sistema do parceiro."}},"responses":{"2790b2fe-8ef3-4b7b-8ae2-64b267d6754d":{"description":"Progresso consolidado.","content":{"application/json":{"schema":{"type":"object","properties":{"subscriber_id":{"type":"string","uniqueKey":"subscriber_id","typeLabel":"string"},"active_novel_count":{"type":"integer","description":"Novelas em andamento (`finished_at` nulo) agora.","uniqueKey":"active_novel_count","typeLabel":"integer"},"active_novel_limit":{"type":"integer","description":"Limite de novelas simultâneas não finalizadas — hoje fixo em 3, aplicado no servidor.","example":3,"uniqueKey":"active_novel_limit","typeLabel":"integer"},"novels":{"type":"array","items":{"type":"object","properties":{"novel_id":{"type":"string","uniqueKey":"novels.items.[INDEX].novel_id","typeLabel":"string"},"title":{"type":"string","uniqueKey":"novels.items.[INDEX].title","typeLabel":"string"},"started_at":{"type":"string","format":"date-time","uniqueKey":"novels.items.[INDEX].started_at","typeLabel":"string\u003cdate-time>"},"current_chapter":{"type":"integer","description":"Último capítulo em que o assinante salvou a posição de leitura (`reading_progress.current_page`).","uniqueKey":"novels.items.[INDEX].current_chapter","typeLabel":"integer"},"unlocked_chapters":{"type":"integer","description":"Capítulos já liberados para este assinante nesta novela agora.","uniqueKey":"novels.items.[INDEX].unlocked_chapters","typeLabel":"integer"},"total_chapters":{"type":"integer","uniqueKey":"novels.items.[INDEX].total_chapters","typeLabel":"integer"},"finished_at":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"novels.items.[INDEX].finished_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"novels.items.[INDEX].finished_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"novels.items.[INDEX].finished_at","typeLabel":"string\u003cdate-time> | null"},"chosen_choice_id":{"oneOf":[{"type":"string","uniqueKey":"novels.items.[INDEX].chosen_choice_id.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"novels.items.[INDEX].chosen_choice_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"novels.items.[INDEX].chosen_choice_id","typeLabel":"string | null"}},"uniqueKey":"novels.items.[INDEX]","typeLabel":"object"},"description":"Toda novela que o assinante já abriu, em andamento ou concluída.","uniqueKey":"novels","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"subscriber_id":"\u003cstring>","active_novel_count":123,"active_novel_limit":3,"novels":[{"novel_id":"\u003cstring>","title":"\u003cstring>","started_at":"2023-11-07T05:31:56Z","current_chapter":123,"unlocked_chapters":123,"total_chapters":123,"finished_at":"2023-11-07T05:31:56Z","chosen_choice_id":"\u003cstring>"}]}}},"exampleType":"generated"}},"exampleType":"generated"},"2e51e4ea-654a-47c1-9b97-487d4f5501e0":{"description":"Credenciais ausentes, inválidas ou expiradas.","content":{"application/json":{"schema":{"type":"object","description":"Mesmo formato de erro (estilo OAuth2, RFC 6749 §5.2) usado pela Platform API.","properties":{"error":{"type":"string","example":"invalid_request","uniqueKey":"error","typeLabel":"string"},"error_description":{"type":"string","example":"Novela inexistente ou removida do catálogo","uniqueKey":"error_description","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"invalid_request","error_description":"Novela inexistente ou removida do catálogo"}}},"exampleType":"generated"}},"exampleType":"generated"},"61937bfa-4663-4c02-b72c-d36b8252c8ee":{"description":"Assinante nunca visto por este parceiro (nenhum entitlement emitido).","content":{"application/json":{"schema":{"type":"object","description":"Mesmo formato de erro (estilo OAuth2, RFC 6749 §5.2) usado pela Platform API.","properties":{"error":{"type":"string","example":"invalid_request","uniqueKey":"error","typeLabel":"string"},"error_description":{"type":"string","example":"Novela inexistente ou removida do catálogo","uniqueKey":"error_description","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"invalid_request","error_description":"Novela inexistente ou removida do catálogo"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"70f66fb0-118f-4ca1-b98e-5457737f61ad":{"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 aba API Platform). Este domínio (`api.novelai.com.br`) só *valida* o token — via a chave pública do projeto Supabase \"Platform\" — nunca emite um token próprio. Isso evita duplicar a verificação de `client_id`/`client_secret` em três projetos Supabase diferentes: o parceiro autentica uma vez, e o mesmo token (com os escopos certos) funciona em qualquer domínio de produto. Ver \"Roteamento cross-projeto\" em [Modelo de autenticação sobre Supabase](/architecture/supabase-auth-model#partner-gateway-a-camada-que-conecta-as-duas-pontas).","flows":{"clientCredentials":{"tokenUrl":"https://api.googa.com.br/v1/oauth2/token","scopes":{"novelai:catalog:read":"Ler catálogo (novelas e categorias)","novelai:chapters:read":"Ler capítulos e estado de liberação por assinante","novelai:progress:read":"Ler progresso de leitura consolidado por assinante","novelai:choices:read":"Ler finais disponíveis por assinante","novelai:analytics:read":"Ler métricas agregadas de engajamento"}}},"scopes":[]}}},"servers":{"f303cc12-7330-4b6c-a4ba-64967536b7aa":{"url":"https://api.novelai.com.br/v1","description":"Produção (proposto)"},"0cb75b40-9acf-48cd-8da4-5e07e5e19685":{"url":"https://sandbox.novelai.com.br/v1","description":"Sandbox (proposto) — catálogo fictício, sem impacto em billing real"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"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 aba API Platform). Este domínio (`api.novelai.com.br`) só *valida* o token — via a chave pública do projeto Supabase \"Platform\" — nunca emite um token próprio. Isso evita duplicar a verificação de `client_id`/`client_secret` em três projetos Supabase diferentes: o parceiro autentica uma vez, e o mesmo token (com os escopos certos) funciona em qualquer domínio de produto. Ver \"Roteamento cross-projeto\" em [Modelo de autenticação sobre Supabase](/architecture/supabase-auth-model#partner-gateway-a-camada-que-conecta-as-duas-pontas).","flows":{"clientCredentials":{"tokenUrl":"https://api.googa.com.br/v1/oauth2/token","scopes":{"novelai:catalog:read":"Ler catálogo (novelas e categorias)","novelai:chapters:read":"Ler capítulos e estado de liberação por assinante","novelai:progress:read":"Ler progresso de leitura consolidado por assinante","novelai:choices:read":"Ler finais disponíveis por assinante","novelai:analytics:read":"Ler métricas agregadas de engajamento"}}},"scopes":[]},"schema":{"title":"OAuth2 Auth","type":"string","isRequired":true,"description":"Client credentials — emitido **uma única vez**, de forma centralizada, pela Platform API (`POST https://api.googa.com.br/v1/oauth2/token`, ver aba API Platform). Este domínio (`api.novelai.com.br`) só *valida* o token — via a chave pública do projeto Supabase \"Platform\" — nunca emite um token próprio. Isso evita duplicar a verificação de `client_id`/`client_secret` em três projetos Supabase diferentes: o parceiro autentica uma vez, e o mesmo token (com os escopos certos) funciona em qualquer domínio de produto. Ver \"Roteamento cross-projeto\" em [Modelo de autenticação sobre Supabase](/architecture/supabase-auth-model#partner-gateway-a-camada-que-conecta-as-duas-pontas).","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"partnerOAuth2","name":"Authorization"}],"title":"partnerOAuth2"}]},"originalFileLocation":"novelai/openapi.yaml"},"subdomain":"googa","siteName":"Googa Developers","title":"Progresso de leitura consolidado de um assinante - Googa Developers","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-08-03T21:36:40.399Z","originalFileLocation":"novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Uma linha por novela que o assinante já abriu — em andamento ou concluída. Nomeado no singular (subscriber, não subscribers) para seguir a mesma convenção de GET /subscriber-status/{id} na Platform API. active_novel_count nunca passa de active_novel_limit (hoje fixo em 3): é o limite de novelas simultâneas não finalizadas, aplicado no servidor por enforce_reading_rules() — o assinante precisa terminar (ou remover) uma novela em andamento antes de abrir uma quarta. Um parceiro que queira, por exemplo, avisar \u0026quot;sua base já está no limite\u0026quot; numa tela própria tem esse dado aqui sem precisar hardcodar o número 3.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Googa Developers\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/googa/P93VhvFgH0upO3di/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/googa/P93VhvFgH0upO3di/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/googa/P93VhvFgH0upO3di/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/googa/P93VhvFgH0upO3di/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/googa/P93VhvFgH0upO3di/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/googa/P93VhvFgH0upO3di/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/googa/P93VhvFgH0upO3di/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/googa/P93VhvFgH0upO3di/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/googa/P93VhvFgH0upO3di/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Progresso de leitura consolidado de um assinante - Googa Developers\">\u003cmeta data-mint-head property=\"og:description\" content=\"Uma linha por novela que o assinante já abriu — em andamento ou concluída. Nomeado no singular (subscriber, não subscribers) para seguir a mesma convenção de GET /subscriber-status/{id} na Platform API. active_novel_count nunca passa de active_novel_limit (hoje fixo em 3): é o limite de novelas simultâneas não finalizadas, aplicado no servidor por enforce_reading_rules() — o assinante precisa terminar (ou remover) uma novela em andamento antes de abrir uma quarta. Um parceiro que queira, por exemplo, avisar \u0026quot;sua base já está no limite\u0026quot; numa tela própria tem esse dado aqui sem precisar hardcodar o número 3.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Googa Developers\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://developers.googa.com.br/novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://googa.mintlify.app/_mintlify/api/og/v2?division=Progress\u0026amp;title=Progresso+de+leitura+consolidado+de+um+assinante\u0026amp;description=Uma+linha+por+novela+que+o+assinante+j%C3%A1+abriu+%E2%80%94+em+andamento+ou+conclu%C3%ADda.+Nomeado+no+singular+%28%60subscriber%60%2C+n%C3%A3o+%60subscribers%60%29+para+seguir+a+mesma+conven%C3%A7%C3%A3o+d\u0026amp;theme=fcf602f6cc84fd27c8bf85fd\u0026amp;signature=03f903f63c62d4d8ab431380a327c08088365c5ee2ec2100f2519523ca76c8f0\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Progresso de leitura consolidado de um assinante - Googa Developers\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Uma linha por novela que o assinante já abriu — em andamento ou concluída. Nomeado no singular (subscriber, não subscribers) para seguir a mesma convenção de GET /subscriber-status/{id} na Platform API. active_novel_count nunca passa de active_novel_limit (hoje fixo em 3): é o limite de novelas simultâneas não finalizadas, aplicado no servidor por enforce_reading_rules() — o assinante precisa terminar (ou remover) uma novela em andamento antes de abrir uma quarta. Um parceiro que queira, por exemplo, avisar \u0026quot;sua base já está no limite\u0026quot; numa tela própria tem esse dado aqui sem precisar hardcodar o número 3.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://googa.mintlify.app/_mintlify/api/og/v2?division=Progress\u0026amp;title=Progresso+de+leitura+consolidado+de+um+assinante\u0026amp;description=Uma+linha+por+novela+que+o+assinante+j%C3%A1+abriu+%E2%80%94+em+andamento+ou+conclu%C3%ADda.+Nomeado+no+singular+%28%60subscriber%60%2C+n%C3%A3o+%60subscribers%60%29+para+seguir+a+mesma+conven%C3%A7%C3%A3o+d\u0026amp;theme=fcf602f6cc84fd27c8bf85fd\u0026amp;signature=03f903f63c62d4d8ab431380a327c08088365c5ee2ec2100f2519523ca76c8f0\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/googa/P93VhvFgH0upO3di/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Googa Developers\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#6C63FF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://developers.googa.com.br/novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://developers.googa.com.br/#organization\",\"name\":\"Googa Developers\",\"url\":\"https://developers.googa.com.br\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/googa/57u-aPav27DBtVfv/logo/googa-developers-light.svg?fit=max\u0026auto=format\u0026n=57u-aPav27DBtVfv\u0026q=85\u0026s=e0a6a2555878f598d4b895ecab0626c0\"}},{\"@type\":\"WebSite\",\"@id\":\"https://developers.googa.com.br#website\",\"name\":\"Googa Developers\",\"url\":\"https://developers.googa.com.br\",\"publisher\":{\"@id\":\"https://developers.googa.com.br/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://developers.googa.com.br/novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante#webpage\",\"url\":\"https://developers.googa.com.br/novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante\",\"name\":\"Progresso de leitura consolidado de um assinante\",\"description\":\"Uma linha por novela que o assinante já abriu — em andamento ou concluída. Nomeado no singular (subscriber, não subscribers) para seguir a mesma convenção de GET /subscriber-status/{id} na Platform API. active_novel_count nunca passa de active_novel_limit (hoje fixo em 3): é o limite de novelas simultâneas não finalizadas, aplicado no servidor por enforce_reading_rules() — o assinante precisa terminar (ou remover) uma novela em andamento antes de abrir uma quarta. Um parceiro que queira, por exemplo, avisar \\\"sua base já está no limite\\\" numa tela própria tem esse dado aqui sem precisar hardcodar o número 3.\",\"dateModified\":\"2026-08-03T21:36:40.399Z\",\"isPartOf\":{\"@id\":\"https://developers.googa.com.br#website\"},\"breadcrumb\":{\"@id\":\"https://developers.googa.com.br/novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://developers.googa.com.br/novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Referência\",\"item\":\"https://developers.googa.com.br/novelai/reference/catalog/lista-as-categoriasg%C3%AAneros-do-cat%C3%A1logo\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Progresso de leitura consolidado de um assinante\",\"item\":\"https://developers.googa.com.br/novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://developers.googa.com.br/novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante#apireference\",\"headline\":\"Progresso de leitura consolidado de um assinante\",\"name\":\"Progresso de leitura consolidado de um assinante\",\"description\":\"Uma linha por novela que o assinante já abriu — em andamento ou concluída. Nomeado no singular (subscriber, não subscribers) para seguir a mesma convenção de GET /subscriber-status/{id} na Platform API. active_novel_count nunca passa de active_novel_limit (hoje fixo em 3): é o limite de novelas simultâneas não finalizadas, aplicado no servidor por enforce_reading_rules() — o assinante precisa terminar (ou remover) uma novela em andamento antes de abrir uma quarta. Um parceiro que queira, por exemplo, avisar \\\"sua base já está no limite\\\" numa tela própria tem esse dado aqui sem precisar hardcodar o número 3.\",\"url\":\"https://developers.googa.com.br/novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante\",\"mainEntityOfPage\":{\"@id\":\"https://developers.googa.com.br/novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante#webpage\"},\"dateModified\":\"2026-08-03T21:36:40.399Z\",\"publisher\":{\"@id\":\"https://developers.googa.com.br/#organization\"},\"isPartOf\":{\"@id\":\"https://developers.googa.com.br#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Googa Developers\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Googa Developers","nav":{"global":null,"tabs":[{"tab":"Guias","pages":[{"title":"Guias","href":""}]},{"tab":"API Platform","pages":[{"title":"API Platform","href":"/platform/overview"}]},{"tab":"HistorinhAI","pages":[{"title":"HistorinhAI","href":"/historinhai/overview"}]},{"tab":"NovelAI","groups":[{"group":"Visão geral","pages":[{"title":"NovelAI API — visão geral","href":"/novelai/overview"}]},{"group":"Referência","pages":[{"group":"Catalog","pages":[{"title":"Lista as categorias/gêneros do catálogo","deprecated":null,"version":null,"openapi":"/novelai/openapi.yaml get /categories","href":"/novelai/reference/catalog/lista-as-categoriasgêneros-do-catálogo"},{"title":"Lista o catálogo de novelas","deprecated":null,"version":null,"openapi":"/novelai/openapi.yaml get /novels","href":"/novelai/reference/catalog/lista-o-catálogo-de-novelas"},{"title":"Detalhe de uma novela","deprecated":null,"version":null,"openapi":"/novelai/openapi.yaml get /novels/{id}","href":"/novelai/reference/catalog/detalhe-de-uma-novela"}]},{"group":"Chapters","pages":[{"title":"Lista os capítulos de uma novela e, opcionalmente, o estado de liberação para um assinante","deprecated":null,"version":null,"openapi":"/novelai/openapi.yaml get /novels/{id}/chapters","href":"/novelai/reference/chapters/lista-os-capítulos-de-uma-novela-e-opcionalmente-o-estado-de-liberação-para-um-assinante"}]},{"group":"Choices","pages":[{"title":"Finais disponíveis de uma novela para um assinante","description":"Os finais só existem, do ponto de vista de conteúdo, quando o drip libera o último capítulo **para aquele assinante especificamente** — é por isso que `subscriber_id` é obrigatório aqui (diferente de `GET /novels/{id}/chapters`, onde é opcional): não há metadado de finais que possa ser mostrado sem gate, porque o próprio rótulo (`label`) de um final pode ser espoiler. Enquanto o assinante não chegou lá, a resposta é `200` com `available: false` e `choices` vazio — não é um erro, é um estado de negócio normal (a maior parte das chamadas a este endpoint vai cair aqui, para qualquer novela ainda em andamento).","deprecated":null,"version":null,"openapi":"/novelai/openapi.yaml get /novels/{id}/choices","href":"/novelai/reference/choices/finais-disponíveis-de-uma-novela-para-um-assinante"}]},{"group":"Progress","pages":[{"title":"Progresso de leitura consolidado de um assinante","deprecated":null,"version":null,"openapi":"/novelai/openapi.yaml get /subscriber/{id}/reading-progress","href":"/novelai/reference/progress/progresso-de-leitura-consolidado-de-um-assinante"}]},{"group":"Analytics","pages":[{"title":"Métricas agregadas de engajamento de leitura, por parceiro e período","description":"Suporte aos indicadores prometidos na proposta (DAU/MAU do ritual diário, take-rate, retenção) — sempre agregado ao nível do parceiro, nunca por assinante. Nenhuma resposta desta rota inclui `subscriber_id` em nenhum nível; ver [Privacidade \u0026 LGPD](/security/lgpd) para o racional.\n\n**Pré-requisito ainda não desenhado em outra página:** para calcular qualquer coisa \"por parceiro\", as tabelas de leitura (`reading_progress` e afins) precisam de uma coluna `partner_id` — hoje elas não distinguem um leitor que entrou pelo app oficial de um que entrou via SSO de um parceiro. Isso é mencionado como necessidade genérica em [Isolamento multi-tenant](/architecture/supabase-auth-model#capacidades-nativas-do-supabase), mas o backfill/migração real dessa coluna não está feito nem desenhado em detalhe — este endpoint está, portanto, mais atrás no roadmap do que os demais desta especificação, que só precisam do `subscriber_id` já resolvido pela Platform API.\n\n`ending_distribution` omite qualquer combinação novela/final com menos de `minimum_cohort_size` leitores no período — supressão de cohort pequeno para reduzir risco de reidentificação, não um limite arbitrário de exibição.","deprecated":null,"version":null,"openapi":"/novelai/openapi.yaml get /analytics/engagement","href":"/novelai/reference/analytics/métricas-agregadas-de-engajamento-de-leitura-por-parceiro-e-período"}]},{"group":"API Reference","pages":[{"title":"Novelfinished","version":null,"deprecated":null,"openapi":"/novelai/openapi.yaml webhook novelFinished","href":"/novelai/reference/novelfinished"}]}]}]},{"tab":"NovelÁudio","pages":[{"title":"NovelÁudio","href":"/novelaudio/overview"}]},{"tab":"Segurança \u0026 LGPD","pages":[{"title":"Segurança \u0026 LGPD","href":"/security/overview"}]}]},"title":"Progresso de leitura consolidado de um assinante - Googa Developers","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-26-lDe7V.js","utils-CWQmgYtH.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-4-Aw3rSD.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-C2zjXYA5.js","snippetPresets-DFmpFA7C.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-FJpQavWq.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-D_GvPF7k.js","shallow-Bs2ZB0NO.js","getApiPlaygroundDisplay-DCcqJJk-.js","CodeSnippet-DzDxawVe.js","CodeSnippets-aUr7fU-7.js","Page-CT9uE8Ip.js","getPastedJson-Y1fKsj_I.js","icon-DI4zTsDr.js","MethodPill-C0nDlmSQ.js","DuplicateIcon-NUXbx2nQ.js","createIcon-BdTHrPAi.js","DynamicMarkdown-CtpgKJwj.js","SectionHeading-B3x35tOt.js","axios-vUo_bRtp.js","Markdown-3OmurJMP.js","clsx-DMKzROTp.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-1ms6tsT-.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-Ke9xIMFx.js"]}