diff --git a/Sources/XXClient/Functions/GetNotificationsReport.swift b/Sources/XXClient/Functions/GetNotificationsReport.swift
index 81d54a59e298bc8a7f5a597736ca5f494e7f07c4..9b1235728902e37a28352fd56479429d53aceb57 100644
--- a/Sources/XXClient/Functions/GetNotificationsReport.swift
+++ b/Sources/XXClient/Functions/GetNotificationsReport.swift
@@ -2,12 +2,12 @@ import Bindings
 import XCTestDynamicOverlay
 
 public struct GetNotificationsReport {
-  public var run: (String, MessageServiceList) throws -> NotificationReport
+  public var run: (String, MessageServiceList) throws -> [NotificationReport]
 
   public func callAsFunction(
     notificationCSV: String,
     services: MessageServiceList
-  ) throws -> NotificationReport {
+  ) throws -> [NotificationReport] {
     try run(notificationCSV, services)
   }
 }
@@ -26,7 +26,7 @@ extension GetNotificationsReport {
     guard let result = result else {
       fatalError("BindingsGetNotificationsReport returned nil without providing error")
     }
-    return try NotificationReport.decode(result)
+    return try [NotificationReport].decode(result)
   }
 }
 
diff --git a/Sources/XXClient/Models/NotificationReport.swift b/Sources/XXClient/Models/NotificationReport.swift
index 06eb1d89c273fcfec99e8d4615936a1d9b8ff237..3a0192cca17d9e0392302800c298f591389a02dc 100644
--- a/Sources/XXClient/Models/NotificationReport.swift
+++ b/Sources/XXClient/Models/NotificationReport.swift
@@ -45,3 +45,13 @@ extension NotificationReport: Codable {
     try JSONEncoder().encode(self)
   }
 }
+
+extension Array where Element == NotificationReport {
+  public static func decode(_ data: Data) throws -> Self {
+    try JSONDecoder().decode(Self.self, from: data)
+  }
+
+  public func encode() throws -> Data {
+    try JSONEncoder().encode(self)
+  }
+}
diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerGetNotificationReport.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerGetNotificationReports.swift
similarity index 67%
rename from Sources/XXMessengerClient/Messenger/Functions/MessengerGetNotificationReport.swift
rename to Sources/XXMessengerClient/Messenger/Functions/MessengerGetNotificationReports.swift
index a7f04ff91554e2982cfb082cb49a9c289985dd6f..b2496c2255cf3d8988e533855d6a161eb89d9a40 100644
--- a/Sources/XXMessengerClient/Messenger/Functions/MessengerGetNotificationReport.swift
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerGetNotificationReports.swift
@@ -1,21 +1,21 @@
 import XXClient
 import XCTestDynamicOverlay
 
