{"record":{"id":"6b1c137fa7ecb316","repo":"jackwener/OpenCLI","slug":"notebooklm-createproject-rpc-returned-no-notebook","errorCode":null,"errorMessage":"NotebookLM CreateProject RPC returned no notebook id","messagePattern":"NotebookLM CreateProject RPC returned no notebook id","errorType":"exception","errorClass":"CommandExecutionError","httpStatus":null,"severity":"error","filePath":"clis/notebooklm/create.js","lineNumber":64,"sourceCode":"    strategy: Strategy.COOKIE,\n    browser: true,\n    navigateBefore: false,\n    args: [\n        { name: 'title', positional: true, required: true, help: 'Notebook title (1-200 chars)' },\n        { name: 'emoji', help: `Notebook emoji icon (default ${DEFAULT_EMOJI})` },\n        { name: 'execute', type: 'boolean', help: 'Actually create the remote NotebookLM notebook' },\n    ],\n    columns: ['id', 'title', 'emoji', 'url'],\n    func: async (page, kwargs) => {\n        const title = parseCreateTitle(kwargs.title);\n        const emoji = parseCreateEmoji(kwargs.emoji);\n        requireNotebooklmExecute(kwargs.execute, 'create a NotebookLM notebook');\n        await ensureNotebooklmHome(page);\n        await requireNotebooklmSession(page);\n        const rpc = await callNotebooklmRpc(page, NOTEBOOKLM_CREATE_PROJECT_RPC_ID, [title, emoji]);\n        const notebookId = parseCreateProjectResult(rpc.result);\n        if (!notebookId) {\n            throw new CommandExecutionError('NotebookLM CreateProject RPC returned no notebook id');\n        }\n        await verifyNotebooklmNotebookExists(page, notebookId, 'create');\n        return [{\n            id: notebookId,\n            title,\n            emoji,\n            url: buildNotebooklmNotebookUrl(notebookId),\n        }];\n    },\n});\n\nexport const __test__ = { parseCreateTitle, parseCreateEmoji, parseCreateProjectResult };\n","sourceCodeStart":46,"sourceCodeEnd":77,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/notebooklm/create.js#L46-L77","documentation":"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.","triggerScenarios":"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.","commonSituations":"Unauthenticated/stale session causing silent backend rejection; hitting NotebookLM quota; Google changed the CreateProject response format; invalid emoji causing backend rejection.","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."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  const nb = await create(title, emoji);\n} catch (e) {\n  if (String(e.message).includes('CreateProject RPC returned no notebook id')) {\n    await refreshSession();\n    return create(title, '📒'); // retry with safe defaults\n  }\n  throw e;\n}","preventionTips":["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)."],"tags":["rpc","notebooklm","response-parsing"],"backgroundTag":"rpc-response-missing-field","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}