diff --git a/models/res_partner.py b/models/res_partner.py
index a5260bdf31c0d95ec634faf26eab4385fc787887..2afba025125c37b6491e0b162e73a990da65113b 100644
--- a/models/res_partner.py
+++ b/models/res_partner.py
@@ -95,35 +95,36 @@ class ResPartner(models.Model):
         UTILS: renvoi l objet etablissement du siege
         """
         # check si l etablissement principal est le siege
-        ets_prin = inpi_data.formality.content.personneMorale.etablissementPrincipal
+        if inpi_data.formality.content.personneMorale:
+            ets_prin = inpi_data.formality.content.personneMorale.etablissementPrincipal
 
-        if (
-            ets_prin
-            and ets_prin.descriptionEtablissement.rolePourEntreprise
-            == inpi_models.RolePourEntreprise.SIEGE_ETS_PRIN.value
-        ):
-            return ets_prin
-
-        # si l etablissement pricipal n est pas le siege,
-        # on cherche parmi les secondaires
-        ets_secondaires = (
-            inpi_data.formality.content.personneMorale.autresEtablissements
-        )
-
-        for ets in ets_secondaires:
             if (
-                ets.descriptionEtablissement.rolePourEntreprise
-                == inpi_models.RolePourEntreprise.SIEGE.value
+                ets_prin
+                and ets_prin.descriptionEtablissement.rolePourEntreprise
+                == inpi_models.RolePourEntreprise.SIEGE_ETS_PRIN.value
             ):
-                return ets
+                return ets_prin
 
-        # si dissolution on renvoi l adresse du siege fermé
-        for ets in ets_secondaires:
-            if (
-                ets.descriptionEtablissement.rolePourEntreprise
-                == inpi_models.RolePourEntreprise.SIEGE_FERME.value
-            ):
-                return ets
+            # si l etablissement pricipal n est pas le siege,
+            # on cherche parmi les secondaires
+            ets_secondaires = (
+                inpi_data.formality.content.personneMorale.autresEtablissements
+            )
+
+            for ets in ets_secondaires:
+                if (
+                    ets.descriptionEtablissement.rolePourEntreprise
+                    == inpi_models.RolePourEntreprise.SIEGE.value
+                ):
+                    return ets
+
+            # si dissolution on renvoi l adresse du siege fermé
+            for ets in ets_secondaires:
+                if (
+                    ets.descriptionEtablissement.rolePourEntreprise
+                    == inpi_models.RolePourEntreprise.SIEGE_FERME.value
+                ):
+                    return ets
         return None
 
     # --------------------------------------------------
@@ -174,6 +175,9 @@ class ResPartner(models.Model):
         MAJ denomination
         """
         logger.info(_(f"Update denomination for {self.name}: {self.siren}"))
+        if not inpi_data.formality.content.personneMorale:
+            return self._get_current_period()
+
         inpi_name = (
             inpi_data.formality.content.personneMorale.identite.entreprise.denomination
         )
@@ -205,6 +209,8 @@ class ResPartner(models.Model):
         MAJ code naf
         """
         logger.info(_(f"Update code naf for {self.name}: {self.siren}"))
+        if not inpi_data.formality.content.personneMorale:
+            return self._get_current_period()
         inpi_naf_id = self._get_inpi_naf_id(
             inpi_data.formality.content.personneMorale.identite.entreprise.codeApe
         )
@@ -280,13 +286,14 @@ class ResPartner(models.Model):
         """
         UTILS: get facility data from siret
         """
-        inpi_facilities = (
-            inpi_data.formality.content.personneMorale.autresEtablissements
-        )
-        if inpi_facilities:
-            for facility in inpi_facilities:
-                if facility.descriptionEtablissement.siret == siret:
-                    return facility
+        if inpi_data.formality.content.personneMorale:
+            inpi_facilities = (
+                inpi_data.formality.content.personneMorale.autresEtablissements
+            )
+            if inpi_facilities:
+                for facility in inpi_facilities:
+                    if facility.descriptionEtablissement.siret == siret:
+                        return facility
         return None
 
     def _update_facility(self, inpi_facility, facility):
@@ -331,9 +338,11 @@ class ResPartner(models.Model):
         Les nouveaux sont créées on ne fait rien pour ceux qui ne sont plus dans INPI
         """
         logger.info(_(f"Update etablissement for {self.name}: {self.siren}"))
-        inpi_facilities = (
-            inpi_data.formality.content.personneMorale.autresEtablissements
-        )
+        inpi_facilities = None
+        if inpi_data.formality.content.personneMorale:
+            inpi_facilities = (
+                inpi_data.formality.content.personneMorale.autresEtablissements
+            )
         facilities_not_in_inpi = []
 
         if inpi_facilities:
@@ -386,7 +395,7 @@ class ResPartner(models.Model):
         Les dirigants sont créées via le modele cgscop.inpi.director
         """
         logger.info(_(f"Update dirigeants for {self.name}: {self.siren}"))
-        if inpi_data.formality.content.personneMorale.composition:
+        if inpi_data.formality.content.personneMorale and inpi_data.formality.content.personneMorale.composition:
             inpi_pouvoirs = (
                 inpi_data.formality.content.personneMorale.composition.pouvoirs
             )
diff --git a/wizard/inpi_update_wizard.py b/wizard/inpi_update_wizard.py
index 2c80017d7640a19556c7aef2596495c7cf07d8f8..81ef213537ca406b7d295e65dae37a2a79d77ceb 100644
--- a/wizard/inpi_update_wizard.py
+++ b/wizard/inpi_update_wizard.py
@@ -1,9 +1,7 @@
 # © 2020 Le Filament (<http://www.le-filament.com>)
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-
 from odoo import fields, models
 
-
 class InpiUpdateWizard(models.TransientModel):
     _name = "inpi.update.wizard"
     _description = "Update inpi wizard"
@@ -30,6 +28,8 @@ class InpiUpdateWizard(models.TransientModel):
 
     def update(self):
 
+        rate_limit_max_by_minute = 100
+
         if self.all_scop == "all":
             scop_to_update = self.env["res.partner"].search(
                 [
@@ -42,7 +42,12 @@ class InpiUpdateWizard(models.TransientModel):
         else:
             scop_to_update = self.partner_ids
 
-        for scop in scop_to_update:
+        # due to rate limit we launch batch of queue every minute
+        eta = 1
+        for nb_jobs, scop in enumerate(scop_to_update):
+            if nb_jobs and nb_jobs % rate_limit_max_by_minute == 0:
+                eta += 60
             scop.sudo().with_delay(
-                description=f"Mise à jours INPI: {scop.name}"
+                description=f"Mise à jours INPI: {scop.name}", eta=eta
             ).update_from_inpi(update_type="all")
+