diff --git a/changelog.d/12364.bugfix b/changelog.d/12364.bugfix
new file mode 100644
index 0000000000000000000000000000000000000000..d042425d200e0a0677c9b4190ca99f9c7ea94ce9
--- /dev/null
+++ b/changelog.d/12364.bugfix
@@ -0,0 +1 @@
+Fix a spec compliance issue where requests to the `/publicRooms` federation API would specify `limit` as a string.
\ No newline at end of file
diff --git a/synapse/federation/transport/client.py b/synapse/federation/transport/client.py
index de6e5f44fe85cfc214c8ccd28b7692c105cabe3c..d4b3cb3e98cabd6e86a77544a910e156b9d6c373 100644
--- a/synapse/federation/transport/client.py
+++ b/synapse/federation/transport/client.py
@@ -481,7 +481,7 @@ class TransportLayerClient:
             if third_party_instance_id:
                 data["third_party_instance_id"] = third_party_instance_id
             if limit:
-                data["limit"] = str(limit)
+                data["limit"] = limit
             if since_token:
                 data["since"] = since_token
 
@@ -509,7 +509,7 @@ class TransportLayerClient:
             if third_party_instance_id:
                 args["third_party_instance_id"] = (third_party_instance_id,)
             if limit:
-                args["limit"] = [str(limit)]
+                args["limit"] = [limit]
             if since_token:
                 args["since"] = [since_token]