jackwener/OpenCLI · error · CommandExecutionError
NotebookLM CreateProject RPC returned no notebook id
Error message
NotebookLM CreateProject RPC returned no notebook id
What it means
After issuing the NotebookLM CreateProject RPC with [title, emoji], the library parses the response for the new notebook id. If no id can be extracted it throws this CommandExecutionError, since everything downstream (verification, returned rows) depends on the notebook id.
Source
Thrown at clis/notebooklm/create.js:64
strategy: Strategy.COOKIE,
browser: true,
navigateBefore: false,
args: [
{ name: 'title', positional: true, required: true, help: 'Notebook title (1-200 chars)' },
{ name: 'emoji', help: `Notebook emoji icon (default ${DEFAULT_EMOJI})` },
{ name: 'execute', type: 'boolean', help: 'Actually create the remote NotebookLM notebook' },
],
columns: ['id', 'title', 'emoji', 'url'],
func: async (page, kwargs) => {
const title = parseCreateTitle(kwargs.title);
const emoji = parseCreateEmoji(kwargs.emoji);
requireNotebooklmExecute(kwargs.execute, 'create a NotebookLM notebook');
await ensureNotebooklmHome(page);
await requireNotebooklmSession(page);
const rpc = await callNotebooklmRpc(page, NOTEBOOKLM_CREATE_PROJECT_RPC_ID, [title, emoji]);
const notebookId = parseCreateProjectResult(rpc.result);
if (!notebookId) {
throw new CommandExecutionError('NotebookLM CreateProject RPC returned no notebook id');
}
await verifyNotebooklmNotebookExists(page, notebookId, 'create');
return [{
id: notebookId,
title,
emoji,
url: buildNotebooklmNotebookUrl(notebookId),
}];
},
});
export const __test__ = { parseCreateTitle, parseCreateEmoji, parseCreateProjectResult };
View on GitHub (pinned to 49907e53dc)
Solutions
- Refresh auth/session (login again) and retry the create command.
- Retry with a simple ASCII title and the default emoji to rule out payload issues.
- Check whether the notebook was actually created in the NotebookLM web UI despite the parse failure.
- Log the raw rpc.result; if the schema changed, update the library's parseCreateProjectResult.
Defensive patterns
Strategy: try-catch
Try / catch
try {
const nb = await create(title, emoji);
} catch (e) {
if (String(e.message).includes('CreateProject RPC returned no notebook id')) {
await refreshSession();
return create(title, '📒'); // retry with safe defaults
}
throw e;
} Prevention
- Refresh auth before batch create operations.
- Use plain ASCII titles and the default emoji when debugging.
- Verify in the web UI whether the notebook was created despite the error before retrying (avoid duplicates).
When it happens
Trigger: Calling `create <title> [emoji]` where the CreateProject RPC responds without a parseable notebook id — e.g. an error payload, a rate-limit response, or a schema change.
Common situations: Unauthenticated/stale session causing silent backend rejection; hitting NotebookLM quota; Google changed the CreateProject response format; invalid emoji causing backend rejection.
Related errors
- NotebookLM AddSources RPC returned no source id; verify the
- NotebookLM AddFileSource (o4cbdc) RPC returned no source id;
- NotebookLM CreateAudioOverview RPC returned no audio id; ser
- NotebookLM CreateArtifact (slides) RPC returned no slide-dec
- NotebookLM RPC returned auth error (${errorCode})
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/6b1c137fa7ecb316.
Report an issue: GitHub.