From fb036feb5ddb21554a0f31767f31442b5720bedd Mon Sep 17 00:00:00 2001 From: Gabriel Grinberg Date: Wed, 4 Feb 2026 13:08:07 +0200 Subject: [PATCH 1/2] Fix feature flag 401 errors causing HTTP request storm Set feature_flags = [] on 401 error to prevent repeated requests. --- posthog/client.py | 1 + posthog/test/test_client.py | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/posthog/client.py b/posthog/client.py index 6470fd3e..36ae7e0f 100644 --- a/posthog/client.py +++ b/posthog/client.py @@ -1335,6 +1335,7 @@ def _fetch_feature_flags_from_api(self): self.log.error( "[FEATURE FLAGS] Error loading feature flags: To use feature flags, please set a valid personal_api_key. More information: https://posthog.com/docs/api/overview" ) + self.feature_flags = [] if self.debug: raise APIError( status=401, diff --git a/posthog/test/test_client.py b/posthog/test/test_client.py index fe0eeab6..f3ad4730 100644 --- a/posthog/test/test_client.py +++ b/posthog/test/test_client.py @@ -479,6 +479,18 @@ def test_load_feature_flags_quota_limited(self, patch_get): self.assertEqual(client.cohorts, {}) self.assertIn("PostHog feature flags quota limited", logs.output[0]) + @mock.patch("posthog.client.get") + def test_load_feature_flags_unauthorized(self, patch_get): + patch_get.side_effect = APIError(401, "Unauthorized") + + client = Client(FAKE_TEST_API_KEY, personal_api_key="test") + with self.assertLogs("posthog", level="ERROR") as logs: + client._load_feature_flags() + + self.assertEqual(client.feature_flags, []) + self.assertEqual(client.feature_flags_by_key, {}) + self.assertIn("please set a valid personal_api_key", logs.output[0]) + @mock.patch("posthog.client.flags") def test_dont_override_capture_with_local_flags(self, patch_flags): patch_flags.return_value = {"featureFlags": {"beta-feature": "random-variant"}} From 9066fb1fc4c28ba1ff0aec1fb9f67c8f530c0785 Mon Sep 17 00:00:00 2001 From: Gabriel Grinberg Date: Wed, 4 Feb 2026 13:14:19 +0200 Subject: [PATCH 2/2] Clear flag_cache, group_type_mapping, cohorts on 401 --- posthog/client.py | 6 ++++++ posthog/test/test_client.py | 2 ++ 2 files changed, 8 insertions(+) diff --git a/posthog/client.py b/posthog/client.py index 36ae7e0f..64db985d 100644 --- a/posthog/client.py +++ b/posthog/client.py @@ -1336,6 +1336,12 @@ def _fetch_feature_flags_from_api(self): "[FEATURE FLAGS] Error loading feature flags: To use feature flags, please set a valid personal_api_key. More information: https://posthog.com/docs/api/overview" ) self.feature_flags = [] + self.group_type_mapping = {} + self.cohorts = {} + + if self.flag_cache: + self.flag_cache.clear() + if self.debug: raise APIError( status=401, diff --git a/posthog/test/test_client.py b/posthog/test/test_client.py index f3ad4730..57c06867 100644 --- a/posthog/test/test_client.py +++ b/posthog/test/test_client.py @@ -489,6 +489,8 @@ def test_load_feature_flags_unauthorized(self, patch_get): self.assertEqual(client.feature_flags, []) self.assertEqual(client.feature_flags_by_key, {}) + self.assertEqual(client.group_type_mapping, {}) + self.assertEqual(client.cohorts, {}) self.assertIn("please set a valid personal_api_key", logs.output[0]) @mock.patch("posthog.client.flags")