binalyze-air-sdk 1.0.1__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 (82) hide show
  1. binalyze_air/__init__.py +77 -0
  2. binalyze_air/apis/__init__.py +27 -0
  3. binalyze_air/apis/authentication.py +27 -0
  4. binalyze_air/apis/auto_asset_tags.py +75 -0
  5. binalyze_air/apis/endpoints.py +22 -0
  6. binalyze_air/apis/event_subscription.py +97 -0
  7. binalyze_air/apis/evidence.py +53 -0
  8. binalyze_air/apis/evidences.py +216 -0
  9. binalyze_air/apis/interact.py +36 -0
  10. binalyze_air/apis/params.py +40 -0
  11. binalyze_air/apis/settings.py +27 -0
  12. binalyze_air/apis/user_management.py +74 -0
  13. binalyze_air/apis/users.py +68 -0
  14. binalyze_air/apis/webhooks.py +231 -0
  15. binalyze_air/base.py +133 -0
  16. binalyze_air/client.py +1338 -0
  17. binalyze_air/commands/__init__.py +146 -0
  18. binalyze_air/commands/acquisitions.py +387 -0
  19. binalyze_air/commands/assets.py +363 -0
  20. binalyze_air/commands/authentication.py +37 -0
  21. binalyze_air/commands/auto_asset_tags.py +231 -0
  22. binalyze_air/commands/baseline.py +396 -0
  23. binalyze_air/commands/cases.py +603 -0
  24. binalyze_air/commands/event_subscription.py +102 -0
  25. binalyze_air/commands/evidences.py +988 -0
  26. binalyze_air/commands/interact.py +58 -0
  27. binalyze_air/commands/organizations.py +221 -0
  28. binalyze_air/commands/policies.py +203 -0
  29. binalyze_air/commands/settings.py +29 -0
  30. binalyze_air/commands/tasks.py +56 -0
  31. binalyze_air/commands/triage.py +360 -0
  32. binalyze_air/commands/user_management.py +126 -0
  33. binalyze_air/commands/users.py +101 -0
  34. binalyze_air/config.py +245 -0
  35. binalyze_air/exceptions.py +50 -0
  36. binalyze_air/http_client.py +306 -0
  37. binalyze_air/models/__init__.py +285 -0
  38. binalyze_air/models/acquisitions.py +251 -0
  39. binalyze_air/models/assets.py +439 -0
  40. binalyze_air/models/audit.py +273 -0
  41. binalyze_air/models/authentication.py +70 -0
  42. binalyze_air/models/auto_asset_tags.py +117 -0
  43. binalyze_air/models/baseline.py +232 -0
  44. binalyze_air/models/cases.py +276 -0
  45. binalyze_air/models/endpoints.py +76 -0
  46. binalyze_air/models/event_subscription.py +172 -0
  47. binalyze_air/models/evidence.py +66 -0
  48. binalyze_air/models/evidences.py +349 -0
  49. binalyze_air/models/interact.py +136 -0
  50. binalyze_air/models/organizations.py +294 -0
  51. binalyze_air/models/params.py +128 -0
  52. binalyze_air/models/policies.py +250 -0
  53. binalyze_air/models/settings.py +84 -0
  54. binalyze_air/models/tasks.py +149 -0
  55. binalyze_air/models/triage.py +143 -0
  56. binalyze_air/models/user_management.py +97 -0
  57. binalyze_air/models/users.py +82 -0
  58. binalyze_air/queries/__init__.py +134 -0
  59. binalyze_air/queries/acquisitions.py +156 -0
  60. binalyze_air/queries/assets.py +105 -0
  61. binalyze_air/queries/audit.py +417 -0
  62. binalyze_air/queries/authentication.py +56 -0
  63. binalyze_air/queries/auto_asset_tags.py +60 -0
  64. binalyze_air/queries/baseline.py +185 -0
  65. binalyze_air/queries/cases.py +293 -0
  66. binalyze_air/queries/endpoints.py +25 -0
  67. binalyze_air/queries/event_subscription.py +55 -0
  68. binalyze_air/queries/evidence.py +140 -0
  69. binalyze_air/queries/evidences.py +280 -0
  70. binalyze_air/queries/interact.py +28 -0
  71. binalyze_air/queries/organizations.py +223 -0
  72. binalyze_air/queries/params.py +115 -0
  73. binalyze_air/queries/policies.py +150 -0
  74. binalyze_air/queries/settings.py +20 -0
  75. binalyze_air/queries/tasks.py +82 -0
  76. binalyze_air/queries/triage.py +231 -0
  77. binalyze_air/queries/user_management.py +83 -0
  78. binalyze_air/queries/users.py +69 -0
  79. binalyze_air_sdk-1.0.1.dist-info/METADATA +635 -0
  80. binalyze_air_sdk-1.0.1.dist-info/RECORD +82 -0
  81. binalyze_air_sdk-1.0.1.dist-info/WHEEL +5 -0
  82. binalyze_air_sdk-1.0.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,285 @@
