diff --git a/Api/Api.csproj b/Api/Api.csproj
index 74605603c0ed6ca8ec648feb9e3a6b2bf5c14408..0a4573764af08a3b16e3197e5f9940577fe567b4 100644
--- a/Api/Api.csproj
+++ b/Api/Api.csproj
@@ -13,6 +13,7 @@
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
     </PackageReference>
+    <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
   </ItemGroup>
 
diff --git a/Api/Middleware/ResponseFormatMiddleware.cs b/Api/Middleware/ResponseFormatMiddleware.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6e72ae3df40278294952025b53288a6d1f7c0366
--- /dev/null
+++ b/Api/Middleware/ResponseFormatMiddleware.cs
@@ -0,0 +1,57 @@
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System.Xml;
+
+public class ResponseFormatMiddleware
+{
+    private readonly RequestDelegate _next;
+
+    public ResponseFormatMiddleware(RequestDelegate next) => _next = next;
+
+    public async Task InvokeAsync(HttpContext context)
+    {
+        var originalBodyStream = context.Response.Body;
+        using var responseBody = new MemoryStream();
+        context.Response.Body = responseBody;
+
+        await _next(context);
+
+        context.Response.Body.Seek(0, SeekOrigin.Begin);
+        var responseText = await new StreamReader(context.Response.Body).ReadToEndAsync();
+
+        context.Response.Body.Seek(0, SeekOrigin.Begin);
+        context.Response.Body = originalBodyStream;
+
+        if (context.Request.Query.TryGetValue("format", out var formatValue) && formatValue.ToString().Equals("xml", StringComparison.OrdinalIgnoreCase))
+        {
+            context.Response.ContentType = "application/xml";
+            await context.Response.WriteAsync(ConvertJsonToXml(responseText));
+        }
+        else
+        {
+            context.Response.ContentType = "application/json";
+            await context.Response.WriteAsync(responseText);
+        }
+    }
+
+    private string ConvertJsonToXml(string json)
+    {
+        try
+        {
+            JToken parsedJson = JToken.Parse(json);
+            if (parsedJson is JArray) json = $"{{\"Root\": {json}}}";
+
+            var doc = JsonConvert.DeserializeXmlNode(json, "Root");
+            if (doc == null) return "<error>Unable to convert JSON to XML; null document</error>";
+
+            using var stringWriter = new StringWriter();
+            using var xmlTextWriter = new XmlTextWriter(stringWriter);
+            doc.WriteTo(xmlTextWriter);
+            return stringWriter.ToString();
+        }
+        catch
+        {
+            return "<error>Unable to convert JSON to XML</error>";
+        }
+    }
+}
diff --git a/Api/Program.cs b/Api/Program.cs
index 8866be6498afd6acc0485e1a56e8cffb418aeb12..a5757e372827a229dab88a48b4991bdfa9f7a39c 100644
--- a/Api/Program.cs
+++ b/Api/Program.cs
@@ -102,8 +102,8 @@ app.UseHttpsRedirection();
 app.UseAuthorization();
 
 app.UseMiddleware<AuthenticationMiddleware>();
-
 app.UseMiddleware<RequestLoggingMiddleware>();
+app.UseMiddleware<ResponseFormatMiddleware>();
 
 app.MapControllers();