diff --git a/gestion_des_portfolios/README b/gestion_des_portfolios/README
index 76d8e7f76d21a9af3f96970c83d9ab420bf8b73a..0e61483de4bd99f0e9567945ac295bce8724b985 100644
--- a/gestion_des_portfolios/README
+++ b/gestion_des_portfolios/README
@@ -2,18 +2,35 @@ Gestion des porfolios
 
 API Bibs
 depot git : https://gitlab.univ-lille.fr/rachid.aliouat/apialma/-/tree/master/gestion_des_portfolios
+
+--------
+CLE API
+--------
+Pour tous les programmes , les cles API doivent être mises dans un fichier dédié : cle.key
+Dupliquer le fichier cle.exempe pour en faire le fichier cle.key
+Ce fichier est un simple fichier texte séparateur tabulation cle/valeur
+Ne renseigner que la valeur. Ne pas renmmer le libellé de la clé
+exemple :
+api_user_bibs	extract_bib_item_test
+api_cle_bibs	l8xx6####################625
+
+--------
+--------
 --------------
-1er programme 
+1er programme : active-portfolios.pl
 --------------
 programme perl pour récupérer les portfolios(GET), et éventuellement pour activer des portfolios (API PUT) si l'URL contient le motif voulu
 
 
 Le programme a besoin de son fichier de configuration à passer en parametre (voir config-activer.exemple)
 
-api_user_bibs    extract_bib_item_test
-api_cle_bibs    l8xx6e14707########7625
-motif_url    https://pepite-depot
-proxy	DEFAULT
+motif_url	https://pepite-depot
+proxy	
+rapport	yes
+email_subject	Rapport portfolio 
+email_destinataire	prenom.nom@univ-machin.fr
+smtp	smtp.univ-machin.fr
+from	noreply@univ-machin.fr
 
 On passe au programme la liste des MMS ID des notices sur lesquelles il doit travailler
 
@@ -69,20 +86,22 @@ Activation    MMS_ID=991007858583205601 --> Porfolio_id=53267587030005601
 
 
 --------------
-2eme programme 
+2eme programme creer-portfolios.pl
 --------------
 Programme perl pour creer des portfolios
+Les clé api doivent être dans cle.key (voir plus haut)
 Le programme a besoin de son fichier de configuration à passer en parametre (voir config-creer.exemple)
 
-api_user_bibs    extract_bib_item_test
-api_cle_bibs    l8xx6e14707########7625
+zone_uri	856
+zone_uri_url	u
+zone_uri_note	z
 
 Le programme a besoin d'un fichier modele de portfolio : modele-portfolio.xml
 
 
 On passe au programme la liste des MMS ID des notices sur lesquelles il doit travailler
 
- perl creer-portfolios.pl liste-mms.csv
+perl creer-portfolios.pl config-creer.conf liste-mms.csv
 
 Exemple de fichier liste-mms.csv
 
@@ -94,6 +113,6 @@ MMS_ID
 
 Algorithme :
 Pour chaque mms_id, le programme récupére la notice.
-Pour chaque 856$u, il va récuperer l'url
+Pour chaque zone_url sous champ zone_uri_url (exemple 856$u), il va récuperer l'url, et la note public dans zone_uri sous champ zone_uri_note (exemple 856$z)
 Le programme recupere tous les portfolio existants. Il compare avec sa liste d'URL pour ne pas créer de doublon.
 Le programme créé les portfolios pour les url qui n'existent pas encore en tant que portfolio.
diff --git a/gestion_des_portfolios/active-portfolios.pl b/gestion_des_portfolios/active-portfolios.pl
index 5f44841c8a1b5505e2d455325def4a73b23991c9..0afa0726fb9694b6c00f3cd0255e153ff31ed210 100644
--- a/gestion_des_portfolios/active-portfolios.pl
+++ b/gestion_des_portfolios/active-portfolios.pl
@@ -9,6 +9,7 @@
 #	31-03-2023 : ajout activation du proxy si la variable proxy est alimentée dans la conf
 #	18-07-2023 : modif du code : tri sur la clé portofolio_id lors du traitement pour avoir un fichier journal plus linéaire
 #	29/11/2024 : passage du fichier de conf en parametre
+#	29/05/2025 : fichier cle.key dedié aux clés api. les clés api ne sont plus mise dans les fichier de conf. plus pratique pour la gestion GIT.
 ###########
 #	passage de parametre -> active_portfolios.pl	fichier-conf.conf	liste.csv
 ##############################
@@ -22,7 +23,8 @@ use MIME::Lite;
 
 my $nom_fic_csv="";
 my %hash_conf=();
-my $nom_fic_conf="";
+my $nom_fic_conf=""; 
+my $nom_fic_cle="cle.key"; # les clés API impérativement dans ce fichier
 my @tab_inter = ();
 my $i=0;
 my $mms_id="";
