From 3d479b7a330fb4c2c248f530039b1c20b3100a27 Mon Sep 17 00:00:00 2001 From: nitescuc <1108077+nitescuc@users.noreply.github.com> Date: Thu, 4 Jun 2026 14:27:53 +0000 Subject: [PATCH] Update python SDK 1.127.0 --- crowdsec_service_api/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 4946 -> 5024 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 -> 158635 bytes crowdsec_service_api/models.py | 464 +++++++-- .../__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 -> 12321 bytes .../__pycache__/decisions.cpython-311.pyc | Bin 3660 -> 4338 bytes .../__pycache__/fingerprints.cpython-311.pyc | Bin 10911 -> 12310 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 | 28 +- crowdsec_service_api/services/decisions.py | 22 +- crowdsec_service_api/services/fingerprints.py | 28 +- 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/Cves.md | 41 + doc/Decisions.md | 34 + doc/Fingerprints.md | 40 + doc/Models.md | 105 +- doc/README.md | 8 + public-openapi.json | 896 ++++++++++++++++-- pyproject.toml | 2 +- uv.lock | 224 ++--- 41 files changed, 1602 insertions(+), 314 deletions(-) diff --git a/crowdsec_service_api/__init__.py b/crowdsec_service_api/__init__.py index 575ab77..f2c57ce 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', @@ -164,6 +165,9 @@ class Server(Enum): 'GetVendorSubscribedIntegrationsResponsePage', 'History', 'IPItem', + 'IndicatorHttpPath', + 'IndicatorType', + 'IndicatorsSortBy', 'IndustryRiskProfile', 'IndustryType', 'IntegrationResponse', diff --git a/crowdsec_service_api/__pycache__/__init__.cpython-311.pyc b/crowdsec_service_api/__pycache__/__init__.cpython-311.pyc index 163833128b3d84b09ebdf0faece86a7e81a98355..215c21ec921643842799421afb889e2450540491 100644 GIT binary patch delta 187 zcmcblwm_YCIWI340}#Y_D`xH4$Xm^%7O9_+pPQ;*RGOEUTBILeo?n!$pPZjpoS&1b zn^=$uWlvtll)<=hGe5I1yP!Z&YHn&uW@1TZeqL}%VoC94MXq1W#)6)CDVfQMCHX}j zB_#y`i6t4gc;P}Jl?AD{1mN7_;QXQzr^?Mze4CjWFK#|3n8_$z#Kg_?fdN4_u!CTc H4A8XzuCG4) delta 109 zcmZ3Weo2jYIWI340}xDhe4ZJ%k++&jE>J%sKQ~pss5CDxwMaj{JijPgzo;x#H?bfS zNKanJl)<=mvpBOb`(_)ipUj&x`8F{#p4}`Xl*uTa$HdL_fdN4_u!CTc4A6W4e~BP+ diff --git a/crowdsec_service_api/__pycache__/base_model.cpython-311.pyc b/crowdsec_service_api/__pycache__/base_model.cpython-311.pyc index 20476fbbd38df73fef49d875e9b27b16023ef750..abdd039753e8d8697f312c18a6764ad404f63512 100644 GIT binary patch delta 65 zcmbQFG)swRIWI340}!}(D`suvQDRn$*3Zb#P1P?d&C5$I(vL6CFUruy OEXahiH~TOj;{^a}#}yR- delta 57 zcmbQGG)akPIWI340}wPgKF{39qr@y1te=seo2p+_nwOVaq#s|NUzDw1RFmpOdPa OSda;2Z~o30DFXnu`4+kW delta 57 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 E1Fv#On*aa+ delta 27963 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 -# timestamp: 2026-04-21T09:21:23+00:00 +# timestamp: 2026-06-04T14:27:43+00:00 from __future__ import annotations @@ -76,6 +76,22 @@ class AllowlistCreateResponse(BaseModelSdk): ] +class Total(RootModelSdk[int]): + root: Annotated[int, Field(ge=0, title='Total')] + + +class Page(RootModelSdk[int]): + root: Annotated[int, Field(ge=1, title='Page')] + + +class Size(RootModelSdk[int]): + root: Annotated[int, Field(ge=1, title='Size')] + + +class Pages(RootModelSdk[int]): + root: Annotated[int, Field(ge=0, title='Pages')] + + class AllowlistItemUpdateRequest(BaseModelSdk): model_config = ConfigDict( extra='forbid', @@ -516,6 +532,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 @@ -773,6 +806,25 @@ class History(BaseModelSdk): days_age: Annotated[int, Field(description='Days age', title='Days Age')] +class IndicatorHttpPath(BaseModelSdk): + indicator_type: Annotated[Literal['http_path'], Field(title='Indicator Type')] = ( + 'http_path' + ) + value: Annotated[str, Field(title='Value')] + first_seen: Annotated[datetime, Field(title='First Seen')] + last_seen: Annotated[datetime, Field(title='Last Seen')] + nb_ips: Annotated[Optional[int], Field(title='Nb Ips')] = 0 + + +class IndicatorType(StrEnum): + HTTP_PATH = 'http_path' + + +class IndicatorsSortBy(StrEnum): + POPULAR = 'popular' + MOST_RECENT = 'most_recent' + + class IndustryRiskProfile(StrEnum): TECHNOLOGY_BUSINESS = 'technology_business' TRADITIONAL_BUSINESS = 'traditional_business' @@ -1017,6 +1069,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 +1077,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 +1085,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 +1093,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 +1101,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 @@ -1147,6 +1204,7 @@ class AllowlistsDeleteAllowlistQueryParameters(BaseModelSdk): Optional[bool], Field( description='Force delete the allowlist, even if it has subscribers', + examples=[True], title='Force', ), ] = False @@ -1239,25 +1297,40 @@ class BlocklistsGetBlocklistsQueryParameters(BaseModelSdk): Optional[int], Field(description='Page number', ge=1, title='Page') ] = 1 page_size: Annotated[ - Optional[int], Field(description='Page size', le=1000, title='Page Size') + Optional[int], + Field(description='Page size', examples=[50], le=1000, title='Page Size'), ] = 100 subscribed_only: Annotated[ Optional[bool], - Field(description='only subscribed blocklists', title='Subscribed Only'), + Field( + description='only subscribed blocklists', + examples=[True], + title='Subscribed Only', + ), ] = False exclude_subscribed: Annotated[ Optional[bool], - Field(description='exclude subscribed blocklists', title='Exclude Subscribed'), + Field( + description='exclude subscribed blocklists', + examples=[False], + title='Exclude Subscribed', + ), ] = False include_filter: Annotated[ Optional[List[BlocklistIncludeFilters]], Field( description='Include blocklists with the specified filters', + examples=[['public', 'shared']], title='Include Filter', ), ] = ['private', 'shared'] category: Annotated[ - Optional[List[str]], Field(description='Filter by category', title='Category') + Optional[List[str]], + Field( + description='Filter by category', + examples=[['proxy', 'scanner']], + title='Category', + ), ] = None size: Annotated[ Optional[int], Field(description='Page size', ge=1, le=100, title='Size') @@ -1290,6 +1363,7 @@ class BlocklistsDeleteBlocklistQueryParameters(BaseModelSdk): Optional[bool], Field( description='Force delete the blocklist if it is shared or subscribed', + examples=[False], title='Force', ), ] = False @@ -1306,13 +1380,17 @@ class BlocklistsUploadBlocklistContentQueryParameters(BaseModelSdk): Optional[datetime], Field( description='Blocklist expiration', - examples=['2026-04-17T08:43:44.302226+00:00'], + examples=['2026-06-04T14:24:57.590679+00:00'], title='Expiration', ), ] = None ignore_invalid_ips: Annotated[ Optional[bool], - Field(description='Ignore invalid IPs', title='Ignore Invalid Ips'), + Field( + description='Ignore invalid IPs', + examples=[False], + title='Ignore Invalid Ips', + ), ] = False @@ -1411,6 +1489,7 @@ class IntegrationsGetIntegrationsQueryParameters(BaseModelSdk): Optional[List[str]], Field( description='List of tags associated with the integrations (any of)', + examples=[['firewall', 'remediation']], title='Tag', ), ] = None @@ -1435,6 +1514,7 @@ class IntegrationsDeleteIntegrationQueryParameters(BaseModelSdk): Optional[bool], Field( description='Force delete the integration even if it has active subscriptions (it will unsubscribe from all lists)', + examples=[True], title='Force', ), ] = False @@ -1455,6 +1535,7 @@ class PageSize(RootModelSdk[int]): int, Field( description='Maximum number of items to return, 0 means no limit (default), should be greater than 10000', + examples=[50000], ge=10000, title='Page Size', ), @@ -1463,18 +1544,22 @@ class PageSize(RootModelSdk[int]): class IntegrationsGetIntegrationContentQueryParameters(BaseModelSdk): page: Annotated[ - Optional[int], Field(description='Page number to return', ge=1, title='Page') + Optional[int], + Field(description='Page number to return', examples=[1], ge=1, title='Page'), ] = 1 page_size: Annotated[ Optional[PageSize], Field( description='Maximum number of items to return, 0 means no limit (default), should be greater than 10000', + examples=[50000], title='Page Size', ), ] = None - pull_limit: Annotated[Optional[int], Field(title='Pull Limit')] = None + pull_limit: Annotated[Optional[int], Field(examples=[5000], title='Pull Limit')] = ( + None + ) enable_ip_aggregation: Annotated[ - Optional[bool], Field(title='Enable Ip Aggregation') + Optional[bool], Field(examples=[True], title='Enable Ip Aggregation') ] = False @@ -1489,6 +1574,7 @@ class IntegrationsGetIntegrationContentStreamQueryParameters(BaseModelSdk): Optional[bool], Field( description="Set to true if it's the first run to fetch all the content, otherwise only changes since the last pull.", + examples=[False], title='Startup', ), ] = False @@ -1503,35 +1589,49 @@ class IntegrationsGetIntegrationContentStreamPathParameters(BaseModelSdk): class DecisionsGetDecisionsQueryParameters(BaseModelSdk): instance_ids: Annotated[ Optional[List[str]], - Field(description='Filter decisions by instance IDs', title='Instance Ids'), + Field( + description='Filter decisions by instance IDs', + examples=[['inst-001', 'inst-002']], + title='Instance Ids', + ), ] = [] tag_ids: Annotated[ Optional[List[str]], - Field(description='Filter decisions by tag IDs', title='Tag Ids'), + Field( + description='Filter decisions by tag IDs', + examples=[['64b8f0c2a1d3e4f5a6b7c8d9', '64b8f0c2a1d3e4f5a6b7c8da']], + title='Tag Ids', + ), ] = [] remediation_types: Annotated[ Optional[List[str]], Field( description='Filter decisions by remediation types', + examples=[['ban', 'captcha']], title='Remediation Types', ), ] = [] ips: Annotated[ Optional[List[str]], Field( - description='Filter decisions by IPs (only for IP decisions)', title='Ips' + description='Filter decisions by IPs (only for IP decisions)', + examples=[['203.0.113.7', '203.0.113.8']], + title='Ips', ), ] = [] sort_by: Annotated[ Optional[DecisionsSortBy], Field( - description='Field to sort by (e.g., created_at, duration)', title='Sort By' + description='Field to sort by (e.g., created_at, duration)', + examples=['created_at'], + title='Sort By', ), ] = 'created_at' sort_order: Annotated[ Optional[DecisionsSortOrder], Field( description="Sort order: 'asc' for ascending, 'desc' for descending", + examples=['desc'], title='Sort Order', ), ] = 'desc' @@ -1543,27 +1643,46 @@ class DecisionsGetDecisionsQueryParameters(BaseModelSdk): ] = 50 +class DecisionsDeleteDecisionPathParameters(BaseModelSdk): + decision_id: Annotated[str, Field(title='Decision Id')] + + class MetricsGetMetricsRemediationQueryParameters(BaseModelSdk): start_date: Annotated[ Optional[datetime], Field( description='Start date of the metrics, default to last day', + examples=['2025-03-14T09:30:00Z'], title='Start Date', ), ] = None end_date: Annotated[ Optional[datetime], - Field(description='End date of the metrics', title='End Date'), + Field( + description='End date of the metrics', + examples=['2025-03-15T09:30:00Z'], + title='End Date', + ), ] = None engine_ids: Annotated[ - Optional[List[str]], Field(description='List of engine ids', title='Engine Ids') + Optional[List[str]], + Field( + description='List of engine ids', + examples=[['engine_1', 'engine_2']], + title='Engine Ids', + ), ] = [] integration_ids: Annotated[ Optional[List[str]], - Field(description='List of integration ids', title='Integration Ids'), + Field( + description='List of integration ids', + examples=[['integration_1', 'integration_2']], + title='Integration Ids', + ), ] = [] tags: Annotated[ - Optional[List[str]], Field(description='List of tags', title='Tags') + Optional[List[str]], + Field(description='List of tags', examples=[['tag_1', 'tag_2']], title='Tags'), ] = [] @@ -1605,18 +1724,30 @@ class HubHeadItemContentPathParameters(BaseModelSdk): class CvesGetCvesQueryParameters(BaseModelSdk): query: Annotated[ - Optional[str], Field(description='Search query for CVEs', title='Query') + Optional[str], + Field( + description='Search query for CVEs', examples=['wordpress'], title='Query' + ), ] = None sort_by: Annotated[ - Optional[GetCVEsSortBy], Field(description='Field to sort by', title='Sort By') + Optional[GetCVEsSortBy], + Field(description='Field to sort by', examples=['trending'], title='Sort By'), ] = 'rule_release_date' sort_order: Annotated[ Optional[GetCVEsSortOrder], - Field(description='Sort order: ascending or descending', title='Sort Order'), + Field( + description='Sort order: ascending or descending', + examples=['asc'], + title='Sort Order', + ), ] = 'desc' exploitation_phase: Annotated[ Optional[CVEExploitationPhase], - Field(description='Filter by exploitation phase', title='Exploitation Phase'), + Field( + description='Filter by exploitation phase', + examples=['mass_exploitation'], + title='Exploitation Phase', + ), ] = None page: Annotated[ Optional[int], Field(description='Page number', ge=1, title='Page') @@ -1643,6 +1774,7 @@ class Since(RootModelSdk[str]): str, Field( description='Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d', + examples=['7d'], pattern='^\\d+[hd]$', title='Since', ), @@ -1654,6 +1786,7 @@ class CvesGetCveIpsDetailsQueryParameters(BaseModelSdk): Optional[Since], Field( description='Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d', + examples=['7d'], title='Since', ), ] = '14d' @@ -1669,11 +1802,24 @@ class CvesGetCveIpsDetailsPathParameters(BaseModelSdk): cve_id: Annotated[str, Field(title='Cve Id')] +class Since1(RootModelSdk[str]): + root: Annotated[ + str, + Field( + description='Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d', + examples=['24h'], + pattern='^\\d+[hd]$', + title='Since', + ), + ] + + class CvesGetCveIpsDetailsStatsQueryParameters(BaseModelSdk): since: Annotated[ - Optional[Since], + Optional[Since1], Field( description='Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d', + examples=['24h'], title='Since', ), ] = '14d' @@ -1705,11 +1851,33 @@ class CvesUnsubscribeIntegrationFromCvePathParameters(BaseModelSdk): integration_name: Annotated[str, Field(title='Integration Name')] +class CvesGetCveIndicatorsQueryParameters(BaseModelSdk): + sort_by: Annotated[ + Optional[IndicatorsSortBy], + Field( + description='Ranking applied to the returned list.', examples=['popular'] + ), + ] = 'popular' + indicator_type: Annotated[ + Optional[List[IndicatorType]], + Field( + description='Restrict to one or more IOC types.', + examples=[['http_path']], + title='Indicator Type', + ), + ] = None + + +class CvesGetCveIndicatorsPathParameters(BaseModelSdk): + cve_id: Annotated[str, Field(title='Cve Id')] + + class CvesGetCveTimelineQueryParameters(BaseModelSdk): since_days: Annotated[ Optional[SinceOptions], Field( - description='Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days.' + description='Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days.', + examples=[7], ), ] = 7 @@ -1720,18 +1888,26 @@ class CvesGetCveTimelinePathParameters(BaseModelSdk): class VendorsGetVendorsQueryParameters(BaseModelSdk): query: Annotated[ - Optional[str], Field(description='Search query for vendors', title='Query') + Optional[str], + Field( + description='Search query for vendors', + examples=['acme-corp'], + title='Query', + ), ] = None sort_by: Annotated[ Optional[VendorSortBy], Field( description='Sort by: value, nb_cves, nb_ips, latest_rule_release', + examples=['nb_cves'], title='Sort By', ), ] = None sort_order: Annotated[ Optional[GetCVEsSortOrder], - Field(description='Sort order: asc or desc', title='Sort Order'), + Field( + description='Sort order: asc or desc', examples=['desc'], title='Sort Order' + ), ] = 'desc' page: Annotated[ Optional[int], Field(description='Page number', ge=1, title='Page') @@ -1749,11 +1925,24 @@ class VendorsDownloadVendorIpsPathParameters(BaseModelSdk): vendor: Annotated[str, Field(title='Vendor')] +class Since2(RootModelSdk[str]): + root: Annotated[ + str, + Field( + description='Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d', + examples=['7d'], + pattern='^\\d+[hd]$', + title='Since', + ), + ] + + class VendorsGetVendorIpsDetailsQueryParameters(BaseModelSdk): since: Annotated[ - Optional[Since], + Optional[Since2], Field( description='Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d', + examples=['7d'], title='Since', ), ] = '14d' @@ -1769,11 +1958,24 @@ class VendorsGetVendorIpsDetailsPathParameters(BaseModelSdk): vendor: Annotated[str, Field(title='Vendor')] +class Since3(RootModelSdk[str]): + root: Annotated[ + str, + Field( + description='Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d', + examples=['30d'], + pattern='^\\d+[hd]$', + title='Since', + ), + ] + + class VendorsGetVendorIpsDetailsStatsQueryParameters(BaseModelSdk): since: Annotated[ - Optional[Since], + Optional[Since3], Field( description='Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d', + examples=['30d'], title='Since', ), ] = '14d' @@ -1807,11 +2009,16 @@ class VendorsUnsubscribeIntegrationFromVendorPathParameters(BaseModelSdk): class VendorsGetVendorImpactQueryParameters(BaseModelSdk): sort_by: Annotated[ - Optional[GetCVEsSortBy], Field(description='Field to sort by', title='Sort By') + Optional[GetCVEsSortBy], + Field(description='Field to sort by', examples=['trending'], title='Sort By'), ] = 'rule_release_date' sort_order: Annotated[ Optional[GetCVEsSortOrder], - Field(description='Sort order: ascending or descending', title='Sort Order'), + Field( + description='Sort order: ascending or descending', + examples=['asc'], + title='Sort Order', + ), ] = 'desc' page: Annotated[ Optional[int], Field(description='Page number', ge=1, title='Page') @@ -1827,7 +2034,12 @@ class VendorsGetVendorImpactPathParameters(BaseModelSdk): class ProductsGetProductsQueryParameters(BaseModelSdk): query: Annotated[ - Optional[str], Field(description='Search query for products', title='Query') + Optional[str], + Field( + description='Search query for products', + examples=['example-product'], + title='Query', + ), ] = None page: Annotated[ Optional[int], Field(description='Page number', ge=1, title='Page') @@ -1839,11 +2051,16 @@ class ProductsGetProductsQueryParameters(BaseModelSdk): class ProductsGetProductImpactQueryParameters(BaseModelSdk): sort_by: Annotated[ - Optional[GetCVEsSortBy], Field(description='Field to sort by', title='Sort By') + Optional[GetCVEsSortBy], + Field(description='Field to sort by', examples=['trending'], title='Sort By'), ] = 'rule_release_date' sort_order: Annotated[ Optional[GetCVEsSortOrder], - Field(description='Sort order: ascending or descending', title='Sort Order'), + Field( + description='Sort order: ascending or descending', + examples=['asc'], + title='Sort Order', + ), ] = 'desc' page: Annotated[ Optional[int], Field(description='Page number', ge=1, title='Page') @@ -1859,7 +2076,10 @@ class ProductsGetProductImpactPathParameters(BaseModelSdk): class TrackerTagsGetTagsQueryParameters(BaseModelSdk): query: Annotated[ - Optional[str], Field(description='Search query for tags', title='Query') + Optional[str], + Field( + description='Search query for tags', examples=['example-tag'], title='Query' + ), ] = None page: Annotated[ Optional[int], Field(description='Page number', ge=1, title='Page') @@ -1871,11 +2091,16 @@ class TrackerTagsGetTagsQueryParameters(BaseModelSdk): class TrackerTagsGetTagImpactQueryParameters(BaseModelSdk): sort_by: Annotated[ - Optional[GetCVEsSortBy], Field(description='Field to sort by', title='Sort By') + Optional[GetCVEsSortBy], + Field(description='Field to sort by', examples=['trending'], title='Sort By'), ] = 'rule_release_date' sort_order: Annotated[ Optional[GetCVEsSortOrder], - Field(description='Sort order: ascending or descending', title='Sort Order'), + Field( + description='Sort order: ascending or descending', + examples=['asc'], + title='Sort Order', + ), ] = 'desc' page: Annotated[ Optional[int], Field(description='Page number', ge=1, title='Page') @@ -1891,7 +2116,12 @@ class TrackerTagsGetTagImpactPathParameters(BaseModelSdk): class TrackerTagsGetTrackerTagsQueryParameters(BaseModelSdk): query: Annotated[ - Optional[str], Field(description='Search query for tags', title='Query') + Optional[str], + Field( + description='Search query for tags', + examples=['network-scanner'], + title='Query', + ), ] = None page: Annotated[ Optional[int], Field(description='Page number', ge=1, title='Page') @@ -1903,11 +2133,16 @@ class TrackerTagsGetTrackerTagsQueryParameters(BaseModelSdk): class TrackerTagsGetTrackerTagImpactQueryParameters(BaseModelSdk): sort_by: Annotated[ - Optional[GetCVEsSortBy], Field(description='Field to sort by', title='Sort By') + Optional[GetCVEsSortBy], + Field(description='Field to sort by', examples=['trending'], title='Sort By'), ] = 'rule_release_date' sort_order: Annotated[ Optional[GetCVEsSortOrder], - Field(description='Sort order: ascending or descending', title='Sort Order'), + Field( + description='Sort order: ascending or descending', + examples=['asc'], + title='Sort Order', + ), ] = 'desc' page: Annotated[ Optional[int], Field(description='Page number', ge=1, title='Page') @@ -1924,14 +2159,23 @@ class TrackerTagsGetTrackerTagImpactPathParameters(BaseModelSdk): class FingerprintsGetFingerprintRulesQueryParameters(BaseModelSdk): query: Annotated[ Optional[str], - Field(description='Search query for fingerprint rules', title='Query'), + Field( + description='Search query for fingerprint rules', + examples=['apache'], + title='Query', + ), ] = None sort_by: Annotated[ - Optional[GetCVEsSortBy], Field(description='Field to sort by', title='Sort By') + Optional[GetCVEsSortBy], + Field(description='Field to sort by', examples=['trending'], title='Sort By'), ] = 'rule_release_date' sort_order: Annotated[ Optional[GetCVEsSortOrder], - Field(description='Sort order: ascending or descending', title='Sort Order'), + Field( + description='Sort order: ascending or descending', + examples=['asc'], + title='Sort Order', + ), ] = 'desc' page: Annotated[ Optional[int], Field(description='Page number', ge=1, title='Page') @@ -1945,11 +2189,24 @@ class FingerprintsDownloadFingerprintIpsPathParameters(BaseModelSdk): fingerprint: Annotated[str, Field(title='Fingerprint')] +class Since4(RootModelSdk[str]): + root: Annotated[ + str, + Field( + description='Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d', + examples=['7d'], + pattern='^\\d+[hd]$', + title='Since', + ), + ] + + class FingerprintsGetFingerprintIpsDetailsQueryParameters(BaseModelSdk): since: Annotated[ - Optional[Since], + Optional[Since4], Field( description='Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d', + examples=['7d'], title='Since', ), ] = '14d' @@ -1965,11 +2222,24 @@ class FingerprintsGetFingerprintIpsDetailsPathParameters(BaseModelSdk): fingerprint: Annotated[str, Field(title='Fingerprint')] +class Since5(RootModelSdk[str]): + root: Annotated[ + str, + Field( + description='Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d', + examples=['30d'], + pattern='^\\d+[hd]$', + title='Since', + ), + ] + + class FingerprintsGetFingerprintIpsDetailsStatsQueryParameters(BaseModelSdk): since: Annotated[ - Optional[Since], + Optional[Since5], Field( description='Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d', + examples=['30d'], title='Since', ), ] = '14d' @@ -2005,13 +2275,15 @@ class FingerprintsGetFingerprintTimelineQueryParameters(BaseModelSdk): since_days: Annotated[ Optional[SinceOptions], Field( - description='Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days.' + description='Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days.', + examples=[7], ), ] = 7 interval: Annotated[ Optional[IntervalOptions], Field( description="Interval for aggregating timeline data. Options: 'hour', 'day', 'week'. Default is adapted based on 'since' parameter.", + examples=['day'], title='Interval', ), ] = None @@ -2021,6 +2293,28 @@ class FingerprintsGetFingerprintTimelinePathParameters(BaseModelSdk): fingerprint: Annotated[str, Field(title='Fingerprint')] +class FingerprintsGetFingerprintIndicatorsQueryParameters(BaseModelSdk): + sort_by: Annotated[ + Optional[IndicatorsSortBy], + Field( + description='Ranking applied to the returned list.', + examples=['most_recent'], + ), + ] = 'popular' + indicator_type: Annotated[ + Optional[List[IndicatorType]], + Field( + description='Restrict to one or more IOC types.', + examples=[['http_path']], + title='Indicator Type', + ), + ] = None + + +class FingerprintsGetFingerprintIndicatorsPathParameters(BaseModelSdk): + fingerprint: Annotated[str, Field(title='Fingerprint')] + + class FingerprintsGetFingerprintRulePathParameters(BaseModelSdk): fingerprint: Annotated[str, Field(title='Fingerprint')] @@ -2030,27 +2324,41 @@ class TrackerEventsGetExploitationPhaseChangeEventsQueryParameters(BaseModelSdk) Optional[str], Field( description="Duration string (e.g. '30d', '24h') to filter events", + examples=['7d'], title='Since', ), ] = '30d' sort_order: Annotated[ Optional[GetCVEsSortOrder], - Field(description='Sort order: ascending or descending', title='Sort Order'), + Field( + description='Sort order: ascending or descending', + examples=['asc'], + title='Sort Order', + ), ] = 'desc' cve_id: Annotated[ Optional[str], - Field(description='Filter by CVE identifier (exact match)', title='Cve Id'), + Field( + description='Filter by CVE identifier (exact match)', + examples=['CVE-2024-12345'], + title='Cve Id', + ), ] = None previous_phase: Annotated[ Optional[CVEExploitationPhase], Field( description='Filter by previous exploitation phase name', + examples=['early_exploitation'], title='Previous Phase', ), ] = None new_phase: Annotated[ Optional[CVEExploitationPhase], - Field(description='Filter by new exploitation phase name', title='New Phase'), + Field( + description='Filter by new exploitation phase name', + examples=['mass_exploitation'], + title='New Phase', + ), ] = None page: Annotated[ Optional[int], Field(description='Page number', ge=1, title='Page') @@ -2067,10 +2375,10 @@ class AllowlistSubscriberEntity(BaseModelSdk): class AllowlistSubscriberEntityPage(BaseModelSdk): items: Annotated[List[AllowlistSubscriberEntity], Field(title='Items')] - total: Annotated[int, Field(ge=0, title='Total')] - page: Annotated[int, Field(ge=1, title='Page')] - size: Annotated[int, Field(ge=1, title='Size')] - pages: Annotated[int, Field(ge=0, title='Pages')] + total: Annotated[Optional[Total], Field(title='Total')] = None + page: Annotated[Optional[Page], Field(title='Page')] = None + size: Annotated[Optional[Size], Field(title='Size')] = None + pages: Annotated[Optional[Pages], Field(title='Pages')] = None links: Links @@ -2311,10 +2619,10 @@ class BlocklistSubscriberEntity(BaseModelSdk): class BlocklistSubscriberEntityPage(BaseModelSdk): items: Annotated[List[BlocklistSubscriberEntity], Field(title='Items')] - total: Annotated[int, Field(ge=0, title='Total')] - page: Annotated[int, Field(ge=1, title='Page')] - size: Annotated[int, Field(ge=1, title='Size')] - pages: Annotated[int, Field(ge=0, title='Pages')] + total: Annotated[Optional[Total], Field(title='Total')] = None + page: Annotated[Optional[Page], Field(title='Page')] = None + size: Annotated[Optional[Size], Field(title='Size')] = None + pages: Annotated[Optional[Pages], Field(title='Pages')] = None links: Links @@ -2571,10 +2879,10 @@ class IntegrationGetResponse(BaseModelSdk): class IntegrationGetResponsePage(BaseModelSdk): items: Annotated[List[IntegrationGetResponse], Field(title='Items')] - total: Annotated[int, Field(ge=0, title='Total')] - page: Annotated[int, Field(ge=1, title='Page')] - size: Annotated[int, Field(ge=1, title='Size')] - pages: Annotated[int, Field(ge=0, title='Pages')] + total: Annotated[Optional[Total], Field(title='Total')] = None + page: Annotated[Optional[Page], Field(title='Page')] = None + size: Annotated[Optional[Size], Field(title='Size')] = None + pages: Annotated[Optional[Pages], Field(title='Pages')] = None links: Links @@ -2792,10 +3100,10 @@ class PublicBlocklistResponse(BaseModelSdk): class PublicBlocklistResponsePage(BaseModelSdk): items: Annotated[List[PublicBlocklistResponse], Field(title='Items')] - total: Annotated[int, Field(ge=0, title='Total')] - page: Annotated[int, Field(ge=1, title='Page')] - size: Annotated[int, Field(ge=1, title='Size')] - pages: Annotated[int, Field(ge=0, title='Pages')] + total: Annotated[Optional[Total], Field(title='Total')] = None + page: Annotated[Optional[Page], Field(title='Page')] = None + size: Annotated[Optional[Size], Field(title='Size')] = None + pages: Annotated[Optional[Pages], Field(title='Pages')] = None links: Links @@ -4142,10 +4450,10 @@ class AllowlistGetItemsResponse(BaseModelSdk): class AllowlistGetItemsResponsePage(BaseModelSdk): items: Annotated[List[AllowlistGetItemsResponse], Field(title='Items')] - total: Annotated[int, Field(ge=0, title='Total')] - page: Annotated[int, Field(ge=1, title='Page')] - size: Annotated[int, Field(ge=1, title='Size')] - pages: Annotated[int, Field(ge=0, title='Pages')] + total: Annotated[Optional[Total], Field(title='Total')] = None + page: Annotated[Optional[Page], Field(title='Page')] = None + size: Annotated[Optional[Size], Field(title='Size')] = None + pages: Annotated[Optional[Pages], Field(title='Pages')] = None links: Links @@ -4201,10 +4509,10 @@ class AllowlistGetResponse(BaseModelSdk): class AllowlistGetResponsePage(BaseModelSdk): items: Annotated[List[AllowlistGetResponse], Field(title='Items')] - total: Annotated[int, Field(ge=0, title='Total')] - page: Annotated[int, Field(ge=1, title='Page')] - size: Annotated[int, Field(ge=1, title='Size')] - pages: Annotated[int, Field(ge=0, title='Pages')] + total: Annotated[Optional[Total], Field(title='Total')] = None + page: Annotated[Optional[Page], Field(title='Page')] = None + size: Annotated[Optional[Size], Field(title='Size')] = None + pages: Annotated[Optional[Pages], Field(title='Pages')] = None links: Links @@ -4363,10 +4671,10 @@ class DecisionResponse(BaseModelSdk): class DecisionsGetResponsePage(BaseModelSdk): items: Annotated[List[DecisionResponse], Field(title='Items')] - total: Annotated[int, Field(ge=0, title='Total')] - page: Annotated[int, Field(ge=1, title='Page')] - size: Annotated[int, Field(ge=1, title='Size')] - pages: Annotated[int, Field(ge=0, title='Pages')] + total: Annotated[Optional[Total], Field(title='Total')] = None + page: Annotated[Optional[Page], Field(title='Page')] = None + size: Annotated[Optional[Size], Field(title='Size')] = None + pages: Annotated[Optional[Pages], Field(title='Pages')] = None links: Links @@ -4457,3 +4765,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..6cd6a5ed5378a55e9b9b2cdf36002008ca171915 100644 GIT binary patch delta 47 xcmX@kc%G4GIWI340}!}(D`rjPF=0%a=qN0doS#>mpOdPaSdgg?VNZ<91OP4O4rc%W delta 39 tcmX@lc$|@EIWI340}wPgKF^%UW5O6U(NUPIs4P`Cu^>~wsBB_dCIHq93&#Ke diff --git a/crowdsec_service_api/services/__pycache__/allowlists.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/allowlists.cpython-311.pyc index 6ea5649913ece2d4af0471a95e6407b7f34cbbfa..23a052628d3a6107414a06918b3374e4b8260b6b 100644 GIT binary patch delta 192 zcmaEt@->BbIWI340}#Y_D`rJ(O^z>4Eh@`QPK{42$kaE~Gc+>S zGnib!9Hf?_pOK%Ns$W!^mzP?kA77qdl&znfpI4lpld20+3t>-wz+54maDhYOB1hsC qj>HQvv^kq4TGK9x@dE=RYZBv(5D2{@7(!o&j)yStlABrdvRD8(|2+`^ delta 185 zcmeyG@-BsUIWI340}xDhe4ZJ(k=K=3PBytHzdWTlH95XGwWusJIW<19AXC50K+n)r z&&X_YK68*nS(6xNgh1#O!4UdFbUcKCm)!i`RGJk4$9O*j delta 185 zcmbPO)>X#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;f7gz$p|W5+LQJo)(GD8;vWzpddNYlf58eph$uLlZBs$o+2Qxz%zN+mK4$-%nVV{R z;q|rxx`c*hMV)HdNUtQUi3bVAOy-ijn zSjw36ihiO|U^G0EwEO3c)DXZ7?MPvvKiWMh4y|1W=`Jz5T69a3Z^(E<^J!s3Ojilq@&bXBzgA6K~C6Id^9J`W=yzU4ElC5|% zCB`Eb#4V7?2RBEiL!JBl|5tajYmKtM(@^~jg&AOaK=%&vE!0KI{%1WV3w#+!OM6{- zr@T=Xw6_{Pd}<%7(N5U0%3Sm(OyMGpq{H%z%L*#WDmr2y1*;aPgF-Zl!&Kla6iAIr zIRcQt_&mJYDD~B*09lL=z~2>jq8&2ucrrmky^Du@&9?QdhK~3^ zi`k%1_he;NL?=pyOn)4F-MYU;0)0D9opA#2bB4BNf2ISv&O;Me_;lQsFSE9+P6)QL zE>@oOopnqOfj#?8ceg7;xh!1t1x#1t*aG~VxuK!5AQYSJoKpkCPvm|#t#f2az+S*UJ(qT zFGR;f7V{$NM9zn#=^r*=dGvDBm*z!#E96$iqXQuurzno6cq3AHUU72nWg zfxGA$%SxUvQe;JnWXo?x=9d`e1^Fm^wRAu?I7rc+d1vyohYo@s#jQY}fCGAfLQm0? zyQteq<09TowLZ~J)n1ByBv|3wNz33Kie8GpwgERUPDQRHQV|9BWv*ASOjF*XsL^;j zo=S$}N|c3^@(@9A@csOZ$hz1{-t&!u5J%TI@{Qlmm`Iz@NbX7E+$;VWkI+l_j4>-J z2rkfc;;JW5uAL6dlqGC4Yn&4MVZr9-$u|vbbd?@Z6Y8{Dc84R=vEc}gOu`&a(_;_A zxuH(pr09u03D?rHM<}+s1>6VGv;^3`F|Ze$d?l?x9#_=N8O6foru%9BO~5=VNXXNn zS=a3H?bw}|#^s!{Cg!SKnrY2l`(R?t8q8Yv!29~JVOOm~%hsV>eM5mmwxdiDu{L{& zqR8*OSZ(64#u-FONtBb;Rli1N{>VHZaXn>`&i z#6L-%T8cf*PC;I;_7nuL1@vF&E#oTMa5e5C8S9LL{x@7nL8oyi>9u*xXFx)~DE*y` X*_I9tG7MDTocG0|9w}`R*SGuwuxtJi delta 589 zcmeyQct(bAIWI340}xDhe4fd`v60V*QRoGb+s-hZA(bJDF@+(DDMf5@4&x=R4u%TG zD1l%GP4USgOk3q-lZ*1pQ;JiQKB#f<)s$s$Cu|9W$PD}rRstd7L`q&$6O|yc!5LWB1h5{j-(4Pv{{{HDN`kSw?=`lGu0NEi$IzUpBwMY+073qTruoAFhQxMk}B+p)C0%C&&%s?y) z5Meplg;P_*0mQTc5w;)#$r>Q{7JETrWlnx#N|D{>shmuVoSKY9LO^j%!O0xFnd;Uc z9rhq~qAsb)nZ=p;dCo1Ic+71{l#>pQIQIM!Hpiv_VUdCaJ^$lvab!i(F;sFf_ z24iCK67{5056VrPiC*OFal{$pP8u&HsHuquPsZ2Q4G!viUw+^J@BQBQ;KH3L&l8qy z0^}rbiWj5es^>KHy@3EMfx7^K1e8F6k|H<@AHxpJQF~w~!GM=W&6x&i=b|&gxqu5u zU3i)rgi(B->PZkcDtQqtxzR3(M+^$0P^&6?@D;UBL9f8K)cyHf8ya%s2&ch7$(k;HUlGl_h+M6oK`)nJ>>8mYM zWhS`Jq$*6RT$9pk`cWHP!Be~lS4!9UWy)9e$azUlr*uV4>T?B@rtvRNxU?Kbko@Wz z7k1Us8us(2`c#R0CI+kClePE>T`!EK^jS4SG8#od5Y!M+s!U*h5O1>WXKKY-d?>4= zQ(0}87_z3Pm0V$X(`@V}umH-VYf$? zgsz4TlSK{}yb-(-@Q2%GketEOAyG@#{b((KYO7AU7h8qNr;116! zZ!mxxg@nel*_XNJxmD$bLY(#HkqTkWjFcK9ZVG~3Dg1>cs9z^E*SprqAzAkNC zQT1bURkj|PAZu3(W~pYvB@-^=PhI`z`W*oLTp(+)uR%fQG&F#T_a(0DKXn(J~p(Di;04Tt(bp2_E=U-UM81nQgBy pys=}e-=1P2F75sTZ{cEW?WpE}hYav{ygl&U%KZ38UJa8a{034$4Cw#> delta 414 zcmbQ1Fh7)UIWI340}xDhe4e>Pb|aq;qfiGU14BE*bcR%hD8>|qD5eyJ$vKRR85JiB zFljR?0ZCComQ?;UwiK}z)+hl^22O?)<;h7*){H8X=P?;br3j|7q_Ct)r?I5Sx3EOX zbTCvfM#%;7mc~+8lIWI340}#Y_D`qKg&DM&3=KO;XkRlle- zFE6!7KfXM_C|f@{Kd(4HCsjAGAQQ@-{F^CDIN<_^#6^z8D;$XzU}$p%^8+@!B*qU6 cjI2qFGeRKrieLzRAvzwyz)NnP#$~_+0Crc}$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..6be90e266a061c13bb09dd2d350e0721526a6e5e 100644 GIT binary patch delta 192 zcmaFE|Cyh6IWI340}#Y_D`u5#O^z>4Eh@`QPK{42$kaE~Gc+>S zGnkyg6r>iXpOK%Ns$W!^mzP?kA77qdl&znfpI4lpld20+3t>;b!IUGMaDhYOB1hsC rj>HQvv^ku)p2;qW@dE=RYZBv(5D2{@7(!o&j)yStlAA@?ZZHA>uzNg@ 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..38e8357012bb60225f941809fa7cce97c0a6155d 100644 GIT binary patch delta 176 zcmZ1>vR;IDIWI340}#Y_D`q|4$lJigC^K1~S(M#S&(O$R&tURurXaOM{fzwFRQ;mT zyu8#R{rK|yqHO)-{Ji4)oK)S!f=noTvNUs%aKZ%+iHjVGS2z+cz|iIe%-k$?NsJ#D c7+I4TXM{lL6~PetLUcTYftTF;lHHyO0DXKky#N3J delta 185 zcmZ24vOt<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..3ca25db4fb0e1722f789903c7bf16f74ae5a0ea3 100644 GIT binary patch delta 192 zcmdlldrX#hIWI340}#Y_D`t6bnS(6xNgh1#O!4UdFbUcKCm)tDKvyKS>EcQLE 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..322f8374b43ffb8f40c90d8d0814b23fd3cfee79 100644 GIT binary patch delta 192 zcmcaD_DGC(IWI340}#Y_D`q{|$h(C}RwlV9zdWTlH95XGwWusJIW<19AXDE^&(O$R z&tUR>rXaNp{fzwFRQ;mTyu8#R{rK|yqHO)-{Ji4)oK#(qS_pfxKXbis!UYbAiyVnp rI1(?w(B_BC$5`x=7(XyDvL-Rk2!YTmf+6&U=y(VNFS+?CM;Q|Uks&^< delta 171 zcmaDPc3X^hIWI340}xDhe4hDmBkvX_Ioaf*{PL9I)a3Z$)S|M?)IY=!{KO;XkRlle-FE6!7KfXM_C|f@{Kd(4HCsh}u7Q&wVow-^#;R1)mMUKQP r9ElfTXmcye9bUU6#t#gPtVxVBLLl^tUnS(6xNgh1#O!4UdFbUcKCm)!hKxrhY-y&gXr delta 185 zcmaDK@FIYBIWI340}xDhe4g36k#`-loNRJYetAl9YI1yWYEfBca%y~HL8gA0fu5nM zo{`z)8_Yp+k@^|=xvBa^rFnU&Mf&mO`9<0KMP;eFAcaL`lLJ_agcC1tNL=Jdy26ok o0fshTWqBoMm(2Kqfsr+taYhJ)UJ(qTFGR;f7 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.127.0") def list_allowlists( self, diff --git a/crowdsec_service_api/services/blocklists.py b/crowdsec_service_api/services/blocklists.py index 65bf0d6..ce73df4 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.127.0") def get_blocklists( self, diff --git a/crowdsec_service_api/services/cves.py b/crowdsec_service_api/services/cves.py index b0d0745..577293d 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.127.0") def get_cves( self, @@ -223,6 +223,32 @@ def unsubscribe_integration_from_cve( return None + def get_cve_indicators( + self, + cve_id: str, + sort_by: IndicatorsSortBy, + indicator_type: Optional[list[IndicatorType]] = None, + )-> list[IndicatorHttpPath]: + endpoint_url = "/cves/{cve_id}/indicators" + loc = locals() + headers = {} + params = json.loads( + CvesGetCveIndicatorsQueryParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + path_params = json.loads( + CvesGetCveIndicatorsPathParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + + response = self.http_client.get( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return [IndicatorHttpPath(**item) for item in response.json()] + def get_cve_timeline( self, cve_id: str, diff --git a/crowdsec_service_api/services/decisions.py b/crowdsec_service_api/services/decisions.py index 077a642..8318995 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.127.0") def get_decisions( self, @@ -60,4 +60,24 @@ def create_decision( ) return DecisionCreateResponse(**response.json()) + + def delete_decision( + self, + decision_id: str, + ): + endpoint_url = "/decisions/{decision_id}" + loc = locals() + headers = {} + params = {} + path_params = json.loads( + DecisionsDeleteDecisionPathParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + + response = self.http_client.delete( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return None \ No newline at end of file diff --git a/crowdsec_service_api/services/fingerprints.py b/crowdsec_service_api/services/fingerprints.py index 25d9ac6..2b507da 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.127.0") def get_fingerprint_rules( self, @@ -208,6 +208,32 @@ def get_fingerprint_timeline( return [FingerprintTimelineItem(**item) for item in response.json()] + def get_fingerprint_indicators( + self, + fingerprint: str, + sort_by: IndicatorsSortBy, + indicator_type: Optional[list[IndicatorType]] = None, + )-> list[IndicatorHttpPath]: + endpoint_url = "/fingerprints/{fingerprint}/indicators" + loc = locals() + headers = {} + params = json.loads( + FingerprintsGetFingerprintIndicatorsQueryParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + path_params = json.loads( + FingerprintsGetFingerprintIndicatorsPathParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + + response = self.http_client.get( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return [IndicatorHttpPath(**item) for item in response.json()] + def get_fingerprint_rule( self, fingerprint: str, diff --git a/crowdsec_service_api/services/hub.py b/crowdsec_service_api/services/hub.py index d488520..d1a7e73 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.127.0") def get_index( self, diff --git a/crowdsec_service_api/services/info.py b/crowdsec_service_api/services/info.py index 9137d39..1f8081a 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.127.0") def get_info( self, diff --git a/crowdsec_service_api/services/integrations.py b/crowdsec_service_api/services/integrations.py index d5e2589..e1ff7d6 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.127.0") def get_integrations( self, diff --git a/crowdsec_service_api/services/metrics.py b/crowdsec_service_api/services/metrics.py index df84939..a5542b6 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.127.0") def get_metrics_remediation( self, diff --git a/crowdsec_service_api/services/products.py b/crowdsec_service_api/services/products.py index 02e32df..4a1f0e6 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.127.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..e8e48b8 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.127.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..de9a00a 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.127.0") def get_tags( self, diff --git a/crowdsec_service_api/services/vendors.py b/crowdsec_service_api/services/vendors.py index c5ae5fb..2d83422 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.127.0") def get_vendors( self, diff --git a/doc/Cves.md b/doc/Cves.md index 4b9c0ac..9b8a39b 100644 --- a/doc/Cves.md +++ b/doc/Cves.md @@ -12,6 +12,7 @@ | [get_cve_subscribed_integrations](#get_cve_subscribed_integrations) | Get the list of integrations subscribed to a specific CVE ID | | [subscribe_integration_to_cve](#subscribe_integration_to_cve) | Subscribe an integration to receive threats related to a specific CVE ID | | [unsubscribe_integration_from_cve](#unsubscribe_integration_from_cve) | Unsubscribe an integration from receiving threats related to a specific CVE ID | +| [get_cve_indicators](#get_cve_indicators) | Get the top indicators (e.g. http_path) observed for a specific CVE ID. Each item is tagged with its ``indicator_type``. The list is pre-ranked by ``sort_by`` (popular = most reported, most_recent = newly discovered variations). Pass ``indicator_type`` one or more times to narrow to specific IOC types. | | [get_cve_timeline](#get_cve_timeline) | Get timeline data of occurrences for a specific CVE ID | ## **get_cves** @@ -365,6 +366,46 @@ except HTTPStatusError as e: ``` +## **get_cve_indicators** +### Get the top indicators (e.g. http_path) observed for a specific CVE ID. Each item is tagged with its ``indicator_type``. The list is pre-ranked by ``sort_by`` (popular = most reported, most_recent = newly discovered variations). Pass ``indicator_type`` one or more times to narrow to specific IOC types. +- Endpoint: `/cves/{cve_id}/indicators` +- Method: `GET` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| cve_id | str | | True | | +| sort_by | IndicatorsSortBy | Ranking applied to the returned list. | False | | +| indicator_type | Optional[list[IndicatorType]] | Restrict to one or more IOC types. | False | None | +### Returns: +[list[IndicatorHttpPath]](./Models.md#list[indicatorhttppath]) +### Errors: +| Code | Description | +| ---- | ----------- | +| 404 | CVE Not Found | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_service_api import ( + Cves, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = Cves(auth=auth) +try: + response = client.get_cve_indicators( + cve_id='cve_id', + sort_by=None, + indicator_type=None, + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + + ## **get_cve_timeline** ### Get timeline data of occurrences for a specific CVE ID - Endpoint: `/cves/{cve_id}/timeline` diff --git a/doc/Decisions.md b/doc/Decisions.md index e4248a1..d4b739b 100644 --- a/doc/Decisions.md +++ b/doc/Decisions.md @@ -5,6 +5,7 @@ | ------ | ----------- | | [get_decisions](#get_decisions) | Get decisions | | [create_decision](#create_decision) | Create a new decision. | +| [delete_decision](#delete_decision) | Delete a decision by its UUID. | ## **get_decisions** ### Get decisions @@ -111,3 +112,36 @@ except HTTPStatusError as e: print(f"An error occurred: {e.response.status_code} - {e.response.text}") ``` + +## **delete_decision** +### Delete a decision by its UUID. +- Endpoint: `/decisions/{decision_id}` +- Method: `DELETE` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| decision_id | str | | True | | +### Errors: +| Code | Description | +| ---- | ----------- | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_service_api import ( + Decisions, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = Decisions(auth=auth) +try: + response = client.delete_decision( + decision_id='decision_id', + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + diff --git a/doc/Fingerprints.md b/doc/Fingerprints.md index 8336e47..addb9a3 100644 --- a/doc/Fingerprints.md +++ b/doc/Fingerprints.md @@ -11,6 +11,7 @@ | [subscribe_integration_to_fingerprint](#subscribe_integration_to_fingerprint) | Subscribe an integration to receive threats related to a specific fingerprint rule | | [unsubscribe_integration_from_fingerprint](#unsubscribe_integration_from_fingerprint) | Unsubscribe an integration from receiving threats related to a specific fingerprint rule | | [get_fingerprint_timeline](#get_fingerprint_timeline) | Get timeline data of occurrences for a specific fingerprint rule | +| [get_fingerprint_indicators](#get_fingerprint_indicators) | Get the top indicators (e.g. http_path) observed for a specific fingerprint rule. Each item is tagged with its ``indicator_type``. The list is pre-ranked by ``sort_by`` (popular = most reported, most_recent = newly discovered variations). Pass ``indicator_type`` one or more times to narrow to specific IOC types. | | [get_fingerprint_rule](#get_fingerprint_rule) | Get information about a specific fingerprint rule | ## **get_fingerprint_rules** @@ -321,6 +322,45 @@ except HTTPStatusError as e: ``` +## **get_fingerprint_indicators** +### Get the top indicators (e.g. http_path) observed for a specific fingerprint rule. Each item is tagged with its ``indicator_type``. The list is pre-ranked by ``sort_by`` (popular = most reported, most_recent = newly discovered variations). Pass ``indicator_type`` one or more times to narrow to specific IOC types. +- Endpoint: `/fingerprints/{fingerprint}/indicators` +- Method: `GET` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| fingerprint | str | | True | | +| sort_by | IndicatorsSortBy | Ranking applied to the returned list. | False | | +| indicator_type | Optional[list[IndicatorType]] | Restrict to one or more IOC types. | False | None | +### Returns: +[list[IndicatorHttpPath]](./Models.md#list[indicatorhttppath]) +### Errors: +| Code | Description | +| ---- | ----------- | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_service_api import ( + Fingerprints, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = Fingerprints(auth=auth) +try: + response = client.get_fingerprint_indicators( + fingerprint='fingerprint', + sort_by=None, + indicator_type=None, + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + + ## **get_fingerprint_rule** ### Get information about a specific fingerprint rule - Endpoint: `/fingerprints/{fingerprint}` diff --git a/doc/Models.md b/doc/Models.md index 6d2e3e8..b6ab9c0 100644 --- a/doc/Models.md +++ b/doc/Models.md @@ -44,15 +44,15 @@ id, allowlist_id, description, scope, value, created_at, created_by # **AllowlistGetItemsResponsePage** ## Required: -items, total, page, size, pages, links +items, page, size, links ## Properties | Property | Type | Description | Example | |----------|------|-------------|---------| | items | list[AllowlistGetItemsResponse] | None || -| total | int | None || -| page | int | None || -| size | int | None || -| pages | int | None || +| total | Optional[int] | None || +| page | Optional[int] | None || +| size | Optional[int] | None || +| pages | Optional[int] | None || | links | Links | None || # **AllowlistGetResponse** @@ -74,15 +74,15 @@ id, organization_id, name, created_at, total_items # **AllowlistGetResponsePage** ## Required: -items, total, page, size, pages, links +items, page, size, links ## Properties | Property | Type | Description | Example | |----------|------|-------------|---------| | items | list[AllowlistGetResponse] | None || -| total | int | None || -| page | int | None || -| size | int | None || -| pages | int | None || +| total | Optional[int] | None || +| page | Optional[int] | None || +| size | Optional[int] | None || +| pages | Optional[int] | None || | links | Links | None || # **AllowlistItemUpdateRequest** @@ -134,15 +134,15 @@ id, entity_type # **AllowlistSubscriberEntityPage** ## Required: -items, total, page, size, pages, links +items, page, size, links ## Properties | Property | Type | Description | Example | |----------|------|-------------|---------| | items | list[AllowlistSubscriberEntity] | None || -| total | int | None || -| page | int | None || -| size | int | None || -| pages | int | None || +| total | Optional[int] | None || +| page | Optional[int] | None || +| size | Optional[int] | None || +| pages | Optional[int] | None || | links | Links | None || # **AllowlistSubscribersCount** @@ -352,15 +352,15 @@ id, entity_type, remediation # **BlocklistSubscriberEntityPage** ## Required: -items, total, page, size, pages, links +items, page, size, links ## Properties | Property | Type | Description | Example | |----------|------|-------------|---------| | items | list[BlocklistSubscriberEntity] | None || -| total | int | None || -| page | int | None || -| size | int | None || -| pages | int | None || +| total | Optional[int] | None || +| page | Optional[int] | None || +| size | Optional[int] | None || +| pages | Optional[int] | None || | links | Links | None || # **BlocklistSubscribersCount** @@ -591,15 +591,15 @@ ORG, TAG, ENTITY # **DecisionsGetResponsePage** ## Required: -items, total, page, size, pages, links +items, page, size, links ## Properties | Property | Type | Description | Example | |----------|------|-------------|---------| | items | list[DecisionResponse] | None || -| total | int | None || -| page | int | None || -| size | int | None || -| pages | int | None || +| total | Optional[int] | None || +| page | Optional[int] | None || +| size | Optional[int] | None || +| pages | Optional[int] | None || | links | Links | None || # **DecisionsSortBy** @@ -630,6 +630,7 @@ raw, computed |----------|------|-------------|---------| | raw | RawMetrics | None || | computed | ComputedMetrics | None || +| stats | RemediationStats | None || # **HTTPValidationError** ## Properties @@ -713,15 +714,15 @@ id, name, organization_id, created_at, updated_at, entity_type, output_format, b # **IntegrationGetResponsePage** ## Required: -items, total, page, size, pages, links +items, page, size, links ## Properties | Property | Type | Description | Example | |----------|------|-------------|---------| | items | list[IntegrationGetResponse] | None || -| total | int | None || -| page | int | None || -| size | int | None || -| pages | int | None || +| total | Optional[int] | None || +| page | Optional[int] | None || +| size | Optional[int] | None || +| pages | Optional[int] | None || | links | Links | None || # **IntegrationType** @@ -827,15 +828,15 @@ id, created_at, updated_at, name, description, is_private, pricing_tier, source, # **PublicBlocklistResponsePage** ## Required: -items, total, page, size, pages, links +items, page, size, links ## Properties | Property | Type | Description | Example | |----------|------|-------------|---------| | items | list[PublicBlocklistResponse] | None || -| total | int | None || -| page | int | None || -| size | int | None || -| pages | int | None || +| total | Optional[int] | None || +| page | Optional[int] | None || +| size | Optional[int] | None || +| pages | Optional[int] | None || | links | Links | None || # **RawMetrics** @@ -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 @@ -1460,6 +1468,33 @@ ip | target_countries | Target Countries | Target countries || | scores | Optional[Scores] | Scoring information || +# **IndicatorHttpPath** +## Required: +value, first_seen, last_seen +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| indicator_type | str | None || +| value | str | None || +| first_seen | str | None || +| last_seen | str | None || +| nb_ips | int | None || + +# **IndicatorType** +Kind of IOC carried in an indicator entry. Add new variants here +as we extend coverage (user_agent, ja3h, …). +## Enum: +HTTP_PATH + +# **IndicatorsSortBy** +How the caller wants the indicators ordered. + +``popular`` returns the cache's ``popular`` slice; ``most_recent`` returns +the ``recent`` slice. Both come pre-ranked from the Athena query so the +API doesn't re-sort. +## Enum: +POPULAR, MOST_RECENT + # **IndustryRiskProfile** ## Enum: TECHNOLOGY_BUSINESS, TRADITIONAL_BUSINESS, CRITICAL_INFRASTRUCTURE, PUBLIC_SERVICE, SOHO diff --git a/doc/README.md b/doc/README.md index 6d0b091..445188f 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) @@ -301,6 +303,12 @@ You can find a Quickstart about this SDK, following this [documentation](https:/ [IPItem](./Models.md#ipitem) +[IndicatorHttpPath](./Models.md#indicatorhttppath) + +[IndicatorType](./Models.md#indicatortype) + +[IndicatorsSortBy](./Models.md#indicatorssortby) + [IndustryRiskProfile](./Models.md#industryriskprofile) [IndustryType](./Models.md#industrytype) diff --git a/public-openapi.json b/public-openapi.json index 0492c9e..fb28d91 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.25", "contact": { "name": "CrowdSec", "url": "https://crowdsec.net", @@ -253,6 +253,9 @@ "schema": { "type": "boolean", "description": "Force delete the allowlist, even if it has subscribers", + "examples": [ + true + ], "default": false, "title": "Force" }, @@ -860,6 +863,9 @@ "type": "integer", "maximum": 1000, "description": "Page size", + "examples": [ + 50 + ], "default": 100, "title": "Page Size" }, @@ -872,6 +878,9 @@ "schema": { "type": "boolean", "description": "only subscribed blocklists", + "examples": [ + true + ], "default": false, "title": "Subscribed Only" }, @@ -884,6 +893,9 @@ "schema": { "type": "boolean", "description": "exclude subscribed blocklists", + "examples": [ + false + ], "default": false, "title": "Exclude Subscribed" }, @@ -899,6 +911,12 @@ "$ref": "#/components/schemas/BlocklistIncludeFilters" }, "description": "Include blocklists with the specified filters", + "examples": [ + [ + "public", + "shared" + ] + ], "default": [ "private", "shared" @@ -924,6 +942,12 @@ } ], "description": "Filter by category", + "examples": [ + [ + "proxy", + "scanner" + ] + ], "title": "Category" }, "description": "Filter by category" @@ -1179,6 +1203,9 @@ "schema": { "type": "boolean", "description": "Force delete the blocklist if it is shared or subscribed", + "examples": [ + false + ], "default": false, "title": "Force" }, @@ -1243,7 +1270,7 @@ ], "description": "Blocklist expiration", "examples": [ - "2026-04-17T08:43:44.302226+00:00" + "2026-06-04T14:24:57.590679+00:00" ], "title": "Expiration" }, @@ -1263,6 +1290,9 @@ } ], "description": "Ignore invalid IPs", + "examples": [ + false + ], "default": false, "title": "Ignore Invalid Ips" }, @@ -1963,6 +1993,12 @@ } ], "description": "List of tags associated with the integrations (any of)", + "examples": [ + [ + "firewall", + "remediation" + ] + ], "title": "Tag" }, "description": "List of tags associated with the integrations (any of)" @@ -2136,6 +2172,9 @@ "schema": { "type": "boolean", "description": "Force delete the integration even if it has active subscriptions (it will unsubscribe from all lists)", + "examples": [ + true + ], "default": false, "title": "Force" }, @@ -2238,6 +2277,9 @@ "type": "integer", "minimum": 1, "description": "Page number to return", + "examples": [ + 1 + ], "default": 1, "title": "Page" }, @@ -2258,6 +2300,9 @@ } ], "description": "Maximum number of items to return, 0 means no limit (default), should be greater than 10000", + "examples": [ + 50000 + ], "title": "Page Size" }, "description": "Maximum number of items to return, 0 means no limit (default), should be greater than 10000" @@ -2275,6 +2320,9 @@ "type": "null" } ], + "examples": [ + 5000 + ], "title": "Pull Limit" } }, @@ -2284,6 +2332,9 @@ "required": false, "schema": { "type": "boolean", + "examples": [ + true + ], "default": false, "title": "Enable Ip Aggregation" } @@ -2348,6 +2399,9 @@ "schema": { "type": "boolean", "description": "Set to true if it's the first run to fetch all the content, otherwise only changes since the last pull.", + "examples": [ + false + ], "default": false, "title": "Startup" }, @@ -2401,6 +2455,12 @@ "type": "string" }, "description": "Filter decisions by instance IDs", + "examples": [ + [ + "inst-001", + "inst-002" + ] + ], "default": [], "title": "Instance Ids" }, @@ -2416,6 +2476,12 @@ "type": "string" }, "description": "Filter decisions by tag IDs", + "examples": [ + [ + "64b8f0c2a1d3e4f5a6b7c8d9", + "64b8f0c2a1d3e4f5a6b7c8da" + ] + ], "default": [], "title": "Tag Ids" }, @@ -2431,6 +2497,12 @@ "type": "string" }, "description": "Filter decisions by remediation types", + "examples": [ + [ + "ban", + "captcha" + ] + ], "default": [], "title": "Remediation Types" }, @@ -2446,6 +2518,12 @@ "type": "string" }, "description": "Filter decisions by IPs (only for IP decisions)", + "examples": [ + [ + "203.0.113.7", + "203.0.113.8" + ] + ], "default": [], "title": "Ips" }, @@ -2465,6 +2543,9 @@ } ], "description": "Field to sort by (e.g., created_at, duration)", + "examples": [ + "created_at" + ], "default": "created_at", "title": "Sort By" }, @@ -2484,6 +2565,9 @@ } ], "description": "Sort order: 'asc' for ascending, 'desc' for descending", + "examples": [ + "desc" + ], "default": "desc", "title": "Sort Order" }, @@ -2590,6 +2674,42 @@ } } }, + "/decisions/{decision_id}": { + "delete": { + "tags": [ + "Decisions" + ], + "summary": "Delete Decision", + "description": "Delete a decision by its UUID.", + "operationId": "deleteDecision", + "parameters": [ + { + "name": "decision_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Decision Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, "/info": { "get": { "tags": [ @@ -2629,6 +2749,9 @@ "type": "string", "format": "date-time", "description": "Start date of the metrics, default to last day", + "examples": [ + "2025-03-14T09:30:00Z" + ], "title": "Start Date" }, "description": "Start date of the metrics, default to last day" @@ -2641,6 +2764,9 @@ "type": "string", "format": "date-time", "description": "End date of the metrics", + "examples": [ + "2025-03-15T09:30:00Z" + ], "title": "End Date" }, "description": "End date of the metrics" @@ -2655,6 +2781,12 @@ "type": "string" }, "description": "List of engine ids", + "examples": [ + [ + "engine_1", + "engine_2" + ] + ], "default": [], "title": "Engine Ids" }, @@ -2670,6 +2802,12 @@ "type": "string" }, "description": "List of integration ids", + "examples": [ + [ + "integration_1", + "integration_2" + ] + ], "default": [], "title": "Integration Ids" }, @@ -2685,6 +2823,12 @@ "type": "string" }, "description": "List of tags", + "examples": [ + [ + "tag_1", + "tag_2" + ] + ], "default": [], "title": "Tags" }, @@ -2983,6 +3127,9 @@ } ], "description": "Search query for CVEs", + "examples": [ + "wordpress" + ], "title": "Query" }, "description": "Search query for CVEs" @@ -3001,6 +3148,9 @@ } ], "description": "Field to sort by", + "examples": [ + "trending" + ], "default": "rule_release_date", "title": "Sort By" }, @@ -3020,6 +3170,9 @@ } ], "description": "Sort order: ascending or descending", + "examples": [ + "asc" + ], "default": "desc", "title": "Sort Order" }, @@ -3039,6 +3192,9 @@ } ], "description": "Filter by exploitation phase", + "examples": [ + "mass_exploitation" + ], "title": "Exploitation Phase" }, "description": "Filter by exploitation phase" @@ -3266,6 +3422,9 @@ } ], "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d", + "examples": [ + "7d" + ], "default": "14d", "title": "Since" }, @@ -3359,6 +3518,9 @@ } ], "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d", + "examples": [ + "24h" + ], "default": "14d", "title": "Since" }, @@ -3576,6 +3738,96 @@ } } }, + "/cves/{cve_id}/indicators": { + "get": { + "tags": [ + "Cves" + ], + "summary": "Get top indicators for a CVE ID", + "description": "Get the top indicators (e.g. http_path) observed for a specific CVE ID. Each item is tagged with its ``indicator_type``. The list is pre-ranked by ``sort_by`` (popular = most reported, most_recent = newly discovered variations). Pass ``indicator_type`` one or more times to narrow to specific IOC types.", + "operationId": "getCveIndicators", + "parameters": [ + { + "name": "cve_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Cve Id" + } + }, + { + "name": "sort_by", + "in": "query", + "required": false, + "schema": { + "$ref": "#/components/schemas/IndicatorsSortBy", + "description": "Ranking applied to the returned list.", + "examples": [ + "popular" + ], + "default": "popular" + }, + "description": "Ranking applied to the returned list." + }, + { + "name": "indicator_type", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/IndicatorType" + } + }, + { + "type": "null" + } + ], + "description": "Restrict to one or more IOC types.", + "examples": [ + [ + "http_path" + ] + ], + "title": "Indicator Type" + }, + "description": "Restrict to one or more IOC types." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IndicatorHttpPath" + }, + "title": "Response Getcveindicators" + } + } + } + }, + "404": { + "description": "CVE Not Found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, "/cves/{cve_id}/timeline": { "get": { "tags": [ @@ -3601,6 +3853,9 @@ "schema": { "$ref": "#/components/schemas/SinceOptions", "description": "Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days.", + "examples": [ + 7 + ], "default": 7 }, "description": "Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days." @@ -3660,6 +3915,9 @@ } ], "description": "Search query for vendors", + "examples": [ + "acme-corp" + ], "title": "Query" }, "description": "Search query for vendors" @@ -3678,6 +3936,9 @@ } ], "description": "Sort by: value, nb_cves, nb_ips, latest_rule_release", + "examples": [ + "nb_cves" + ], "title": "Sort By" }, "description": "Sort by: value, nb_cves, nb_ips, latest_rule_release" @@ -3696,6 +3957,9 @@ } ], "description": "Sort order: asc or desc", + "examples": [ + "desc" + ], "default": "desc", "title": "Sort Order" }, @@ -3872,6 +4136,9 @@ } ], "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d", + "examples": [ + "7d" + ], "default": "14d", "title": "Since" }, @@ -3962,6 +4229,9 @@ } ], "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d", + "examples": [ + "30d" + ], "default": "14d", "title": "Since" }, @@ -4193,6 +4463,9 @@ } ], "description": "Field to sort by", + "examples": [ + "trending" + ], "default": "rule_release_date", "title": "Sort By" }, @@ -4212,6 +4485,9 @@ } ], "description": "Sort order: ascending or descending", + "examples": [ + "asc" + ], "default": "desc", "title": "Sort Order" }, @@ -4292,6 +4568,9 @@ } ], "description": "Search query for products", + "examples": [ + "example-product" + ], "title": "Query" }, "description": "Search query for products" @@ -4380,6 +4659,9 @@ } ], "description": "Field to sort by", + "examples": [ + "trending" + ], "default": "rule_release_date", "title": "Sort By" }, @@ -4399,6 +4681,9 @@ } ], "description": "Sort order: ascending or descending", + "examples": [ + "asc" + ], "default": "desc", "title": "Sort Order" }, @@ -4479,6 +4764,9 @@ } ], "description": "Search query for tags", + "examples": [ + "example-tag" + ], "title": "Query" }, "description": "Search query for tags" @@ -4567,6 +4855,9 @@ } ], "description": "Field to sort by", + "examples": [ + "trending" + ], "default": "rule_release_date", "title": "Sort By" }, @@ -4586,6 +4877,9 @@ } ], "description": "Sort order: ascending or descending", + "examples": [ + "asc" + ], "default": "desc", "title": "Sort Order" }, @@ -4666,6 +4960,9 @@ } ], "description": "Search query for tags", + "examples": [ + "network-scanner" + ], "title": "Query" }, "description": "Search query for tags" @@ -4754,6 +5051,9 @@ } ], "description": "Field to sort by", + "examples": [ + "trending" + ], "default": "rule_release_date", "title": "Sort By" }, @@ -4773,6 +5073,9 @@ } ], "description": "Sort order: ascending or descending", + "examples": [ + "asc" + ], "default": "desc", "title": "Sort Order" }, @@ -4853,6 +5156,9 @@ } ], "description": "Search query for fingerprint rules", + "examples": [ + "apache" + ], "title": "Query" }, "description": "Search query for fingerprint rules" @@ -4871,6 +5177,9 @@ } ], "description": "Field to sort by", + "examples": [ + "trending" + ], "default": "rule_release_date", "title": "Sort By" }, @@ -4890,6 +5199,9 @@ } ], "description": "Sort order: ascending or descending", + "examples": [ + "asc" + ], "default": "desc", "title": "Sort Order" }, @@ -5023,6 +5335,9 @@ } ], "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d", + "examples": [ + "7d" + ], "default": "14d", "title": "Since" }, @@ -5113,6 +5428,9 @@ } ], "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d", + "examples": [ + "30d" + ], "default": "14d", "title": "Since" }, @@ -5337,6 +5655,9 @@ "schema": { "$ref": "#/components/schemas/SinceOptions", "description": "Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days.", + "examples": [ + 7 + ], "default": 7 }, "description": "Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days." @@ -5355,6 +5676,9 @@ } ], "description": "Interval for aggregating timeline data. Options: 'hour', 'day', 'week'. Default is adapted based on 'since' parameter.", + "examples": [ + "day" + ], "title": "Interval" }, "description": "Interval for aggregating timeline data. Options: 'hour', 'day', 'week'. Default is adapted based on 'since' parameter." @@ -5388,6 +5712,93 @@ } } }, + "/fingerprints/{fingerprint}/indicators": { + "get": { + "tags": [ + "Fingerprints" + ], + "summary": "Get top indicators for a fingerprint rule", + "description": "Get the top indicators (e.g. http_path) observed for a specific fingerprint rule. Each item is tagged with its ``indicator_type``. The list is pre-ranked by ``sort_by`` (popular = most reported, most_recent = newly discovered variations). Pass ``indicator_type`` one or more times to narrow to specific IOC types.", + "operationId": "getFingerprintIndicators", + "parameters": [ + { + "name": "fingerprint", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Fingerprint" + } + }, + { + "name": "sort_by", + "in": "query", + "required": false, + "schema": { + "$ref": "#/components/schemas/IndicatorsSortBy", + "description": "Ranking applied to the returned list.", + "examples": [ + "most_recent" + ], + "default": "popular" + }, + "description": "Ranking applied to the returned list." + }, + { + "name": "indicator_type", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/IndicatorType" + } + }, + { + "type": "null" + } + ], + "description": "Restrict to one or more IOC types.", + "examples": [ + [ + "http_path" + ] + ], + "title": "Indicator Type" + }, + "description": "Restrict to one or more IOC types." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IndicatorHttpPath" + }, + "title": "Response Getfingerprintindicators" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, "/fingerprints/{fingerprint}": { "get": { "tags": [ @@ -5447,6 +5858,9 @@ "schema": { "type": "string", "description": "Duration string (e.g. '30d', '24h') to filter events", + "examples": [ + "7d" + ], "default": "30d", "title": "Since" }, @@ -5466,6 +5880,9 @@ } ], "description": "Sort order: ascending or descending", + "examples": [ + "asc" + ], "default": "desc", "title": "Sort Order" }, @@ -5485,6 +5902,9 @@ } ], "description": "Filter by CVE identifier (exact match)", + "examples": [ + "CVE-2024-12345" + ], "title": "Cve Id" }, "description": "Filter by CVE identifier (exact match)" @@ -5503,6 +5923,9 @@ } ], "description": "Filter by previous exploitation phase name", + "examples": [ + "early_exploitation" + ], "title": "Previous Phase" }, "description": "Filter by previous exploitation phase name" @@ -5521,6 +5944,9 @@ } ], "description": "Filter by new exploitation phase name", + "examples": [ + "mass_exploitation" + ], "title": "New Phase" }, "description": "Filter by new exploitation phase name" @@ -5808,23 +6234,51 @@ "title": "Items" }, "total": { - "type": "integer", - "minimum": 0.0, + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], "title": "Total" }, "page": { - "type": "integer", - "minimum": 1.0, + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], "title": "Page" }, "size": { - "type": "integer", - "minimum": 1.0, + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], "title": "Size" }, "pages": { - "type": "integer", - "minimum": 0.0, + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], "title": "Pages" }, "links": { @@ -5835,10 +6289,8 @@ "type": "object", "required": [ "items", - "total", "page", "size", - "pages", "links" ], "title": "AllowlistGetItemsResponsePage" @@ -5947,23 +6399,51 @@ "title": "Items" }, "total": { - "type": "integer", - "minimum": 0.0, + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], "title": "Total" }, "page": { - "type": "integer", - "minimum": 1.0, + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], "title": "Page" }, "size": { - "type": "integer", - "minimum": 1.0, + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], "title": "Size" }, "pages": { - "type": "integer", - "minimum": 0.0, + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], "title": "Pages" }, "links": { @@ -5974,10 +6454,8 @@ "type": "object", "required": [ "items", - "total", "page", "size", - "pages", "links" ], "title": "AllowlistGetResponsePage" @@ -6181,23 +6659,51 @@ "title": "Items" }, "total": { - "type": "integer", - "minimum": 0.0, + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], "title": "Total" }, "page": { - "type": "integer", - "minimum": 1.0, + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], "title": "Page" }, "size": { - "type": "integer", - "minimum": 1.0, + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], "title": "Size" }, "pages": { - "type": "integer", - "minimum": 0.0, + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], "title": "Pages" }, "links": { @@ -6208,10 +6714,8 @@ "type": "object", "required": [ "items", - "total", "page", "size", - "pages", "links" ], "title": "AllowlistSubscriberEntityPage" @@ -7030,23 +7534,51 @@ "title": "Items" }, "total": { - "type": "integer", - "minimum": 0.0, + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], "title": "Total" }, "page": { - "type": "integer", - "minimum": 1.0, + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], "title": "Page" }, "size": { - "type": "integer", - "minimum": 1.0, + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], "title": "Size" }, "pages": { - "type": "integer", - "minimum": 0.0, + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], "title": "Pages" }, "links": { @@ -7057,10 +7589,8 @@ "type": "object", "required": [ "items", - "total", "page", "size", - "pages", "links" ], "title": "BlocklistSubscriberEntityPage" @@ -7893,23 +8423,51 @@ "title": "Items" }, "total": { - "type": "integer", - "minimum": 0.0, + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], "title": "Total" }, "page": { - "type": "integer", - "minimum": 1.0, + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], "title": "Page" }, "size": { - "type": "integer", - "minimum": 1.0, + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], "title": "Size" }, "pages": { - "type": "integer", - "minimum": 0.0, + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], "title": "Pages" }, "links": { @@ -7920,10 +8478,8 @@ "type": "object", "required": [ "items", - "total", "page", "size", - "pages", "links" ], "title": "DecisionsGetResponsePage" @@ -7980,6 +8536,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", @@ -8395,23 +8955,51 @@ "title": "Items" }, "total": { - "type": "integer", - "minimum": 0.0, + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], "title": "Total" }, "page": { - "type": "integer", - "minimum": 1.0, + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], "title": "Page" }, "size": { - "type": "integer", - "minimum": 1.0, + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], "title": "Size" }, "pages": { - "type": "integer", - "minimum": 0.0, + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], "title": "Pages" }, "links": { @@ -8422,10 +9010,8 @@ "type": "object", "required": [ "items", - "total", "page", "size", - "pages", "links" ], "title": "IntegrationGetResponsePage" @@ -8959,23 +9545,51 @@ "title": "Items" }, "total": { - "type": "integer", - "minimum": 0.0, + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], "title": "Total" }, "page": { - "type": "integer", - "minimum": 1.0, + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], "title": "Page" }, "size": { - "type": "integer", - "minimum": 1.0, + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], "title": "Size" }, "pages": { - "type": "integer", - "minimum": 0.0, + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], "title": "Pages" }, "links": { @@ -8986,10 +9600,8 @@ "type": "object", "required": [ "items", - "total", "page", "size", - "pages", "links" ], "title": "PublicBlocklistResponsePage" @@ -9094,6 +9706,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": { @@ -12265,6 +12919,60 @@ ], "title": "IPItem" }, + "IndicatorHttpPath": { + "properties": { + "indicator_type": { + "type": "string", + "const": "http_path", + "title": "Indicator Type", + "default": "http_path" + }, + "value": { + "type": "string", + "title": "Value" + }, + "first_seen": { + "type": "string", + "format": "date-time", + "title": "First Seen" + }, + "last_seen": { + "type": "string", + "format": "date-time", + "title": "Last Seen" + }, + "nb_ips": { + "type": "integer", + "title": "Nb Ips", + "default": 0 + } + }, + "type": "object", + "required": [ + "value", + "first_seen", + "last_seen" + ], + "title": "IndicatorHttpPath", + "description": "One HTTP-path indicator (a single row from http_path_context).\n\n``value`` is the reconstructed HTTP request line: ``\" \"``\n(e.g. ``\"POST /wp-login.php\"``). Future indicator types use the same\n``value`` field with different semantics \u2014 clients dispatch on\n``indicator_type``.\n\nThe internal scoring columns ``watcher_count`` and ``cve_count`` drive\nSQL filtering/ranking but are never exposed. ``pokemon_count`` is\nsurfaced as ``nb_ips`` so the API speaks in user-facing terms." + }, + "IndicatorType": { + "type": "string", + "enum": [ + "http_path" + ], + "title": "IndicatorType", + "description": "Kind of IOC carried in an indicator entry. Add new variants here\nas we extend coverage (user_agent, ja3h, \u2026)." + }, + "IndicatorsSortBy": { + "type": "string", + "enum": [ + "popular", + "most_recent" + ], + "title": "IndicatorsSortBy", + "description": "How the caller wants the indicators ordered.\n\n``popular`` returns the cache's ``popular`` slice; ``most_recent`` returns\nthe ``recent`` slice. Both come pre-ranked from the Athena query so the\nAPI doesn't re-sort." + }, "IndustryRiskProfile": { "type": "string", "enum": [ @@ -13402,7 +14110,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 +14125,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 +14143,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 +14161,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 +14179,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..fafcb08 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.127.0" license = { text = "MIT" } authors = [ { name="crowdsec", email="info@crowdsec.net" } diff --git a/uv.lock b/uv.lock index 613efa8..400f52c 100644 --- a/uv.lock +++ b/uv.lock @@ -26,30 +26,30 @@ wheels = [ [[package]] name = "botocore" -version = "1.42.92" +version = "1.43.22" 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/76/cf/840f1b8db16d45e3807c23d1ea779723eed1cd9cf3b6c49e16f372d2a777/botocore-1.43.22.tar.gz", hash = "sha256:b00de525e538289ed4a7a85263f1be4e47473c124cec87be6b23be49356bf745", size = 15458781, upload-time = "2026-06-03T19:33:02.882Z" } 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/de/6b/576a1b0f915871e35f14a33104f2bcae635f19c6a72486ba639db0d1fc70/botocore-1.43.22-py3-none-any.whl", hash = "sha256:ceec9f81d0891abe7b28ca2b2ee47e32de7b3360ad11e80d351470f015217379", size = 15141375, upload-time = "2026-06-03T19:32:58.324Z" }, ] [[package]] name = "certifi" -version = "2026.2.25" +version = "2026.5.20" 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/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } 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/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, ] [[package]] name = "crowdsec-service-api" -version = "0.15.26" +version = "1.127.0" source = { editable = "." } dependencies = [ { name = "botocore" }, @@ -126,11 +126,11 @@ wheels = [ [[package]] name = "idna" -version = "3.11" +version = "3.18" 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/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } 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/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, ] [[package]] @@ -144,7 +144,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.13.3" +version = "2.13.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -152,9 +152,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d9/e4/40d09941a2cebcb20609b86a559817d5b9291c49dd6f8c87e5feffbe703a/pydantic-2.13.3.tar.gz", hash = "sha256:af09e9d1d09f4e7fe37145c1f577e1d61ceb9a41924bf0094a36506285d0a84d", size = 844068, upload-time = "2026-04-20T14:46:43.632Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/0a/fd7d723f8f8153418fb40cf9c940e82004fce7e987026b08a68a36dd3fe7/pydantic-2.13.3-py3-none-any.whl", hash = "sha256:6db14ac8dfc9a1e57f87ea2c0de670c251240f43cb0c30a5130e9720dc612927", size = 471981, upload-time = "2026-04-20T14:46:41.402Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, ] [package.optional-dependencies] @@ -167,104 +167,104 @@ timezone = [ [[package]] name = "pydantic-core" -version = "2.46.3" +version = "2.46.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2a/ef/f7abb56c49382a246fd2ce9c799691e3c3e7175ec74b14d99e798bcddb1a/pydantic_core-2.46.3.tar.gz", hash = "sha256:41c178f65b8c29807239d47e6050262eb6bf84eb695e41101e62e38df4a5bc2c", size = 471412, upload-time = "2026-04-20T14:40:56.672Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/a2/1ba90a83e85a3f94c796b184f3efde9c72f2830dcda493eea8d59ba78e6d/pydantic_core-2.46.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ab124d49d0459b2373ecf54118a45c28a1e6d4192a533fbc915e70f556feb8e5", size = 2106740, upload-time = "2026-04-20T14:41:20.932Z" }, - { url = "https://files.pythonhosted.org/packages/b6/f6/99ae893c89a0b9d3daec9f95487aa676709aa83f67643b3f0abaf4ab628a/pydantic_core-2.46.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cca67d52a5c7a16aed2b3999e719c4bcf644074eac304a5d3d62dd70ae7d4b2c", size = 1948293, upload-time = "2026-04-20T14:43:42.115Z" }, - { url = "https://files.pythonhosted.org/packages/3e/b8/2e8e636dc9e3f16c2e16bf0849e24be82c5ee82c603c65fc0326666328fc/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c024e08c0ba23e6fd68c771a521e9d6a792f2ebb0fa734296b36394dc30390e", size = 1973222, upload-time = "2026-04-20T14:41:57.841Z" }, - { url = "https://files.pythonhosted.org/packages/34/36/0e730beec4d83c5306f417afbd82ff237d9a21e83c5edf675f31ed84c1fe/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6645ce7eec4928e29a1e3b3d5c946621d105d3e79f0c9cddf07c2a9770949287", size = 2053852, upload-time = "2026-04-20T14:40:43.077Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f0/3071131f47e39136a17814576e0fada9168569f7f8c0e6ac4d1ede6a4958/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a712c7118e6c5ea96562f7b488435172abb94a3c53c22c9efc1412264a45cbbe", size = 2221134, upload-time = "2026-04-20T14:43:03.349Z" }, - { url = "https://files.pythonhosted.org/packages/2f/a9/a2dc023eec5aa4b02a467874bad32e2446957d2adcab14e107eab502e978/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69a868ef3ff206343579021c40faf3b1edc64b1cc508ff243a28b0a514ccb050", size = 2279785, upload-time = "2026-04-20T14:41:19.285Z" }, - { url = "https://files.pythonhosted.org/packages/0a/44/93f489d16fb63fbd41c670441536541f6e8cfa1e5a69f40bc9c5d30d8c90/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc7e8c32db809aa0f6ea1d6869ebc8518a65d5150fdfad8bcae6a49ae32a22e2", size = 2089404, upload-time = "2026-04-20T14:43:10.108Z" }, - { url = "https://files.pythonhosted.org/packages/2a/78/8692e3aa72b2d004f7a5d937f1dfdc8552ba26caf0bec75f342c40f00dec/pydantic_core-2.46.3-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:3481bd1341dc85779ee506bc8e1196a277ace359d89d28588a9468c3ecbe63fa", size = 2114898, upload-time = "2026-04-20T14:44:51.475Z" }, - { url = "https://files.pythonhosted.org/packages/6a/62/e83133f2e7832532060175cebf1f13748f4c7e7e7165cdd1f611f174494b/pydantic_core-2.46.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8690eba565c6d68ffd3a8655525cbdd5246510b44a637ee2c6c03a7ebfe64d3c", size = 2157856, upload-time = "2026-04-20T14:43:46.64Z" }, - { url = "https://files.pythonhosted.org/packages/6d/ec/6a500e3ad7718ee50583fae79c8651f5d37e3abce1fa9ae177ae65842c53/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4de88889d7e88d50d40ee5b39d5dac0bcaef9ba91f7e536ac064e6b2834ecccf", size = 2180168, upload-time = "2026-04-20T14:42:00.302Z" }, - { url = "https://files.pythonhosted.org/packages/d8/53/8267811054b1aa7fc1dc7ded93812372ef79a839f5e23558136a6afbfde1/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:e480080975c1ef7f780b8f99ed72337e7cc5efea2e518a20a692e8e7b278eb8b", size = 2322885, upload-time = "2026-04-20T14:41:05.253Z" }, - { url = "https://files.pythonhosted.org/packages/c8/c1/1c0acdb3aa0856ddc4ecc55214578f896f2de16f400cf51627eb3c26c1c4/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:de3a5c376f8cd94da9a1b8fd3dd1c16c7a7b216ed31dc8ce9fd7a22bf13b836e", size = 2360328, upload-time = "2026-04-20T14:41:43.991Z" }, - { url = "https://files.pythonhosted.org/packages/f0/d0/ef39cd0f4a926814f360e71c1adeab48ad214d9727e4deb48eedfb5bce1a/pydantic_core-2.46.3-cp311-cp311-win32.whl", hash = "sha256:fc331a5314ffddd5385b9ee9d0d2fee0b13c27e0e02dad71b1ae5d6561f51eeb", size = 1979464, upload-time = "2026-04-20T14:43:12.215Z" }, - { url = "https://files.pythonhosted.org/packages/18/9c/f41951b0d858e343f1cf09398b2a7b3014013799744f2c4a8ad6a3eec4f2/pydantic_core-2.46.3-cp311-cp311-win_amd64.whl", hash = "sha256:b5b9c6cf08a8a5e502698f5e153056d12c34b8fb30317e0c5fd06f45162a6346", size = 2070837, upload-time = "2026-04-20T14:41:47.707Z" }, - { url = "https://files.pythonhosted.org/packages/9f/1e/264a17cd582f6ed50950d4d03dd5fefd84e570e238afe1cb3e25cf238769/pydantic_core-2.46.3-cp311-cp311-win_arm64.whl", hash = "sha256:5dfd51cf457482f04ec49491811a2b8fd5b843b64b11eecd2d7a1ee596ea78a6", size = 2053647, upload-time = "2026-04-20T14:42:27.535Z" }, - { url = "https://files.pythonhosted.org/packages/4b/cb/5b47425556ecc1f3fe18ed2a0083188aa46e1dd812b06e406475b3a5d536/pydantic_core-2.46.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b11b59b3eee90a80a36701ddb4576d9ae31f93f05cb9e277ceaa09e6bf074a67", size = 2101946, upload-time = "2026-04-20T14:40:52.581Z" }, - { url = "https://files.pythonhosted.org/packages/a1/4f/2fb62c2267cae99b815bbf4a7b9283812c88ca3153ef29f7707200f1d4e5/pydantic_core-2.46.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af8653713055ea18a3abc1537fe2ebc42f5b0bbb768d1eb79fd74eb47c0ac089", size = 1951612, upload-time = "2026-04-20T14:42:42.996Z" }, - { url = "https://files.pythonhosted.org/packages/50/6e/b7348fd30d6556d132cddd5bd79f37f96f2601fe0608afac4f5fb01ec0b3/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a519dab6d63c514f3a81053e5266c549679e4aa88f6ec57f2b7b854aceb1b0", size = 1977027, upload-time = "2026-04-20T14:42:02.001Z" }, - { url = "https://files.pythonhosted.org/packages/82/11/31d60ee2b45540d3fb0b29302a393dbc01cd771c473f5b5147bcd353e593/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6cd87cb1575b1ad05ba98894c5b5c96411ef678fa2f6ed2576607095b8d9789", size = 2063008, upload-time = "2026-04-20T14:44:17.952Z" }, - { url = "https://files.pythonhosted.org/packages/8a/db/3a9d1957181b59258f44a2300ab0f0be9d1e12d662a4f57bb31250455c52/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f80a55484b8d843c8ada81ebf70a682f3f00a3d40e378c06cf17ecb44d280d7d", size = 2233082, upload-time = "2026-04-20T14:40:57.934Z" }, - { url = "https://files.pythonhosted.org/packages/9c/e1/3277c38792aeb5cfb18c2f0c5785a221d9ff4e149abbe1184d53d5f72273/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3861f1731b90c50a3266316b9044f5c9b405eecb8e299b0a7120596334e4fe9c", size = 2304615, upload-time = "2026-04-20T14:42:12.584Z" }, - { url = "https://files.pythonhosted.org/packages/5e/d5/e3d9717c9eba10855325650afd2a9cba8e607321697f18953af9d562da2f/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb528e295ed31570ac3dcc9bfdd6e0150bc11ce6168ac87a8082055cf1a67395", size = 2094380, upload-time = "2026-04-20T14:43:05.522Z" }, - { url = "https://files.pythonhosted.org/packages/a1/20/abac35dedcbfd66c6f0b03e4e3564511771d6c9b7ede10a362d03e110d9b/pydantic_core-2.46.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:367508faa4973b992b271ba1494acaab36eb7e8739d1e47be5035fb1ea225396", size = 2135429, upload-time = "2026-04-20T14:41:55.549Z" }, - { url = "https://files.pythonhosted.org/packages/6c/a5/41bfd1df69afad71b5cf0535055bccc73022715ad362edbc124bc1e021d7/pydantic_core-2.46.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ad3c826fe523e4becf4fe39baa44286cff85ef137c729a2c5e269afbfd0905d", size = 2174582, upload-time = "2026-04-20T14:41:45.96Z" }, - { url = "https://files.pythonhosted.org/packages/79/65/38d86ea056b29b2b10734eb23329b7a7672ca604df4f2b6e9c02d4ee22fe/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ec638c5d194ef8af27db69f16c954a09797c0dc25015ad6123eb2c73a4d271ca", size = 2187533, upload-time = "2026-04-20T14:40:55.367Z" }, - { url = "https://files.pythonhosted.org/packages/b6/55/a1129141678a2026badc539ad1dee0a71d06f54c2f06a4bd68c030ac781b/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:28ed528c45446062ee66edb1d33df5d88828ae167de76e773a3c7f64bd14e976", size = 2332985, upload-time = "2026-04-20T14:44:13.05Z" }, - { url = "https://files.pythonhosted.org/packages/d7/60/cb26f4077719f709e54819f4e8e1d43f4091f94e285eb6bd21e1190a7b7c/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aed19d0c783886d5bd86d80ae5030006b45e28464218747dcf83dabfdd092c7b", size = 2373670, upload-time = "2026-04-20T14:41:53.421Z" }, - { url = "https://files.pythonhosted.org/packages/6b/7e/c3f21882bdf1d8d086876f81b5e296206c69c6082551d776895de7801fa0/pydantic_core-2.46.3-cp312-cp312-win32.whl", hash = "sha256:06d5d8820cbbdb4147578c1fe7ffcd5b83f34508cb9f9ab76e807be7db6ff0a4", size = 1966722, upload-time = "2026-04-20T14:44:30.588Z" }, - { url = "https://files.pythonhosted.org/packages/57/be/6b5e757b859013ebfbd7adba02f23b428f37c86dcbf78b5bb0b4ffd36e99/pydantic_core-2.46.3-cp312-cp312-win_amd64.whl", hash = "sha256:c3212fda0ee959c1dd04c60b601ec31097aaa893573a3a1abd0a47bcac2968c1", size = 2072970, upload-time = "2026-04-20T14:42:54.248Z" }, - { url = "https://files.pythonhosted.org/packages/bf/f8/a989b21cc75e9a32d24192ef700eea606521221a89faa40c919ce884f2b1/pydantic_core-2.46.3-cp312-cp312-win_arm64.whl", hash = "sha256:f1f8338dd7a7f31761f1f1a3c47503a9a3b34eea3c8b01fa6ee96408affb5e72", size = 2035963, upload-time = "2026-04-20T14:44:20.4Z" }, - { url = "https://files.pythonhosted.org/packages/9b/3c/9b5e8eb9821936d065439c3b0fb1490ffa64163bfe7e1595985a47896073/pydantic_core-2.46.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:12bc98de041458b80c86c56b24df1d23832f3e166cbaff011f25d187f5c62c37", size = 2102109, upload-time = "2026-04-20T14:41:24.219Z" }, - { url = "https://files.pythonhosted.org/packages/91/97/1c41d1f5a19f241d8069f1e249853bcce378cdb76eec8ab636d7bc426280/pydantic_core-2.46.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:85348b8f89d2c3508b65b16c3c33a4da22b8215138d8b996912bb1532868885f", size = 1951820, upload-time = "2026-04-20T14:42:14.236Z" }, - { url = "https://files.pythonhosted.org/packages/30/b4/d03a7ae14571bc2b6b3c7b122441154720619afe9a336fa3a95434df5e2f/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1105677a6df914b1fb71a81b96c8cce7726857e1717d86001f29be06a25ee6f8", size = 1977785, upload-time = "2026-04-20T14:42:31.648Z" }, - { url = "https://files.pythonhosted.org/packages/ae/0c/4086f808834b59e3c8f1aa26df8f4b6d998cdcf354a143d18ef41529d1fe/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87082cd65669a33adeba5470769e9704c7cf026cc30afb9cc77fd865578ebaad", size = 2062761, upload-time = "2026-04-20T14:40:37.093Z" }, - { url = "https://files.pythonhosted.org/packages/fa/71/a649be5a5064c2df0db06e0a512c2281134ed2fcc981f52a657936a7527c/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60e5f66e12c4f5212d08522963380eaaeac5ebd795826cfd19b2dfb0c7a52b9c", size = 2232989, upload-time = "2026-04-20T14:42:59.254Z" }, - { url = "https://files.pythonhosted.org/packages/a2/84/7756e75763e810b3a710f4724441d1ecc5883b94aacb07ca71c5fb5cfb69/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6cdf19bf84128d5e7c37e8a73a0c5c10d51103a650ac585d42dd6ae233f2b7f", size = 2303975, upload-time = "2026-04-20T14:41:32.287Z" }, - { url = "https://files.pythonhosted.org/packages/6c/35/68a762e0c1e31f35fa0dac733cbd9f5b118042853698de9509c8e5bf128b/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031bb17f4885a43773c8c763089499f242aee2ea85cf17154168775dccdecf35", size = 2095325, upload-time = "2026-04-20T14:42:47.685Z" }, - { url = "https://files.pythonhosted.org/packages/77/bf/1bf8c9a8e91836c926eae5e3e51dce009bf495a60ca56060689d3df3f340/pydantic_core-2.46.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:bcf2a8b2982a6673693eae7348ef3d8cf3979c1d63b54fca7c397a635cc68687", size = 2133368, upload-time = "2026-04-20T14:41:22.766Z" }, - { url = "https://files.pythonhosted.org/packages/e5/50/87d818d6bab915984995157ceb2380f5aac4e563dddbed6b56f0ed057aba/pydantic_core-2.46.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28e8cf2f52d72ced402a137145923a762cbb5081e48b34312f7a0c8f55928ec3", size = 2173908, upload-time = "2026-04-20T14:42:52.044Z" }, - { url = "https://files.pythonhosted.org/packages/91/88/a311fb306d0bd6185db41fa14ae888fb81d0baf648a761ae760d30819d33/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:17eaface65d9fc5abb940003020309c1bf7a211f5f608d7870297c367e6f9022", size = 2186422, upload-time = "2026-04-20T14:43:29.55Z" }, - { url = "https://files.pythonhosted.org/packages/8f/79/28fd0d81508525ab2054fef7c77a638c8b5b0afcbbaeee493cf7c3fef7e1/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:93fd339f23408a07e98950a89644f92c54d8729719a40b30c0a30bb9ebc55d23", size = 2332709, upload-time = "2026-04-20T14:42:16.134Z" }, - { url = "https://files.pythonhosted.org/packages/b3/21/795bf5fe5c0f379308b8ef19c50dedab2e7711dbc8d0c2acf08f1c7daa05/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:23cbdb3aaa74dfe0837975dbf69b469753bbde8eacace524519ffdb6b6e89eb7", size = 2372428, upload-time = "2026-04-20T14:41:10.974Z" }, - { url = "https://files.pythonhosted.org/packages/45/b3/ed14c659cbe7605e3ef063077680a64680aec81eb1a04763a05190d49b7f/pydantic_core-2.46.3-cp313-cp313-win32.whl", hash = "sha256:610eda2e3838f401105e6326ca304f5da1e15393ae25dacae5c5c63f2c275b13", size = 1965601, upload-time = "2026-04-20T14:41:42.128Z" }, - { url = "https://files.pythonhosted.org/packages/ef/bb/adb70d9a762ddd002d723fbf1bd492244d37da41e3af7b74ad212609027e/pydantic_core-2.46.3-cp313-cp313-win_amd64.whl", hash = "sha256:68cc7866ed863db34351294187f9b729964c371ba33e31c26f478471c52e1ed0", size = 2071517, upload-time = "2026-04-20T14:43:36.096Z" }, - { url = "https://files.pythonhosted.org/packages/52/eb/66faefabebfe68bd7788339c9c9127231e680b11906368c67ce112fdb47f/pydantic_core-2.46.3-cp313-cp313-win_arm64.whl", hash = "sha256:f64b5537ac62b231572879cd08ec05600308636a5d63bcbdb15063a466977bec", size = 2035802, upload-time = "2026-04-20T14:43:38.507Z" }, - { url = "https://files.pythonhosted.org/packages/7f/db/a7bcb4940183fda36022cd18ba8dd12f2dff40740ec7b58ce7457befa416/pydantic_core-2.46.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:afa3aa644f74e290cdede48a7b0bee37d1c35e71b05105f6b340d484af536d9b", size = 2097614, upload-time = "2026-04-20T14:44:38.374Z" }, - { url = "https://files.pythonhosted.org/packages/24/35/e4066358a22e3e99519db370494c7528f5a2aa1367370e80e27e20283543/pydantic_core-2.46.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ced3310e51aa425f7f77da8bbbb5212616655bedbe82c70944320bc1dbe5e018", size = 1951896, upload-time = "2026-04-20T14:40:53.996Z" }, - { url = "https://files.pythonhosted.org/packages/87/92/37cf4049d1636996e4b888c05a501f40a43ff218983a551d57f9d5e14f0d/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e29908922ce9da1a30b4da490bd1d3d82c01dcfdf864d2a74aacee674d0bfa34", size = 1979314, upload-time = "2026-04-20T14:41:49.446Z" }, - { url = "https://files.pythonhosted.org/packages/d8/36/9ff4d676dfbdfb2d591cf43f3d90ded01e15b1404fd101180ed2d62a2fd3/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0c9ff69140423eea8ed2d5477df3ba037f671f5e897d206d921bc9fdc39613e7", size = 2056133, upload-time = "2026-04-20T14:42:23.574Z" }, - { url = "https://files.pythonhosted.org/packages/bc/f0/405b442a4d7ba855b06eec8b2bf9c617d43b8432d099dfdc7bf999293495/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b675ab0a0d5b1c8fdb81195dc5bcefea3f3c240871cdd7ff9a2de8aa50772eb2", size = 2228726, upload-time = "2026-04-20T14:44:22.816Z" }, - { url = "https://files.pythonhosted.org/packages/e7/f8/65cd92dd5a0bd89ba277a98ecbfaf6fc36bbd3300973c7a4b826d6ab1391/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0087084960f209a9a4af50ecd1fb063d9ad3658c07bb81a7a53f452dacbfb2ba", size = 2301214, upload-time = "2026-04-20T14:44:48.792Z" }, - { url = "https://files.pythonhosted.org/packages/fd/86/ef96a4c6e79e7a2d0410826a68fbc0eccc0fd44aa733be199d5fcac3bb87/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed42e6cc8e1b0e2b9b96e2276bad70ae625d10d6d524aed0c93de974ae029f9f", size = 2099927, upload-time = "2026-04-20T14:41:40.196Z" }, - { url = "https://files.pythonhosted.org/packages/6d/53/269caf30e0096e0a8a8f929d1982a27b3879872cca2d917d17c2f9fdf4fe/pydantic_core-2.46.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:f1771ce258afb3e4201e67d154edbbae712a76a6081079fe247c2f53c6322c22", size = 2128789, upload-time = "2026-04-20T14:41:15.868Z" }, - { url = "https://files.pythonhosted.org/packages/00/b0/1a6d9b6a587e118482910c244a1c5acf4d192604174132efd12bf0ac486f/pydantic_core-2.46.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7610b6a5242a6c736d8ad47fd5fff87fcfe8f833b281b1c409c3d6835d9227f", size = 2173815, upload-time = "2026-04-20T14:44:25.152Z" }, - { url = "https://files.pythonhosted.org/packages/87/56/e7e00d4041a7e62b5a40815590114db3b535bf3ca0bf4dca9f16cef25246/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:ff5e7783bcc5476e1db448bf268f11cb257b1c276d3e89f00b5727be86dd0127", size = 2181608, upload-time = "2026-04-20T14:41:28.933Z" }, - { url = "https://files.pythonhosted.org/packages/e8/22/4bd23c3d41f7c185d60808a1de83c76cf5aeabf792f6c636a55c3b1ec7f9/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:9d2e32edcc143bc01e95300671915d9ca052d4f745aa0a49c48d4803f8a85f2c", size = 2326968, upload-time = "2026-04-20T14:42:03.962Z" }, - { url = "https://files.pythonhosted.org/packages/24/ac/66cd45129e3915e5ade3b292cb3bc7fd537f58f8f8dbdaba6170f7cabb74/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6e42d83d1c6b87fa56b521479cff237e626a292f3b31b6345c15a99121b454c1", size = 2369842, upload-time = "2026-04-20T14:41:35.52Z" }, - { url = "https://files.pythonhosted.org/packages/a2/51/dd4248abb84113615473aa20d5545b7c4cd73c8644003b5259686f93996c/pydantic_core-2.46.3-cp314-cp314-win32.whl", hash = "sha256:07bc6d2a28c3adb4f7c6ae46aa4f2d2929af127f587ed44057af50bf1ce0f505", size = 1959661, upload-time = "2026-04-20T14:41:00.042Z" }, - { url = "https://files.pythonhosted.org/packages/20/eb/59980e5f1ae54a3b86372bd9f0fa373ea2d402e8cdcd3459334430f91e91/pydantic_core-2.46.3-cp314-cp314-win_amd64.whl", hash = "sha256:8940562319bc621da30714617e6a7eaa6b98c84e8c685bcdc02d7ed5e7c7c44e", size = 2071686, upload-time = "2026-04-20T14:43:16.471Z" }, - { url = "https://files.pythonhosted.org/packages/8c/db/1cf77e5247047dfee34bc01fa9bca134854f528c8eb053e144298893d370/pydantic_core-2.46.3-cp314-cp314-win_arm64.whl", hash = "sha256:5dcbbcf4d22210ced8f837c96db941bdb078f419543472aca5d9a0bb7cddc7df", size = 2026907, upload-time = "2026-04-20T14:43:31.732Z" }, - { url = "https://files.pythonhosted.org/packages/57/c0/b3df9f6a543276eadba0a48487b082ca1f201745329d97dbfa287034a230/pydantic_core-2.46.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d0fe3dce1e836e418f912c1ad91c73357d03e556a4d286f441bf34fed2dbeecf", size = 2095047, upload-time = "2026-04-20T14:42:37.982Z" }, - { url = "https://files.pythonhosted.org/packages/66/57/886a938073b97556c168fd99e1a7305bb363cd30a6d2c76086bf0587b32a/pydantic_core-2.46.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9ce92e58abc722dac1bf835a6798a60b294e48eb0e625ec9fd994b932ac5feee", size = 1934329, upload-time = "2026-04-20T14:43:49.655Z" }, - { url = "https://files.pythonhosted.org/packages/0b/7c/b42eaa5c34b13b07ecb51da21761297a9b8eb43044c864a035999998f328/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a03e6467f0f5ab796a486146d1b887b2dc5e5f9b3288898c1b1c3ad974e53e4a", size = 1974847, upload-time = "2026-04-20T14:42:10.737Z" }, - { url = "https://files.pythonhosted.org/packages/e6/9b/92b42db6543e7de4f99ae977101a2967b63122d4b6cf7773812da2d7d5b5/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2798b6ba041b9d70acfb9071a2ea13c8456dd1e6a5555798e41ba7b0790e329c", size = 2041742, upload-time = "2026-04-20T14:40:44.262Z" }, - { url = "https://files.pythonhosted.org/packages/0f/19/46fbe1efabb5aa2834b43b9454e70f9a83ad9c338c1291e48bdc4fecf167/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9be3e221bdc6d69abf294dcf7aff6af19c31a5cdcc8f0aa3b14be29df4bd03b1", size = 2236235, upload-time = "2026-04-20T14:41:27.307Z" }, - { url = "https://files.pythonhosted.org/packages/77/da/b3f95bc009ad60ec53120f5d16c6faa8cabdbe8a20d83849a1f2b8728148/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f13936129ce841f2a5ddf6f126fea3c43cd128807b5a59588c37cf10178c2e64", size = 2282633, upload-time = "2026-04-20T14:44:33.271Z" }, - { url = "https://files.pythonhosted.org/packages/cc/6e/401336117722e28f32fb8220df676769d28ebdf08f2f4469646d404c43a3/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28b5f2ef03416facccb1c6ef744c69793175fd27e44ef15669201601cf423acb", size = 2109679, upload-time = "2026-04-20T14:44:41.065Z" }, - { url = "https://files.pythonhosted.org/packages/fc/53/b289f9bc8756a32fe718c46f55afaeaf8d489ee18d1a1e7be1db73f42cc4/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:830d1247d77ad23852314f069e9d7ddafeec5f684baf9d7e7065ed46a049c4e6", size = 2108342, upload-time = "2026-04-20T14:42:50.144Z" }, - { url = "https://files.pythonhosted.org/packages/10/5b/8292fc7c1f9111f1b2b7c1b0dcf1179edcd014fc3ea4517499f50b829d71/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0793c90c1a3c74966e7975eaef3ed30ebdff3260a0f815a62a22adc17e4c01c", size = 2157208, upload-time = "2026-04-20T14:42:08.133Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9e/f80044e9ec07580f057a89fc131f78dda7a58751ddf52bbe05eaf31db50f/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d2d0aead851b66f5245ec0c4fb2612ef457f8bbafefdf65a2bf9d6bac6140f47", size = 2167237, upload-time = "2026-04-20T14:42:25.412Z" }, - { url = "https://files.pythonhosted.org/packages/f8/84/6781a1b037f3b96be9227edbd1101f6d3946746056231bf4ac48cdff1a8d/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:2f40e4246676beb31c5ce77c38a55ca4e465c6b38d11ea1bd935420568e0b1ab", size = 2312540, upload-time = "2026-04-20T14:40:40.313Z" }, - { url = "https://files.pythonhosted.org/packages/3e/db/19c0839feeb728e7df03255581f198dfdf1c2aeb1e174a8420b63c5252e5/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:cf489cf8986c543939aeee17a09c04d6ffb43bfef8ca16fcbcc5cfdcbed24dba", size = 2369556, upload-time = "2026-04-20T14:41:09.427Z" }, - { url = "https://files.pythonhosted.org/packages/e0/15/3228774cb7cd45f5f721ddf1b2242747f4eb834d0c491f0c02d606f09fed/pydantic_core-2.46.3-cp314-cp314t-win32.whl", hash = "sha256:ffe0883b56cfc05798bf994164d2b2ff03efe2d22022a2bb080f3b626176dd56", size = 1949756, upload-time = "2026-04-20T14:41:25.717Z" }, - { url = "https://files.pythonhosted.org/packages/b8/2a/c79cf53fd91e5a87e30d481809f52f9a60dd221e39de66455cf04deaad37/pydantic_core-2.46.3-cp314-cp314t-win_amd64.whl", hash = "sha256:706d9d0ce9cf4593d07270d8e9f53b161f90c57d315aeec4fb4fd7a8b10240d8", size = 2051305, upload-time = "2026-04-20T14:43:18.627Z" }, - { url = "https://files.pythonhosted.org/packages/0b/db/d8182a7f1d9343a032265aae186eb063fe26ca4c40f256b21e8da4498e89/pydantic_core-2.46.3-cp314-cp314t-win_arm64.whl", hash = "sha256:77706aeb41df6a76568434701e0917da10692da28cb69d5fb6919ce5fdb07374", size = 2026310, upload-time = "2026-04-20T14:41:01.778Z" }, - { url = "https://files.pythonhosted.org/packages/66/7f/03dbad45cd3aa9083fbc93c210ae8b005af67e4136a14186950a747c6874/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:9715525891ed524a0a1eb6d053c74d4d4ad5017677fb00af0b7c2644a31bae46", size = 2105683, upload-time = "2026-04-20T14:42:19.779Z" }, - { url = "https://files.pythonhosted.org/packages/26/22/4dc186ac8ea6b257e9855031f51b62a9637beac4d68ac06bee02f046f836/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:9d2f400712a99a013aff420ef1eb9be077f8189a36c1e3ef87660b4e1088a874", size = 1940052, upload-time = "2026-04-20T14:43:59.274Z" }, - { url = "https://files.pythonhosted.org/packages/0d/ca/d376391a5aff1f2e8188960d7873543608130a870961c2b6b5236627c116/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd2aab0e2e9dc2daf36bd2686c982535d5e7b1d930a1344a7bb6e82baab42a76", size = 1988172, upload-time = "2026-04-20T14:41:17.469Z" }, - { url = "https://files.pythonhosted.org/packages/0e/6b/523b9f85c23788755d6ab949329de692a2e3a584bc6beb67fef5e035aa9d/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e9d76736da5f362fabfeea6a69b13b7f2be405c6d6966f06b2f6bfff7e64531", size = 2128596, upload-time = "2026-04-20T14:40:41.707Z" }, - { url = "https://files.pythonhosted.org/packages/34/42/f426db557e8ab2791bc7562052299944a118655496fbff99914e564c0a94/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:b12dd51f1187c2eb489af8e20f880362db98e954b54ab792fa5d92e8bcc6b803", size = 2091877, upload-time = "2026-04-20T14:43:27.091Z" }, - { url = "https://files.pythonhosted.org/packages/5c/4f/86a832a9d14df58e663bfdf4627dc00d3317c2bd583c4fb23390b0f04b8e/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f00a0961b125f1a47af7bcc17f00782e12f4cd056f83416006b30111d941dfa3", size = 1932428, upload-time = "2026-04-20T14:40:45.781Z" }, - { url = "https://files.pythonhosted.org/packages/11/1a/fe857968954d93fb78e0d4b6df5c988c74c4aaa67181c60be7cfe327c0ca/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57697d7c056aca4bbb680200f96563e841a6386ac1129370a0102592f4dddff5", size = 1997550, upload-time = "2026-04-20T14:44:02.425Z" }, - { url = "https://files.pythonhosted.org/packages/17/eb/9d89ad2d9b0ba8cd65393d434471621b98912abb10fbe1df08e480ba57b5/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd35aa21299def8db7ef4fe5c4ff862941a9a158ca7b63d61e66fe67d30416b4", size = 2137657, upload-time = "2026-04-20T14:42:45.149Z" }, - { url = "https://files.pythonhosted.org/packages/1f/da/99d40830684f81dec901cac521b5b91c095394cc1084b9433393cde1c2df/pydantic_core-2.46.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:13afdd885f3d71280cf286b13b310ee0f7ccfefd1dbbb661514a474b726e2f25", size = 2107973, upload-time = "2026-04-20T14:42:06.175Z" }, - { url = "https://files.pythonhosted.org/packages/99/a5/87024121818d75bbb2a98ddbaf638e40e7a18b5e0f5492c9ca4b1b316107/pydantic_core-2.46.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f91c0aff3e3ee0928edd1232c57f643a7a003e6edf1860bc3afcdc749cb513f3", size = 1947191, upload-time = "2026-04-20T14:43:14.319Z" }, - { url = "https://files.pythonhosted.org/packages/60/62/0c1acfe10945b83a6a59d19fbaa92f48825381509e5701b855c08f13db76/pydantic_core-2.46.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6529d1d128321a58d30afcc97b49e98836542f68dd41b33c2e972bb9e5290536", size = 2123791, upload-time = "2026-04-20T14:43:22.766Z" }, - { url = "https://files.pythonhosted.org/packages/75/3e/3b2393b4c8f44285561dc30b00cf307a56a2eff7c483a824db3b8221ca51/pydantic_core-2.46.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:975c267cff4f7e7272eacbe50f6cc03ca9a3da4c4fbd66fffd89c94c1e311aa1", size = 2153197, upload-time = "2026-04-20T14:44:27.932Z" }, - { url = "https://files.pythonhosted.org/packages/ba/75/5af02fb35505051eee727c061f2881c555ab4f8ddb2d42da715a42c9731b/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2b8e4f2bbdf71415c544b4b1138b8060db7b6611bc927e8064c769f64bed651c", size = 2181073, upload-time = "2026-04-20T14:43:20.729Z" }, - { url = "https://files.pythonhosted.org/packages/10/92/7e0e1bd9ca3c68305db037560ca2876f89b2647deb2f8b6319005de37505/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e61ea8e9fff9606d09178f577ff8ccdd7206ff73d6552bcec18e1033c4254b85", size = 2315886, upload-time = "2026-04-20T14:44:04.826Z" }, - { url = "https://files.pythonhosted.org/packages/b8/d8/101655f27eaf3e44558ead736b2795d12500598beed4683f279396fa186e/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b504bda01bafc69b6d3c7a0c7f039dcf60f47fab70e06fe23f57b5c75bdc82b8", size = 2360528, upload-time = "2026-04-20T14:40:47.431Z" }, - { url = "https://files.pythonhosted.org/packages/07/0f/1c34a74c8d07136f0d729ffe5e1fdab04fbdaa7684f61a92f92511a84a15/pydantic_core-2.46.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b00b76f7142fc60c762ce579bd29c8fa44aaa56592dd3c54fab3928d0d4ca6ff", size = 2184144, upload-time = "2026-04-20T14:42:57Z" }, + { url = "https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594", size = 2111872, upload-time = "2026-05-06T13:40:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c", size = 1948255, upload-time = "2026-05-06T13:39:12.574Z" }, + { url = "https://files.pythonhosted.org/packages/43/3a/41114a9f7569b84b4d84e7a018c57c56347dac30c0d4a872946ec4e36c46/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826", size = 1972827, upload-time = "2026-05-06T13:38:19.841Z" }, + { url = "https://files.pythonhosted.org/packages/ef/25/1ab42e8048fe551934d9884e8d64daa7e990ad386f310a15981aeb6a5b08/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04", size = 2041051, upload-time = "2026-05-06T13:38:10.447Z" }, + { url = "https://files.pythonhosted.org/packages/94/c2/1a934597ddf08da410385b3b7aae91956a5a76c635effef456074fad7e88/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e", size = 2221314, upload-time = "2026-05-06T13:40:13.089Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/9e8ad178c9c4df27ad3c8f25d1fe2a7ab0d2ba0559fad4aee5d3d1f16771/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3", size = 2285146, upload-time = "2026-05-06T13:38:59.224Z" }, + { url = "https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4", size = 2089685, upload-time = "2026-05-06T13:38:17.762Z" }, + { url = "https://files.pythonhosted.org/packages/6b/a4/b440ad35f05f6a38f89fa0f149accb3f0e02be94ca5e15f3c449a61b4bc9/pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398", size = 2115420, upload-time = "2026-05-06T13:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/99/61/de4f55db8dfd57bfdfa9a12ec90fe1b57c4f41062f7ca86f08586b3e0ac0/pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3", size = 2165122, upload-time = "2026-05-06T13:37:01.167Z" }, + { url = "https://files.pythonhosted.org/packages/f7/52/7c529d7bdb2d1068bd52f51fe32572c8301f9a4febf1948f10639f1436f5/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848", size = 2182573, upload-time = "2026-05-06T13:38:45.04Z" }, + { url = "https://files.pythonhosted.org/packages/37/b3/7c40325848ba78247f2812dcf9c7274e38cd801820ca6dd9fe63bcfb0eb4/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3", size = 2317139, upload-time = "2026-05-06T13:37:15.539Z" }, + { url = "https://files.pythonhosted.org/packages/d9/37/f913f81a657c865b75da6c0dbed79876073c2a43b5bd9edbe8da785e4d49/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109", size = 2360433, upload-time = "2026-05-06T13:37:30.099Z" }, + { url = "https://files.pythonhosted.org/packages/c4/67/6acaa1be2567f9256b056d8477158cac7240813956ce86e49deae8e173b4/pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda", size = 1985513, upload-time = "2026-05-06T13:38:15.669Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33", size = 2071114, upload-time = "2026-05-06T13:40:35.416Z" }, + { url = "https://files.pythonhosted.org/packages/0f/da/7a263a96d965d9d0df5e8de8a475f33495451117035b09acb110288c381f/pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d", size = 2044298, upload-time = "2026-05-06T13:38:29.754Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, + { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, + { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, + { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, + { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, + { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, + { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, + { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, + { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, + { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, + { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, + { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, + { url = "https://files.pythonhosted.org/packages/ee/a4/73995fd4ebbb46ba0ee51e6fa049b8f02c40daebb762208feda8a6b7894d/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:14d4edf427bdcf950a8a02d7cb44a08614388dd6e1bdcbf4f67504fa7887da9c", size = 2111589, upload-time = "2026-05-06T13:37:10.817Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7f/f37d3a5e8bfcc2e403f5c57a730f2d815693fb42119e8ea48b3789335af1/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b", size = 1944552, upload-time = "2026-05-06T13:36:56.717Z" }, + { url = "https://files.pythonhosted.org/packages/15/3c/d7eb777b3ff43e8433a4efb39a17aa8fd98a4ee8561a24a67ef5db07b2d6/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b", size = 1982984, upload-time = "2026-05-06T13:39:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/63/87/70b9f40170a81afd55ca26c9b2acb25c20d64bcfbf888fafecb3ba077d4c/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea", size = 2138417, upload-time = "2026-05-06T13:39:45.476Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, + { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, + { url = "https://files.pythonhosted.org/packages/11/cb/428de0385b6c8d44b716feba566abfacfbd23ee3c4439faa789a1456242f/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0", size = 2112782, upload-time = "2026-05-06T13:37:04.016Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b5/6a17bdadd0fc1f170adfd05a20d37c832f52b117b4d9131da1f41bb097ce/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7", size = 1952146, upload-time = "2026-05-06T13:39:43.092Z" }, + { url = "https://files.pythonhosted.org/packages/2a/dc/03734d80e362cd43ef65428e9de77c730ce7f2f11c60d2b1e1b39f0fbf99/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2", size = 2134492, upload-time = "2026-05-06T13:36:58.124Z" }, + { url = "https://files.pythonhosted.org/packages/de/df/5e5ffc085ed07cc22d298134d3d911c63e91f6a0eb91fe646750a3209910/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9", size = 2156604, upload-time = "2026-05-06T13:37:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/81/44/6e112a4253e56f5705467cbab7ab5e91ee7398ba3d56d358635958893d3e/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf", size = 2183828, upload-time = "2026-05-06T13:37:43.053Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ad/5565071e937d8e752842ac241463944c9eb14c87e2d269f2658a5bd05e98/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30", size = 2310000, upload-time = "2026-05-06T13:37:56.694Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c3/66883a5cec183e7fba4d024b4cbbe61851a63750ef606b0afecc46d1f2bf/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc", size = 2361286, upload-time = "2026-05-06T13:40:05.667Z" }, + { url = "https://files.pythonhosted.org/packages/4b/2d/69abac8f838090bbecd5df894befb2c2619e7996a98ddb949db9f3b93225/pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983", size = 2193071, upload-time = "2026-05-06T13:38:08.682Z" }, ] [[package]] @@ -320,18 +320,18 @@ 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]] name = "urllib3" -version = "2.6.3" +version = "2.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, ]