-public struct MessengerGetNotificationReport {
+public struct MessengerGetNotificationReports {
   public enum Error: Swift.Error, Equatable {
     case serviceListMissing
   }
 
-  public var run: (String) throws -> NotificationReport
+  public var run: (String) throws -> [NotificationReport]
 
-  public func callAsFunction(notificationCSV: String) throws -> NotificationReport {
+  public func callAsFunction(notificationCSV: String) throws -> [NotificationReport] {
     try run(notificationCSV)
   }
 }
 
-extension MessengerGetNotificationReport {
-  public static func live(_ env: MessengerEnvironment) -> MessengerGetNotificationReport {
-    MessengerGetNotificationReport { notificationCSV in
+extension MessengerGetNotificationReports {
+  public static func live(_ env: MessengerEnvironment) -> MessengerGetNotificationReports {
+    MessengerGetNotificationReports { notificationCSV in
       guard let serviceList = env.serviceList() else {
         throw Error.serviceListMissing
       }
@@ -27,8 +27,8 @@ extension MessengerGetNotificationReport {
   }
 }
 
-extension MessengerGetNotificationReport {
-  public static let unimplemented = MessengerGetNotificationReport(
+extension MessengerGetNotificationReports {
+  public static let unimplemented = MessengerGetNotificationReports(
     run: XCTUnimplemented("\(Self.self)")
   )
 }
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index d0bf6e46b814ce1c10a3194d627cd46707528530..9261d26467400a3f34fc9852c08dd5df1baf0b5d 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -47,7 +47,7 @@ public struct Messenger {
   public var sendFile: MessengerSendFile
   public var receiveFile: MessengerReceiveFile
   public var trackServices: MessengerTrackServices
-  public var getNotificationReport: MessengerGetNotificationReport
+  public var getNotificationReports: MessengerGetNotificationReports
 }
 
 extension Messenger {
@@ -99,7 +99,7 @@ extension Messenger {
       sendFile: .live(env),
       receiveFile: .live(env),
       trackServices: .live(env),
-      getNotificationReport: .live(env)
+      getNotificationReports: .live(env)
     )
   }
 }
@@ -152,6 +152,6 @@ extension Messenger {
     sendFile: .unimplemented,
     receiveFile: .unimplemented,
     trackServices: .unimplemented,
-    getNotificationReport: .unimplemented
+    getNotificationReports: .unimplemented
   )
 }
diff --git a/Tests/XXClientTests/Models/NotificationReportTests.swift b/Tests/XXClientTests/Models/NotificationReportTests.swift
index 9e99d82544e5631c26142d4a43b5a64ba96342bc..4b8372fc8669d0a660325412dcbf72b5ad5a7877 100644
--- a/Tests/XXClientTests/Models/NotificationReportTests.swift
+++ b/Tests/XXClientTests/Models/NotificationReportTests.swift
@@ -28,4 +28,43 @@ final class NotificationReportTests: XCTestCase {
 
     XCTAssertNoDifference(decodedModel, model)
   }
+
+  func testCodingArray() throws {
+    let source1B64 = "dGVzdGVyMTIzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+    let source2B64 = "ciI1cpyUUY/UPaVeMy1zBFWbZRgiZSXhY+cVoM+fCxwD"
+    let jsonString = """
+    [
+      {
+        "ForMe": true,
+        "Type": "\(NotificationReport.ReportType.default.rawValue)",
+        "Source": "\(source1B64)"
+      },
+      {
+        "ForMe": false,
+        "Type": "\(NotificationReport.ReportType.request.rawValue)",
+        "Source": "\(source2B64)"
+      },
+    ]
+    """
+    let jsonData = jsonString.data(using: .utf8)!
+    let models = try [NotificationReport].decode(jsonData)
+
+    XCTAssertNoDifference(models, [
+      NotificationReport(
+        forMe: true,
+        type: .default,
+        source: Data(base64Encoded: source1B64)!
+      ),
+      NotificationReport(
+        forMe: false,
+        type: .request,
+        source: Data(base64Encoded: source2B64)!
+      )
+    ])
+
+    let encodedModels = try models.encode()
+    let decodedModels = try [NotificationReport].decode(encodedModels)
+
+    XCTAssertNoDifference(decodedModels, models)
+  }
 }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerGetNotificationReportTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerGetNotificationReportsTests.swift
similarity index 65%
rename from Tests/XXMessengerClientTests/Messenger/Functions/MessengerGetNotificationReportTests.swift
rename to Tests/XXMessengerClientTests/Messenger/Functions/MessengerGetNotificationReportsTests.swift
index eed49be16789ec70d6179e9b5c0a8c5fc2e2e171..98e1adce1915b5d60e93312ab22990f830db3628 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerGetNotificationReportTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerGetNotificationReportsTests.swift
@@ -4,11 +4,11 @@ import XCTestDynamicOverlay
 import XXClient
 @testable import XXMessengerClient
 
-final class MessengerGetNotificationReportTests: XCTestCase {
+final class MessengerGetNotificationReportsTests: XCTestCase {
   func testGetReport() throws {
     let serviceList = MessageServiceList.stub()
     let notificationCSV = "notification-csv"
-    let notificationReport = NotificationReport.stub()
+    let notificationReports = [NotificationReport].stub()
 
     struct GetNotificationsReportParams: Equatable {
       var notificationCSV: String
@@ -25,11 +25,11 @@ final class MessengerGetNotificationReportTests: XCTestCase {
         notificationCSV: notificationCSV,
         serviceList: serviceList
       ))
-      return notificationReport
+      return notificationReports
     }
-    let getReport: MessengerGetNotificationReport = .live(env)
+    let getReports: MessengerGetNotificationReports = .live(env)
 
-    let report = try getReport(notificationCSV: notificationCSV)
+    let reports = try getReports(notificationCSV: notificationCSV)
 
     XCTAssertNoDifference(didGetNotificationsReport, [
       .init(
@@ -37,25 +37,31 @@ final class MessengerGetNotificationReportTests: XCTestCase {
         serviceList: serviceList
       )
     ])
-    XCTAssertNoDifference(report, notificationReport)
+    XCTAssertNoDifference(reports, notificationReports)
   }
 
   func testGetReportWhenServiceListMissing() {
     var env: MessengerEnvironment = .unimplemented
     env.e2e.get = { .unimplemented }
     env.serviceList.get = { nil }
-    let getReport: MessengerGetNotificationReport = .live(env)
+    let getReports: MessengerGetNotificationReports = .live(env)
 
-    XCTAssertThrowsError(try getReport(notificationCSV: "")) { error in
+    XCTAssertThrowsError(try getReports(notificationCSV: "")) { error in
       XCTAssertNoDifference(
-        error as? MessengerGetNotificationReport.Error,
+        error as? MessengerGetNotificationReports.Error,
         .serviceListMissing
       )
     }
   }
 }
 
-extension NotificationReport {
+private extension Array where Element == NotificationReport {
+  static func stub() -> [NotificationReport] {
+    [.stub(), .stub(), .stub()]
+  }
+}
+
+private extension NotificationReport {
   static func stub() -> NotificationReport {
     NotificationReport(
       forMe: .random(),