From 079d73cceabed4b554eb49135b4722769f2eeb19 Mon Sep 17 00:00:00 2001 From: he2ss <19668340+he2ss@users.noreply.github.com> Date: Wed, 6 May 2026 08:54:16 +0000 Subject: [PATCH] Update python SDK 1.121.0 --- crowdsec_service_api/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 4946 -> 4972 bytes .../__pycache__/base_model.cpython-311.pyc | Bin 4370 -> 4378 bytes .../__pycache__/http_client.cpython-311.pyc | Bin 7760 -> 7768 bytes .../__pycache__/models.cpython-311.pyc | Bin 149055 -> 150394 bytes crowdsec_service_api/models.py | 30 +++++- .../__pycache__/__init__.cpython-311.pyc | Bin 199 -> 207 bytes .../__pycache__/allowlists.cpython-311.pyc | Bin 12910 -> 12917 bytes .../__pycache__/blocklists.cpython-311.pyc | Bin 15114 -> 15121 bytes .../services/__pycache__/cves.cpython-311.pyc | Bin 11005 -> 11012 bytes .../__pycache__/decisions.cpython-311.pyc | Bin 3660 -> 3667 bytes .../__pycache__/fingerprints.cpython-311.pyc | Bin 10911 -> 10918 bytes .../services/__pycache__/hub.cpython-311.pyc | Bin 3270 -> 3277 bytes .../services/__pycache__/info.cpython-311.pyc | Bin 2028 -> 2035 bytes .../__pycache__/integrations.cpython-311.pyc | Bin 8068 -> 8075 bytes .../__pycache__/metrics.cpython-311.pyc | Bin 2600 -> 2607 bytes .../__pycache__/products.cpython-311.pyc | Bin 3775 -> 3782 bytes .../tracker_events.cpython-311.pyc | Bin 2907 -> 2914 bytes .../__pycache__/tracker_tags.cpython-311.pyc | Bin 5691 -> 5698 bytes .../__pycache__/vendors.cpython-311.pyc | Bin 10344 -> 10351 bytes crowdsec_service_api/services/allowlists.py | 2 +- crowdsec_service_api/services/blocklists.py | 2 +- crowdsec_service_api/services/cves.py | 2 +- crowdsec_service_api/services/decisions.py | 2 +- crowdsec_service_api/services/fingerprints.py | 2 +- crowdsec_service_api/services/hub.py | 2 +- crowdsec_service_api/services/info.py | 2 +- crowdsec_service_api/services/integrations.py | 2 +- crowdsec_service_api/services/metrics.py | 2 +- crowdsec_service_api/services/products.py | 2 +- .../services/tracker_events.py | 2 +- crowdsec_service_api/services/tracker_tags.py | 2 +- crowdsec_service_api/services/vendors.py | 2 +- doc/Models.md | 8 ++ doc/README.md | 2 + public-openapi.json | 94 ++++++++++++++++-- pyproject.toml | 2 +- uv.lock | 26 ++--- 38 files changed, 153 insertions(+), 36 deletions(-) diff --git a/crowdsec_service_api/__init__.py b/crowdsec_service_api/__init__.py index 575ab77..226be57 100644 --- a/crowdsec_service_api/__init__.py +++ b/crowdsec_service_api/__init__.py @@ -113,6 +113,7 @@ class Server(Enum): 'RawMetrics', 'RemediationMetrics', 'RemediationMetricsData', + 'RemediationStats', 'Share', 'SourceInfo', 'SourceType', diff --git a/crowdsec_service_api/__pycache__/__init__.cpython-311.pyc b/crowdsec_service_api/__pycache__/__init__.cpython-311.pyc index 163833128b3d84b09ebdf0faece86a7e81a98355..68481bf66c2375a8c50a72145ad001e6c66a6209 100644 GIT binary patch delta 130 zcmcbl_C}3&IWI340}!la{GD00k++&jEmA)tKQ~pss5CDxwMaj{JijPgKRG|II6o&< zH?bfS%AUN8DT8s{W`1U2c0qxl)ZEmR%*2w+{Jh|j#FFC8id<{h8P9D#Cz#17ozKM0 Q^nn3EHn4+WkqppM05P8_9{>OV delta 104 zcmaE(c1ewQIWI340}xDhe4ZJ%k++&jE>J%sKQ~pss5CDxwMaj{JijPgzo;x#H?bfS uNKanJl)<=mvpBOb`(_)i)$ELCH@^_fWR%Wh;%555fFK*#L9j>$Xfy!v^dDaU diff --git a/crowdsec_service_api/__pycache__/base_model.cpython-311.pyc b/crowdsec_service_api/__pycache__/base_model.cpython-311.pyc index 20476fbbd38df73fef49d875e9b27b16023ef750..c0aa44a3215db51e4ab2e0cc02576cd3323a9a81 100644 GIT binary patch delta 64 zcmbQFG)swlIWI340}xDL{JoJ|nOQAbKO;XkRlle-FE6!7KfXM_C|f@{Kd(4HCsjAG NAQQ^o?8AJF7XWZp6+-|3 delta 56 zcmbQGG)akjIWI340}wPgKHtc#%q$nIpOK%Ns$W!^mzP?kA77qdl&xP>ma3arkO`zW JhcF-G1pv`k5(@wT diff --git a/crowdsec_service_api/__pycache__/http_client.cpython-311.pyc b/crowdsec_service_api/__pycache__/http_client.cpython-311.pyc index d4fd3942ca303cfa7c5b4da3e0ae730f52566507..fbc0e174805b48d84f6fd5bdbe11fd56c517db13 100644 GIT binary patch delta 64 zcmca$bHj#vIWI340}xDL{JoL;9HUx{enx(7s(w*vUS4XEetda;QMP_^eqM2YPO5HV NK_-;F`8#8z3;?^>7U%!~ delta 56 zcmca%bHRptIWI340}wPgKHtcFj!`Z|KO;XkRlle-FE6!7KfXM_C|kd%ELAtLAQMP$ J{?8aG0{{{j6R-dP diff --git a/crowdsec_service_api/__pycache__/models.cpython-311.pyc b/crowdsec_service_api/__pycache__/models.cpython-311.pyc index aa2975956d24551ca8e4a277f2124e4e271e9716..8bfb82d2664ba1580a3ea7763bf18e50bd775e5e 100644 GIT binary patch delta 18243 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 pgF{b=&iCBnIDj7NtMMK4-0wbf8k*_ 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 -# timestamp: 2026-04-21T09:21:23+00:00 +# timestamp: 2026-05-06T08:54:01+00:00 from __future__ import annotations @@ -516,6 +516,23 @@ class RemediationMetricsData(BaseModelSdk): ] +class RemediationStats(BaseModelSdk): + dropped_rate: Annotated[ + Optional[Dict[str, Optional[float]]], + Field( + description='Percentage of dropped traffic over total processed traffic, per unit, rounded to 2 decimals. Null when no processed traffic was observed for the unit.', + title='Dropped Rate', + ), + ] = None + allowed_rate: Annotated[ + Optional[Dict[str, Optional[float]]], + Field( + description='Percentage of allowed (passed-through) traffic over total processed traffic, per unit, rounded to 2 decimals. Null when no processed traffic was observed for the unit.', + title='Allowed Rate', + ), + ] = None + + class Share(BaseModelSdk): organization_id: Annotated[str, Field(title='Organization Id')] permission: Permission @@ -1017,6 +1034,7 @@ class ThreatContext(BaseModelSdk): Optional[Dict[str, int]], Field( description='Attacker country distribution (country code → count)', + examples=[{'FR': 18, 'NL': 23, 'US': 36}], title='Attacker Countries', ), ] = None @@ -1024,6 +1042,7 @@ class ThreatContext(BaseModelSdk): Optional[Dict[str, int]], Field( description='Defender country distribution (country code → count)', + examples=[{'BE': 13, 'FR': 22, 'NL': 22}], title='Defender Countries', ), ] = None @@ -1031,6 +1050,7 @@ class ThreatContext(BaseModelSdk): Optional[Dict[str, int]], Field( description='Industry type distribution (type → count)', + examples=[{'commerce': 65, 'government': 5, 'non_profit': 30}], title='Industry Types', ), ] = None @@ -1038,6 +1058,7 @@ class ThreatContext(BaseModelSdk): Optional[Dict[str, int]], Field( description='Industry risk profile distribution (profile → count)', + examples=[{'SOHO': 25, 'public_service': 10, 'technology_business': 65}], title='Industry Risk Profiles', ), ] = None @@ -1045,6 +1066,7 @@ class ThreatContext(BaseModelSdk): Optional[Dict[str, int]], Field( description='Attacker objective distribution (objective → count)', + examples=[{'data_exfiltration': 10, 'infrastructure_takeover': 90}], title='Attacker Objectives', ), ] = None @@ -1306,7 +1328,7 @@ class BlocklistsUploadBlocklistContentQueryParameters(BaseModelSdk): Optional[datetime], Field( description='Blocklist expiration', - examples=['2026-04-17T08:43:44.302226+00:00'], + examples=['2026-05-06T08:51:29.433616+00:00'], title='Expiration', ), ] = None @@ -4457,3 +4479,7 @@ class ComputedMetrics(BaseModelSdk): class GetRemediationMetricsResponse(BaseModelSdk): raw: Annotated[RawMetrics, Field(description='Raw metrics data')] computed: Annotated[ComputedMetrics, Field(description='Computed metrics data')] + stats: Annotated[ + Optional[RemediationStats], + Field(description='Aggregate stats computed over the time window'), + ] = None diff --git a/crowdsec_service_api/services/__pycache__/__init__.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/__init__.cpython-311.pyc index c6a195485a921a398d492e3c22dc5b9a5c1e8b3e..b820b79b8d79639d5c5884af52a1aa249a5a02c0 100644 GIT binary patch delta 46 wcmX@kc%G4aIWI340}xDL{5_G|lrd?dqp(nNeqM2YPO5HVL8d;0Juxm505A~_l>h($ delta 38 scmX@lc$|@YIWI340}wPgKA*^K${01#QJAZ!ELAtLAXC4nY+_m_0LWqsT>t<8 diff --git a/crowdsec_service_api/services/__pycache__/allowlists.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/allowlists.cpython-311.pyc index 6ea5649913ece2d4af0471a95e6407b7f34cbbfa..ca69ae7853cf48cccd0daa4208d98588a0f583aa 100644 GIT binary patch delta 192 zcmaEt@->BbIWI340}!la{GA!Gk=K=3RwlV9zdWTlH95XGwWusJIW<19AXDE^&(O$F z&tP%^bC6n!enx(7s(w*vUS4XEetda;QMP_^eqM2YPO2_QErdP!0ds|L!UYbAiyVnp rI1(?w(B^EGXid8$#t#gPtVxVBLLl^tUX#4oR^o20SG2LKF_?dk@qOGoNRJYetAl9YI1yWYEfBca%y~HL8gA0fu5nM zo{`z)_sl_ZG5Q(#xvBa^rFnU&Mf&mO`9<0KMP;eFAcaL`lhau$gcC1tNL=Jdy26ok o0fshzVmW4Dm(2Kqfsr+taYhJ)UJ(qTFGR;f7jb6JLOIWI340}!la{GIuqeIws{CPtab^O;524fPC-4D}2qOEU+lCF^J8=ceix zmFDH87U{>A=NDz`C+FuC=jWvACKhBu*^|4O%Y+jya7bL_NW8+4cmaksi?H~!+a)o6 dU|?iTVw@2Ip;rV$=nK*D5C&dy^Fr>`OaOsUnSq|6 zsh*M9WGUt#xoG{2{M=OiqSCy))FS=(^8BJ~{i3o|U68_}vdNQ}%Y+jza7bL_NV>w2 pbODAoOSAa1+a)u8U|?iTW}FcMp;rV$=nK*D5C&dy^9t_OOaT4nIuQT> diff --git a/crowdsec_service_api/services/__pycache__/fingerprints.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/fingerprints.cpython-311.pyc index 100a01d31e4050bf875ca352f04a4837bf25920c..2350bba0baed31f0b754cea4f1ff2d5a1254ce34 100644 GIT binary patch delta 162 zcmbOqx-67;IWI340}!la{GGXYBkyEpMw!VAnMK(R^$d*+^$aHOV-8|Wn=Hs8ER>v| zSDc@ds+(AlsSjaK)?=v=PPo7!agihO3P<7v7}~s-B}>sRiSYviBWn`lj1UODA{atn Ph>nLa@RFNT)vQu delta 169 zcmZ1$IzNvBkyEpM%l>=nMFCu4D<|5^^D9W?_~~>i__1@&rQ`Y zD$UDFEz*xK&o9c>FDgsbO)SU+(vwYDYJ?Lna7bL_NV>w2bODAoA7RN-v`c3Ez`)3w Z%s3+iLazvh&=;cPAq>3a<{ULE769X?Gs^$~ diff --git a/crowdsec_service_api/services/__pycache__/hub.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/hub.cpython-311.pyc index 54c3d53885a08d42f6d64ce826721d7d4f44ef1d..cc87297f5e10c989e0b646bef4994b210d775262 100644 GIT binary patch delta 176 zcmX>mc~+8lIWI340}!la{GF-1kvD;fQD!nfvnacvo}rPUp26g9rXaOg{fzwFRQ;mT zyu8#R{rK|yqHO)-{Ji4)oK)S!f=noT@^7Xr;e-nu5*IlVuW%$@fT7J5%n#V?k{CZQ cFtR2w&Ip0fD}o{Ph3I$)124IG8kYeR0M&Lil>h($ delta 185 zcmX>rc}$XbIWI340}xDhe4eSYkvD-!PBytHzdWTlH95XGwWusJIW<19AXC50K+n)r z&&X_Y7gLa2sD4I%ZmND!X ofT7Lx%n#V?k{LfRFtR2y&Ip0fD}o{Ph3I$)124IGE|&ol0N#Q*!vFvP diff --git a/crowdsec_service_api/services/__pycache__/info.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/info.cpython-311.pyc index 431d4d1996f576be20f996bf812295e05c94fe5e..51556dbd4d0b3b2dbf5ab59d912f483eac4bbe49 100644 GIT binary patch delta 192 zcmaFE|Cyh6IWI340}!la{GD00k=K?b delta 185 zcmey&|AwD;IWI340}xDhe4bgpk=K? ofT7I}EX&00k{LfRFtR2y&Ip0fD}o{Ph3I$)124H*MJAmY01&@9?*IS* diff --git a/crowdsec_service_api/services/__pycache__/metrics.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/metrics.cpython-311.pyc index 319ef0f78ff8bcef5b7ef765fe96db88daad312a..dbd28f07c4b63e7686729f2d6a3c9255d0906a5a 100644 GIT binary patch delta 176 zcmZ1>vR;IDIWI340}!la{GIuHBX0u}qs(M|W>I!SJwqcyJ%h=snS#_3^)vEwQ}v5V z^YT)Q^yAC(i?a2T^Ye=Hb5eB^3o@bX$FmtomB{6t<8 diff --git a/crowdsec_service_api/services/__pycache__/products.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/products.cpython-311.pyc index a5ee5ccc09ac3d37543c8da613a58feac6453b0b..e572fa5f29b8d47f104d274833e20e61b686a748 100644 GIT binary patch delta 192 zcmdlldrX#hIWI340}!la{GI8&k@q;0tW0uIetAl9YI1yWYEfBca%y~HL8iW;o}rPU zp26f#OhIZ%`WgATsrp5wd3mWt`tjxYMcMkv`FX|pIjOoJwGj5?B<2#~gbN%J7daBI ra3o%Uq0KLuU$NUIF@9iRWKCk65dxuC1ViWx(eV%lUUIV_&pIXmlW;yj delta 185 zcmX>myI+=fIWI340}xDhe4gpEk@q;0oNRJYetAl9YI1yWYEfBca%y~HL8gA0fu5nM zo{`z)k4!;wQTiGAxvBa^rFnU&Mf&mO`9<0KMP;eFAcaL`lQWr1gcC1tNL=Jdy26ok o0fshzV1C7Jm(2Kqfsr+taYhJ)UJ(qTFGR;f7 diff --git a/crowdsec_service_api/services/__pycache__/tracker_events.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/tracker_events.cpython-311.pyc index 8bdc48e8456376c27f977642a666be33841d3948..0cbc2fa248de89cf1c30400fd828f142409bdbb3 100644 GIT binary patch delta 192 zcmcaD_DGC(IWI340}!la{GIt=BkvX_S()Ub{PL9I)a3Z$)S|M?jnS#_Z^fU5vQ}v5V^YT)Q^yAC(i?a2T^Ye=Hb5eCdY9Z{&{>=5l2^TmdE^;JZ r;YhpyLz^EmA7imgV*J3s$eP4BBLqUP2!_xXqT?Y9yyWJm9A!)Z_nSXJ delta 171 zcmaDPc3X^hIWI340}xDhe4hDmBkvX_Ioaf*{PL9I)a3Z$)S|M?Us}dP+Wu delta 192 zcmX@4vs;IEIWI340}xDhe4aUHBX10|oNRJYetAl9YI1yWYEfBca%y~HL8gA0fu5nM zo{`z)Hs&C?IQ@+L+*JLd(!9LXBK`RC{Gx3AqOw$7kiw#}$^V$Eg%dAuNL=Jdy26ok u0fsjBu-xHwOlJJRz{r}+I3ol?uLy?F7oy`K3<4zA None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.15.26") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.121.0") def list_allowlists( self, diff --git a/crowdsec_service_api/services/blocklists.py b/crowdsec_service_api/services/blocklists.py index 65bf0d6..526ee26 100644 --- a/crowdsec_service_api/services/blocklists.py +++ b/crowdsec_service_api/services/blocklists.py @@ -11,7 +11,7 @@ class Blocklists(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.15.26") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.121.0") def get_blocklists( self, diff --git a/crowdsec_service_api/services/cves.py b/crowdsec_service_api/services/cves.py index b0d0745..b9bc34a 100644 --- a/crowdsec_service_api/services/cves.py +++ b/crowdsec_service_api/services/cves.py @@ -11,7 +11,7 @@ class Cves(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.15.26") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.121.0") def get_cves( self, diff --git a/crowdsec_service_api/services/decisions.py b/crowdsec_service_api/services/decisions.py index 077a642..7341652 100644 --- a/crowdsec_service_api/services/decisions.py +++ b/crowdsec_service_api/services/decisions.py @@ -11,7 +11,7 @@ class Decisions(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.15.26") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.121.0") def get_decisions( self, diff --git a/crowdsec_service_api/services/fingerprints.py b/crowdsec_service_api/services/fingerprints.py index 25d9ac6..da7a66c 100644 --- a/crowdsec_service_api/services/fingerprints.py +++ b/crowdsec_service_api/services/fingerprints.py @@ -11,7 +11,7 @@ class Fingerprints(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.15.26") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.121.0") def get_fingerprint_rules( self, diff --git a/crowdsec_service_api/services/hub.py b/crowdsec_service_api/services/hub.py index d488520..00737de 100644 --- a/crowdsec_service_api/services/hub.py +++ b/crowdsec_service_api/services/hub.py @@ -11,7 +11,7 @@ class Hub(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.15.26") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.121.0") def get_index( self, diff --git a/crowdsec_service_api/services/info.py b/crowdsec_service_api/services/info.py index 9137d39..f504a1c 100644 --- a/crowdsec_service_api/services/info.py +++ b/crowdsec_service_api/services/info.py @@ -11,7 +11,7 @@ class Info(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.15.26") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.121.0") def get_info( self, diff --git a/crowdsec_service_api/services/integrations.py b/crowdsec_service_api/services/integrations.py index d5e2589..3a40354 100644 --- a/crowdsec_service_api/services/integrations.py +++ b/crowdsec_service_api/services/integrations.py @@ -11,7 +11,7 @@ class Integrations(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.15.26") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.121.0") def get_integrations( self, diff --git a/crowdsec_service_api/services/metrics.py b/crowdsec_service_api/services/metrics.py index df84939..50ea9eb 100644 --- a/crowdsec_service_api/services/metrics.py +++ b/crowdsec_service_api/services/metrics.py @@ -11,7 +11,7 @@ class Metrics(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.15.26") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.121.0") def get_metrics_remediation( self, diff --git a/crowdsec_service_api/services/products.py b/crowdsec_service_api/services/products.py index 02e32df..0044f3d 100644 --- a/crowdsec_service_api/services/products.py +++ b/crowdsec_service_api/services/products.py @@ -11,7 +11,7 @@ class Products(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.15.26") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.121.0") def get_products( self, diff --git a/crowdsec_service_api/services/tracker_events.py b/crowdsec_service_api/services/tracker_events.py index eddace0..d3e4ed5 100644 --- a/crowdsec_service_api/services/tracker_events.py +++ b/crowdsec_service_api/services/tracker_events.py @@ -11,7 +11,7 @@ class TrackerEvents(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.15.26") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.121.0") def get_exploitation_phase_change_events( self, diff --git a/crowdsec_service_api/services/tracker_tags.py b/crowdsec_service_api/services/tracker_tags.py index 5485b3f..83634f4 100644 --- a/crowdsec_service_api/services/tracker_tags.py +++ b/crowdsec_service_api/services/tracker_tags.py @@ -11,7 +11,7 @@ class TrackerTags(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.15.26") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.121.0") def get_tags( self, diff --git a/crowdsec_service_api/services/vendors.py b/crowdsec_service_api/services/vendors.py index c5ae5fb..ab13c6b 100644 --- a/crowdsec_service_api/services/vendors.py +++ b/crowdsec_service_api/services/vendors.py @@ -11,7 +11,7 @@ class Vendors(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.15.26") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.121.0") def get_vendors( self, diff --git a/doc/Models.md b/doc/Models.md index 6d2e3e8..088f518 100644 --- a/doc/Models.md +++ b/doc/Models.md @@ -630,6 +630,7 @@ raw, computed |----------|------|-------------|---------| | raw | RawMetrics | None || | computed | ComputedMetrics | None || +| stats | RemediationStats | None || # **HTTPValidationError** ## Properties @@ -865,6 +866,13 @@ value, timestamp | value | Union[int, float] | Value of the metric || | timestamp | str | Timestamp of the metric || +# **RemediationStats** +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| dropped_rate | Dropped Rate | Percentage of dropped traffic over total processed traffic, per unit, rounded to 2 decimals. Null when no processed traffic was observed for the unit. || +| allowed_rate | Allowed Rate | Percentage of allowed (passed-through) traffic over total processed traffic, per unit, rounded to 2 decimals. Null when no processed traffic was observed for the unit. || + # **Share** ## Required: organization_id, permission diff --git a/doc/README.md b/doc/README.md index 6d0b091..809ced9 100644 --- a/doc/README.md +++ b/doc/README.md @@ -199,6 +199,8 @@ You can find a Quickstart about this SDK, following this [documentation](https:/ [RemediationMetricsData](./Models.md#remediationmetricsdata) +[RemediationStats](./Models.md#remediationstats) + [Share](./Models.md#share) [SourceInfo](./Models.md#sourceinfo) diff --git a/public-openapi.json b/public-openapi.json index 0492c9e..d64b563 100644 --- a/public-openapi.json +++ b/public-openapi.json @@ -3,7 +3,7 @@ "info": { "title": "Service API", "description": "This is the API to manage Crowdsec services", - "version": "1.70.4", + "version": "1.70.9", "contact": { "name": "CrowdSec", "url": "https://crowdsec.net", @@ -1243,7 +1243,7 @@ ], "description": "Blocklist expiration", "examples": [ - "2026-04-17T08:43:44.302226+00:00" + "2026-05-06T08:51:29.433616+00:00" ], "title": "Expiration" }, @@ -7980,6 +7980,10 @@ "computed": { "$ref": "#/components/schemas/ComputedMetrics", "description": "Computed metrics data" + }, + "stats": { + "$ref": "#/components/schemas/RemediationStats", + "description": "Aggregate stats computed over the time window" } }, "type": "object", @@ -9094,6 +9098,48 @@ ], "title": "RemediationMetricsData" }, + "RemediationStats": { + "properties": { + "dropped_rate": { + "additionalProperties": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "propertyNames": { + "$ref": "#/components/schemas/MetricUnits" + }, + "type": "object", + "title": "Dropped Rate", + "description": "Percentage of dropped traffic over total processed traffic, per unit, rounded to 2 decimals. Null when no processed traffic was observed for the unit." + }, + "allowed_rate": { + "additionalProperties": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "propertyNames": { + "$ref": "#/components/schemas/MetricUnits" + }, + "type": "object", + "title": "Allowed Rate", + "description": "Percentage of allowed (passed-through) traffic over total processed traffic, per unit, rounded to 2 decimals. Null when no processed traffic was observed for the unit." + } + }, + "type": "object", + "title": "RemediationStats" + }, "Share": { "properties": { "organization_id": { @@ -13402,7 +13448,14 @@ }, "type": "object", "title": "Attacker Countries", - "description": "Attacker country distribution (country code \u2192 count)" + "description": "Attacker country distribution (country code \u2192 count)", + "examples": [ + { + "FR": 18, + "NL": 23, + "US": 36 + } + ] }, "defender_countries": { "additionalProperties": { @@ -13410,7 +13463,14 @@ }, "type": "object", "title": "Defender Countries", - "description": "Defender country distribution (country code \u2192 count)" + "description": "Defender country distribution (country code \u2192 count)", + "examples": [ + { + "BE": 13, + "FR": 22, + "NL": 22 + } + ] }, "industry_types": { "additionalProperties": { @@ -13421,7 +13481,14 @@ }, "type": "object", "title": "Industry Types", - "description": "Industry type distribution (type \u2192 count)" + "description": "Industry type distribution (type \u2192 count)", + "examples": [ + { + "commerce": 65, + "government": 5, + "non_profit": 30 + } + ] }, "industry_risk_profiles": { "additionalProperties": { @@ -13432,7 +13499,14 @@ }, "type": "object", "title": "Industry Risk Profiles", - "description": "Industry risk profile distribution (profile \u2192 count)" + "description": "Industry risk profile distribution (profile \u2192 count)", + "examples": [ + { + "SOHO": 25, + "public_service": 10, + "technology_business": 65 + } + ] }, "attacker_objectives": { "additionalProperties": { @@ -13443,7 +13517,13 @@ }, "type": "object", "title": "Attacker Objectives", - "description": "Attacker objective distribution (objective \u2192 count)" + "description": "Attacker objective distribution (objective \u2192 count)", + "examples": [ + { + "data_exfiltration": 10, + "infrastructure_takeover": 90 + } + ] } }, "type": "object", diff --git a/pyproject.toml b/pyproject.toml index a0f93d8..f01ed4c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "crowdsec_service_api" -version = "v0.15.26" +version = "1.121.0" license = { text = "MIT" } authors = [ { name="crowdsec", email="info@crowdsec.net" } diff --git a/uv.lock b/uv.lock index 613efa8..ad0488a 100644 --- a/uv.lock +++ b/uv.lock @@ -26,30 +26,30 @@ wheels = [ [[package]] name = "botocore" -version = "1.42.92" +version = "1.43.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath" }, { name = "python-dateutil" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d5/0a/6785ce224ba4483b3e1282d959e1dd2c2898823336f013464c43cb154036/botocore-1.42.92.tar.gz", hash = "sha256:f1193d3057a2d0267353d7ef4e136be37ea432336d097fcb1951fae566ca3a22", size = 15235239, upload-time = "2026-04-20T19:38:05.085Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c1/45/f73f2a126752ed4c762a46210315c80cb7e67a96887aaa2f9c32d41631c6/botocore-1.43.4.tar.gz", hash = "sha256:1a95c90fa9ca6ee85c1a02b04c8e05e948661d201b85b443000d676857905019", size = 15317239, upload-time = "2026-05-05T19:34:27.317Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/b8/41d4d7ba75a4fb4f11362e96371a12695bc6ba0bb7cc680137db0213f97e/botocore-1.42.92-py3-none-any.whl", hash = "sha256:09ddefddbb1565ceef4b44b4b6e61b1ca5f12701d1494ecc85c1133d1b1e81fb", size = 14916275, upload-time = "2026-04-20T19:38:01.684Z" }, + { url = "https://files.pythonhosted.org/packages/5d/53/8dfb1f8f0be68cce735181d876d8f7c537c5c44656b3b9ab4b3b9e973320/botocore-1.43.4-py3-none-any.whl", hash = "sha256:f1897d3254965cacac7514cfed1b6ff016166b165ee2e06232b4a3954cf9d713", size = 14999193, upload-time = "2026-05-05T19:34:23.893Z" }, ] [[package]] name = "certifi" -version = "2026.2.25" +version = "2026.4.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, + { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, ] [[package]] name = "crowdsec-service-api" -version = "0.15.26" +version = "1.121.0" source = { editable = "." } dependencies = [ { name = "botocore" }, @@ -126,11 +126,11 @@ wheels = [ [[package]] name = "idna" -version = "3.11" +version = "3.13" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/cc/762dfb036166873f0059f3b7de4565e1b5bc3d6f28a414c13da27e442f99/idna-3.13.tar.gz", hash = "sha256:585ea8fe5d69b9181ec1afba340451fba6ba764af97026f92a91d4eef164a242", size = 194210, upload-time = "2026-04-22T16:42:42.314Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, + { url = "https://files.pythonhosted.org/packages/5d/13/ad7d7ca3808a898b4612b6fe93cde56b53f3034dcde235acb1f0e1df24c6/idna-3.13-py3-none-any.whl", hash = "sha256:892ea0cde124a99ce773decba204c5552b69c3c67ffd5f232eb7696135bc8bb3", size = 68629, upload-time = "2026-04-22T16:42:40.909Z" }, ] [[package]] @@ -320,11 +320,11 @@ wheels = [ [[package]] name = "tzdata" -version = "2026.1" +version = "2026.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/f5/cd531b2d15a671a40c0f66cf06bc3570a12cd56eef98960068ebbad1bf5a/tzdata-2026.1.tar.gz", hash = "sha256:67658a1903c75917309e753fdc349ac0efd8c27db7a0cb406a25be4840f87f98", size = 197639, upload-time = "2026-04-03T11:25:22.002Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10", size = 198254, upload-time = "2026-04-24T15:22:08.651Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/70/d460bd685a170790ec89317e9bd33047988e4bce507b831f5db771e142de/tzdata-2026.1-py2.py3-none-any.whl", hash = "sha256:4b1d2be7ac37ceafd7327b961aa3a54e467efbdb563a23655fbfe0d39cfc42a9", size = 348952, upload-time = "2026-04-03T11:25:20.313Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" }, ] [[package]]