Index: services/migrations/gitea_downloader.go
--- services/migrations/gitea_downloader.go.orig
+++ services/migrations/gitea_downloader.go
@@ -5,6 +5,7 @@ package migrations
 
 import (
 	"context"
+	"encoding/json"
 	"errors"
 	"fmt"
 	"io"
@@ -74,6 +75,9 @@ type GiteaDownloader struct {
 	repoName   string
 	pagination bool
 	maxPerPage int
+	token      string
+	username   string
+	password   string
 }
 
 // NewGiteaDownloader creates a gitea Downloader via gitea API
@@ -121,6 +125,9 @@ func NewGiteaDownloader(ctx context.Context, baseURL, 
 		repoName:   path[1],
 		pagination: paginationSupport,
 		maxPerPage: maxPerPage,
+		token:      token,
+		username:   username,
+		password:   password,
 	}, nil
 }
 
@@ -544,7 +551,7 @@ func (g *GiteaDownloader) GetPullRequests(page, perPag
 
 	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/pulls", url.PathEscape(g.repoOwner), url.PathEscape(g.repoName)))
 	link.RawQuery = opt.QueryEncode()
-	_, err := getParsedResponse(g.client, "GET", link.String(), http.Header{"content-type": []string{"application/json"}}, nil, &prs)
+	_, err := g.doRawAPIRequest("GET", link.String(), http.Header{"content-type": []string{"application/json"}}, &prs)
 	if err != nil {
 		return nil, false, fmt.Errorf("error while listing pull requests (page: %d, pagesize: %d). Error: %w", page, perPage, err)
 	}
@@ -739,3 +746,52 @@ func (g *GiteaDownloader) GetReviews(reviewable base.R
 	}
 	return allReviews, nil
 }
+
+func (g *GiteaDownloader) doRawAPIRequest(method, path string, headers http.Header, parsedResponse any) (string, error) {
+	fullURL := g.baseURL + "/api/v1" + path
+
+	u, err := url.Parse(fullURL)
+	if err != nil {
+		return "", fmt.Errorf("malformed URL: %w", err)
+	}
+
+	baseURLParsed, _ := url.Parse(g.baseURL)
+	if u.Host != baseURLParsed.Host {
+		return "", fmt.Errorf("request host changed from %s to %s", baseURLParsed.Host, u.Host)
+	}
+	
+	httpClient := NewMigrationHTTPClient()
+
+	req, err := http.NewRequestWithContext(g.ctx, method, fullURL, nil)
+	if err != nil {
+		return "", err
+	}
+
+	if headers != nil {
+		req.Header = headers
+	}
+
+	if len(g.token) != 0 {
+		req.Header.Set("Authorization", "token "+g.token)
+	} else if len(g.username) != 0 {
+		req.SetBasicAuth(g.username, g.password)
+	}
+
+	resp, err := httpClient.Do(req)
+	if err != nil {
+		return "", err
+	}
+	defer resp.Body.Close()
+
+	if resp.StatusCode < 200 || resp.StatusCode >= 300 {
+		body, _ := io.ReadAll(resp.Body)
+		return "", fmt.Errorf("http error %d: %s. Body: %s", resp.StatusCode, resp.Status, string(body))
+	}
+
+	if err := json.NewDecoder(resp.Body).Decode(parsedResponse); err != nil {
+		return "", fmt.Errorf("failed to decode response: %w", err)
+	}
+
+	return resp.Header.Get("Link"), nil
+}
+
