diff --git a/src/FetchAPI/Headers.res b/src/FetchAPI/Headers.res
index b559700..ed70403 100644
--- a/src/FetchAPI/Headers.res
+++ b/src/FetchAPI/Headers.res
@@ -5,13 +5,25 @@ open Prelude
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/Headers)
 */
 @new
-external make: (~init: array<array<string>>=?) => headers = "Headers"
+external make: unit => headers = "Headers"
 
 /**
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/Headers)
 */
 @new
-external make2: (~init: any=?) => headers = "Headers"
+external fromDict: dict<string> => headers = "Headers"
+
+/**
+[Read more on MDN](https://developer.mozilla.org/docs/Web/API/Headers)
+*/
+@new
+external fromHeaders: headers => headers = "Headers"
+
+/**
+[Read more on MDN](https://developer.mozilla.org/docs/Web/API/Headers)
+*/
+@new
+external fromKeyValueArray: array<(string, string)> => headers = "Headers"
 
 /**
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/Headers/append)
diff --git a/src/FetchAPI/HeadersInit.res b/src/FetchAPI/HeadersInit.res
index 2ca2f21..50d96c9 100644
--- a/src/FetchAPI/HeadersInit.res
+++ b/src/FetchAPI/HeadersInit.res
@@ -9,3 +9,8 @@ external fromDict: dict<string> => headersInit = "%identity"
  [Read more on MDN](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#setting_headers)
  */
 external fromHeaders: headers => headersInit = "%identity"
+
+/**
+ [Read more on MDN](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#setting_headers)
+ */
+external fromKeyValueArray: array<(string, string)> => headersInit = "%identity"
diff --git a/src/FetchAPI/Request.res b/src/FetchAPI/Request.res
index 9b9f504..c1b71a3 100644
--- a/src/FetchAPI/Request.res
+++ b/src/FetchAPI/Request.res
@@ -5,13 +5,13 @@ open FileAPI
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/Request)
 */
 @new
-external make: (~input: request, ~init: requestInit=?) => request = "Request"
+external fromURL: (string, ~init: requestInit=?) => request = "Request"
 
 /**
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/Request)
 */
 @new
-external make2: (~input: string, ~init: requestInit=?) => request = "Request"
+external fromRequest: (request, ~init: requestInit=?) => request = "Request"
 
 /**
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer)
diff --git a/src/FetchAPI/Response.res b/src/FetchAPI/Response.res
index 96e4d04..56c197d 100644
--- a/src/FetchAPI/Response.res
+++ b/src/FetchAPI/Response.res
@@ -5,43 +5,61 @@ open FileAPI
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/Response)
 */
 @new
-external make: (~body: readableStream<unit>=?, ~init: responseInit=?) => response = "Response"
+external fromNull: (@as(json`null`) _, ~init: responseInit=?) => response = "Response"
 
 /**
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/Response)
 */
 @new
-external make2: (~body: blob=?, ~init: responseInit=?) => response = "Response"
+external fromString: (string, ~init: responseInit=?) => response = "Response"
 
 /**
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/Response)
 */
 @new
-external make3: (~body: DataView.t=?, ~init: responseInit=?) => response = "Response"
+external fromArrayBuffer: (ArrayBuffer.t, ~init: responseInit=?) => response = "Response"
 
 /**
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/Response)
 */
 @new
