diff --git a/CMakeLists.txt b/CMakeLists.txt
index d45eb1f7b3b14bd37b63adcbfc264dec1a8a5217..3b6fe628791ad1fa8167086c9a86bd4583e7dd57 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -20,7 +20,7 @@ include(astyle)
 include(testing_cpp)
 
 add_subdirectory(common/cpp)
-add_subdirectory(producer/api)
+add_subdirectory(producer)
 add_subdirectory(worker/api/cpp)
 add_subdirectory(receiver)
 
diff --git a/producer/CMakeLists.txt b/producer/CMakeLists.txt
index 5f35adf857e6f13c8bba2de4452a9eeeb55169fc..53d257b04ea6ffc4b663736b9d8bd559dc341222 100644
--- a/producer/CMakeLists.txt
+++ b/producer/CMakeLists.txt
@@ -1 +1 @@
-#add_subdirectory(inotify-event-detector-cpp)
+add_subdirectory(api)
diff --git a/producer/api/include/producer/producer.h b/producer/api/include/producer/producer.h
index e04f927825176e2742c1ef464e33edd901464b74..486025abb2553b503b0a6f1a6a6cd18832a856be 100644
--- a/producer/api/include/producer/producer.h
+++ b/producer/api/include/producer/producer.h
@@ -27,15 +27,28 @@ enum class ProducerStatus {
 
 class Producer {
   public:
+    //! Creates a new producer
     static std::unique_ptr<Producer> create();
 
-    //virtual ~Producer() = 0;
+    virtual ~Producer() = default;
 
     virtual uint64_t GetVersion() const = 0;
     virtual ProducerStatus GetStatus() const = 0;
 
+    //! Connects to a receiver
+    /*!
+      \param receiver_address - The address of the receiver. E.g. 127.0.0.1:4200
+      \return ProducerError - Will be ProducerError::kNoError on success
+    */
     virtual ProducerError ConnectToReceiver(const std::string& receiver_address) = 0;
-    virtual ProducerError Send(uint64_t file_id, void* data, size_t file_size) = 0;
+    //! Sends data to the receiver
+    /*!
+      \param file_id - The id of the file. An error will be returned if this file id already exists on the receiver.
+      \param data - A pointer to the data to send
+      \param file_size - The size of the data.
+      \return ProducerError - Will be ProducerError::kNoError on success
+    */
+    virtual ProducerError Send(uint64_t file_id, const void* data, size_t file_size) = 0;
 };
 }
 
diff --git a/producer/api/src/producer_impl.cpp b/producer/api/src/producer_impl.cpp
index da208b21ed4d0a834b52dba4e474f9e49208bdfb..07c0311119ad29238c6188a361b007e24b8ca704 100644
--- a/producer/api/src/producer_impl.cpp
+++ b/producer/api/src/producer_impl.cpp
@@ -65,7 +65,7 @@ hidra2::ProducerError hidra2::ProducerImpl::ConnectToReceiver(const std::string&
     return ProducerError::kNoError;
 }
 
-hidra2::ProducerError hidra2::ProducerImpl::Send(uint64_t file_id, void* data, size_t file_size) {
+hidra2::ProducerError hidra2::ProducerImpl::Send(uint64_t file_id, const void* data, size_t file_size) {
     if(status_ != ProducerStatus::kConnected) {
         return ProducerError::kConnectionNotReady;
     }
diff --git a/producer/api/src/producer_impl.h b/producer/api/src/producer_impl.h
index 3c00c114b0271a8589eacac2d290477a164e163d..9c8a277a20a481cd98c3acedc868860aa2ca2736 100644
--- a/producer/api/src/producer_impl.h
+++ b/producer/api/src/producer_impl.h
@@ -29,7 +29,7 @@ class ProducerImpl : public Producer, public HasIO {
     uint64_t GetVersion() const override;
     ProducerStatus GetStatus() const override;
     ProducerError ConnectToReceiver(const std::string& receiver_address) override;
-    ProducerError Send(uint64_t file_id, void* data, size_t file_size) override;
+    ProducerError Send(uint64_t file_id, const void* data, size_t file_size) override;
 
 };
 }