@@ -36,16 +38,32 @@ my $balise_proxy_enable="<proxy_enabled desc=\"Yes\">true</proxy_enabled>";
 my $balise_proxy="";
 
 
-
-if (!(exists $ARGV[0])) {print "Manque le fichier de conf en parametre.\n";exit(0)};
+## test si fichier des mms id est en paramétre
+if (!(exists $ARGV[0])) {print "Manque des fichiers en parametre : perl active-portfolios.pl config.conf liste-mms.csv\n";exit(0)};
 $nom_fic_conf=$ARGV[0];
-if (!(exists $ARGV[1])) {print "Manque le fichier des MMS_ID en parametre.\n";exit(0)};
+if (!(exists $ARGV[1])) {print "Manque des fichiers en parametre : perl active-portfolios.pl config.conf liste-mms.csv\n";exit(0)};
 $nom_fic_csv=$ARGV[1];
 
+##### LIRE LE FICHIER DE CLE
+
+open (CONF, $nom_fic_cle) or die "Ouverture fichier de cle api $nom_fic_cle impossible , cause : $! \n";
+print "lecture des cle api:\n";
+print "-" x 20, "\n";
+@tab_inter = <CONF>; 
+close(CONF);
+$i=0;
+for ($i=0;$i<=$#tab_inter;$i++) {
+	#print $tab_inter[$i];
+	my @ligne=split('\t',$tab_inter[$i]); # decoupage ligne
+	$hash_conf{$ligne[0]}=epure($ligne[1]); # alimentation de la table de hash avec les cles
+	
+
+}
+
 ##### LIRE LE FICHIER DE CONF
 
-open (CONF, $nom_fic_conf) or die "Ouverture fichier de configuration $nom_fic_conf impossible , cause : $! \n";
-print "lecture de la configuration:\n";
+open (CONF, $nom_fic_conf) or die "Ouverture fichier de conf $nom_fic_conf impossible , cause : $! \n";
+print "lecture des conf :\n";
 print "-" x 20, "\n";
 @tab_inter = <CONF>; 
 close(CONF);
@@ -53,7 +71,7 @@ $i=0;
 for ($i=0;$i<=$#tab_inter;$i++) {
 	#print $tab_inter[$i];
 	my @ligne=split('\t',$tab_inter[$i]); # decoupage ligne
-	$hash_conf{$ligne[0]}=epure($ligne[1]); # alimentation de la table de hash avec la conf
+	$hash_conf{$ligne[0]}=epure($ligne[1]); # alimentation de la table de hash avec les cles
 	
 
 }
@@ -73,6 +91,16 @@ print "lecture des MMS_ID:\n";
 print "-" x 20, "\n";
 @tab_inter = <CSV>; 
 close(CSV);
+for ($i=1;$i<=$#tab_inter;$i++) { #supprimer les lignes vides ou sans mms_id
+	print "$tab_inter[$i] =>\n";
+	if ($tab_inter[$i]=~ /^\d.*/) { # si cela ne commence par par un chiffre
+		print "OK pour [".$tab_inter[$i]."]\n";
+	} else {
+		print "delete [".$tab_inter[$i]."]\n";
+		delete $tab_inter[$i];
+		
+	}
+}
 ######## Ouvrir le rapport d'errreur des lignes non traité : par exemple PPN inconnu
 open (ERR, ">journal-activer-portfolios-$date_jour_rapport.txt") or die "Ouverture fichier de journal impossible , cause : $! \n";
 print ERR "Motif\tCommentaire\n"; # on récupére l'entête , on ajoute une colone avant pour renseigner ensuite le motif du rejet
@@ -84,18 +112,17 @@ close (ERR);
 ######### Recuperer tous les portfolios
 $i=1; # on passe la ligne d'entete => on commence à 1
 for ($i;$i<=$#tab_inter;$i++) {
+	## passer les lignes vides
 	print "############ Traitement de la ligne : ################\n$tab_inter[$i]#########################\n";
 	my @ligne=split('\t',$tab_inter[$i]); # decoupage ligne dès que le CSV comporte plusieurs colonne
 	#$mms_id=epure($tab_inter[$i]);
 	$mms_id=epure($ligne[0]);
 	print "############ Traitement du MMS_ID : ################\n$mms_id\n#########################\n";
-	## passer les ligne vide
 	$twig_portfolios=XML::Twig->new( # on créer un objet TWIG dans lequel on met toute la structure XML
-		
-        pretty_print  => 'indented',
-	);
+		pretty_print  => 'indented',
+		);
 	$block_xml=get_portfolios_from_mms_id($mms_id); # Appel de l'API sur le mms_id pour récuperer toutes les portfolios