1
+ """
2
+ Data models for the Binalyze AIR SDK.
3
+ """
4
+
5
+ from .assets import Asset, AssetDetail, AssetTask, AssetFilter, AssetTaskFilter
6
+ from .cases import (
7
+ Case, CaseActivity, CaseEndpoint, CaseTask, User, CaseFilter, CaseActivityFilter,
8
+ CreateCaseRequest, UpdateCaseRequest, CaseStatus, CaseNote
9
+ )
10
+ from .tasks import (
11
+ Task, TaskFilter, TaskData, TaskConfig, DroneConfig, TaskStatus, TaskType
12
+ )
13
+ from .acquisitions import (
14
+ AcquisitionProfile, AcquisitionProfileDetails, AcquisitionFilter,
15
+ AcquisitionTaskRequest, ImageAcquisitionTaskRequest, CreateAcquisitionProfileRequest,
16
+ NetworkCaptureConfig, EDiscoveryPattern
17
+ )
18
+ from .policies import (
19
+ Policy, PolicyFilter, PolicyAssignment, PolicyExecution, PolicyRule, PolicyCondition, PolicyAction,
20
+ CreatePolicyRequest, UpdatePolicyRequest, AssignPolicyRequest, PolicyType, PolicyStatus
21
+ )
22
+ from .organizations import (
23
+ Organization, OrganizationUser, OrganizationRole, OrganizationFilter,
24
+ CreateOrganizationRequest, UpdateOrganizationRequest, AddUserToOrganizationRequest,
25
+ OrganizationStatus, UserRole
26
+ )
27
+ from .triage import (
28
+ TriageRule, TriageTag, TriageProfile, TriageFilter,
29
+ CreateTriageRuleRequest, UpdateTriageRuleRequest, CreateTriageTagRequest, CreateTriageProfileRequest,
30
+ TriageStatus, TriageSeverity, TriageRuleType
31
+ )
32
+ from .audit import (
33
+ AuditLog, AuditFilter, AuditSummary, AuditUserActivity, AuditSystemEvent,
34
+ AuditExportRequest, AuditRetentionPolicy, AuditLevel, AuditCategory, AuditAction,
35
+ AuditLogsFilter
36
+ )
37
+ from .baseline import (
38
+ Baseline, BaselineProfile, BaselineComparison, BaselineChange, BaselineFilter,
39
+ CreateBaselineRequest, UpdateBaselineRequest, CreateBaselineProfileRequest, CompareBaselineRequest,
40
+ BaselineStatus, BaselineType, ComparisonStatus, ChangeType
41
+ )
42
+ from .authentication import (
43
+ AuthStatus, LoginRequest, LoginResponse
44
+ )
45
+ from .user_management import (
46
+ UserManagementUser, CreateUserRequest, UpdateUserRequest,
47
+ AIUser, CreateAIUserRequest, APIUser, CreateAPIUserRequest, UserFilter
48
+ )
49
+ from .evidence import (
50
+ EvidencePPC, EvidenceReportFileInfo, EvidenceReport
51
+ )
52
+ from .auto_asset_tags import (
53
+ AutoAssetTag, CreateAutoAssetTagRequest, UpdateAutoAssetTagRequest,
54
+ StartTaggingRequest, TaggingResult, AutoAssetTagFilter
55
+ )
56
+ from .evidences import (
57
+ EvidenceRepository, AmazonS3Repository, AzureStorageRepository,
58
+ FTPSRepository, SFTPRepository, SMBRepository, RepositoryFilter,
59
+ CreateAmazonS3RepositoryRequest, UpdateAmazonS3RepositoryRequest,
60
+ CreateAzureStorageRepositoryRequest, UpdateAzureStorageRepositoryRequest,
61
+ CreateFTPSRepositoryRequest, UpdateFTPSRepositoryRequest,
62
+ CreateSFTPRepositoryRequest, UpdateSFTPRepositoryRequest,
63
+ CreateSMBRepositoryRequest, UpdateSMBRepositoryRequest,
64
+ ValidateRepositoryRequest, ValidationResult
65
+ )
66
+ from .event_subscription import (
67
+ EventSubscription, EventSubscriptionFilter, CreateEventSubscriptionRequest,
68
+ UpdateEventSubscriptionRequest, SubscriptionStatus, EventType, DeliveryMethod
69
+ )
70
+ from .interact import (
71
+ ShellInteraction, AssignShellTaskRequest, ShellTaskResponse,
72
+ InteractionType, InteractionStatus
73
+ )
74
+ from .params import (
75
+ AcquisitionArtifact, EDiscoveryPattern, AcquisitionEvidence, DroneAnalyzer,
76
+ ArtifactType, ArtifactCategory, Platform
77
+ )
78
+ from .settings import (
79
+ BannerSettings, UpdateBannerSettingsRequest, BannerType, BannerPosition
80
+ )
81
+ from .endpoints import (
82
+ EndpointTag, CreateEndpointTagRequest, UpdateEndpointTagRequest,
83
+ EndpointTagFilter, TagType, TagScope
84
+ )
85
+
86
+ # TODO: Add imports when implementing other endpoints
87
+ # from .organizations import Organization, User, Role
88
+ # from .policies import Policy
89
+ # from .triage import TriageRule, TriageTag
90
+ # from .audit import AuditLog
91
+
92
+ __all__ = [
93
+ # Assets
94
+ "Asset",
95
+ "AssetDetail",
96
+ "AssetTask",
97
+ "AssetFilter",
98
+ "AssetTaskFilter",
99
+
100
+ # Cases
101
+ "Case",
102
+ "CaseActivity",
103
+ "CaseEndpoint",
104
+ "CaseTask",
105
+ "User",
106
+ "CaseFilter",
107
+ "CaseActivityFilter",
108
+ "CreateCaseRequest",
109
+ "UpdateCaseRequest",
110
+ "CaseStatus",
111
+ "CaseNote",
112
+
113
+ # Tasks
114
+ "Task",
115
+ "TaskFilter",
116
+ "TaskData",
117
+ "TaskConfig",
118
+ "DroneConfig",
119
+ "TaskStatus",
120
+ "TaskType",
121
+
122
+ # Acquisitions
123
+ "AcquisitionProfile",
124
+ "AcquisitionProfileDetails",
125
+ "AcquisitionFilter",
126
+ "AcquisitionTaskRequest",
127
+ "ImageAcquisitionTaskRequest",
128
+ "CreateAcquisitionProfileRequest",
129
+ "NetworkCaptureConfig",
130
+ "EDiscoveryPattern",
131
+
132
+ # Policies
133
+ "Policy",
134
+ "PolicyFilter",
135
+ "PolicyAssignment",
136
+ "PolicyExecution",
137
+ "PolicyRule",
138
+ "PolicyCondition",
139
+ "PolicyAction",
140
+ "CreatePolicyRequest",
141
+ "UpdatePolicyRequest",
142
+ "AssignPolicyRequest",
143
+ "PolicyType",
144
+ "PolicyStatus",
145
+
146
+ # Organizations
147
+ "Organization",
148
+ "OrganizationUser",
149
+ "OrganizationRole",
150
+ "OrganizationFilter",
151
+ "CreateOrganizationRequest",
152
+ "UpdateOrganizationRequest",
153
+ "AddUserToOrganizationRequest",
154
+ "OrganizationStatus",
155
+ "UserRole",
156
+
157
+ # Triage
158
+ "TriageRule",
159
+ "TriageTag",
160
+ "TriageProfile",
161
+ "TriageFilter",
162
+ "CreateTriageRuleRequest",
163
+ "UpdateTriageRuleRequest",
164
+ "CreateTriageTagRequest",
165
+ "CreateTriageProfileRequest",
166
+ "TriageStatus",
167
+ "TriageSeverity",
168
+ "TriageRuleType",
169
+
170
+ # Audit
171
+ "AuditLog",
172
+ "AuditFilter",
173
+ "AuditSummary",
174
+ "AuditUserActivity",
175
+ "AuditSystemEvent",
176
+ "AuditExportRequest",
177
+ "AuditRetentionPolicy",
178
+ "AuditLevel",
179
+ "AuditCategory",
180
+ "AuditAction",
181
+ "AuditLogsFilter",
182
+
183
+ # Baseline
184
+ "Baseline",
185
+ "BaselineProfile",
186
+ "BaselineComparison",
187
+ "BaselineChange",
188
+ "BaselineFilter",
189
+ "CreateBaselineRequest",
190
+ "UpdateBaselineRequest",
191
+ "CreateBaselineProfileRequest",
192
+ "CompareBaselineRequest",
193
+ "BaselineStatus",
194
+ "BaselineType",
195
+ "ComparisonStatus",
196
+ "ChangeType",
197
+
198
+ # Authentication
199
+ "AuthStatus",
200
+ "LoginRequest",
201
+ "LoginResponse",
202
+
203
+ # User Management
204
+ "UserManagementUser",
205
+ "CreateUserRequest",
206
+ "UpdateUserRequest",
207
+ "AIUser",
208
+ "CreateAIUserRequest",
209
+ "APIUser",
210
+ "CreateAPIUserRequest",
211
+ "UserFilter",
212
+
213
+ # Evidence
214
+ "EvidencePPC",
215
+ "EvidenceReportFileInfo",
216
+ "EvidenceReport",
217
+
218
+ # Auto Asset Tags
219
+ "AutoAssetTag",
220
+ "CreateAutoAssetTagRequest",
221
+ "UpdateAutoAssetTagRequest",
222
+ "StartTaggingRequest",
223
+ "TaggingResult",
224
+ "AutoAssetTagFilter",
225
+
226
+ # Evidences/Repositories
227
+ "EvidenceRepository",
228
+ "AmazonS3Repository",
229
+ "AzureStorageRepository",
230
+ "FTPSRepository",
231
+ "SFTPRepository",
232
+ "SMBRepository",
233
+ "RepositoryFilter",
234
+ "CreateAmazonS3RepositoryRequest",
235
+ "UpdateAmazonS3RepositoryRequest",
236
+ "CreateAzureStorageRepositoryRequest",
237
+ "UpdateAzureStorageRepositoryRequest",
238
+ "CreateFTPSRepositoryRequest",
239
+ "UpdateFTPSRepositoryRequest",
240
+ "CreateSFTPRepositoryRequest",
241
+ "UpdateSFTPRepositoryRequest",
242
+ "CreateSMBRepositoryRequest",
243
+ "UpdateSMBRepositoryRequest",
244
+ "ValidateRepositoryRequest",
245
+ "ValidationResult",
246
+
247
+ # Event Subscription
248
+ "EventSubscription",
249
+ "EventSubscriptionFilter",
250
+ "CreateEventSubscriptionRequest",
251
+ "UpdateEventSubscriptionRequest",
252
+ "SubscriptionStatus",
253
+ "EventType",
254
+ "DeliveryMethod",
255
+
256
+ # Interact
257
+ "ShellInteraction",
258
+ "AssignShellTaskRequest",
259
+ "ShellTaskResponse",
260
+ "InteractionType",
261
+ "InteractionStatus",
262
+
263
+ # Params
264
+ "AcquisitionArtifact",
265
+ "EDiscoveryPattern",
266
+ "AcquisitionEvidence",
267
+ "DroneAnalyzer",
268
+ "ArtifactType",
269
+ "ArtifactCategory",
270
+ "Platform",
271
+
272
+ # Settings
273
+ "BannerSettings",
274
+ "UpdateBannerSettingsRequest",
275
+ "BannerType",
276
+ "BannerPosition",
277
+
278
+ # Endpoints
279
+ "EndpointTag",
280
+ "CreateEndpointTagRequest",
281
+ "UpdateEndpointTagRequest",
282
+ "EndpointTagFilter",
283
+ "TagType",
284
+ "TagScope",
285
+ ]
@@ -0,0 +1,251 @@
1
+ """
2
+ Acquisition-related data models for the Binalyze AIR SDK.
3
+ """
4
+
5
+ from typing import List, Optional, Dict, Any
6
+ from datetime import datetime
7
+
8
+ from ..base import AIRBaseModel, Filter
9
+
10
+
11
+ class NetworkCaptureConfig(AIRBaseModel):
12
+ """Network capture configuration."""
13
+
14
+ enabled: bool = False
15
+ duration: int = 60
16
+ pcap: Dict[str, bool] = {"enabled": False}
17
+ network_flow: Dict[str, bool] = {"enabled": False}
18
+
19
+
20
+ class EDiscoveryPattern(AIRBaseModel):
21
+ """eDiscovery pattern model."""
22
+
23
+ pattern: str
24
+ category: str
25
+
26
+
27
+ class SaveLocationConfig(AIRBaseModel):
28
+ """Save location configuration."""
29
+
30
+ location: str
31
+ use_most_free_volume: bool = False
32
+ repository_id: Optional[str] = None
33
+ path: str
34
+ volume: Optional[str] = None
35
+ tmp: str
36
+ direct_collection: bool = False
37
+
38
+
39
+ class TaskConfig(AIRBaseModel):
40
+ """Task configuration."""
41
+
42
+ choice: str
43
+ save_to: Dict[str, SaveLocationConfig]
44
+ cpu: Dict[str, int] = {"limit": 50}
45
+ compression: Dict[str, Any] = {
46
+ "enabled": False,
47
+ "encryption": {"enabled": False, "password": ""}
48
+ }
49
+
50
+
51
+ class DroneConfig(AIRBaseModel):
52
+ """Drone configuration."""
53
+
54
+ auto_pilot: bool = False
55
+ enabled: bool = False
56
+ analyzers: List[str] = []
57
+ keywords: List[str] = []
58
+
59
+
60
+ class FilterConfig(AIRBaseModel):
61
+ """Filter configuration for acquisition tasks - matches API specification exactly."""
62
+
63
+ # Basic search and identification
64
+ search_term: Optional[str] = None
65
+ name: Optional[str] = None
66
+ ip_address: Optional[str] = None
67
+ group_id: Optional[str] = None
68
+ group_full_path: Optional[str] = None
69
+ label: Optional[str] = None # NEW - Missing from API spec
70
+
71
+ # Status filters (arrays as per API)
72
+ managed_status: List[str] = []
73
+ isolation_status: List[str] = []
74
+ platform: List[str] = []
75
+ issue: Optional[str] = None # API expects string, not array
76
+ online_status: List[str] = []
77
+
78
+ # Tags and policies
79
+ tags: List[str] = []
80
+ version: Optional[str] = None
81
+ policy: Optional[str] = None
82
+
83
+ # Endpoint targeting
84
+ included_endpoint_ids: List[str] = []
85
+ excluded_endpoint_ids: List[str] = []
86
+
87
+ # Organization and case
88
+ organization_ids: List[int] = [] # Required by API
89
+ case_id: Optional[str] = None # NEW - Missing from API spec
90
+
91
+ # Date/time filters
92
+ last_seen: Optional[str] = None # NEW - Missing from API spec (ISO 8601 format)
93
+
94
+ # Cloud provider filters
95
+ aws_regions: Optional[List[str]] = None # NEW - Missing from API spec
96
+ azure_regions: Optional[List[str]] = None # NEW - Missing from API spec
97
+
98
+
99
+ class AcquisitionProfilePlatformDetails(AIRBaseModel):
100
+ """Platform-specific acquisition profile details."""
101
+
102
+ evidence_list: List[str] = []
103
+ artifact_list: Optional[List[str]] = None
104
+ custom_content_profiles: List[Any] = []
105
+ network_capture: Optional[NetworkCaptureConfig] = None
106
+
107
+
108
+ class AcquisitionProfile(AIRBaseModel):
109
+ """Acquisition profile model."""
110
+
111
+ id: str
112
+ name: str
113
+ organization_ids: List[int] = []
114
+ created_at: Optional[datetime] = None
115
+ updated_at: Optional[datetime] = None
116
+ created_by: str
117
+ deletable: bool = True
118
+ artifacts: List[str] = [] # Added for test compatibility
119
+
120
+ # Additional fields from API response
121
+ average_time: Optional[int] = None
122
+ last_used_at: Optional[datetime] = None
123
+ last_used_by: Optional[str] = None
124
+ has_event_log_records_evidence: Optional[bool] = None
125
+
126
+
127
+ class AcquisitionProfileDetails(AcquisitionProfile):
128
+ """Detailed acquisition profile with platform configurations."""
129
+
130
+ windows: Optional[AcquisitionProfilePlatformDetails] = None
131
+ linux: Optional[AcquisitionProfilePlatformDetails] = None
132
+ macos: Optional[AcquisitionProfilePlatformDetails] = None
133
+ aix: Optional[AcquisitionProfilePlatformDetails] = None
134
+ e_discovery: Optional[Dict[str, List[EDiscoveryPattern]]] = None
135
+ settings: Optional[Dict[str, Any]] = None # Added for test compatibility
136
+
137
+
138
+ class EndpointVolumeConfig(AIRBaseModel):
139
+ """Endpoint and volume configuration for disk image acquisition."""
140
+
141
+ endpoint_id: str
142
+ volumes: List[str] = []
143
+
144
+
145
+ class DiskImageOptions(AIRBaseModel):
146
+ """Disk image options."""
147
+
148
+ chunk_size: int
149
+ chunk_count: int
150
+ start_offset: int
151
+ endpoints: List[EndpointVolumeConfig] = []
152
+
153
+
154
+ class AcquisitionTaskRequest(AIRBaseModel):
155
+ """Acquisition task request."""
156
+
157
+ case_id: str
158
+ drone_config: DroneConfig
159
+ task_config: TaskConfig
160
+ acquisition_profile_id: str
161
+ filter: FilterConfig
162
+
163
+
164
+ class ImageAcquisitionTaskRequest(AIRBaseModel):
165
+ """Image acquisition task request."""
166
+
167
+ case_id: Optional[str] = None
168
+ task_config: TaskConfig
169
+ disk_image_options: DiskImageOptions
170
+ filter: FilterConfig
171
+
172
+
173
+ class CreateAcquisitionProfileRequest(AIRBaseModel):
174
+ """Create acquisition profile request."""
175
+
176
+ name: str
177
+ organization_ids: List[int] = []
178
+ windows: Optional[AcquisitionProfilePlatformDetails] = None
179
+ linux: Optional[AcquisitionProfilePlatformDetails] = None
180
+ macos: Optional[AcquisitionProfilePlatformDetails] = None
181
+ aix: Optional[AcquisitionProfilePlatformDetails] = None
182
+ e_discovery: Optional[Dict[str, List[EDiscoveryPattern]]] = None
183
+ description: Optional[str] = None # Added for test compatibility
184
+ artifacts: List[str] = [] # Added for test compatibility
185
+
186
+
187
+ # Simplified request models for testing
188
+ class CreateAcquisitionRequest(AIRBaseModel):
189
+ """Simplified acquisition request for testing."""
190
+
191
+ filter: Dict[str, Any]
192
+ profileId: str
193
+ name: Optional[str] = None
194
+
195
+
196
+ class CreateImageAcquisitionRequest(AIRBaseModel):
197
+ """Simplified image acquisition request for testing."""
198
+
199
+ filter: Dict[str, Any]
200
+ name: Optional[str] = None
201
+ fullDisk: bool = False
202
+ repository_id: Optional[str] = None
203
+ volumes: Optional[List[str]] = None
204
+
205
+
206
+ class AcquisitionFilter(Filter):
207
+ """Filter for acquisition profile queries - matches API specification exactly."""
208
+
209
+ # Search and identification
210
+ search_term: Optional[str] = None
211
+ name: Optional[str] = None
212
+
213
+ # Organization parameters
214
+ organization_ids: Optional[List[int]] = None # Required by API
215
+ all_organizations: Optional[bool] = None # true/false
216
+
217
+ # Profile metadata (for backwards compatibility)
218
+ created_by: Optional[str] = None
219
+ deletable: Optional[bool] = None
220
+
221
+ def to_params(self) -> Dict[str, Any]:
222
+ """Convert filter to API parameters."""
223
+ params = {}
224
+
225
+ # Pagination parameters (not in filter namespace) - only if set
226
+ if self.page_number is not None:
227
+ params["pageNumber"] = self.page_number
228
+ if self.page_size is not None:
229
+ params["pageSize"] = self.page_size
230
+ if self.sort_by is not None:
231
+ params["sortBy"] = self.sort_by
232
+ if self.sort_type is not None:
233
+ params["sortType"] = self.sort_type
234
+
235
+ # Add acquisition-specific filter parameters (use API field names)
236
+ if self.search_term is not None:
237
+ params["filter[searchTerm]"] = self.search_term
238
+ if self.name is not None:
239
+ params["filter[name]"] = self.name
240
+ if self.organization_ids is not None:
241
+ params["filter[organizationIds]"] = ",".join(map(str, self.organization_ids))
242
+ if self.all_organizations is not None:
243
+ params["filter[allOrganizations]"] = "true" if self.all_organizations else "false"
244
+
245
+ # Backwards compatibility fields (not in API spec but may be used)
246
+ if self.created_by is not None:
247
+ params["filter[createdBy]"] = self.created_by
248
+ if self.deletable is not None:
249
+ params["filter[deletable]"] = "true" if self.deletable else "false"
250
+
251
+ return params