diff --git a/lib/workers/repository/update/pr/changelog/gitea/index.spec.ts b/lib/workers/repository/update/pr/changelog/gitea/index.spec.ts
index f1c09d2d5dbb7d0d34c5ba5fb40c680ce1ab0eba..a9316d67d937b8edfa2c093bb9a565d26b18a7f6 100644
--- a/lib/workers/repository/update/pr/changelog/gitea/index.spec.ts
+++ b/lib/workers/repository/update/pr/changelog/gitea/index.spec.ts
@@ -208,7 +208,7 @@ describe('workers/repository/update/pr/changelog/gitea/index', () => {
               notesSourceUrl:
                 'https://gitea.com/api/v1/repos/meno/dropzone/releases',
               tag: 'v5.6.1',
-              url: 'https://gitea.com/api/v1/repos/meno/dropzone/releases/tag/v5.6.1',
+              url: 'https://gitea.com/meno/dropzone/releases/tag/v5.6.1',
             },
           },
           { version: '5.6.0' },
diff --git a/lib/workers/repository/update/pr/changelog/gitea/index.ts b/lib/workers/repository/update/pr/changelog/gitea/index.ts
index 8f354fe6f1712a30c61be45c59c3ae3963978f6b..fe99e2dfc025e138d7c7ce4c69f4d745a09f05f5 100644
--- a/lib/workers/repository/update/pr/changelog/gitea/index.ts
+++ b/lib/workers/repository/update/pr/changelog/gitea/index.ts
@@ -83,7 +83,7 @@ export async function getReleaseList(
     ReleasesSchema
   );
   return res.body.map((release) => ({
-    url: `${apiUrl}/tag/${release.tag_name}`,
+    url: `${project.baseUrl}${project.repository}/releases/tag/${release.tag_name}`,
     notesSourceUrl: apiUrl,
     name: release.name,
     body: release.body,
diff --git a/lib/workers/repository/update/pr/changelog/github/index.ts b/lib/workers/repository/update/pr/changelog/github/index.ts
index dd03b255818bc3717f89d284b452a739482be4e7..4bc1432afefb705f7ad5bc73e017cccf9823f3c2 100644
--- a/lib/workers/repository/update/pr/changelog/github/index.ts
+++ b/lib/workers/repository/update/pr/changelog/github/index.ts
@@ -82,7 +82,7 @@ export async function getReleaseList(
   _release: ChangeLogRelease
 ): Promise<ChangeLogNotes[]> {
   logger.trace('github.getReleaseList()');
-  const apiBaseUrl = project.apiBaseUrl!; // TODO #22198
+  const apiBaseUrl = project.apiBaseUrl;
   const repository = project.repository;
   const notesSourceUrl = joinUrlParts(
     apiBaseUrl,
diff --git a/lib/workers/repository/update/pr/changelog/gitlab/index.ts b/lib/workers/repository/update/pr/changelog/gitlab/index.ts
index 711c14c329251c5bd00cc1f985a4f6e04470da5e..889d7eb0d7cd684aafbfa2ee0b98989c1f340f95 100644
--- a/lib/workers/repository/update/pr/changelog/gitlab/index.ts
+++ b/lib/workers/repository/update/pr/changelog/gitlab/index.ts
@@ -3,7 +3,6 @@ import { logger } from '../../../../../../logger';
 import type { GitlabRelease } from '../../../../../../modules/datasource/gitlab-releases/types';
 import type { GitlabTreeNode } from '../../../../../../types/platform/gitlab';
 import { GitlabHttp } from '../../../../../../util/http/gitlab';
-import { ensureTrailingSlash } from '../../../../../../util/url';
 import type {
   ChangeLogFile,
   ChangeLogNotes,
@@ -21,9 +20,7 @@ export async function getReleaseNotesMd(
 ): Promise<ChangeLogFile | null> {
   logger.trace('gitlab.getReleaseNotesMd()');
   const urlEncodedRepo = encodeURIComponent(repository);
-  const apiPrefix = `${ensureTrailingSlash(
-    apiBaseUrl
-  )}projects/${urlEncodedRepo}/repository/`;
+  const apiPrefix = `${apiBaseUrl}projects/${urlEncodedRepo}/repository/`;
 
   // https://docs.gitlab.com/13.2/ee/api/repositories.html#list-repository-tree
   const tree = (
@@ -64,20 +61,16 @@ export async function getReleaseList(
   _release: ChangeLogRelease
 ): Promise<ChangeLogNotes[]> {
   logger.trace('gitlab.getReleaseNotesMd()');
-  // TODO #22198
-  const apiBaseUrl = project.apiBaseUrl!;
-  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
-  const repository = project.repository!;
+  const apiBaseUrl = project.apiBaseUrl;
+  const repository = project.repository;
   const urlEncodedRepo = encodeURIComponent(repository);
-  const apiUrl = `${ensureTrailingSlash(
-    apiBaseUrl
-  )}projects/${urlEncodedRepo}/releases`;
+  const apiUrl = `${apiBaseUrl}projects/${urlEncodedRepo}/releases`;
 
   const res = await http.getJson<GitlabRelease[]>(`${apiUrl}?per_page=100`, {
     paginate: true,
   });
   return res.body.map((release) => ({
-    url: `${apiUrl}/${release.tag_name}`,
+    url: `${project.baseUrl}${repository}/-/releases/${release.tag_name}`,
     notesSourceUrl: apiUrl,
     name: release.name,
     body: release.description,
diff --git a/lib/workers/repository/update/pr/changelog/release-notes.spec.ts b/lib/workers/repository/update/pr/changelog/release-notes.spec.ts
index dda0633eb8ae08a25ec9ad9634b1c28552053ce2..d3b72ae73836f7bfd1693d7b35a56f9649e9d23b 100644
--- a/lib/workers/repository/update/pr/changelog/release-notes.spec.ts
+++ b/lib/workers/repository/update/pr/changelog/release-notes.spec.ts
@@ -141,11 +141,21 @@ describe('workers/repository/update/pr/changelog/release-notes', () => {
     });
 
     it('returns ChangeLogResult without release notes', async () => {
+      httpMock
+        .scope(
+          'https://gitlab.com/api/v4/projects/gitlab-org%2Fgitter%2Fwebapp'
+        )
+        .get('/repository/tree?per_page=100&path=lib')
+        .reply(200, [])
+        .get('/releases?per_page=100')
+        .reply(200, []);
       const input = {
         project: partial<ChangeLogProject>({
           type: 'gitlab',
-          repository: 'https://gitlab.com/gitlab-org/gitter/webapp/',
+          repository: 'gitlab-org/gitter/webapp',
           sourceDirectory: 'lib',
+          apiBaseUrl: 'https://gitlab.com/api/v4/',
+          baseUrl: 'https://gitlab.com/',
         }),
         versions: [
           partial<ChangeLogRelease>({
@@ -159,9 +169,11 @@ describe('workers/repository/update/pr/changelog/release-notes', () => {
       ).toEqual({
         hasReleaseNotes: false,
         project: {
-          repository: 'https://gitlab.com/gitlab-org/gitter/webapp/',
+          repository: 'gitlab-org/gitter/webapp',
           type: 'gitlab',
           sourceDirectory: 'lib',
+          apiBaseUrl: 'https://gitlab.com/api/v4/',
+          baseUrl: 'https://gitlab.com/',
         },
         versions: [
           {
@@ -252,13 +264,13 @@ describe('workers/repository/update/pr/changelog/release-notes', () => {
           notesSourceUrl:
             'https://gitlab.com/api/v4/projects/some%2Fyet-other-repository/releases',
           tag: 'v1.0.0',
-          url: 'https://gitlab.com/api/v4/projects/some%2Fyet-other-repository/releases/v1.0.0',
+          url: 'https://gitlab.com/some/yet-other-repository/-/releases/v1.0.0',
         },
         {
           notesSourceUrl:
             'https://gitlab.com/api/v4/projects/some%2Fyet-other-repository/releases',
           tag: 'v1.0.1',
-          url: 'https://gitlab.com/api/v4/projects/some%2Fyet-other-repository/releases/v1.0.1',
+          url: 'https://gitlab.com/some/yet-other-repository/-/releases/v1.0.1',
         },
       ]);
     });
@@ -291,13 +303,13 @@ describe('workers/repository/update/pr/changelog/release-notes', () => {
           notesSourceUrl:
             'https://my.custom.domain/api/v4/projects/some%2Fyet-other-repository/releases',
           tag: 'v1.0.0',
-          url: 'https://my.custom.domain/api/v4/projects/some%2Fyet-other-repository/releases/v1.0.0',
+          url: 'https://my.custom.domain/some/yet-other-repository/-/releases/v1.0.0',
         },
         {
           notesSourceUrl:
             'https://my.custom.domain/api/v4/projects/some%2Fyet-other-repository/releases',
           tag: 'v1.0.1',
-          url: 'https://my.custom.domain/api/v4/projects/some%2Fyet-other-repository/releases/v1.0.1',
+          url: 'https://my.custom.domain/some/yet-other-repository/-/releases/v1.0.1',
         },
       ]);
     });
diff --git a/lib/workers/repository/update/pr/changelog/release-notes.ts b/lib/workers/repository/update/pr/changelog/release-notes.ts
index b03d95ecc9d13df15ca43af409206cd08248b58b..1ca943247c2a09f1a567cc368c64d981b5b6ffbe 100644
--- a/lib/workers/repository/update/pr/changelog/release-notes.ts
+++ b/lib/workers/repository/update/pr/changelog/release-notes.ts
@@ -66,7 +66,7 @@ export function getCachedReleaseList(
 ): Promise<ChangeLogNotes[]> {
   const { repository, apiBaseUrl } = project;
   // TODO: types (#22198)
-  const cacheKey = `getReleaseList-${apiBaseUrl!}-${repository}`;
+  const cacheKey = `getReleaseList-${apiBaseUrl}-${repository}`;
   const cachedResult = memCache.get<Promise<ChangeLogNotes[]>>(cacheKey);
   // istanbul ignore if
   if (cachedResult !== undefined) {
@@ -241,7 +241,7 @@ export async function getReleaseNotesMdFileInner(
   project: ChangeLogProject
 ): Promise<ChangeLogFile | null> {
   const { repository, type } = project;
-  const apiBaseUrl = project.apiBaseUrl!;
+  const apiBaseUrl = project.apiBaseUrl;
   const sourceDirectory = project.sourceDirectory!;
   try {
     switch (type) {
@@ -295,8 +295,8 @@ export function getReleaseNotesMdFile(
   const { sourceDirectory, repository, apiBaseUrl } = project;
   // TODO: types (#22198)
   const cacheKey = sourceDirectory
-    ? `getReleaseNotesMdFile@v2-${repository}-${sourceDirectory}-${apiBaseUrl!}`
-    : `getReleaseNotesMdFile@v2-${repository}-${apiBaseUrl!}`;
+    ? `getReleaseNotesMdFile@v2-${repository}-${sourceDirectory}-${apiBaseUrl}`
+    : `getReleaseNotesMdFile@v2-${repository}-${apiBaseUrl}`;
   const cachedResult = memCache.get<Promise<ChangeLogFile | null>>(cacheKey);
   // istanbul ignore if
   if (cachedResult !== undefined) {
diff --git a/lib/workers/repository/update/pr/changelog/types.ts b/lib/workers/repository/update/pr/changelog/types.ts
index 4c14a6c83af56f99b9d54e71815ef3b6cc0052be..8a4a19e9a8feadc1fc8481a8c46cd9d7aca9e621 100644
--- a/lib/workers/repository/update/pr/changelog/types.ts
+++ b/lib/workers/repository/update/pr/changelog/types.ts
@@ -28,7 +28,7 @@ export type ChangeLogPlatform = 'bitbucket' | 'gitea' | 'github' | 'gitlab';
 export interface ChangeLogProject {
   packageName?: string;
   type: ChangeLogPlatform;
-  apiBaseUrl?: string;
+  apiBaseUrl: string;
   baseUrl: string;
   repository: string;
   sourceUrl: string;
diff --git a/lib/workers/repository/update/pr/index.spec.ts b/lib/workers/repository/update/pr/index.spec.ts
index 6a4411f2fa521fa570374d729e3d9c39325190c8..866eca46bccda8766e57119b8a527af9d62b41dd 100644
--- a/lib/workers/repository/update/pr/index.spec.ts
+++ b/lib/workers/repository/update/pr/index.spec.ts
@@ -685,6 +685,7 @@ describe('workers/repository/update/pr/index', () => {
             type: 'github',
             repository: 'some/repo',
             baseUrl: 'https://github.com',
+            apiBaseUrl: 'https://api.github.com/',
             sourceUrl: 'https://github.com/some/repo',
           },
           versions: [