{"record":{"id":"eab3b89c4af0d955","repo":"calcom/cal.diy","slug":"something-went-wrong-unable-to-get-transcription","errorCode":null,"errorMessage":"Something went wrong! Unable to get transcription access link","messagePattern":"Something went wrong! Unable to get transcription access link","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/app-store/dailyvideo/lib/VideoApiAdapter.ts","lineNumber":441,"sourceCode":"      } catch (err) {\n        console.log(\"err\", err);\n        throw new Error(\"Something went wrong! Unable to get recording access link\");\n      }\n    },\n    getAllTranscriptsAccessLinkFromRoomName: async (roomName: string): Promise<Array<string>> => {\n      try {\n        const allTranscripts = await fetcher(`/transcript?room_name=${roomName}`).then(getTranscripts.parse);\n\n        if (!allTranscripts.data.length) return [];\n\n        const allTranscriptsIds = allTranscripts.data.map((transcript) => transcript.transcriptId);\n        const allTranscriptsAccessLink = await processTranscriptsInBatches(allTranscriptsIds);\n        const accessLinks = await Promise.all(allTranscriptsAccessLink);\n\n        return Promise.resolve(accessLinks);\n      } catch (err) {\n        console.log(\"err\", err);\n        throw new Error(\"Something went wrong! Unable to get transcription access link\");\n      }\n    },\n    getAllTranscriptsAccessLinkFromMeetingId: async (meetingId: string): Promise<Array<string>> => {\n      try {\n        const allTranscripts = await fetcher(`/transcript?mtgSessionId=${meetingId}`).then(\n          getTranscripts.parse\n        );\n\n        if (!allTranscripts.data.length) return [];\n\n        const allTranscriptsIds = allTranscripts.data.map((transcript) => transcript.transcriptId);\n        const allTranscriptsAccessLink = await processTranscriptsInBatches(allTranscriptsIds);\n        const accessLinks = await Promise.all(allTranscriptsAccessLink);\n\n        return Promise.resolve(accessLinks);\n      } catch (err) {\n        console.log(\"err\", err);\n        throw new Error(\"Something went wrong! Unable to get transcription access link\");","sourceCodeStart":423,"sourceCodeEnd":459,"githubUrl":"https://github.com/calcom/cal.diy/blob/176037d0afbe572f870a3c702985e7cd83fe6c0c/packages/app-store/dailyvideo/lib/VideoApiAdapter.ts#L423-L459","documentation":"Thrown by getAllTranscriptsAccessLinkFromRoomName in the Daily video adapter. The method lists transcripts for a Daily room via GET /transcript?room_name=..., extracts their IDs, then resolves access links through processTranscriptsInBatches. Any failure inside the try block (network error from fetcher, a Zod parse failure in getTranscripts.parse, or a rejected batch promise) is swallowed by a generic catch that re-throws this message, discarding the original cause.","triggerScenarios":"Calling getAllTranscriptsAccessLinkFromRoomName(roomName) where roomName has no recordings, the Daily API key is missing/invalid, the response shape does not match getTranscripts schema, or one of processTranscriptsInBatches inner promises rejects.","commonSituations":"Daily app credentials misconfigured in the Cal.com admin; roomName is stale (room deleted); Daily API rate limit hit; Daily changed their transcript payload shape causing getTranscripts.parse to throw ZodError; transcriptId missing on a transcript object.","solutions":["Check the console.log('err', err) output server-side for the real underlying error (ZodError, fetch TypeError, or Daily status code).","Verify the Daily app's API key is set and valid under /apps/dailyvideo configuration.","Confirm the roomName passed corresponds to an existing Daily room that had recordings enabled.","If the underlying error is a Zod parse failure, compare the live Daily /transcript response against getTranscripts and update the schema.","Re-throw the original error instead of a generic message so callers can branch on cause."],"exampleFix":"// before\n} catch (err) {\n  console.log(\"err\", err);\n  throw new Error(\"Something went wrong! Unable to get transcription access link\");\n}\n\n// after - preserve cause for diagnostics\n} catch (err) {\n  this.log.error(\"getAllTranscriptsAccessLinkFromRoomName failed for\", roomName, err);\n  throw new Error(`Unable to get transcription access link for room ${roomName}: ${err instanceof Error ? err.message : String(err)}`, { cause: err });\n}","handlingStrategy":"try-catch","validationCode":"if (!roomName || typeof roomName !== \"string\") throw new TypeError(\"roomName must be a non-empty string\");\nconst creds = await getParsedAppKeysFromSlug(\"dailyvideo\", dailyAppKeysSchema);\nif (!creds.api_key) throw new Error(\"Daily API key not configured\");","typeGuard":"const isTranscriptList = (v: unknown): v is { data: { transcriptId: string }[] } =>\n  typeof v === \"object\" && v !== null && Array.isArray((v as any).data) &&\n  (v as any).data.every((t: any) => typeof t?.transcriptId === \"string\");","tryCatchPattern":"try {\n  const links = await adapter.getAllTranscriptsAccessLinkFromRoomName(roomName);\n} catch (err) {\n  logger.error(\"transcript fetch failed\", { roomName, cause: err instanceof Error ? err.message : err });\n  return []; // transcripts are non-critical, degrade gracefully\n}","preventionTips":["Monitor Daily API key validity and rotate before expiry.","Pin the Daily response schema with a contract test against a recorded fixture.","Treat transcript access as best-effort: wrap calls so a failure does not break booking flows."],"tags":["daily-video","transcript","oauth-api","error-swallowing","zod"],"backgroundTag":null,"analyzedSha":"176037d0afbe572f870a3c702985e7cd83fe6c0c","analyzedAt":"2026-08-12T19:12:41.464Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}