kalir-python 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. kalir/__init__.py +11 -0
  2. kalir/api/__init__.py +1 -0
  3. kalir/api/assets/__init__.py +1 -0
  4. kalir/api/assets/create_asset.py +193 -0
  5. kalir/api/assets/delete_asset.py +182 -0
  6. kalir/api/assets/get_asset.py +186 -0
  7. kalir/api/assets/list_assets.py +165 -0
  8. kalir/api/assets/update_asset.py +206 -0
  9. kalir/api/events/__init__.py +1 -0
  10. kalir/api/events/get_event.py +194 -0
  11. kalir/api/events/ingest_event.py +215 -0
  12. kalir/api/events/list_events.py +259 -0
  13. kalir/api/exposures/__init__.py +1 -0
  14. kalir/api/exposures/count_exposures.py +165 -0
  15. kalir/api/exposures/get_infostealer_summary.py +181 -0
  16. kalir/api/exposures/list_exposures.py +225 -0
  17. kalir/api/incidents/__init__.py +1 -0
  18. kalir/api/incidents/get_incident.py +194 -0
  19. kalir/api/incidents/list_incidents.py +265 -0
  20. kalir/api/incidents/update_incident_status.py +207 -0
  21. kalir/api/intel/__init__.py +1 -0
  22. kalir/api/intel/get_ransomware_stats.py +165 -0
  23. kalir/api/intel/list_ransomware_victims.py +165 -0
  24. kalir/api/mentions/__init__.py +1 -0
  25. kalir/api/mentions/list_mentions.py +283 -0
  26. kalir/api/overview/__init__.py +1 -0
  27. kalir/api/overview/get_overview.py +184 -0
  28. kalir/api/phishing/__init__.py +1 -0
  29. kalir/api/phishing/list_phishing.py +245 -0
  30. kalir/api/reports/__init__.py +1 -0
  31. kalir/api/reports/create_report.py +193 -0
  32. kalir/api/reports/download_report.py +186 -0
  33. kalir/api/reports/list_reports.py +165 -0
  34. kalir/api/rules/__init__.py +1 -0
  35. kalir/api/rules/create_rule.py +193 -0
  36. kalir/api/rules/delete_rule.py +183 -0
  37. kalir/api/rules/get_rule.py +187 -0
  38. kalir/api/rules/list_rules.py +165 -0
  39. kalir/api/rules/replace_rule.py +207 -0
  40. kalir/api/takedowns/__init__.py +1 -0
  41. kalir/api/takedowns/count_takedowns.py +165 -0
  42. kalir/api/takedowns/create_takedown.py +193 -0
  43. kalir/api/takedowns/delete_takedown.py +183 -0
  44. kalir/api/takedowns/get_takedown.py +187 -0
  45. kalir/api/takedowns/list_takedowns.py +165 -0
  46. kalir/api/takedowns/replace_takedown.py +210 -0
  47. kalir/api/takedowns/update_takedown.py +210 -0
  48. kalir/api/webhooks/__init__.py +1 -0
  49. kalir/api/webhooks/create_webhook.py +222 -0
  50. kalir/api/webhooks/delete_webhook.py +190 -0
  51. kalir/api/webhooks/get_webhook.py +194 -0
  52. kalir/api/webhooks/get_webhook_delivery.py +194 -0
  53. kalir/api/webhooks/list_webhook_deliveries.py +239 -0
  54. kalir/api/webhooks/list_webhook_event_types.py +165 -0
  55. kalir/api/webhooks/list_webhooks.py +172 -0
  56. kalir/api/webhooks/retry_webhook_delivery.py +190 -0
  57. kalir/api/webhooks/rotate_webhook_secret.py +202 -0
  58. kalir/api/webhooks/send_webhook_test.py +202 -0
  59. kalir/api/webhooks/update_webhook.py +229 -0
  60. kalir/client.py +271 -0
  61. kalir/errors.py +14 -0
  62. kalir/models/__init__.py +195 -0
  63. kalir/models/asset.py +162 -0
  64. kalir/models/asset_create.py +122 -0
  65. kalir/models/asset_create_asset_type.py +14 -0
  66. kalir/models/asset_create_metadata.py +64 -0
  67. kalir/models/count_exposures_response_200.py +78 -0
  68. kalir/models/count_takedowns_response_200.py +96 -0
  69. kalir/models/create_report_body.py +96 -0
  70. kalir/models/create_report_body_type.py +10 -0
  71. kalir/models/create_webhook_response_201.py +111 -0
  72. kalir/models/error.py +84 -0
  73. kalir/models/error_error.py +106 -0
  74. kalir/models/error_error_type.py +15 -0
  75. kalir/models/event.py +151 -0
  76. kalir/models/event_asset.py +87 -0
  77. kalir/models/event_ingest.py +146 -0
  78. kalir/models/event_ingest_asset.py +87 -0
  79. kalir/models/event_ingest_evidence.py +64 -0
  80. kalir/models/event_ingest_source.py +87 -0
  81. kalir/models/exposure.py +137 -0
  82. kalir/models/exposure_webhook_event.py +152 -0
  83. kalir/models/exposure_webhook_event_data.py +115 -0
  84. kalir/models/exposure_webhook_event_data_exposure.py +149 -0
  85. kalir/models/exposure_webhook_event_data_infection.py +136 -0
  86. kalir/models/exposure_webhook_event_type.py +8 -0
  87. kalir/models/get_incident_response_200.py +174 -0
  88. kalir/models/get_infostealer_summary_response_200.py +100 -0
  89. kalir/models/get_ransomware_stats_response_200.py +156 -0
  90. kalir/models/get_ransomware_stats_response_200_top_countries_7d_item.py +64 -0
  91. kalir/models/get_ransomware_stats_response_200_top_groups_7d_item.py +64 -0
  92. kalir/models/incident.py +170 -0
  93. kalir/models/incident_severity.py +10 -0
  94. kalir/models/incident_status.py +10 -0
  95. kalir/models/incident_webhook_event.py +152 -0
  96. kalir/models/incident_webhook_event_data.py +115 -0
  97. kalir/models/incident_webhook_event_data_previous.py +88 -0
  98. kalir/models/incident_webhook_event_type.py +9 -0
  99. kalir/models/infostealer_domain_summary.py +122 -0
  100. kalir/models/infostealer_domain_summary_snapshot.py +201 -0
  101. kalir/models/infostealer_domain_summary_snapshot_top_employee_urls_item.py +87 -0
  102. kalir/models/infostealer_domain_summary_snapshot_top_families_item.py +87 -0
  103. kalir/models/list_assets_response_200.py +100 -0
  104. kalir/models/list_events_response_200.py +109 -0
  105. kalir/models/list_exposures_response_200.py +127 -0
  106. kalir/models/list_incidents_bucket.py +10 -0
  107. kalir/models/list_incidents_response_200.py +149 -0
  108. kalir/models/list_incidents_response_200_counts.py +106 -0
  109. kalir/models/list_incidents_status.py +12 -0
  110. kalir/models/list_mentions_response_200.py +122 -0
  111. kalir/models/list_mentions_source.py +8 -0
  112. kalir/models/list_phishing_response_200.py +122 -0
  113. kalir/models/list_phishing_verdict.py +11 -0
  114. kalir/models/list_ransomware_victims_response_200.py +109 -0
  115. kalir/models/list_ransomware_victims_response_200_victims_item.py +64 -0
  116. kalir/models/list_reports_response_200.py +109 -0
  117. kalir/models/list_rules_response_200.py +100 -0
  118. kalir/models/list_takedowns_response_200.py +109 -0
  119. kalir/models/list_webhook_deliveries_response_200.py +122 -0
  120. kalir/models/list_webhook_event_types_response_200.py +100 -0
  121. kalir/models/list_webhook_event_types_response_200_data_item.py +87 -0
  122. kalir/models/list_webhooks_response_200.py +100 -0
  123. kalir/models/mention.py +194 -0
  124. kalir/models/mention_source.py +8 -0
  125. kalir/models/overview.py +231 -0
  126. kalir/models/overview_assets.py +96 -0
  127. kalir/models/overview_exposures.py +105 -0
  128. kalir/models/overview_incidents.py +114 -0
  129. kalir/models/overview_phishing.py +87 -0
  130. kalir/models/overview_risk_level.py +10 -0
  131. kalir/models/overview_takedowns.py +87 -0
  132. kalir/models/pagination.py +105 -0
  133. kalir/models/phishing_domain.py +186 -0
  134. kalir/models/phishing_domain_verdict.py +11 -0
  135. kalir/models/report.py +182 -0
  136. kalir/models/report_parameters.py +181 -0
  137. kalir/models/report_parameters_date_range.py +11 -0
  138. kalir/models/report_parameters_language.py +8 -0
  139. kalir/models/report_parameters_sections_item.py +15 -0
  140. kalir/models/report_status.py +10 -0
  141. kalir/models/rotate_webhook_secret_response_200.py +87 -0
  142. kalir/models/rule.py +174 -0
  143. kalir/models/rule_input.py +134 -0
  144. kalir/models/rule_input_actions_item.py +64 -0
  145. kalir/models/takedown.py +163 -0
  146. kalir/models/takedown_create.py +113 -0
  147. kalir/models/takedown_update.py +96 -0
  148. kalir/models/update_incident_status_body.py +90 -0
  149. kalir/models/update_incident_status_body_status.py +10 -0
  150. kalir/models/webhook_delivery.py +274 -0
  151. kalir/models/webhook_delivery_payload.py +64 -0
  152. kalir/models/webhook_delivery_status.py +9 -0
  153. kalir/models/webhook_endpoint.py +216 -0
  154. kalir/models/webhook_endpoint_input.py +124 -0
  155. kalir/models/webhook_endpoint_input_event_types_item.py +11 -0
  156. kalir/models/webhook_incident.py +232 -0
  157. kalir/models/webhook_incident_severity.py +10 -0
  158. kalir/py.typed +1 -0
  159. kalir/types.py +53 -0
  160. kalir/webhooks.py +63 -0
  161. kalir_python-0.1.0.dist-info/METADATA +76 -0
  162. kalir_python-0.1.0.dist-info/RECORD +163 -0
  163. kalir_python-0.1.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,232 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ from ..types import UNSET, Unset
