Inventory + probe the 123 UNMAPPED live RPCs from the registry capture (71 consumer-callable)
Summary
A live capture of NotebookLM's RPC-id registry (scripts/capture_rpc_registry.py, run 2026-08-31 against bl=boq_labs-tailwind-frontend) parsed 171 registrations. All 48 ids then in rpc/types.py were CONFIRMED (0 ABSENT, 0 PRESENT-UNPARSED), and every -> Method annotation matched the live bundle exactly.
It also surfaced 123 UNMAPPED live RPCs — declared by the frontend, not exposed by this client. This issue inventories them, prioritises the consumer-callable subset, and tracks live probing on both front doors (web batchexecute and the native Android gRPC channel, which serve the same LabsTailwindOrchestrationService).
Status (2026-09-01): probing is complete — 53 of the 71 consumer-callable ids were live-probed, the remaining 18 are mutating / write-only / realtime and were deliberately left alone. 8 ids shipped as public API (#2291, #2299, #2300), three defects it uncovered are fixed (#2284, #2289, #2290), and the residual follow-ups are listed in comment 8. A strict re-parse of the same bundle found 16 more registrations the scraper dropped (#2289, fixed in #2295), and a walk of the lazy modules found 4 more it still cannot see; the useful ones are probed in comments 4 and 6.
Buckets:
| Bucket | Count | Status |
|---|---|---|
consumer backend (LabsTailwind*) — callable on our cohort, just unexposed |
71 | probed; see comments 2–8 |
| enterprise (Discovery Engine / Agentspace) — VPC-SC-gated | 38 | out of scope, not consumer-callable |
| other / unclassified | 14 | mostly telemetry + promotions |
Consumer-callable inventory (71) — with final disposition
Legend: ✅ works · shipped · gated for this cohort · ⚰️ dead / stub / unimplemented · streaming transport only · ❓ shape unresolved · ⏸️ not probed (mutating)
Sources & upload (10) — comment 2
X1snv AddSourcesAsync #2291 sources.add_urls_async() both front doors (the "impersonation policy" block was the web finalize path with an Android bearer)
QsNTEd AppendSource #2291 sources.append_text()
Z8UXi CopySources ⚰️ dead sync twin — R27wvc CopySourcesAsync (from the #2289 set) shipped instead as sources.copy()
dtT1F BatchRefreshSources ✅ accepted on both tiers; candidate replacement for the rejected FLmJqe (#2296 follow-up)
NYrLZ CreateFailedSource 16 on web; not tried natively
bfVDO PollSourceDiscoveryStatus ⚰️ 13 INTERNAL on both transports, incl. with runs in flight
NJVyMd GetDriveSourceStatus ⚰️ 12 UNIMPLEMENTED on both front doors
PBKZtb GetDriveFile ❓ two required strings; NOT_FOUND for every consumer id pairing (not the auth tier)
szZSpe UploadFile ✅ works natively, mutating — redundant with the shipped Scotty upload path; do not model
tKY5Tb RecordNotebookEntrySource ⚰️ 12 UNIMPLEMENTED on both front doorsArtifacts & studio (15) — comment 3
ExHMqd ActOnArtifactStreamed v1 path only
zVGIdd CopyArtifacts ⚰️ no-op stub — accepts garbage, copies nothing; never model
mKDdke CopyArtifactsAsync #2291 artifacts.copy()
AHyHrd CreateAudioOverview ❓ uniform 3; enterprise-switch reference only
sJDbic DeleteAudioOverview ❓ DATA [] on [artifact_id], unverified
VUsiyb GetAudioOverview ✅ [notebook_id] — notebook-scoped
f3dkp GenerateTableArtifact ❓ arg 1 is looked up but is not the notebook id
sqTeoe GetArtifactCustomizationChoices #2291 artifacts.get_customization_choices(); account-level; #2284 tripwire replaced
sODAg GetArtifactDeferredGenerationQuota 7 on the empty request
ulBSjf GetArtifactUserState ✅ [ctx, artifact_id]
Fxmvse UpsertArtifactUserState ✅ round-trip verified
hRBcub UpdateArtifactPlan ❓ envelope known; repeated-item field number open
SHTSY SuggestArtifacts ✅ Android-only ("watch next" suggestions); web 16
nRZAQd ExecuteDeferredGeneration 7 on the empty request
XgrPMd CancelGeneration ✅ chat-stream cancel keyed on the stream's clientType=WEB; not gated (earlier "7" was an artifact id at f2)Magic view / knowledge index (5) — comment 7
uK8f7c GenerateMagicView launch gate — 3 before validation on both transports; experiment flag 45701857 false on all profiles
rtY7md GetMagicView ✅ served; 5 NOT_FOUND = nothing generated yet
XpqOp GetMagicIndex reclassified: internal, dormant — always []
nmltpc GenerateKnowledgeTree reclassified: internal — web 16, Android 3
Tuchcd IndexKnowledge reclassified: internal — web 16, Android no-op ackThis is the surface behind MagicArtifactType in _types/enums.py. Park all five; the "Magic Index" UI is the label organiser already shipped as agX4Bc.
Chat & query (4, + 3 recovered via #2289) — comment 4
laWbsf GenerateFreeFormStreamed ours — streaming (`_.eC`), v1 path only; full web field map in comment 4
oXwmh GetChatSessionStatus ✅ live generation signal keyed on the chat session id (1 idle / 2 generating)
VVafVb GetQueryFocussedContent reachable, looked up, empty everywhere; dormant
likKIe ExecuteWritingFunction ⚰️ 12 on both transports
OcvKNc* NextStepSuggestions #2291 notebooks.suggest_next_steps()
WJkjP* GetSuggestedArtifactFromChat reachable, always []; wants a turn reference
itA0pc* GuidebookGenerateAnswer ⚰️ 12; re-probe on cohort changeRealtime audio / Interactive Mode (2) — comment 7
Of0kDd GetIceConfig ⏸️
eyWvXc SendSdpOffer ⏸️Research (2) — comment 6
Es3dTe DiscoverSources #2299 research.discover() — sync discovery that also records a job
E1lmYc UpdateDiscoverSourcesStatus ✅ [ctx?, msg, job_id, 4|5|6]; 5 = finished-nothing-imported, 6 = imported; not yet shippedDiscovery, search & featured (11) — comment 6
GtGWLe ListProjects 9 FAILED_PRECONDITION
hdU2Oe SearchAllNotebooks 7 — shape [query]
iSSZ9e DiscoveryService.SearchNotebooks 7 — shape [query]
AX2G1c ComputeTailwindRecommendations ⚰️ 13 on every shape
ub2Bae ListFeaturedProjects ✅ [] — params ignored
DemIHe UpdateFeaturedNotebookStatus ⏸️ builder shape [notebook_id, bool]
einaIc UpdateOnlineProjectRankingSignalsAsync ⏸️
Hq716e ListAvailableContent reachable, []
mVtEUb ListExpertIntelligenceContent #2300 — Google Play Books library; sources.list_play_books() / add_play_book() (Android add → #2302)
fEkck AnalyzeNotebook ⏸️
AUrzMb GetProjectAnalytics reachable, [] — [project_id]Notebook cosmetics (3) — comment 7
U4KVxb AddCustomNotebookImage ⏸️
diF09c AddCustomNotebookImageAsync ⏸️
wgK8N GenerateNotebookTitleCard ⏸️Account, quota & user state (11) — comment 5
SatQRc GetAccount ✅ [] — side-effect-free twin of ZwVcOc; carries the credit-meter flag Si
gzAChb GetQuota ✅ [ctx] — the enforced per-feature namespace, but no counters (-1 / unset even when exhausted)
EylDcb ListQuotaSummary ✅ [ctx] — tier-invariant credit price list over two windows; meter off (Si=false), not accruing
EnujNd ListModelOptions reachable, [] — model picker not offered to this cohort
shTref GetUserAppState reachable, []
lA7CIe UpdateUserProfile ⏸️
LQhfEb UpdateProjectUserState ⏸️ builder shape [ctx, project_id, state, mask?]
J1DK9e BatchGetProjectUserActivities ❓ uniform 3
preRPe GenerateAccessToken 16 — the Drive OAuth consent gap; the only genuine credential wall in the inventory
r7Krzb AddWaitlist ⏸️
ANxkT CheckWaitlist 9Sharing (4) — comment 7
n3dkHd CreateAccessRequest ⏸️ builder shape [project_id, None, enum, ctx@f4]
bLZXde ShareArtifact ⏸️ probably the generic successor to RGP97b ShareAudio — needs a UI capture
OTl0K ShareGuidebook ⏸️
LJyzeb GetGuidebookDetails ❓ 3 / 13Telemetry & feedback (4) — comment 7
VdOUQc LogInteractionEvent ⏸️
uNyJKe SubmitFeedback ⏸️
OmVMXc ReportContent ⏸️
CJHszf RecordTransparencyNotice ⏸️* = from the 16 registrations the scraper had dropped (#2289). Four more exist only in lazy module DR4Ugf and are still invisible to the scraper: ASU5Oe RetrieveRelevantChunks (✅ works — semantic chunk retrieval, the best unshipped surface), pGjVxd, Iiyueb, eNlMuc — comment 6 §7.
The two open questions — both answered
GtGWLe ListProjectsvswXbhsf ListRecentlyViewedProjects.GtGWLeparses but is gated (9). The question was settled another way: on a 75-notebook accountwXbhsfwithinclude_own_projects = 1returns 75/75 in one unpaginated call — the union of all three ListNotebooks methods (wXbhsf,fprTef,rBs0R) — whileinclude_own_projects = 0returns 0 rows. It is the full owned set, not a truncated recents list; keep it (the alternatives are paginated at 20 and drop the embedded source counts). Comment 6 §6.mVtEUb ListExpertIntelligenceContent. It is the producer forSourceType.EXPERT_INTELLIGENCE(code 20): the account's Google Play Books library, addable as sources via anExpertIntelligenceContentspec on the ordinaryAddSourcespath. Verified end to end and shipped in #2300;SourceType20 is now live-observed. Comment 6 §1.
Probing methodology
Read-only probes freely; mutators only with empty requests, well-formed nonexistent ids, or on throwaway scratch notebooks with every effect verified by re-listing. The gRPC status is the signal, calibrated against mapped RPCs (full calibration and the six traps that produced false readings are in comment 1):
| Signal | Meaning |
|---|---|
DATA |
request converted and the handler answered |
code 3 INVALID_ARGUMENT |
structural refusal (field absent / wrong type / wrong nesting) — or a launch gate refusing before validation |
code 5 NOT_FOUND |
request validated, entity lookup failed — proves the shape |
| code 7 / 9 | parsed, then refused at authorization level — cohort gating (vary the id first: XgrPMd's 7 was "not your session") |
| code 12 / 13 / 16 | the service answered — a backend verdict, not a routing one. Web 16 is usually a front-door restriction that the native Android channel does not have |
| HTTP 400 | id not routable from this frontend — the only "not served here" signal |
| HTTP 500 | streaming-family id (_.eC) over the unary envelope — needs the v1 path |
Where the web ladder stalls, the same service is probed over Android gRPC with individual field tags (the "mobile tag oracle"), and where the 1.55.10 APK declares the message (docs/android/schema.proto, #2301) the shape is read from there first.
Live results are consolidated by bucket in comments 1–7, with the overall disposition, corrections log, and remaining follow-ups in comment 8.
Source: teng-lin/notebooklm-py