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

  1. Refresh auth/session (login again) and retry the create command.
  2. Retry with a simple ASCII title and the default emoji to rule out payload issues.
  3. Check whether the notebook was actually created in the NotebookLM web UI despite the parse failure.
  4. 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

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


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/6b1c137fa7ecb316. Report an issue: GitHub.