diff --git a/Rakefile b/Rakefile
index da0d0a622e4c4181890aaae4a53f713ffb76ece3..1f4fd9ff6d715ef63c74d56c5eb0ebcb0975d91f 100644
--- a/Rakefile
+++ b/Rakefile
@@ -203,10 +203,11 @@ namespace :gen do
 
   namespace :puppet do
 
-    all_puppet_tasks = [:bindg5k, :conmang5k, :dhcpg5k, :kadeployg5k, :lanpowerg5k, :kavlang5k, :network_monitoring]
+    all_puppet_tasks = [:bindg5k, :conmang5k, :dhcpg5k, :kadeployg5k, :lanpowerg5k, :kavlang5k, :network_monitoring, :'refapi-subset']
 
     all_puppet_tasks.each { |t|
-      desc "Generate #{t} configuration -- parameters: [SITE={grenoble,...}] [OUTPUTDIR=(default: #{PUPPET_ODIR})] [CONFDIR=...] [VERBOSE=1]"
+      generated_desc = (t == :'refapi-subset') ? 'description' : 'configuration'
+      desc "Generate #{t} #{generated_desc} -- parameters: [SITE={grenoble,...}] [OUTPUTDIR=(default: #{PUPPET_ODIR})] [CONFDIR=...] [VERBOSE=1]"
       task t do
         require "refrepo/gen/puppet/#{t}"
         options = {}
@@ -214,7 +215,7 @@ namespace :gen do
         options[:output_dir] = ENV['OUTPUTDIR'] || PUPPET_ODIR
         options[:verbose] = true if ENV['VERBOSE']
         options[:conf_dir] = ENV['CONFDIR'] if ENV['CONFDIR']
-        send("generate_puppet_#{t}", options)
+        send("generate_puppet_#{t}".gsub(/-/, '_'), options)
 
       end
     }
diff --git a/lib/refrepo/gen/puppet/refapi-subset.rb b/lib/refrepo/gen/puppet/refapi-subset.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e63082962de3767d35399ef90c6926585d525e87
--- /dev/null
+++ b/lib/refrepo/gen/puppet/refapi-subset.rb
@@ -0,0 +1,31 @@
+# coding: utf-8
+
+require 'refrepo/data_loader'
+
+def generate_puppet_refapi_subset(options)
+  if not options[:conf_dir]
+    options[:conf_dir] = "#{options[:output_dir]}/platforms/production/generators/refapi"
+  end
+
+  options[:sites].each do |site|
+    output_file = "#{options[:output_dir]}/platforms/production/modules/generated/files/grid5000/refapi/#{site}.json"
+    gen_json(site, output_file)
+  end
+end
+
+# For now, we only put software key in the generated JSON
+def gen_json(site, output_path)
+  site_data_hierarchy = load_data_hierarchy
+  site_data_hierarchy.delete_if { |key| key != 'sites' }
+  site_data_hierarchy['sites'].delete_if { |key| key != site }
+  site_data_hierarchy['sites'][site].delete_if { |key| key != 'clusters' }
+  site_data_hierarchy['sites'][site]['clusters'].to_h.each do |cluster_uid, cluster_hash|
+    cluster_hash.delete_if { |key| key != 'nodes' }
+    cluster_hash['nodes'].to_h.each do |node_uid, node_hash|
+      node_hash.delete_if { |key| key != 'software' }
+    end
+  end
+
+  output_file = File.new(output_path, 'w')
+  output_file.write(JSON.pretty_generate(site_data_hierarchy))
+end