-	#print $block_xml,"\n";
+	print $block_xml,"\n";
 	if  ($block_xml !~ /total_record_count="0"/) { # s'il y a un portfolos
 		$twig_portfolios->parse($block_xml); # ici tout est dans la structure twig
 		my $root= $twig_portfolios->root->first_child('portfolios');  
@@ -105,14 +132,11 @@ for ($i;$i<=$#tab_inter;$i++) {
 			my $portfolio_id=$un_portfolio_id->first_child('id')->text ; #portfolio_id
 			print $portfolio_id,"\n";
 			$hash_portfolios{$portfolio_id}=$mms_id;
-			
-			}
+		}
 	} else { # log erreur
 		print "Aucun portfolios pour $mms_id\n";
 		ecrire_log("Aucun portfolio",$mms_id);
-
 	}
-
 }
 
 ########### Activer tous les portfolios pour lesquels l'url contient le motif (motif_url)
diff --git a/gestion_des_portfolios/cle.exemple b/gestion_des_portfolios/cle.exemple
new file mode 100755
index 0000000000000000000000000000000000000000..2547c4d0d33bf1b2e0b334bf32574b9163cdcd91
--- /dev/null
+++ b/gestion_des_portfolios/cle.exemple
@@ -0,0 +1,2 @@
+api_user_bibs	extract_bib_item_test
+api_cle_bibs	l8xx6####################625
diff --git a/gestion_des_portfolios/config-creer.exemple b/gestion_des_portfolios/config-creer.exemple
index 6e95bf251e995c4722a588087a1fb78e99c24c29..2a61945dd15727a12b82f1a7065960b72737844f 100755
--- a/gestion_des_portfolios/config-creer.exemple
+++ b/gestion_des_portfolios/config-creer.exemple
@@ -1,2 +1,3 @@
-api_user_create_hold_item	create_hold_item_test
-api_cle_create_hold_item	l8xx0f3#############7ed8945d81
+zone_uri	856
+zone_uri_url	u
+zone_uri_note	z
diff --git a/gestion_des_portfolios/creer_portfolios.pl b/gestion_des_portfolios/creer_portfolios.pl
index 09fcceaa72a82087b278e79da5a5b01f3628da51..b81b41998eac794318708554faf40b4204600662 100644
--- a/gestion_des_portfolios/creer_portfolios.pl
+++ b/gestion_des_portfolios/creer_portfolios.pl
@@ -12,6 +12,7 @@
 #	28/09/2023 : creer les portfolio dans l'ordre d'apparition des 856
 #	04/12/2023 : ajouter dans les logs une information de creation du portfolio
 #	29/11/2024 : passage du fichier de conf en parametre
+#	29/05/2025 : fichier cle.key dedié aux clés api. les clés api ne sont plus mise dans les fichier de conf. plus pratique pour la gestion GIT.
 ###########
 #	passage de parametre -> creer_portfolio.pl	fichier-conf.conf	liste.csv
 ##############################
@@ -26,6 +27,7 @@ use Encode;
 my $nom_fic_csv="";
 my %hash_conf=();
 my $nom_fic_conf="";
+my $nom_fic_cle="cle.key"; # les clés API impérativement dans ce fichier
 my @tab_inter = ();
 my $i=0;
 my $mms_id="";
@@ -37,11 +39,27 @@ my %tab_mms_id_url_ordonnee=(); # table de hash des mmd_id et url avec l'ordre d
 my $ordre_apparition_856=0;
 my $nbr_portfolios=0;
 
-if (!(exists $ARGV[0])) {print "Manque le fichier de conf en parametre.\n";exit(0)};
+if (!(exists $ARGV[0])) {print "Manque des fichiers en parametre : perl creer_portfolio.pl	fichier-conf.conf	liste.csv.\n";exit(0)};
 $nom_fic_conf=$ARGV[0];
-if (!(exists $ARGV[1])) {print "Manque le fichier des MMS_ID en parametre.\n";exit(0)};
+if (!(exists $ARGV[1])) {print "Manque des fichiers en parametre : perl creer_portfolio.pl	fichier-conf.conf	liste.csv.\n";exit(0)};
 $nom_fic_csv=$ARGV[1];
 
+##### LIRE LE FICHIER DE CLE
+
+open (CONF, $nom_fic_cle) or die "Ouverture fichier de cle api $nom_fic_cle impossible , cause : $! \n";
+print "lecture des cle api:\n";
+print "-" x 20, "\n";
+@tab_inter = <CONF>; 
+close(CONF);
+$i=0;
+for ($i=0;$i<=$#tab_inter;$i++) {
+	#print $tab_inter[$i];
+	my @ligne=split('\t',$tab_inter[$i]); # decoupage ligne
+	$hash_conf{$ligne[0]}=epure($ligne[1]); # alimentation de la table de hash avec les cles
+	
+
+}
+
 ##### LIRE LE FICHIER DE CONF
 
 open (CONF, $nom_fic_conf) or die "Ouverture fichier de configuration $nom_fic_conf impossible , cause : $! \n";