10
+
11
+ from ..models.webhook_incident_severity import WebhookIncidentSeverity
12
+ from ..types import UNSET, Unset
13
+ from typing import cast
14
+ from uuid import UUID
15
+ import datetime
16
+
17
+
18
+
19
+
20
+
21
+
22
+ T = TypeVar("T", bound="WebhookIncident")
23
+
24
+
25
+
26
+ @_attrs_define
27
+ class WebhookIncident:
28
+ """
29
+ Attributes:
30
+ id (UUID | Unset):
31
+ title (str | Unset):
32
+ severity (WebhookIncidentSeverity | Unset):
33
+ status (str | Unset):
34
+ signal_family (str | Unset):
35
+ asset (str | Unset):
36
+ risk_score (int | Unset):
37
+ event_count (int | Unset):
38
+ first_event_at (datetime.datetime | Unset):
39
+ last_event_at (datetime.datetime | Unset):
40
+ created_at (datetime.datetime | Unset):
41
+ url (str | Unset): Deep link to the incident in Kalir.
42
+ """
43
+
44
+ id: UUID | Unset = UNSET
45
+ title: str | Unset = UNSET
46
+ severity: WebhookIncidentSeverity | Unset = UNSET
47
+ status: str | Unset = UNSET
48
+ signal_family: str | Unset = UNSET
49
+ asset: str | Unset = UNSET
50
+ risk_score: int | Unset = UNSET
51
+ event_count: int | Unset = UNSET
52
+ first_event_at: datetime.datetime | Unset = UNSET
53
+ last_event_at: datetime.datetime | Unset = UNSET
54
+ created_at: datetime.datetime | Unset = UNSET
55
+ url: str | Unset = UNSET
56
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
57
+
58
+
59
+
60
+
61
+
62
+ def to_dict(self) -> dict[str, Any]:
63
+ id: str | Unset = UNSET
64
+ if not isinstance(self.id, Unset):
65
+ id = str(self.id)
66
+
67
+ title = self.title
68
+
69
+ severity: str | Unset = UNSET
70
+ if not isinstance(self.severity, Unset):
71
+ severity = self.severity.value
72
+
73
+
74
+ status = self.status
75
+
76
+ signal_family = self.signal_family
77
+
78
+ asset = self.asset
79
+
80
+ risk_score = self.risk_score
81
+
82
+ event_count = self.event_count
83
+
84
+ first_event_at: str | Unset = UNSET
85
+ if not isinstance(self.first_event_at, Unset):
86
+ first_event_at = self.first_event_at.isoformat()
87
+
88
+ last_event_at: str | Unset = UNSET
89
+ if not isinstance(self.last_event_at, Unset):
90
+ last_event_at = self.last_event_at.isoformat()
91
+
92
+ created_at: str | Unset = UNSET
93
+ if not isinstance(self.created_at, Unset):
94
+ created_at = self.created_at.isoformat()
95
+
96
+ url = self.url
97
+
98
+
99
+ field_dict: dict[str, Any] = {}
100
+ field_dict.update(self.additional_properties)
101
+ field_dict.update({
102
+ })
103
+ if id is not UNSET:
104
+ field_dict["id"] = id
105
+ if title is not UNSET:
106
+ field_dict["title"] = title
107
+ if severity is not UNSET:
108
+ field_dict["severity"] = severity
109
+ if status is not UNSET:
110
+ field_dict["status"] = status
111
+ if signal_family is not UNSET:
112
+ field_dict["signal_family"] = signal_family
113
+ if asset is not UNSET:
114
+ field_dict["asset"] = asset
115
+ if risk_score is not UNSET:
116
+ field_dict["risk_score"] = risk_score
117
+ if event_count is not UNSET:
118
+ field_dict["event_count"] = event_count
119
+ if first_event_at is not UNSET:
120
+ field_dict["first_event_at"] = first_event_at
121
+ if last_event_at is not UNSET:
122
+ field_dict["last_event_at"] = last_event_at
123
+ if created_at is not UNSET:
124
+ field_dict["created_at"] = created_at
125
+ if url is not UNSET:
126
+ field_dict["url"] = url
127
+
128
+ return field_dict
129
+
130
+
131
+
132
+ @classmethod
133
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
134
+ d = dict(src_dict)
135
+ _id = d.pop("id", UNSET)
136
+ id: UUID | Unset
137
+ if isinstance(_id, Unset):
138
+ id = UNSET
139
+ else:
140
+ id = UUID(_id)
141
+
142
+
143
+
144
+
145
+ title = d.pop("title", UNSET)
146
+
147
+ _severity = d.pop("severity", UNSET)
148
+ severity: WebhookIncidentSeverity | Unset
149
+ if isinstance(_severity, Unset):
150
+ severity = UNSET
151
+ else:
152
+ severity = WebhookIncidentSeverity(_severity)
153
+
154
+
155
+
156
+
157
+ status = d.pop("status", UNSET)
158
+
159
+ signal_family = d.pop("signal_family", UNSET)
160
+
161
+ asset = d.pop("asset", UNSET)
162
+
163
+ risk_score = d.pop("risk_score", UNSET)
164
+
165
+ event_count = d.pop("event_count", UNSET)
166
+
167
+ _first_event_at = d.pop("first_event_at", UNSET)
168
+ first_event_at: datetime.datetime | Unset
169
+ if isinstance(_first_event_at, Unset):
170
+ first_event_at = UNSET
171
+ else:
172
+ first_event_at = datetime.datetime.fromisoformat(_first_event_at)
173
+
174
+
175
+
176
+
177
+ _last_event_at = d.pop("last_event_at", UNSET)
178
+ last_event_at: datetime.datetime | Unset
179
+ if isinstance(_last_event_at, Unset):
180
+ last_event_at = UNSET
181
+ else:
182
+ last_event_at = datetime.datetime.fromisoformat(_last_event_at)
183
+
184
+
185
+
186
+
187
+ _created_at = d.pop("created_at", UNSET)
188
+ created_at: datetime.datetime | Unset
189
+ if isinstance(_created_at, Unset):
190
+ created_at = UNSET
191
+ else:
192
+ created_at = datetime.datetime.fromisoformat(_created_at)
193
+
194
+
195
+
196
+
197
+ url = d.pop("url", UNSET)
198
+
199
+ webhook_incident = cls(
200
+ id=id,
201
+ title=title,
202
+ severity=severity,
203
+ status=status,
204
+ signal_family=signal_family,
205
+ asset=asset,
206
+ risk_score=risk_score,
207
+ event_count=event_count,
208
+ first_event_at=first_event_at,
209
+ last_event_at=last_event_at,
210
+ created_at=created_at,
211
+ url=url,
212
+ )
213
+
214
+
215
+ webhook_incident.additional_properties = d
216
+ return webhook_incident
217
+
218
+ @property
219
+ def additional_keys(self) -> list[str]:
220
+ return list(self.additional_properties.keys())
221
+
222
+ def __getitem__(self, key: str) -> Any:
223
+ return self.additional_properties[key]
224
+
225
+ def __setitem__(self, key: str, value: Any) -> None:
226
+ self.additional_properties[key] = value
227
+
228
+ def __delitem__(self, key: str) -> None:
229
+ del self.additional_properties[key]
230
+
231
+ def __contains__(self, key: str) -> bool:
232
+ return key in self.additional_properties
@@ -0,0 +1,10 @@
1
+ from enum import StrEnum
2
+
3
+ class WebhookIncidentSeverity(StrEnum):
4
+ CRITICAL = "critical"
5
+ HIGH = "high"
6
+ LOW = "low"
7
+ MEDIUM = "medium"
8
+
9
+ def __str__(self) -> str:
10
+ return str(self.value)
kalir/py.typed ADDED
@@ -0,0 +1 @@
1
+ # Marker file for PEP 561
kalir/types.py ADDED
@@ -0,0 +1,53 @@
1
+ """ Contains some shared types for properties """
2
+
3
+ from collections.abc import Mapping, MutableMapping
4
+ from http import HTTPStatus
5
+ from typing import BinaryIO, Generic, TypeVar, Literal, IO
6
+
7
+ from attrs import define
8
+
9
+
10
+ class Unset:
11
+ def __bool__(self) -> Literal[False]:
12
+ return False
13
+
14
+
15
+ UNSET: Unset = Unset()
16
+
17
+ # The types that `httpx.Client(files=)` can accept, copied from that library.
18
+ FileContent = IO[bytes] | bytes | str
19
+ FileTypes = (
20
+ # (filename, file (or bytes), content_type)
21
+ tuple[str | None, FileContent, str | None]
22
+ # (filename, file (or bytes), content_type, headers)
23
+ | tuple[str | None, FileContent, str | None, Mapping[str, str]]
24
+ )
25
+ RequestFiles = list[tuple[str, FileTypes]]
26
+
27
+ @define
28
+ class File:
29
+ """ Contains information for file uploads """
30
+
31
+ payload: BinaryIO
32
+ file_name: str | None = None
33
+ mime_type: str | None = None
34
+
35
+ def to_tuple(self) -> FileTypes:
36
+ """ Return a tuple representation that httpx will accept for multipart/form-data """
37
+ return self.file_name, self.payload, self.mime_type
38
+
39
+
40
+ T = TypeVar("T")
41
+
42
+
43
+ @define
44
+ class Response(Generic[T]):
45
+ """ A response from an endpoint """
46
+
47
+ status_code: HTTPStatus
48
+ content: bytes
49
+ headers: MutableMapping[str, str]
50
+ parsed: T | None
51
+
52
+
53
+ __all__ = ["UNSET", "File", "FileTypes", "RequestFiles", "Response", "Unset"]
kalir/webhooks.py ADDED
@@ -0,0 +1,63 @@
1
+ """Verify and parse Kalir webhook deliveries.
2
+
3
+ Hand-written (not generated); ``regenerate.sh`` copies it into the package.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ import hashlib
9
+ import hmac
10
+ import json
11
+ import time
12
+ from typing import Any, Union
13
+
14
+
15
+ class WebhookSignatureError(Exception):
16
+ """Raised when a delivery's signature is missing, invalid or too old."""
17
+
18
+
19
+ def construct_event(
20
+ raw_body: Union[bytes, str],
21
+ signature_header: Union[str, None],
22
+ secret: str,
23
+ tolerance_seconds: int = 300,
24
+ ) -> dict[str, Any]:
25
+ """Verify an ``X-Kalir-Signature`` header and return the parsed event.
26
+
27
+ The header is ``t=<unix>,v1=<hex>`` where
28
+ ``v1 = HMAC-SHA256(secret, "<t>." + raw_body)``. Deliveries older than
29
+ ``tolerance_seconds`` are rejected to stop replays.
30
+
31
+ Pass the **raw** request body exactly as received, not re-serialized JSON.
32
+
33
+ Example (Flask)::
34
+
35
+ from kalir.webhooks import construct_event, WebhookSignatureError
36
+
37
+ @app.post("/kalir-webhooks")
38
+ def kalir_webhooks():
39
+ try:
40
+ event = construct_event(request.get_data(), request.headers.get("X-Kalir-Signature"), SECRET)
41
+ except WebhookSignatureError:
42
+ return "", 400
43
+ if event["type"] == "incident.created":
44
+ ...
45
+ return "", 200
46
+ """
47
+ if not signature_header:
48
+ raise WebhookSignatureError("missing X-Kalir-Signature header")
49
+ try:
50
+ parts = dict(p.strip().split("=", 1) for p in signature_header.split(","))
51
+ timestamp = int(parts["t"])
52
+ received = parts["v1"]
53
+ except (KeyError, ValueError) as exc:
54
+ raise WebhookSignatureError("malformed X-Kalir-Signature header") from exc
55
+
56
+ if abs(time.time() - timestamp) > tolerance_seconds:
57
+ raise WebhookSignatureError("signature timestamp outside tolerance (possible replay)")
58
+
59
+ body = raw_body.encode() if isinstance(raw_body, str) else raw_body
60
+ expected = hmac.new(secret.encode(), f"{timestamp}.".encode() + body, hashlib.sha256).hexdigest()
61
+ if not hmac.compare_digest(expected, received):
62
+ raise WebhookSignatureError("signature mismatch")
63
+ return json.loads(body)
@@ -0,0 +1,76 @@
1
+ Metadata-Version: 2.4
2
+ Name: kalir-python
3
+ Version: 0.1.0
4
+ Summary: Official Python SDK for the Kalir Public API — digital risk intelligence and signed webhooks.
5
+ License-Expression: MIT
6
+ Requires-Dist: httpx>=0.23.1,<0.29.0
7
+ Requires-Dist: attrs>=22.2.0
8
+ Requires-Python: >=3.11
9
+ Description-Content-Type: text/markdown
10
+
11
+ # kalir-python
12
+
13
+ Official Python SDK for the [Kalir](https://kalir.io) Public API: your organization's digital-risk intelligence (incidents, credential and infostealer exposure, phishing impersonation, dark-web and Telegram mentions) plus signed webhooks. Typed with `attrs`, built on `httpx`, sync and async.
14
+
15
+ ```bash
16
+ pip install kalir-python
17
+ ```
18
+
19
+ ## Quickstart
20
+
21
+ Create an API key at **app.kalir.io → Developers → API Keys**.
22
+
23
+ ```python
24
+ from kalir import AuthenticatedClient
25
+ from kalir.api.overview import get_overview
26
+ from kalir.api.phishing import list_phishing
27
+ from kalir.api.incidents import list_incidents
28
+ from kalir.models import ListIncidentsBucket, ListPhishingVerdict
29
+
30
+ client = AuthenticatedClient(base_url="https://api.kalir.io", token="klr_…")
31
+
32
+ with client as c:
33
+ overview = get_overview.sync(client=c)
34
+ print(overview.risk_score, overview.incidents.open_critical)
35
+
36
+ phishing = list_phishing.sync(client=c, verdict=ListPhishingVerdict.CONFIRMED)
37
+ for d in phishing.data:
38
+ print(d.domain, "impersonates", d.impersonates)
39
+
40
+ incidents = list_incidents.sync(client=c, bucket=ListIncidentsBucket.OPEN, limit=20)
41
+ ```
42
+
43
+ Every endpoint has four functions: `sync`, `sync_detailed` (status + headers), `asyncio` and `asyncio_detailed`.
44
+
45
+ ```python
46
+ async with AuthenticatedClient(base_url="https://api.kalir.io", token="klr_…") as c:
47
+ overview = await get_overview.asyncio(client=c)
48
+ ```
49
+
50
+ ## Errors
51
+
52
+ Error responses share one envelope: `{"error": {"type", "message", "status", "retry_after"}}`. Use the `*_detailed` functions to inspect `status_code`, or pass `raise_on_unexpected_status=True` to the client.
53
+
54
+ ## Webhooks
55
+
56
+ ```python
57
+ from kalir.webhooks import construct_event, WebhookSignatureError
58
+
59
+ @app.post("/kalir-webhooks") # Flask
60
+ def kalir_webhooks():
61
+ try:
62
+ event = construct_event(
63
+ request.get_data(), # raw body
64
+ request.headers.get("X-Kalir-Signature"),
65
+ KALIR_WEBHOOK_SECRET, # whsec_…
66
+ )
67
+ except WebhookSignatureError:
68
+ return "", 400
69
+ if event["type"] == "incident.created":
70
+ ...
71
+ return "", 200
72
+ ```
73
+
74
+ Respond `2xx` within 15 seconds. Failed deliveries are retried with exponential backoff for ~20 hours; deduplicate on the `X-Kalir-Event-Id` header.
75
+
76
+ Full reference: <https://app.kalir.io/developers/docs>
@@ -0,0 +1,163 @@
1
+ kalir/__init__.py,sha256=H4kfOIsp1W1wsL4Vd8KHAl9qXmOkcLSW9oxrIB1H7_Q,274
2
+ kalir/api/__init__.py,sha256=87ApBzKyGb5zsgTMOkQXDqsLZCmaSFoJMwbGzCDQZMw,47
3
+ kalir/api/assets/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
4
+ kalir/api/assets/create_asset.py,sha256=64kcETxi6NkcjVHlo3lJ3FOe37qO4a7QiAPyiOUe9gY,4030
5
+ kalir/api/assets/delete_asset.py,sha256=vnLFWv3HekfqVhrzNk4IO0wpVEYwLM5MYLB6tJC2iNI,3690
6
+ kalir/api/assets/get_asset.py,sha256=dC6ZKAsLn80yZlizcmy_Tt1n94132sTKBZeiMfuN3BU,3749
7
+ kalir/api/assets/list_assets.py,sha256=4Cnp66bBy4k1wsHFh7S-7AS0Lzr9fqQlzVRQaYk2Oi4,3710
8
+ kalir/api/assets/update_asset.py,sha256=x_B1w7JDuK_GVCEJgPcaRjX8zsQozJq-Eo0I64UaOwI,4235
9
+ kalir/api/events/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
10
+ kalir/api/events/get_event.py,sha256=_QLKTRHfXEob9L_GTQg61CS8F0vIb_fYTu2cc2m40pM,3928
11
+ kalir/api/events/ingest_event.py,sha256=zw9cWeaIrS-bQlYmeeqKhuR3HQD3gw5nByvevFMdUgw,4686
12
+ kalir/api/events/list_events.py,sha256=CLiqFMlyW9bSun_upmc3J_9ODn94bFH-TkZWZ4uTNDk,6225
13
+ kalir/api/exposures/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
14
+ kalir/api/exposures/count_exposures.py,sha256=GjTZro7xkmU_bS3x8am4pxXAwCXbGCwmxLCMd9qDMcg,3855
15
+ kalir/api/exposures/get_infostealer_summary.py,sha256=Fe-UcVi52CXmNZL10cYVXtI0PwzL1VY6PUFfRIgJEg0,4817
16
+ kalir/api/exposures/list_exposures.py,sha256=ldpeCI0BFQMSEk2PL6hIa6k-5WXh7ADDOauAAOQfiQE,5166
17
+ kalir/api/incidents/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
18
+ kalir/api/incidents/get_incident.py,sha256=5Eb2n3v0SOL0uU_5x-jbc7BYpuo0rLFjQOXD9k2LYAg,4167
19
+ kalir/api/incidents/list_incidents.py,sha256=y_TjTLCISC_ukD9vLKMyOjmKhjjrQDziLraXkPzbQLE,6779
20
+ kalir/api/incidents/update_incident_status.py,sha256=5efksDsIN0dF7HzwLDOfN4Vqcs60vlwkTSErGSefVzs,4483
21
+ kalir/api/intel/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
22
+ kalir/api/intel/get_ransomware_stats.py,sha256=v2bUHwI6WogYfV7mHD9zSeHzzntUNt7gyHoOX-fA2KU,3899
23
+ kalir/api/intel/list_ransomware_victims.py,sha256=fTs30ChxCWvwrVNqW6w80WhKsdK3KUNwU4TLdPNT-_A,3916
24
+ kalir/api/mentions/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
25
+ kalir/api/mentions/list_mentions.py,sha256=a3jxtnuLwNQ7ZepRVUCwWfZJyM-CCVki2H9hsCJaYmA,7707
26
+ kalir/api/overview/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
27
+ kalir/api/overview/get_overview.py,sha256=h3becj_UpxVznN6B_Ynmd-1b7kE1CA97VrFQkTib6UQ,4340
28
+ kalir/api/phishing/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
29
+ kalir/api/phishing/list_phishing.py,sha256=JoqhF_x53RCfG3Ho711TmQmkXEWwoOdQcO7ReOF_ytc,6111
30
+ kalir/api/reports/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
31
+ kalir/api/reports/create_report.py,sha256=9IuEC76YKOY6OvARmIIxrvhtnST_lSvlT44egolIeEY,4108
32
+ kalir/api/reports/download_report.py,sha256=7el9b5s-cWfWXYU2pmIVMwGL6yMQYbG7i9HlJd5nnVk,3732
33
+ kalir/api/reports/list_reports.py,sha256=kbunY8aNNiNyAS6Jk_dSRIMTvWzIGIr57WkwFKR-7OQ,3728
34
+ kalir/api/rules/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
35
+ kalir/api/rules/create_rule.py,sha256=iSoHn7h_LqC98KK-H2hFyjnC97KywkHu702pmSnGSvU,3986
36
+ kalir/api/rules/delete_rule.py,sha256=6UAR7pzO_kI0uCvyfn01_Mvdve7V7c9WQlO8M_AHS_Q,3712
37
+ kalir/api/rules/get_rule.py,sha256=8KiuZKv5Rw_VQT8eHG9O0_5lIdspHq0x8M0_8RE4sjY,3758
38
+ kalir/api/rules/list_rules.py,sha256=y6ODTh0VMZR1j7ye0yIO6m8QgGKjOB8O6P1JOpcZVLo,3692
39
+ kalir/api/rules/replace_rule.py,sha256=wYvIO9Rc2GnIM7BP1cZQYV1BTOS9-d8H1FEsJH3dPfg,4226
40
+ kalir/api/takedowns/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
41
+ kalir/api/takedowns/count_takedowns.py,sha256=W616mLbcI8CwFWu1NVYoclYHTKjAL9timqOpYlcWUhI,3788
42
+ kalir/api/takedowns/create_takedown.py,sha256=yQIlaW1ySgz4bGqN_vH6o1_jUibuc68mq0B-4ojAUbY,4145
43
+ kalir/api/takedowns/delete_takedown.py,sha256=CxbzZtXMTIZpboYbKWW2VO-ZC1Y-0J23qPCfQySOAO8,3732
44
+ kalir/api/takedowns/get_takedown.py,sha256=lVorzKpM1at5sbwXd0keCcOxeVHxCWjA94N1syjInI4,3830
45
+ kalir/api/takedowns/list_takedowns.py,sha256=nCy7E-XpwuPETeb2hYCdRN9UgbEZ8tMn91C62QrjA_I,3796
46
+ kalir/api/takedowns/replace_takedown.py,sha256=Gfeyzcobr_IyP-XpeXr4pxMtpYA4dGNC7cszVHH96f4,4608
47
+ kalir/api/takedowns/update_takedown.py,sha256=gLwPHY4txRCX-ScRQ0tnInT1fO_HNJ2Eaqyo-qI6ozs,4542
48
+ kalir/api/webhooks/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
49
+ kalir/api/webhooks/create_webhook.py,sha256=Bh-MzCd8joA77KrVf8Qa1DRcl1btRRvoBoioutmA7Fs,5166
50
+ kalir/api/webhooks/delete_webhook.py,sha256=Zj1POhzP2VOoV2C8seqpQk03I0jn5Y2AYO0TdZezpFs,3887
51
+ kalir/api/webhooks/get_webhook.py,sha256=uhcduHbZPMoEmoG9egb6QDruUGJRzxITZCu9DfLG36w,4077
52
+ kalir/api/webhooks/get_webhook_delivery.py,sha256=BFdIfmCXDPv7lm-SLJdC5qV51WLlgDHbHMXyNGPizLM,4115
53
+ kalir/api/webhooks/list_webhook_deliveries.py,sha256=_wS5PqJf5FxfDdZ-dXaGCQw8bXSsxAMPbvcv-TY6Jy4,5682
54
+ kalir/api/webhooks/list_webhook_event_types.py,sha256=sDvXWco-9CgU-ErbVfrseHEjbf73fOzf1UsL_NshOGk,3941
55
+ kalir/api/webhooks/list_webhooks.py,sha256=HN0AHdYy1bW7Bk9BYnRkpRIFr7YOB0FWLqFL8wKb9HU,3906
56
+ kalir/api/webhooks/retry_webhook_delivery.py,sha256=DNf3GRffTtXh1bQonQnB1Ofuewl_ACdoUs6XIi-5AFg,3853
57
+ kalir/api/webhooks/rotate_webhook_secret.py,sha256=AHhlpKz2luoGAuwo7DluMFsgsN6jGHBanKF4FR8-iyk,4634
58
+ kalir/api/webhooks/send_webhook_test.py,sha256=hdzniXS6dhqOtKVr-crTEdcVJLUE7ci5RlBG-RtHPho,4423
59
+ kalir/api/webhooks/update_webhook.py,sha256=iM5flDNy94fIiJneZC2PlYrm94WydWu_kTwWpGpGb3M,5181
60
+ kalir/client.py,sha256=DHrMMBAjNo246WrkD6e8CTsC-xgljCIMj9VtSR2azYU,12309
61
+ kalir/errors.py,sha256=trp-p5qn1_JLRxGZhdHtICaNPaCrcDCe4TgIihBravk,546
62
+ kalir/models/__init__.py,sha256=DT8C2Z0PJApSz-jrK8qMqYAXV7kk-9SWK7pwM0nUzHo,8453
63
+ kalir/models/asset.py,sha256=PzV3z1gcgRfCX1P_hR6-G4sLkM_38yUKnP1lH0QkbJo,4281
64
+ kalir/models/asset_create.py,sha256=Dg77hZ49OOVzGl5lDdusZPuFi7NMmvSM8L6wVt-McJ4,3133
65
+ kalir/models/asset_create_asset_type.py,sha256=qusQooLTvrO7Nj1EHA3PLuJrpw--4YcpP383Lq6J1vs,301
66
+ kalir/models/asset_create_metadata.py,sha256=sXYSAeUNDibWcddABDz5SPDGDZAfNxMM4rOC01daWos,1382
67
+ kalir/models/count_exposures_response_200.py,sha256=609vdrI_ChUcs9n64yPhwtNx8eVI9pPfEggWOfrgZH8,1739
68
+ kalir/models/count_takedowns_response_200.py,sha256=gslKa4ren0nJH56UcrlbokXjIPjn1tbAXrxZ1bdQ_Gs,2237
69
+ kalir/models/create_report_body.py,sha256=am-ZdZvZ03G_gNXL3VTr-ZGjeAMUfcBjdzTHOXl5d54,2243
70
+ kalir/models/create_report_body_type.py,sha256=HJKAzbr6va97atWwneS1tlmdnuYvy7h2kQKzsqV8zmc,287
71
+ kalir/models/create_webhook_response_201.py,sha256=moC_1l0JcOHbxVi2-Bvg_EYtg9yLYWSdNyNmesBBZNI,2860
72
+ kalir/models/error.py,sha256=ibyKuZbutHQMDO_AjQHpPzDg-uzCVzEkOvaHz-lUyBQ,1796
73
+ kalir/models/error_error.py,sha256=9POZiGtmTioFZbTepztv7KRJd6I-DRer_AeB1GF9NGc,2398
74
+ kalir/models/error_error_type.py,sha256=JyUy0JMJT37mx4RdRvwpFtmVeK6lkSQeNapNe6fUcX0,511
75
+ kalir/models/event.py,sha256=BYAVhNax3SdmdpuxeaVWFsjNcpCuLJgAN8xKpFkr_oA,3918
76
+ kalir/models/event_asset.py,sha256=CG2JA6NH0jmTHSO92uEpNmn50iwaKI60Pn46ttWIXAI,1938
77
+ kalir/models/event_ingest.py,sha256=MUT2XCTspK-iGYxKVuekKk_dg15maJIXikFtOiaGqbU,4073
78
+ kalir/models/event_ingest_asset.py,sha256=Z7W_qW8oqWxOMx3m_KrmWvBeFidN6aAovotBQ0DuFaY,2012
79
+ kalir/models/event_ingest_evidence.py,sha256=mITHRe3zJmiYuQ-VkQ1jhmRRQoZhB9pvucHui1fwmhE,1382
80
+ kalir/models/event_ingest_source.py,sha256=pocyiuedkvNF8CRMgm4tmXRL0QT51RPHq__WJ_D8f_A,1899
81
+ kalir/models/exposure.py,sha256=fd8Du_CGZmWa0rydX3Gk1ioRFsIJcZiLjjGiUh4O1K4,3431
82
+ kalir/models/exposure_webhook_event.py,sha256=qBRgRKuBh3WA9VPWvn5wDrYykd7LSWovVxa8nY7WzlE,4095
83
+ kalir/models/exposure_webhook_event_data.py,sha256=Hbaw5qLH9XCIQgNvBXk2dxSizsWjCaSsB5Chr5YZ5SQ,3563
84
+ kalir/models/exposure_webhook_event_data_exposure.py,sha256=6WhYwyxIT-iWTUkCy9dCz7FkrtfoI-J5LV86-vVIR5w,3900
85
+ kalir/models/exposure_webhook_event_data_infection.py,sha256=g2UsnEyFzRYNqUG3Gjg7SLzGqUUe6CAeJ-t1efkyqoU,4055
86
+ kalir/models/exposure_webhook_event_type.py,sha256=vvzqVpNbQp3LI9zA7S2Y5vpDWUnHuHbugy23B-p5loM,223
87
+ kalir/models/get_incident_response_200.py,sha256=2HnP4b-imUlCccHfAY_jmtkrWJkkCQT2G6f9LsOCFe0,5141
88
+ kalir/models/get_infostealer_summary_response_200.py,sha256=wf5njESqXRempTLodDigo6HMxSrBp-OBPRWmDWcObZs,2722
89
+ kalir/models/get_ransomware_stats_response_200.py,sha256=SwsphYgvBln05rWfzKn_v074YqMegZ_Bvwu4Pzgo-zE,5444
90
+ kalir/models/get_ransomware_stats_response_200_top_countries_7d_item.py,sha256=R3dhJLAnMBVhVsB34iSzAGG8901BuaFdxdoApgk87As,1540
91
+ kalir/models/get_ransomware_stats_response_200_top_groups_7d_item.py,sha256=UTO97meJLerIxlLCZyPvKNpe2wJ4EeF8c9QPmH49cto,1525
92
+ kalir/models/incident.py,sha256=P46A5wMpGNO6pbBSKA2dAsJdazWfuMP42px9cyE_a0k,4417
93
+ kalir/models/incident_severity.py,sha256=TD2hz9vG59AtYC0Uv9syuSY80FUEPOufOWNJEYFXwAc,203
94
+ kalir/models/incident_status.py,sha256=j5MCAuJb7pPkDvsg4LsQ1kPQNK-MqjzNveCoE2Z14wU,221
95
+ kalir/models/incident_webhook_event.py,sha256=i3z9r3kgtAFQ2KExJtK3zPBZ6yjI5SPLiHj9qJaEWfA,4095
96
+ kalir/models/incident_webhook_event_data.py,sha256=MKeU4s33q-uq-QFyA1AwxfcpvGZuFIRQifp0pGRLCDc,3352
97
+ kalir/models/incident_webhook_event_data_previous.py,sha256=UTI7tGLu-S909micTdKdYfbBznNpcZALcSW7RXzDGoI,2074
98
+ kalir/models/incident_webhook_event_type.py,sha256=Jc9M25Zj66y5-9hSqYcVq8y-thLIKUI_psPURuOTiSs,257
99
+ kalir/models/infostealer_domain_summary.py,sha256=SLtq6ohc0PXJyTp0Np1CKqujJW_HHvTtbH1dx9wTyPU,3437
100
+ kalir/models/infostealer_domain_summary_snapshot.py,sha256=pJq41gHxaQru-axYLvP43b064lJ8Nz0uQZ2eIGX1e98,7395
101
+ kalir/models/infostealer_domain_summary_snapshot_top_employee_urls_item.py,sha256=HPUsqsurr2GSw8qzOwcyVmN2IYkm4Ro_PKe1sF-vWM0,2141
102
+ kalir/models/infostealer_domain_summary_snapshot_top_families_item.py,sha256=7GXSM_o2FJp3vHCRTOEnxdm0PXsM6lzlWa-vsXCKjc4,2096
103
+ kalir/models/list_assets_response_200.py,sha256=tNgsqdb_87YEtX3ANsDvMNguGwBJu_mTMGVR8Par8LA,2441
104
+ kalir/models/list_events_response_200.py,sha256=lzPxyjqa7QK_YEXnRgznLb8jD_o-mcrtwm9Yf27BKS8,2668
105
+ kalir/models/list_exposures_response_200.py,sha256=VJb-CXq0H-0mH0CXtHiHYEgxe0j-dWgmx_yI5OGJpXY,3259
106
+ kalir/models/list_incidents_bucket.py,sha256=l_aPADcDCXTZiEqm26r_6zCttjb9lls76TXOLL8-cgU,238
107
+ kalir/models/list_incidents_response_200.py,sha256=DCh-OAdMJR_TmuiA660dNF_dc5I9VGFZ87XBOTkjhfo,4219
108
+ kalir/models/list_incidents_response_200_counts.py,sha256=Eba5oKO78m35afZQZPcZqg_A80zmO9bfHAGEYlBG76M,2682
109
+ kalir/models/list_incidents_status.py,sha256=zs-PgUbAEQ_x3CK40tphWl_Qd7oYxnozEsWDPcenaRI,290
110
+ kalir/models/list_mentions_response_200.py,sha256=PneujQkQPobf95luCy-xo2IDU1r8ofp2FlIjvQOSuNA,3199
111
+ kalir/models/list_mentions_source.py,sha256=C7RK3r-HAw-9dyx9hdpIi6FSXmd6n1Q3I_1a6JtZCls,173
112
+ kalir/models/list_phishing_response_200.py,sha256=nXRdhM-h75obBxKnmSqkM2QqBGSBGNEFCtQdwfCi5_4,3272
113
+ kalir/models/list_phishing_verdict.py,sha256=CP5yMOY1MAydu_6YNJrYIDvb-D3_e3QiZlZ9iuSul5Y,266
114
+ kalir/models/list_ransomware_victims_response_200.py,sha256=YwgJzEBqwN4dgu4dNLVp92Jegqx_FM-iJ5FhMsVFijg,3151
115
+ kalir/models/list_ransomware_victims_response_200_victims_item.py,sha256=w1M6T4cWpbcqjTcXj_j7fqsNvgpANxHeIto2wTZW4XQ,1514
116
+ kalir/models/list_reports_response_200.py,sha256=RJ9yRKax0LGkZ6DuSFkSF2Y1AVqQn7bFGqeGRU_wPdE,2710
117
+ kalir/models/list_rules_response_200.py,sha256=RpAWLf2vPZTC7X55gZ3PRlxzPB1mDO-WPHSDn_nZibk,2399
118
+ kalir/models/list_takedowns_response_200.py,sha256=Tb2NgrNUm8JUiBQ9b8oDiLJLi2__Czy5D2LJICqg8eI,2794
119
+ kalir/models/list_webhook_deliveries_response_200.py,sha256=21QrRINwPQlwSmqNe80irl-eeo1_DzlDneK1gsT-ziQ,3330
120
+ kalir/models/list_webhook_event_types_response_200.py,sha256=dA1GhL4cT-RKbcPJWdTFnlDdGJrADCf7eMwWgqaDC1k,2819
121
+ kalir/models/list_webhook_event_types_response_200_data_item.py,sha256=-g2kxxIuFZVPE_L4Z7qBP8W8Ob_q0_tDItNuF4IteLk,2117
122
+ kalir/models/list_webhooks_response_200.py,sha256=_EJ0L4Ev_D-ukPCNeqGdKlzwQy_2jtcUNWILK6r9cjk,2500
123
+ kalir/models/mention.py,sha256=YaRpQpXqw8B06MEaz1RU8algKuUvA-ignEVe_5qOIjg,5020
124
+ kalir/models/mention_source.py,sha256=7_QWZClqdA9RvJt5QexztURtj1g3K-a-Bb1ICDgrc6k,168
125
+ kalir/models/overview.py,sha256=VeInXwIpjJltuCaI8aXsHy6IWNQRa6rpofbTK_ijdew,7159
126
+ kalir/models/overview_assets.py,sha256=6Ne04vmW84oWWnWACZIneugws87YCQaiUkaIBBf6-Jc,2286
127
+ kalir/models/overview_exposures.py,sha256=SR10aPQbAV69zLEjBaOByobl-qxHTDAWId6dvreGhOU,2887
128
+ kalir/models/overview_incidents.py,sha256=0LcvAgzbNUOxvM8Yj53DQ0zAJMFZpLKBbx-qXopUXaA,2887
129
+ kalir/models/overview_phishing.py,sha256=tiosmgdJ7AkzuW6-q2pGFlERpMhD0IesOCPH6Yi0Cx8,1970
130
+ kalir/models/overview_risk_level.py,sha256=NJP57yOckIY0IYJURct6uPl_Lp5czw-uTvxtp0TZ39g,204
131
+ kalir/models/overview_takedowns.py,sha256=dz7JfvhpUsScV8iGg83SaAqfrEmCjzNYUCEwQ-zNbMc,1951
132
+ kalir/models/pagination.py,sha256=BpQOoLt7uXyPLWm_plitVe0PpBe9JlcTG3rpEnjLeys,2382
133
+ kalir/models/phishing_domain.py,sha256=hIy-Y-3t-5rrVDuNGiZpGws2r2BSfOyr1uazHQpZy5c,5176
134
+ kalir/models/phishing_domain_verdict.py,sha256=_XCyacjppuO0EuBC_ym4QvvPwijsZ2Ucnbw3Zsj_66U,268
135
+ kalir/models/report.py,sha256=yKtymi81cWd7adkZoaV1e3RB8YV8wW1rH83EPQmH3xI,4818
136
+ kalir/models/report_parameters.py,sha256=erFq6JjMp-Wngv-maPO_EOfVYHOTZo7sZ03Q-zLumKY,4938
137
+ kalir/models/report_parameters_date_range.py,sha256=MXJeOal_VssDUyIirAGbMnLakjunNB2bsjrYwvt_5Oo,231
138
+ kalir/models/report_parameters_language.py,sha256=IDcpGrj54TN3GQpLfxStKRjakEt6qMzFG-GAoRIAMVw,157
139
+ kalir/models/report_parameters_sections_item.py,sha256=1C5H3povzwkhAjbBsHBVX6mxeHs3ZVqemidFlE8FyBQ,403
140
+ kalir/models/report_status.py,sha256=EtoBfN7q88GHqx3ym4NxTitHkwqTcILCoLzrbMoihJ4,221
141
+ kalir/models/rotate_webhook_secret_response_200.py,sha256=FMPr9ltJ87U-vCNZgtPM2v5dKONn3mysgmJAP0cU6IA,2027
142
+ kalir/models/rule.py,sha256=ucA-W7oqEDvvsH53-Sj5Id2MFCEi_qZ203pHl3nenxY,4607
143
+ kalir/models/rule_input.py,sha256=aMv9pUSkj_h0TL46gtpv15owQHSa5ALTaLqiNmmHVro,3472
144
+ kalir/models/rule_input_actions_item.py,sha256=92vOmDABMk4PWcxZfbp-NrdPqZ0hLACa2ClTMDWhST8,1390
145
+ kalir/models/takedown.py,sha256=mExaHTmLY0L22d_90WE2vfTV7kKGfhe74PbF93jU11s,4232
146
+ kalir/models/takedown_create.py,sha256=APKHHXb_uzwKzvwS1ljisEhjmRgy77GTJeNENbVaRt8,2768
147
+ kalir/models/takedown_update.py,sha256=xHETKuf636tnSo574YKh3v-UDeeSv0-ut8z86stH0Xo,2176
148
+ kalir/models/update_incident_status_body.py,sha256=-2EKPWp15Go6gaGBkCj9CaedzjNAlU-fMtxUo0Vc1f8,2128
149
+ kalir/models/update_incident_status_body_status.py,sha256=yPXaOaGBXEOy64Amcq8McsdUun_YjoDgSmZNUBTuidM,237
150
+ kalir/models/webhook_delivery.py,sha256=BvDaDIX3NjoOHVrffnpA4zsApfA2hFiOZzKtiAr6WQU,7966
151
+ kalir/models/webhook_delivery_payload.py,sha256=nt1meN41asUDaV8wZ9Jl9jER6BrWcwmHmvVG0yE_bg4,1397
152
+ kalir/models/webhook_delivery_status.py,sha256=pbM260wmFSDwfL9jDe28lhe8U_V73NMwY3Avyv41YT4,200
153
+ kalir/models/webhook_endpoint.py,sha256=JYuYhIVF0cL8hNSppQoNEq0hNcPDk2F_CscnEshOaGI,6112
154
+ kalir/models/webhook_endpoint_input.py,sha256=Ida6-pkaqlZspEaWdfD_NjvhBdzCFlmrPXBdbZ7K9XA,3417
155
+ kalir/models/webhook_endpoint_input_event_types_item.py,sha256=hHHaown4razbfrgK7Q9G0QsWiF1f9suTXN5UWBpHrMA,361
156
+ kalir/models/webhook_incident.py,sha256=CF6YrpUFK-8WnwoEwk5rIkoZWRkAD_dxZAUTPDo0KKc,6420
157
+ kalir/models/webhook_incident_severity.py,sha256=DsO5gg17WPlP-JI6Q6DfzSRwbvVyQbBv2_y981oU7Mw,210
158
+ kalir/py.typed,sha256=8ZJUsxZiuOy1oJeVhsTWQhTG_6pTVHVXk5hJL79ebTk,25
159
+ kalir/types.py,sha256=k9-ddYg6Tq-sd90hvGkH8-9hLj94QeCGVmGNz2xM5JQ,1350
160
+ kalir/webhooks.py,sha256=L79TZ09MW-KEW-XAs6dLtLcT5Dh5IGibhyZIjhfJg-s,2189
161
+ kalir_python-0.1.0.dist-info/WHEEL,sha256=7hzKWg-J8I3Buqyw5tBii5z_MmAVsDYXXijd_QAtNZ8,81
162
+ kalir_python-0.1.0.dist-info/METADATA,sha256=PKeWkY2eKI6XCyqr2sBNeFLkMHBBA81V2KJo-g45RfE,2681
163
+ kalir_python-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: uv 0.12.18
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any