-external make4: (~body: ArrayBuffer.t=?, ~init: responseInit=?) => response = "Response"
+external fromTypedArray: (TypedArray.t<'t>, ~init: responseInit=?) => response = "Response"
 
 /**
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/Response)
 */
 @new
-external make5: (~body: formData=?, ~init: responseInit=?) => response = "Response"
+external fromDataView: (DataView.t, ~init: responseInit=?) => response = "Response"
 
 /**
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/Response)
 */
 @new
-external make6: (~body: urlSearchParams=?, ~init: responseInit=?) => response = "Response"
+external fromBlob: (blob, ~init: responseInit=?) => response = "Response"
 
 /**
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/Response)
 */
 @new
-external make7: (~body: string=?, ~init: responseInit=?) => response = "Response"
+external fromFile: (file, ~init: responseInit=?) => response = "Response"
+
+/**
+[Read more on MDN](https://developer.mozilla.org/docs/Web/API/Response)
+*/
+@new
+external fromURLSearchParams: (urlSearchParams, ~init: responseInit=?) => response = "Response"
+
+/**
+[Read more on MDN](https://developer.mozilla.org/docs/Web/API/Response)
+*/
+@new
+external fromFormData: (formData, ~init: responseInit=?) => response = "Response"
+
+/**
+[Read more on MDN](https://developer.mozilla.org/docs/Web/API/Response)
+*/
+@new
+external fromReadableStream: (readableStream<'t>, ~init: responseInit=?) => response = "Response"
 
 /**
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer)
diff --git a/src/FetchAPI/URLSearchParams.res b/src/FetchAPI/URLSearchParams.res
index 89bf4a3..a09c66a 100644
--- a/src/FetchAPI/URLSearchParams.res
+++ b/src/FetchAPI/URLSearchParams.res
@@ -5,19 +5,25 @@ open Prelude
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/URLSearchParams)
 */
 @new
-external make: (~init: array<array<string>>=?) => urlSearchParams = "URLSearchParams"
+external make: unit => urlSearchParams = "URLSearchParams"
 
 /**
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/URLSearchParams)
 */
 @new
-external make2: (~init: any=?) => urlSearchParams = "URLSearchParams"
+external fromKeyValueArray: array<(string, string)> => urlSearchParams = "URLSearchParams"
 
 /**
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/URLSearchParams)
 */
 @new
-external make3: (~init: string=?) => urlSearchParams = "URLSearchParams"
+external fromDict: dict<string> => urlSearchParams = "URLSearchParams"
+
+/**
+[Read more on MDN](https://developer.mozilla.org/docs/Web/API/URLSearchParams)
+*/
+@new
+external fromString: string => urlSearchParams = "URLSearchParams"
 
 /**
 Appends a specified key/value pair as a new search parameter.
diff --git a/tests/FetchAPI/Headers__test.js b/tests/FetchAPI/Headers__test.js
new file mode 100644
index 0000000..d26eb3b
--- /dev/null
+++ b/tests/FetchAPI/Headers__test.js
@@ -0,0 +1,30 @@
+// Generated by ReScript, PLEASE EDIT WITH CARE
+
+
+let h = new Headers();
+
+h.set("X-Test", "1");
+
+let h2 = new Headers({
+  "X-Vegetable": "Carrot"
+});
+
+let h3 = new Headers([
+  [
+    "X-Fruit",
+    "Apple"
+  ],
+  [
+    "X-Vegetable",
+    "Carrot"
+  ]
+]);
+
+console.log(h3.get("X-Fruit"));
+
+export {
+  h,
+  h2,
+  h3,
+}
+/* h Not a pure module */
diff --git a/tests/FetchAPI/Headers__test.res b/tests/FetchAPI/Headers__test.res
new file mode 100644
index 0000000..cb6ba06
--- /dev/null
+++ b/tests/FetchAPI/Headers__test.res
@@ -0,0 +1,9 @@
+let h = Headers.make()
+
+h->Headers.set(~name="X-Test", ~value="1")
+
+let h2 = Headers.fromDict(dict{"X-Vegetable": "Carrot"})
+
+let h3 = Headers.fromKeyValueArray([("X-Fruit", "Apple"), ("X-Vegetable", "Carrot")])
+
+Console.log(h3->Headers.get("X-Fruit"))
diff --git a/tests/FetchAPI/Request__test.js b/tests/FetchAPI/Request__test.js
new file mode 100644
index 0000000..69cb971
--- /dev/null
+++ b/tests/FetchAPI/Request__test.js
@@ -0,0 +1,20 @@
+// Generated by ReScript, PLEASE EDIT WITH CARE
+
+
+let req = new Request("https://example.com");
+
+let req1 = new Request("https://example.com/api", {
+  method: "POST",
+  body: "hello"
+});
+
+let req2 = new Request(req1);
+
+console.log(await req2.text());
+
+export {
+  req,
+  req1,
+  req2,
+}
+/* req Not a pure module */
diff --git a/tests/FetchAPI/Request__test.res b/tests/FetchAPI/Request__test.res
new file mode 100644
index 0000000..7cbcb62
--- /dev/null
+++ b/tests/FetchAPI/Request__test.res
@@ -0,0 +1,10 @@
+let req = Request.fromURL("https://example.com")
+
+let req1 = Request.fromURL(
+  "https://example.com/api",
+  ~init={method: "POST", body: BodyInit.fromString("hello")},
+)
+
+let req2 = Request.fromRequest(req1)
+
+Console.log(await req2->Request.text)
diff --git a/tests/FetchAPI/Response__test.js b/tests/FetchAPI/Response__test.js
new file mode 100644
index 0000000..9c28ae1
--- /dev/null
+++ b/tests/FetchAPI/Response__test.js
@@ -0,0 +1,19 @@
+// Generated by ReScript, PLEASE EDIT WITH CARE
+
+
+let response = new Response(null, {
+  status: 204
+});
+
+let response1 = new Response("pong", {
+  status: 200,
+  headers: {
+    "X-Fruit": "Peach"
+  }
+});
+
+export {
+  response,
+  response1,
+}
+/* response Not a pure module */
diff --git a/tests/FetchAPI/Response__test.res b/tests/FetchAPI/Response__test.res
new file mode 100644
index 0000000..ce97d0d
--- /dev/null
+++ b/tests/FetchAPI/Response__test.res
@@ -0,0 +1,6 @@
+let response = Response.fromNull(~init={status: 204})
+
+let response1 = Response.fromString(
+  "pong",
+  ~init={status: 200, headers: HeadersInit.fromDict(dict{"X-Fruit": "Peach"})},
+)
diff --git a/tests/FetchAPI/URLSearchParams__test.js b/tests/FetchAPI/URLSearchParams__test.js
index 4ee1bca..e3510d9 100644
--- a/tests/FetchAPI/URLSearchParams__test.js
+++ b/tests/FetchAPI/URLSearchParams__test.js
@@ -7,13 +7,25 @@ Array.from(params1.keys()).forEach(prim => {
   console.log(prim);
 });
 
-let params2 = new URLSearchParams("?foo=1&bar=b");
+let params2 = new URLSearchParams([
+  [
+    "foo",
+    "1"
+  ],
+  [
+    "bar",
+    "b"
+  ]
+]);
 
 Array.from(params2.values()).forEach(prim => {
   console.log(prim);
 });
 
-let params3 = new URLSearchParams("?foo=1&bar=b");
+let params3 = new URLSearchParams({
+  foo: "1",
+  bar: "b"
+});
 
 Array.from(params3.entries()).forEach(param => {
   console.log(param[0], param[1]);
diff --git a/tests/FetchAPI/URLSearchParams__test.res b/tests/FetchAPI/URLSearchParams__test.res
index 00ef3db..2bec637 100644
--- a/tests/FetchAPI/URLSearchParams__test.res
+++ b/tests/FetchAPI/URLSearchParams__test.res
@@ -1,10 +1,10 @@
-let params1 = URLSearchParams.make3(~init="foo=1&bar=2")
+let params1 = URLSearchParams.fromString("foo=1&bar=2")
 params1->URLSearchParams.keys->Iterator.toArray->Array.forEach(Console.log)
 
-let params2 = URLSearchParams.make3(~init="?foo=1&bar=b")
+let params2 = URLSearchParams.fromKeyValueArray([("foo", "1"), ("bar", "b")])
 params2->URLSearchParams.values->Iterator.toArray->Array.forEach(Console.log)
 
-let params3 = URLSearchParams.make3(~init="?foo=1&bar=b")
+let params3 = URLSearchParams.fromDict(dict{"foo": "1", "bar": "b"})
 params3
 ->URLSearchParams.entries
 ->Iterator.toArray
diff --git a/tests/Global__test.res b/tests/Global__test.res
index 2f76d0e..a1eee25 100644
--- a/tests/Global__test.res
+++ b/tests/Global__test.res
@@ -16,7 +16,7 @@ let response2 = await fetch(
 )
 
 let response3 = await fetch_withRequest(
-  Request.make2(~input="https://rescript-lang.org/"),
+  Request.fromURL("https://rescript-lang.org/"),
   ~init={
     method: "POST",
     headers: HeadersInit.fromDict(