[0.8.2] - 2026-09-02
The headline of this release is the new Android backend. The Python SDK, CLI,
MCP server, and REST server can now use NotebookLM's native mobile API as an
alternative to the Web backend. Install the android extra and select it with
backend="android", --backend android, or NOTEBOOKLM_BACKEND=android.
The Web backend remains the default. All eleven public API namespaces are
available, and Android operations no longer fall back to the Web transport. See
the installation and
configuration guides
(#2269, #2281).
Why choose it? The Android transport talks directly to NotebookLM's native gRPC
service, using short-lived OAuth bearer tokens minted on demand from a stored
master token. This avoids the Web backend's expiring browser-cookie sessions,
frontend build labels, obfuscated RPC IDs, and positional batchexecute
responses. It can therefore be a better fit for unattended CI, containers, and
long-running services, while also providing an independent route when a Web UI
change disrupts automation. The tradeoff is that a durable master token is a
more powerful credential than a cookie snapshot; use a dedicated account and
protect it carefully. Both backends rely on undocumented Google APIs and may
change without notice.
Added
- Added chat generation status and cancellation on both backends.
client.chat.session_status()reports the active session state, while
client.chat.cancel()idempotently stops the selected or latest session.
MCP users can cancel a detached chat task withchat_canceland inspect live
session state throughchat_status(#2306). - Added
notebooklm copy <title>as a CLI entry point for copying a notebook
with its sources and Studio artifacts on either backend. It accepts a partial
or active notebook ID,--useselects the new copy, and--jsonreturns
structured output (#2308). - Added ranked passage search on both backends through
sources.search(notebook_id, query, source_ids=..., limit=...)and
notebooklm source search. Results include the source, text, rank, and
source-relative span, and can be filtered to selected sources
(#2305, #2307). - Added Google Play Books sources on both backends. Use
sources.list_play_books()andsources.add_play_book(),
notebooklm source books/source add-book, or the corresponding MCP
tools to add eligible books from your library. Availability follows
NotebookLM's account and region restrictions (#2300, #2304). - Added
research.discover()andnotebooklm research discoveron both
backends for a single-call "Discover sources" workflow. It returns ranked
sources and an overview immediately, while preserving a task ID for later
import (#2299). - Added source and artifact workflow helpers on both backends: non-blocking URL
batches, appending text to a source, copying sources or artifacts, fetching
Studio customization choices, and requesting grounded next-step suggestions.
These are also available through the corresponding CLI commands (#2291). - Added
chat_startandchat_statusMCP tools for chat generations that
may outlast a remote connector's request timeout. Requests queue when the
configurable concurrency limit is reached, andchat_statuscan poll
multiple task IDs at once (#2286). - Added source-type recognition for Gemini chats, Excel, Gmail, AI Mode chats,
Google Play Books, and general Google Drive files (#2282, #2300).
Changed
- Release and nightly compatibility testing now runs the complete 15-cell
matrix: Ubuntu, macOS, and Windows across Python 3.10 through 3.14. Browser,
coverage, repository-lint, and live-E2E work remains in dedicated lanes. - Compatibility note: backend source type code
14now reports
SourceType.GOOGLE_DRIVEinstead ofGOOGLE_SPREADSHEET. Native Google
Sheets continue to reportSourceType.GOOGLE_SPREADSHEETthrough code7
(#2281). - The
cookiesextra now uses the maintainedrookie-cookiespackage instead
ofrookiepy. This supports Python 3.13+ as well as extracting cookies on
Windows for Chrome, Edge, Brave, and other Chromium-based browsers (#2162).
Fixed
- Android gRPC
PERMISSION_DENIEDresponses now surface as client request
failures rather than authentication failures, matching the Web backend and
avoiding misleading re-authentication guidance for operation-level refusals. - Web chat now identifies payload-free terminal streams as quota exhaustion,
matching the Android backend's explicitRESOURCE_EXHAUSTEDresult for the
same account state. CLI, MCP, and REST callers now receive a retriable
rate-limit error instead of a non-retriable generic chat failure. - The public API compatibility audit now treats a previously uninspectable
baseline signature as unknown rather than a breaking change. This prevents
false release failures on Python 3.14 while still rejecting regressions that
make a previously inspectable signature unavailable. - Credential redaction now recognizes current
AQ.-prefixed Google
authorization keys in runtime logs, exception previews, and cassette
fixtures, alongside legacyAIzakeys (#2254). - The RPC health canary no longer treats an account-dependent omission of the
dedicated Cinematic row from Studio customization choices as removal of
VideoFormat.CINEMATIC. Wire format 3 remains supported, while unknown codes
and missing ordinary format choices still report drift (#2313). - Write operations no longer report success when NotebookLM actually rejected
the request. This covers source refresh and rename, notebook and chat
updates, sharing changes, note, label, and collection mutations, and artifact
rename, export, and mind-map generation (#2296). - Android
sources.get_guide()now accepts the server's valid unlabelled
response on repeated reads. Missing or not-yet-summarized sources also match
Web behavior forget_guide()andcheck_freshness()instead of raising a
false not-found error (#2277, #2280). - Android file uploads now always perform one status check before timing out
when given a positive wait timeout, so a ready or failed source is not
misreported as an indeterminate timeout (#2294). - Interactive login now tolerates interrupted navigation during Google's
sign-in flow and gives actionable fallback guidance after repeated failures.
Browser-cookie import also handles millisecond or microsecond expiry values
and Firefox session cookies correctly (#2260, #2252). - Fixed evaluation of public method annotations on Python 3.14 when a class
method shadows a builtin type name (#2268).