diff --git a/xroot_plugins/XrdSsiCtaRequestMessage.cpp b/xroot_plugins/XrdSsiCtaRequestMessage.cpp
index fe4681d5c2d8dbefedaf61e9cc0a9f41cb2b19e5..c3e5a0213407138de152daa16b9f5b8ab7a281dc 100644
--- a/xroot_plugins/XrdSsiCtaRequestMessage.cpp
+++ b/xroot_plugins/XrdSsiCtaRequestMessage.cpp
@@ -393,11 +393,17 @@ void RequestMessage::processCLOSEW(const cta::eos::Notification &notification, c
      throw PbException(std::string(__FUNCTION__) + ": Failed to find the extended attribute named sys.archive.storage_class");
    }
 
-   // For testing, this storage class will always fail
+   // For testing: this storage class will always fail
    if(storageClassItor->second == "fail_on_closew_test") {
       throw PbException("File is in fail_on_closew_test storage class, which always fails.");
    }
 
+   // Disallow archival of files above the specified limit
+   if(notification.file().size() > m_archiveFileMaxSize) {
+      throw exception::UserError("Archive request rejected: file size (" + std::to_string(notification.file().size()) +
+                                 " bytes) exceeds maximum allowed size (" + std::to_string(m_archiveFileMaxSize) + " bytes)");
+   }
+
    cta::common::dataStructures::ArchiveRequest request;
    checksum::ProtobufToChecksumBlob(notification.file().csb(), request.checksumBlob);
    request.diskFileInfo.owner_uid = notification.file().owner().uid();
@@ -417,7 +423,6 @@ void RequestMessage::processCLOSEW(const cta::eos::Notification &notification, c
 
    // CTA Archive ID is an EOS extended attribute, i.e. it is stored as a string, which
    // must be converted to a valid uint64_t
-
    const auto archiveFileIdItor = notification.file().xattr().find("sys.archive.file_id");
    if(notification.file().xattr().end() == archiveFileIdItor) {
      throw PbException(std::string(__FUNCTION__) + ": Failed to find the extended attribute named sys.archive.file_id");
diff --git a/xroot_plugins/XrdSsiCtaRequestMessage.hpp b/xroot_plugins/XrdSsiCtaRequestMessage.hpp
index 67bf2968587696e2a13c3c9095fd25adfd4f7670..c71640b7504b4db64299f7b51907e0b57092f05e 100644
--- a/xroot_plugins/XrdSsiCtaRequestMessage.hpp
+++ b/xroot_plugins/XrdSsiCtaRequestMessage.hpp
@@ -36,6 +36,7 @@ public:
     m_scheddb(service->getSchedDb()),
     m_catalogue(service->getCatalogue()),
     m_scheduler(service->getScheduler()),
+    m_archiveFileMaxSize(service->getArchiveFileMaxSize()),
     m_repackBufferURL(service->getRepackBufferURL()),
     m_namespaceMap(service->getNamespaceMap()),
     m_lc(service->getLogContext()) {
@@ -271,6 +272,7 @@ private:
   cta::OStoreDBWithAgent                               &m_scheddb;            //!< Reference to CTA ObjectStore
   cta::catalogue::Catalogue                            &m_catalogue;          //!< Reference to CTA Catalogue
   cta::Scheduler                                       &m_scheduler;          //!< Reference to CTA Scheduler
+  uint64_t                                              m_archiveFileMaxSize; //!< Maximum allowed file size for archive requests
   optional<std::string>				        m_repackBufferURL;    //!< Repack buffer URL
   NamespaceMap_t                                        m_namespaceMap;       //!< Identifiers for namespace queries
   cta::log::LogContext                                  m_lc;                 //!< CTA Log Context
diff --git a/xroot_plugins/XrdSsiCtaServiceProvider.cpp b/xroot_plugins/XrdSsiCtaServiceProvider.cpp
index ee42e84d96901bc9fc3a552b583f27bd0b5395d3..bb2f58de6aa451e48212e2ef1d654a6d2606a997 100644
--- a/xroot_plugins/XrdSsiCtaServiceProvider.cpp
+++ b/xroot_plugins/XrdSsiCtaServiceProvider.cpp
@@ -148,7 +148,12 @@ void XrdSsiCtaServiceProvider::ExceptionThrowingInit(XrdSsiLogger *logP, XrdSsiC
    } catch (std::bad_cast &) {
       // If not, never mind
    }
-   
+
+   // Initialise the Frontend
+   auto archiveFileMaxSize = config.getOptionValueInt("cta.archivefile.max_size_gb");
+   m_archiveFileMaxSize = archiveFileMaxSize.first ? archiveFileMaxSize.second : 2048; // GB
+   m_archiveFileMaxSize *= 1024*1024*1024; // bytes
+
    // Get the repack buffer URL
    auto repackBufferURLConf = config.getOptionValueStr("cta.repack.repack_buffer_url");
    if(repackBufferURLConf.first){
diff --git a/xroot_plugins/XrdSsiCtaServiceProvider.hpp b/xroot_plugins/XrdSsiCtaServiceProvider.hpp
index 74acb3ce53d0e2873874bdb0a7a042b175c55c5d..f4fa5da741d04a57aec897ddd4f8205bb69502b5 100644
--- a/xroot_plugins/XrdSsiCtaServiceProvider.hpp
+++ b/xroot_plugins/XrdSsiCtaServiceProvider.hpp
@@ -104,7 +104,12 @@ public:
     * Get the log context for this Service
     */
    cta::log::LogContext getLogContext() const { return cta::log::LogContext(*m_log); }
-   
+
+   /*!
+    * Get the maximum file size for an archive request
+    */
+   uint64_t getArchiveFileMaxSize() const { return m_archiveFileMaxSize; }
+
    /*!
     * Get the repack buffer URL
     */
@@ -148,6 +153,7 @@ private:
 
    // Member variables
 
+   uint64_t                                            m_archiveFileMaxSize;  //!< Maximum allowed file size for archive requests
    std::unique_ptr<cta::objectstore::Backend>          m_backend;             //!< VFS backend for the objectstore DB
    std::unique_ptr<cta::objectstore::BackendPopulator> m_backendPopulator;    //!< Object used to populate the backend
    std::unique_ptr<cta::OStoreDBWithAgent>             m_scheddb;             //!< DB/Object Store of persistent objects
diff --git a/xroot_plugins/cta-frontend-xrootd.conf b/xroot_plugins/cta-frontend-xrootd.conf
index b7b88c14303dc809fc49b56517c0d967c37c4f99..9ac9bc8d3d6915376691bb40cd79587f348ac61e 100644
--- a/xroot_plugins/cta-frontend-xrootd.conf
+++ b/xroot_plugins/cta-frontend-xrootd.conf
@@ -11,6 +11,9 @@ cta.schedulerdb.numberofthreads 500
 # CTA Catalogue options
 cta.catalogue.numberofconnections 10
 
+# Maximum file size (in GB) that the CTA Frontend will accept for archiving
+cta.archivefile.max_size_gb 1000
+
 # CTA Frontend log URL
 cta.log.url file:/var/log/cta/cta-frontend.log