calcom/cal.diy · error · Error

Something went wrong! Unable to get recording access link

Error message

Something went wrong! Unable to get recording access link

What it means

`getRecordingDownloadLink` wraps `fetcher(`/recordings/${recordingId}/access-link?valid_for_secs=43200`)` (Zod-parsed via `getAccessLinkResponseSchema`) and re-throws a generic Error on any failure. The original cause is logged via `console.log("err", err)` then discarded.

Source

Thrown at packages/app-store/dailyvideo/lib/VideoApiAdapter.ts:425

      try {
        const res = await fetcher(`/recordings?room_name=${roomName}`).then(
          getRecordingsResponseSchema.parse
        );
        return Promise.resolve(res);
      } catch {
        throw new Error("Something went wrong! Unable to get recording");
      }
    },
    createInstantCalVideoRoom: (endTime: string) => createInstantMeeting(endTime, region),
    getRecordingDownloadLink: async (recordingId: string): Promise<GetAccessLinkResponseSchema> => {
      try {
        const res = await fetcher(`/recordings/${recordingId}/access-link?valid_for_secs=43200`).then(
          getAccessLinkResponseSchema.parse
        );
        return Promise.resolve(res);
      } catch (err) {
        console.log("err", err);
        throw new Error("Something went wrong! Unable to get recording access link");
      }
    },
    getAllTranscriptsAccessLinkFromRoomName: async (roomName: string): Promise<Array<string>> => {
      try {
        const allTranscripts = await fetcher(`/transcript?room_name=${roomName}`).then(getTranscripts.parse);

        if (!allTranscripts.data.length) return [];

        const allTranscriptsIds = allTranscripts.data.map((transcript) => transcript.transcriptId);
        const allTranscriptsAccessLink = await processTranscriptsInBatches(allTranscriptsIds);
        const accessLinks = await Promise.all(allTranscriptsAccessLink);

        return Promise.resolve(accessLinks);
      } catch (err) {
        console.log("err", err);
        throw new Error("Something went wrong! Unable to get transcription access link");
      }
    },

View on GitHub (pinned to 176037d0af)

Solutions

  1. Preserve the cause: `throw new Error(..., { cause: err })` and remove the `console.log` in favor of structured logging.
  2. Confirm `recordingId` corresponds to an existing, non-expired Daily recording.
  3. Verify the Daily API credential is valid and has recordings:access scope.
  4. Check `getAccessLinkResponseSchema` against the current Daily access-link response shape.

Example fix

// before
} catch (err) {
  console.log("err", err);
  throw new Error("Something went wrong! Unable to get recording access link");
}

// after
} catch (err) {
  logger.warn("Daily access-link fetch failed", { recordingId, err });
  throw new Error(`Unable to get recording access link for ${recordingId}`, { cause: err });
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (!recordingId || typeof recordingId !== "string") {
  throw new Error("recordingId required to fetch access link");
}

Type guard

function isAccessLinkResponse(r: unknown): r is GetAccessLinkResponseSchema {
  return getAccessLinkResponseSchema.safeParse(r).success;
}

Try / catch

try {
  return await adapter.getRecordingDownloadLink(recordingId);
} catch (e) {
  if (e instanceof Error && /recording access link/.test(e.message)) {
    return null;
  }
  throw e;
}

Prevention

When it happens

Trigger: Daily API rejects the access-link request (invalid/expired `recordingId`, auth failure, rate limit), the access link has already expired, or the response shape fails `getAccessLinkResponseSchema`.

Common situations: Recording id typo or from a deleted recording; Daily API credential invalid; recording retention period elapsed so Daily returns 404; schema drift after a Daily API update; transient network failure.

Related errors


AI-assisted analysis of calcom/cal.diy@176037d0af (2026-08-12). Data as JSON: /api/errors/98adcf0298df3e33. Report an issue: GitHub.