diff --git a/packages/openapi-fetch/src/index.js b/packages/openapi-fetch/src/index.js
index 432b1ff33..39331c49f 100644
--- a/packages/openapi-fetch/src/index.js
+++ b/packages/openapi-fetch/src/index.js
@@ -54,8 +54,9 @@ export default function createClient(clientOptions) {
       body,
       ...init
     } = fetchOptions || {};
+    let finalBaseUrl = baseUrl;
     if (localBaseUrl) {
-      baseUrl = removeTrailingSlash(localBaseUrl);
+      finalBaseUrl = removeTrailingSlash(localBaseUrl) ?? baseUrl;
     }
 
     let querySerializer =
@@ -94,7 +95,10 @@ export default function createClient(clientOptions) {
 
     let id;
     let options;
-    let request = new CustomRequest(createFinalURL(schemaPath, { baseUrl, params, querySerializer }), requestInit);
+    let request = new CustomRequest(
+      createFinalURL(schemaPath, { baseUrl: finalBaseUrl, params, querySerializer }),
+      requestInit,
+    );
     let response;
 
     /** Add custom parameters to Request object */
@@ -109,7 +113,7 @@ export default function createClient(clientOptions) {
 
       // middleware (request)
       options = Object.freeze({
-        baseUrl,
+        baseUrl: finalBaseUrl,
         fetch,
         parseAs,
         querySerializer,
diff --git a/packages/openapi-fetch/test/common/create-client.test.ts b/packages/openapi-fetch/test/common/create-client.test.ts
index 15c5c9383..a2185c222 100644
--- a/packages/openapi-fetch/test/common/create-client.test.ts
+++ b/packages/openapi-fetch/test/common/create-client.test.ts
@@ -38,6 +38,25 @@ describe("createClient options", () => {
     expect(actualURL.href).toBe("https://api.foo.bar/v3/resources");
   });
 
+  test("baseUrl per request causes no override on default baseUrl", async () => {
+    let actualURL = new URL("https://fakeurl.example");
+    const client = createObservedClient<paths>({ baseUrl: "https://api.foo.bar/v2/" }, async (req) => {
+      actualURL = new URL(req.url);
+      return Response.json([]);
+    });
+
+    const localBaseUrl = "https://api.foo.bar/v3";
+    await client.GET("/resources", { baseUrl: localBaseUrl });
+
+    // assert baseUrl and path mesh as expected
+    expect(actualURL.href).toBe("https://api.foo.bar/v3/resources");
+
+    await client.GET("/resources");
+
+    // assert baseUrl and path mesh as expected
+    expect(actualURL.href).toBe("https://api.foo.bar/v2/resources");
+  });
+
   describe("content-type", () => {
     const BODY_ACCEPTING_METHODS = [["PUT"], ["POST"], ["DELETE"], ["OPTIONS"], ["PATCH"]] as const;
     const ALL_METHODS = [...BODY_ACCEPTING_METHODS, ["GET"], ["HEAD"]] as const;