@censys/platform-sdk 0.10.1 → 0.10.2

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 (261) hide show
  1. package/README.md +6 -0
  2. package/docs/sdks/threathunting/README.md +250 -1
  3. package/funcs/accountManagementGetMemberCreditUsage.js.map +1 -1
  4. package/funcs/accountManagementGetOrganizationCreditUsage.js.map +1 -1
  5. package/funcs/accountManagementGetOrganizationCredits.js.map +1 -1
  6. package/funcs/accountManagementGetOrganizationDetails.js.map +1 -1
  7. package/funcs/accountManagementInviteUserToOrganization.js.map +1 -1
  8. package/funcs/accountManagementListOrganizationMembers.js.map +1 -1
  9. package/funcs/accountManagementRemoveOrganizationMember.js.map +1 -1
  10. package/funcs/accountManagementUpdateOrganizationMember.js.map +1 -1
  11. package/funcs/collectionsAggregate.js.map +1 -1
  12. package/funcs/collectionsDelete.js.map +1 -1
  13. package/funcs/collectionsGet.js.map +1 -1
  14. package/funcs/collectionsListEvents.js.map +1 -1
  15. package/funcs/collectionsSearch.js.map +1 -1
  16. package/funcs/collectionsUpdate.js.map +1 -1
  17. package/funcs/globalDataGetCertificate.js.map +1 -1
  18. package/funcs/globalDataGetCertificateRaw.js.map +1 -1
  19. package/funcs/globalDataGetHost.js.map +1 -1
  20. package/funcs/globalDataGetHostTimeline.js.map +1 -1
  21. package/funcs/globalDataGetTrackedScan.js.map +1 -1
  22. package/funcs/globalDataGetWebProperty.js.map +1 -1
  23. package/funcs/globalDataListServicesOnHost.js.map +1 -1
  24. package/funcs/threatHuntingCreateCenseyeJob.d.ts +18 -0
  25. package/funcs/threatHuntingCreateCenseyeJob.d.ts.map +1 -0
  26. package/funcs/threatHuntingCreateCenseyeJob.js +131 -0
  27. package/funcs/threatHuntingCreateCenseyeJob.js.map +1 -0
  28. package/funcs/threatHuntingGetCenseyeJob.d.ts +18 -0
  29. package/funcs/threatHuntingGetCenseyeJob.d.ts.map +1 -0
  30. package/funcs/threatHuntingGetCenseyeJob.js +134 -0
  31. package/funcs/threatHuntingGetCenseyeJob.js.map +1 -0
  32. package/funcs/threatHuntingGetCenseyeJobResults.d.ts +18 -0
  33. package/funcs/threatHuntingGetCenseyeJobResults.d.ts.map +1 -0
  34. package/funcs/threatHuntingGetCenseyeJobResults.js +136 -0
  35. package/funcs/threatHuntingGetCenseyeJobResults.js.map +1 -0
  36. package/funcs/threatHuntingGetHostObservationsWithCertificate.js.map +1 -1
  37. package/funcs/threatHuntingGetTrackedScanThreatHunting.js.map +1 -1
  38. package/funcs/threatHuntingValueCounts.d.ts +1 -1
  39. package/funcs/threatHuntingValueCounts.js +1 -1
  40. package/jsr.json +1 -1
  41. package/lib/config.d.ts +4 -4
  42. package/lib/config.js +4 -4
  43. package/lib/encodings.d.ts.map +1 -1
  44. package/lib/encodings.js +20 -5
  45. package/lib/encodings.js.map +1 -1
  46. package/lib/files.d.ts +13 -0
  47. package/lib/files.d.ts.map +1 -1
  48. package/lib/files.js +19 -0
  49. package/lib/files.js.map +1 -1
  50. package/lib/matchers.d.ts.map +1 -1
  51. package/lib/matchers.js +0 -1
  52. package/lib/matchers.js.map +1 -1
  53. package/lib/sdks.d.ts.map +1 -1
  54. package/lib/sdks.js +8 -4
  55. package/lib/sdks.js.map +1 -1
  56. package/lib/security.d.ts.map +1 -1
  57. package/lib/security.js +1 -2
  58. package/lib/security.js.map +1 -1
  59. package/lib/url.d.ts.map +1 -1
  60. package/lib/url.js +4 -2
  61. package/lib/url.js.map +1 -1
  62. package/models/components/censeyejob.d.ts +59 -0
  63. package/models/components/censeyejob.d.ts.map +1 -0
  64. package/models/components/censeyejob.js +85 -0
  65. package/models/components/censeyejob.js.map +1 -0
  66. package/models/components/censeyeresult.d.ts +18 -0
  67. package/models/components/censeyeresult.d.ts.map +1 -0
  68. package/models/components/censeyeresult.js +57 -0
  69. package/models/components/censeyeresult.js.map +1 -0
  70. package/models/components/censeyeresultsresponse.d.ts +18 -0
  71. package/models/components/censeyeresultsresponse.d.ts.map +1 -0
  72. package/models/components/censeyeresultsresponse.js +57 -0
  73. package/models/components/censeyeresultsresponse.js.map +1 -0
  74. package/models/components/censeyetarget.d.ts +30 -0
  75. package/models/components/censeyetarget.d.ts.map +1 -0
  76. package/models/components/censeyetarget.js +75 -0
  77. package/models/components/censeyetarget.js.map +1 -0
  78. package/models/components/countcondition.d.ts +1 -1
  79. package/models/components/createcenseyejobinputbody.d.ts +13 -0
  80. package/models/components/createcenseyejobinputbody.d.ts.map +1 -0
  81. package/models/components/createcenseyejobinputbody.js +50 -0
  82. package/models/components/createcenseyejobinputbody.js.map +1 -0
  83. package/models/components/fieldvaluepair.d.ts +5 -0
  84. package/models/components/fieldvaluepair.d.ts.map +1 -1
  85. package/models/components/fieldvaluepair.js +11 -1
  86. package/models/components/fieldvaluepair.js.map +1 -1
  87. package/models/components/host.d.ts +12 -0
  88. package/models/components/host.d.ts.map +1 -1
  89. package/models/components/host.js +7 -0
  90. package/models/components/host.js.map +1 -1
  91. package/models/components/index.d.ts +21 -0
  92. package/models/components/index.d.ts.map +1 -1
  93. package/models/components/index.js +21 -0
  94. package/models/components/index.js.map +1 -1
  95. package/models/components/networkclassification.d.ts +27 -0
  96. package/models/components/networkclassification.d.ts.map +1 -0
  97. package/models/components/networkclassification.js +60 -0
  98. package/models/components/networkclassification.js.map +1 -0
  99. package/models/components/networkmobileinfo.d.ts +21 -0
  100. package/models/components/networkmobileinfo.d.ts.map +1 -0
  101. package/models/components/networkmobileinfo.js +57 -0
  102. package/models/components/networkmobileinfo.js.map +1 -0
  103. package/models/components/privacy.d.ts +39 -0
  104. package/models/components/privacy.d.ts.map +1 -0
  105. package/models/components/privacy.js +64 -0
  106. package/models/components/privacy.js.map +1 -0
  107. package/models/components/privacytorinfo.d.ts +11 -0
  108. package/models/components/privacytorinfo.d.ts.map +1 -0
  109. package/models/components/privacytorinfo.js +51 -0
  110. package/models/components/privacytorinfo.js.map +1 -0
  111. package/models/components/privacytorinforelay.d.ts +140 -0
  112. package/models/components/privacytorinforelay.d.ts.map +1 -0
  113. package/models/components/privacytorinforelay.js +114 -0
  114. package/models/components/privacytorinforelay.js.map +1 -0
  115. package/models/components/privacytorinforelayexitpolicysummary.d.ts +17 -0
  116. package/models/components/privacytorinforelayexitpolicysummary.d.ts.map +1 -0
  117. package/models/components/privacytorinforelayexitpolicysummary.js +51 -0
  118. package/models/components/privacytorinforelayexitpolicysummary.js.map +1 -0
  119. package/models/components/reputation.d.ts +26 -0
  120. package/models/components/reputation.d.ts.map +1 -0
  121. package/models/components/reputation.js +71 -0
  122. package/models/components/reputation.js.map +1 -0
  123. package/models/components/reputationevidence.d.ts +17 -0
  124. package/models/components/reputationevidence.d.ts.map +1 -0
  125. package/models/components/reputationevidence.js +65 -0
  126. package/models/components/reputationevidence.js.map +1 -0
  127. package/models/components/reputationevidenceexternalsignal.d.ts +23 -0
  128. package/models/components/reputationevidenceexternalsignal.d.ts.map +1 -0
  129. package/models/components/reputationevidenceexternalsignal.js +62 -0
  130. package/models/components/reputationevidenceexternalsignal.js.map +1 -0
  131. package/models/components/reputationevidencefieldvalue.d.ts +11 -0
  132. package/models/components/reputationevidencefieldvalue.d.ts.map +1 -0
  133. package/models/components/reputationevidencefieldvalue.js +51 -0
  134. package/models/components/reputationevidencefieldvalue.js.map +1 -0
  135. package/models/components/reputationevidencethreat.d.ts +12 -0
  136. package/models/components/reputationevidencethreat.d.ts.map +1 -0
  137. package/models/components/reputationevidencethreat.js +59 -0
  138. package/models/components/reputationevidencethreat.js.map +1 -0
  139. package/models/components/responseenvelopecenseyejob.d.ts +11 -0
  140. package/models/components/responseenvelopecenseyejob.d.ts.map +1 -0
  141. package/models/components/responseenvelopecenseyejob.js +51 -0
  142. package/models/components/responseenvelopecenseyejob.js.map +1 -0
  143. package/models/components/responseenvelopecenseyeresultsresponse.d.ts +11 -0
  144. package/models/components/responseenvelopecenseyeresultsresponse.d.ts.map +1 -0
  145. package/models/components/responseenvelopecenseyeresultsresponse.js +51 -0
  146. package/models/components/responseenvelopecenseyeresultsresponse.js.map +1 -0
  147. package/models/components/sapient.d.ts +15 -0
  148. package/models/components/sapient.d.ts.map +1 -0
  149. package/models/components/sapient.js +60 -0
  150. package/models/components/sapient.js.map +1 -0
  151. package/models/components/sapienterror.d.ts +11 -0
  152. package/models/components/sapienterror.d.ts.map +1 -0
  153. package/models/components/sapienterror.js +56 -0
  154. package/models/components/sapienterror.js.map +1 -0
  155. package/models/components/sapientregistrationack.d.ts +11 -0
  156. package/models/components/sapientregistrationack.d.ts.map +1 -0
  157. package/models/components/sapientregistrationack.js +56 -0
  158. package/models/components/sapientregistrationack.js.map +1 -0
  159. package/models/components/searchvaluecountsinputbody.d.ts +1 -1
  160. package/models/components/service.d.ts +2 -0
  161. package/models/components/service.d.ts.map +1 -1
  162. package/models/components/service.js +2 -0
  163. package/models/components/service.js.map +1 -1
  164. package/models/components/servicescan.d.ts +2 -0
  165. package/models/components/servicescan.d.ts.map +1 -1
  166. package/models/components/servicescan.js +2 -0
  167. package/models/components/servicescan.js.map +1 -1
  168. package/models/components/servicesonhostresponse.d.ts +6 -0
  169. package/models/components/servicesonhostresponse.d.ts.map +1 -1
  170. package/models/components/servicesonhostresponse.js +3 -4
  171. package/models/components/servicesonhostresponse.js.map +1 -1
  172. package/models/operations/index.d.ts +3 -0
  173. package/models/operations/index.d.ts.map +1 -1
  174. package/models/operations/index.js +3 -0
  175. package/models/operations/index.js.map +1 -1
  176. package/models/operations/v3threathuntingcenseyejobresults.d.ts +45 -0
  177. package/models/operations/v3threathuntingcenseyejobresults.d.ts.map +1 -0
  178. package/models/operations/v3threathuntingcenseyejobresults.js +76 -0
  179. package/models/operations/v3threathuntingcenseyejobresults.js.map +1 -0
  180. package/models/operations/v3threathuntingcenseyejobscreate.d.ts +32 -0
  181. package/models/operations/v3threathuntingcenseyejobscreate.d.ts.map +1 -0
  182. package/models/operations/v3threathuntingcenseyejobscreate.js +72 -0
  183. package/models/operations/v3threathuntingcenseyejobscreate.js.map +1 -0
  184. package/models/operations/v3threathuntingcenseyejobsget.d.ts +35 -0
  185. package/models/operations/v3threathuntingcenseyejobsget.d.ts.map +1 -0
  186. package/models/operations/v3threathuntingcenseyejobsget.js +72 -0
  187. package/models/operations/v3threathuntingcenseyejobsget.js.map +1 -0
  188. package/package.json +1 -1
  189. package/sdk/threathunting.d.ts +22 -1
  190. package/sdk/threathunting.d.ts.map +1 -1
  191. package/sdk/threathunting.js +31 -1
  192. package/sdk/threathunting.js.map +1 -1
  193. package/src/funcs/accountManagementGetMemberCreditUsage.ts +0 -1
  194. package/src/funcs/accountManagementGetOrganizationCreditUsage.ts +0 -1
  195. package/src/funcs/accountManagementGetOrganizationCredits.ts +0 -1
  196. package/src/funcs/accountManagementGetOrganizationDetails.ts +0 -1
  197. package/src/funcs/accountManagementInviteUserToOrganization.ts +0 -1
  198. package/src/funcs/accountManagementListOrganizationMembers.ts +0 -1
  199. package/src/funcs/accountManagementRemoveOrganizationMember.ts +0 -1
  200. package/src/funcs/accountManagementUpdateOrganizationMember.ts +0 -1
  201. package/src/funcs/collectionsAggregate.ts +0 -1
  202. package/src/funcs/collectionsDelete.ts +0 -1
  203. package/src/funcs/collectionsGet.ts +0 -1
  204. package/src/funcs/collectionsListEvents.ts +0 -1
  205. package/src/funcs/collectionsSearch.ts +0 -1
  206. package/src/funcs/collectionsUpdate.ts +0 -1
  207. package/src/funcs/globalDataGetCertificate.ts +0 -1
  208. package/src/funcs/globalDataGetCertificateRaw.ts +0 -1
  209. package/src/funcs/globalDataGetHost.ts +0 -1
  210. package/src/funcs/globalDataGetHostTimeline.ts +0 -1
  211. package/src/funcs/globalDataGetTrackedScan.ts +0 -1
  212. package/src/funcs/globalDataGetWebProperty.ts +0 -1
  213. package/src/funcs/globalDataListServicesOnHost.ts +0 -1
  214. package/src/funcs/threatHuntingCreateCenseyeJob.ts +195 -0
  215. package/src/funcs/threatHuntingGetCenseyeJob.ts +200 -0
  216. package/src/funcs/threatHuntingGetCenseyeJobResults.ts +202 -0
  217. package/src/funcs/threatHuntingGetHostObservationsWithCertificate.ts +0 -1
  218. package/src/funcs/threatHuntingGetTrackedScanThreatHunting.ts +0 -1
  219. package/src/funcs/threatHuntingValueCounts.ts +1 -1
  220. package/src/lib/config.ts +4 -4
  221. package/src/lib/encodings.ts +23 -4
  222. package/src/lib/files.ts +22 -0
  223. package/src/lib/matchers.ts +3 -2
  224. package/src/lib/sdks.ts +7 -5
  225. package/src/lib/security.ts +1 -2
  226. package/src/lib/url.ts +16 -14
  227. package/src/models/components/censeyejob.ts +106 -0
  228. package/src/models/components/censeyeresult.ts +48 -0
  229. package/src/models/components/censeyeresultsresponse.ts +45 -0
  230. package/src/models/components/censeyetarget.ts +77 -0
  231. package/src/models/components/countcondition.ts +1 -1
  232. package/src/models/components/createcenseyejobinputbody.ts +36 -0
  233. package/src/models/components/fieldvaluepair.ts +21 -0
  234. package/src/models/components/host.ts +19 -0
  235. package/src/models/components/index.ts +21 -0
  236. package/src/models/components/networkclassification.ts +60 -0
  237. package/src/models/components/networkmobileinfo.ts +49 -0
  238. package/src/models/components/privacy.ts +73 -0
  239. package/src/models/components/privacytorinfo.ts +35 -0
  240. package/src/models/components/privacytorinforelay.ts +227 -0
  241. package/src/models/components/privacytorinforelayexitpolicysummary.ts +40 -0
  242. package/src/models/components/reputation.ts +66 -0
  243. package/src/models/components/reputationevidence.ts +63 -0
  244. package/src/models/components/reputationevidenceexternalsignal.ts +50 -0
  245. package/src/models/components/reputationevidencefieldvalue.ts +33 -0
  246. package/src/models/components/reputationevidencethreat.ts +42 -0
  247. package/src/models/components/responseenvelopecenseyejob.ts +32 -0
  248. package/src/models/components/responseenvelopecenseyeresultsresponse.ts +36 -0
  249. package/src/models/components/sapient.ts +44 -0
  250. package/src/models/components/sapienterror.ts +38 -0
  251. package/src/models/components/sapientregistrationack.ts +38 -0
  252. package/src/models/components/searchvaluecountsinputbody.ts +1 -1
  253. package/src/models/components/service.ts +3 -0
  254. package/src/models/components/servicescan.ts +3 -0
  255. package/src/models/components/servicesonhostresponse.ts +9 -4
  256. package/src/models/operations/index.ts +3 -0
  257. package/src/models/operations/v3threathuntingcenseyejobresults.ts +107 -0
  258. package/src/models/operations/v3threathuntingcenseyejobscreate.ts +91 -0
  259. package/src/models/operations/v3threathuntingcenseyejobsget.ts +87 -0
  260. package/src/sdk/threathunting.ts +55 -1
  261. package/tests/sdk.test.ts +412 -259
package/tests/sdk.test.ts CHANGED
@@ -1,13 +1,7 @@
1
1
  import { describe, it, expect, beforeEach } from "vitest";
2
2
  import { SDK } from "@censys/platform-sdk";
3
+ import { RFCDate } from "@censys/platform-sdk/types";
3
4
  import {
4
- V3CollectionsCrudCreateRequest,
5
- V3CollectionsCrudDeleteRequest,
6
- V3CollectionsCrudGetRequest,
7
- V3CollectionsCrudUpdateRequest,
8
- V3CollectionsListEventsRequest,
9
- V3CollectionsSearchAggregateRequest,
10
- V3CollectionsSearchQueryRequest,
11
5
  V3GlobaldataAssetCertificateListPostRequest,
12
6
  V3GlobaldataAssetCertificateListRawPostRequest,
13
7
  V3GlobaldataAssetCertificateRequest,
@@ -19,291 +13,412 @@ import {
19
13
  V3GlobaldataAssetWebpropertyRequest,
20
14
  V3GlobaldataSearchAggregateRequest,
21
15
  V3GlobaldataSearchQueryRequest,
16
+ V3GlobaldataSearchConvertRequest,
17
+ V3GlobaldataScansRescanRequest,
18
+ V3GlobaldataScansGetRequest,
19
+ V3CollectionsCrudCreateRequest,
20
+ V3CollectionsCrudDeleteRequest,
21
+ V3CollectionsCrudGetRequest,
22
+ V3CollectionsCrudUpdateRequest,
23
+ V3CollectionsListEventsRequest,
24
+ V3CollectionsSearchAggregateRequest,
25
+ V3CollectionsSearchQueryRequest,
26
+ V3AccountmanagementOrgDetailsRequest,
27
+ V3AccountmanagementOrgCreditsRequest,
28
+ V3AccountmanagementOrgCreditsUsageRequest,
29
+ V3AccountmanagementListOrgMembersRequest,
30
+ V3AccountmanagementMemberCreditsUsageRequest,
31
+ V3AccountmanagementUserCreditsUsageRequest,
22
32
  V3ThreathuntingValueCountsRequest,
33
+ V3ThreathuntingGetHostObservationsWithCertificateRequest,
34
+ V3ThreathuntingThreatsListRequest,
35
+ V3ThreathuntingScansDiscoveryRequest,
36
+ V3ThreathuntingScansGetRequest,
23
37
  } from "@censys/platform-sdk/models/operations";
24
38
 
39
+ const CERT_IDS = [
40
+ "00000002741c89f06524afbbb4720876bc173aca3a6ce344e08584859b9ac34e",
41
+ "000000033b547e13ee216c65b0ff50237f0decef12acb76fce0a96afa9c70d50",
42
+ ];
43
+ const HOST_IDS = ["1.1.1.1", "8.8.8.8"];
44
+ const WEB_PROPERTY_IDS = ["104.236.29.250:443", "78.133.74.135:49152"];
45
+ const COLLECTION_QUERY =
46
+ "host.services.protocol='SSH' and host.location.country = 'Netherlands' and host.services.port = 9100 and host.autonomous_system.name = 'WORLDSTREAM'";
47
+
48
+ function thirtyDaysAgo(): RFCDate {
49
+ const d = new Date();
50
+ d.setDate(d.getDate() - 30);
51
+ return new RFCDate(d);
52
+ }
53
+
25
54
  describe("Censys SDK", () => {
26
55
  let sdk: SDK;
56
+ const orgId = process.env["ORG_ID"]!;
27
57
 
28
58
  beforeEach(() => {
29
59
  sdk = new SDK({
30
- organizationId: process.env["ORG_ID"],
60
+ organizationId: orgId,
31
61
  personalAccessToken: process.env["TOKEN"],
32
62
  });
33
63
  });
34
64
 
35
- describe("Global Data Certificate", () => {
36
- it("should get certificate by ID", async () => {
37
- const certID =
38
- "00000002741c89f06524afbbb4720876bc173aca3a6ce344e08584859b9ac34e";
39
-
40
- const request = {
41
- certificateId: certID,
42
- } satisfies V3GlobaldataAssetCertificateRequest;
43
-
44
- const response = await sdk.globalData.getCertificate(request);
45
-
46
- expect(response).toBeDefined();
47
- expect(response.result.result?.resource.fingerprintSha256).toBe(certID);
65
+ // ---------------------------------------------------------------------------
66
+ // Global Data
67
+ // ---------------------------------------------------------------------------
68
+ describe("Global Data", () => {
69
+ describe("Certificates", () => {
70
+ it("should get certificate by ID", async () => {
71
+ const request = {
72
+ certificateId: CERT_IDS[0],
73
+ } satisfies V3GlobaldataAssetCertificateRequest;
74
+
75
+ const response = await sdk.globalData.getCertificate(request);
76
+ expect(response.result.result?.resource.fingerprintSha256).toBe(
77
+ CERT_IDS[0]
78
+ );
79
+ });
80
+
81
+ it("should get certificate in raw format by ID", async () => {
82
+ const request = {
83
+ certificateId: CERT_IDS[0],
84
+ } satisfies V3GlobaldataAssetCertificateRawRequest;
85
+
86
+ const response = await sdk.globalData.getCertificateRaw(request);
87
+ expect(response.result).toBeDefined();
88
+ });
89
+
90
+ it("should get multiple certificates by IDs", async () => {
91
+ const request = {
92
+ assetCertificateListInputBody: { certificateIds: CERT_IDS },
93
+ } satisfies V3GlobaldataAssetCertificateListPostRequest;
94
+
95
+ const response = await sdk.globalData.getCertificates(request);
96
+ expect(response.result.result?.length).toBe(CERT_IDS.length);
97
+ });
98
+
99
+ it("should get multiple certificates in raw format by IDs", async () => {
100
+ const request = {
101
+ assetCertificateListInputBody: { certificateIds: CERT_IDS },
102
+ } satisfies V3GlobaldataAssetCertificateListRawPostRequest;
103
+
104
+ const response = await sdk.globalData.getCertificatesRaw(request);
105
+ expect(response.result).toBeDefined();
106
+ });
48
107
  });
49
108
 
50
- it("should get certificate in raw format by ID", async () => {
51
- const certID =
52
- "00000002741c89f06524afbbb4720876bc173aca3a6ce344e08584859b9ac34e";
53
-
54
- const request = {
55
- certificateId: certID,
56
- } satisfies V3GlobaldataAssetCertificateRawRequest;
57
-
58
- const response = await sdk.globalData.getCertificateRaw(request);
59
-
60
- expect(response).toBeDefined();
61
- expect(response.result).toBeDefined();
62
- });
63
- });
64
-
65
- it("should get multiple certificates by IDs", async () => {
66
- const certIDs = [
67
- "00000002741c89f06524afbbb4720876bc173aca3a6ce344e08584859b9ac34e",
68
- "000000033b547e13ee216c65b0ff50237f0decef12acb76fce0a96afa9c70d50",
69
- ];
70
-
71
- const request = {
72
- assetCertificateListInputBody: {
73
- certificateIds: certIDs,
74
- },
75
- } satisfies V3GlobaldataAssetCertificateListPostRequest;
76
-
77
- const response = await sdk.globalData.getCertificates(request);
78
-
79
- expect(response).toBeDefined();
80
- expect(response.result.result?.length).toBe(certIDs.length);
81
- });
82
-
83
- it("should get multiple certificates in raw format by IDs", async () => {
84
- const certIDs = [
85
- "00000002741c89f06524afbbb4720876bc173aca3a6ce344e08584859b9ac34e",
86
- "000000033b547e13ee216c65b0ff50237f0decef12acb76fce0a96afa9c70d50",
87
- ];
88
-
89
- const request = {
90
- assetCertificateListInputBody: {
91
- certificateIds: certIDs,
92
- },
93
- } satisfies V3GlobaldataAssetCertificateListRawPostRequest;
94
-
95
- const response = await sdk.globalData.getCertificatesRaw(request);
96
-
97
- expect(response).toBeDefined();
98
- expect(response.result).toBeDefined();
99
- });
100
-
101
- describe("Global Data Host List", () => {
102
- it("should get multiple hosts by IPs", async () => {
103
- const hostIDs = ["1.1.1.1", "8.8.8.8"];
104
-
105
- const request = {
106
- assetHostListInputBody: {
107
- hostIds: hostIDs,
109
+ describe("Hosts", () => {
110
+ it("should get multiple hosts by IPs", async () => {
111
+ const request = {
112
+ assetHostListInputBody: { hostIds: HOST_IDS },
113
+ } satisfies V3GlobaldataAssetHostListPostRequest;
114
+
115
+ const response = await sdk.globalData.getHosts(request);
116
+ expect(response).toBeDefined();
117
+ });
118
+
119
+ it("should get host by IP", async () => {
120
+ const request = {
121
+ hostId: "1.1.1.1",
122
+ atTime: new Date("2025-03-20T00:00:00Z"),
123
+ } satisfies V3GlobaldataAssetHostRequest;
124
+
125
+ const response = await sdk.globalData.getHost(request);
126
+ expect(response.result.result).toBeDefined();
127
+ });
128
+
129
+ it(
130
+ "should get host timeline",
131
+ async () => {
132
+ const request: V3GlobaldataAssetHostTimelineRequest = {
133
+ hostId: "125.13.31.107",
134
+ startTime: new Date("2025-03-20T00:00:00Z"),
135
+ endTime: new Date("2025-03-22T00:00:00Z"),
136
+ };
137
+
138
+ const response = await sdk.globalData.getHostTimeline(request);
139
+ expect(response.result.result).toBeDefined();
108
140
  },
109
- } satisfies V3GlobaldataAssetHostListPostRequest;
110
-
111
- const response = await sdk.globalData.getHosts(request);
112
-
113
- expect(response).toBeDefined();
141
+ 30_000
142
+ );
114
143
  });
115
144
 
116
- it("should get host by IP with optional time", async () => {
117
- const hostID = "125.13.31.107";
118
- const atTime = new Date("2025-03-20T00:00:00Z");
119
-
120
- const request = {
121
- hostId: hostID,
122
- atTime,
123
- } satisfies V3GlobaldataAssetHostRequest;
124
-
125
- const response = await sdk.globalData.getHost(request);
126
-
127
- expect(response).toBeDefined();
128
- expect(response.result.result).toBeDefined();
145
+ describe("Web Properties", () => {
146
+ it("should get web property by ID", async () => {
147
+ const request = {
148
+ webpropertyId: WEB_PROPERTY_IDS[0],
149
+ } satisfies V3GlobaldataAssetWebpropertyRequest;
150
+
151
+ const response = await sdk.globalData.getWebProperty(request);
152
+ expect(response.result.result).toBeDefined();
153
+ });
154
+
155
+ it("should get multiple web properties by IDs", async () => {
156
+ const request = {
157
+ assetWebpropertyListInputBody: {
158
+ webpropertyIds: WEB_PROPERTY_IDS,
159
+ },
160
+ } satisfies V3GlobaldataAssetWebpropertyListPostRequest;
161
+
162
+ const response = await sdk.globalData.getWebProperties(request);
163
+ expect(response.result.result?.length).toBe(WEB_PROPERTY_IDS.length);
164
+ });
129
165
  });
130
166
 
131
- it("should get host timeline with time range", async () => {
132
- const hostID = "125.13.31.107";
133
- const startTime = new Date("2025-03-20T00:00:00Z");
134
- const endTime = new Date("2025-03-22T00:00:00Z");
135
-
136
- const request: V3GlobaldataAssetHostTimelineRequest = {
137
- hostId: hostID,
138
- startTime,
139
- endTime,
140
- };
141
-
142
- const response = await sdk.globalData.getHostTimeline(request);
167
+ describe("Search", () => {
168
+ it("should perform search query", async () => {
169
+ const request = {
170
+ searchQueryInputBody: {
171
+ query: "web.port: *",
172
+ pageSize: 3,
173
+ fields: ["web.port"],
174
+ },
175
+ } satisfies V3GlobaldataSearchQueryRequest;
176
+
177
+ const response = await sdk.globalData.search(request);
178
+ expect(response.result.result).toBeDefined();
179
+ });
180
+
181
+ it("should perform aggregate search", async () => {
182
+ const request = {
183
+ searchAggregateInputBody: {
184
+ field: "web.endpoints.http.status_reason",
185
+ numberOfBuckets: 2,
186
+ query: "web.port: *",
187
+ },
188
+ } satisfies V3GlobaldataSearchAggregateRequest;
189
+
190
+ const response = await sdk.globalData.aggregate(request);
191
+ expect(response.result.result).toBeDefined();
192
+ });
193
+
194
+ it("should convert legacy search queries", async () => {
195
+ const request = {
196
+ searchConvertQueryInputBody: {
197
+ queries: ["parsed.names: censys.io AND tags: trusted"],
198
+ },
199
+ } satisfies V3GlobaldataSearchConvertRequest;
200
+
201
+ const response =
202
+ await sdk.globalData.convertLegacySearchQueries(request);
203
+ expect(response.result.result).toBeDefined();
204
+ });
205
+ });
143
206
 
144
- expect(response).toBeDefined();
145
- expect(response.result.result).toBeDefined();
207
+ describe("Tracked Scans (Live Rescan)", () => {
208
+ it("should create and get a tracked scan", async () => {
209
+ const createRequest = {
210
+ scansRescanInputBody: {
211
+ target: {
212
+ serviceId: {
213
+ ip: "1.1.1.1",
214
+ port: 443,
215
+ protocol: "HTTP",
216
+ transportProtocol: "tcp" as const,
217
+ },
218
+ },
219
+ },
220
+ } satisfies V3GlobaldataScansRescanRequest;
221
+
222
+ const createResponse =
223
+ await sdk.globalData.createTrackedScan(createRequest);
224
+ const scanId = createResponse.result.result?.trackedScanId ?? "";
225
+ expect(scanId).toBeTruthy();
226
+
227
+ const getRequest = { scanId } satisfies V3GlobaldataScansGetRequest;
228
+ const getResponse = await sdk.globalData.getTrackedScan(getRequest);
229
+ expect(getResponse.result.result).toBeDefined();
230
+ });
146
231
  });
147
232
  });
148
233
 
149
- describe("Global Data Web Property", () => {
150
- it("should get web property by ID", async () => {
151
- const webPropertyID = "104.236.29.250:443";
152
-
153
- const request = {
154
- webpropertyId: webPropertyID,
155
- } satisfies V3GlobaldataAssetWebpropertyRequest;
156
-
157
- const response = await sdk.globalData.getWebProperty(request);
158
-
159
- expect(response).toBeDefined();
234
+ // ---------------------------------------------------------------------------
235
+ // Collections
236
+ // ---------------------------------------------------------------------------
237
+ describe("Collections", () => {
238
+ it("should list collections", async () => {
239
+ const response = await sdk.collections.list({});
160
240
  expect(response.result.result).toBeDefined();
161
241
  });
162
242
 
163
- it("should get multiple web properties by IDs", async () => {
164
- const webPropertyIDs = ["104.236.29.250:443", "78.133.74.135:49152"];
165
-
166
- const request = {
167
- assetWebpropertyListInputBody: {
168
- webpropertyIds: webPropertyIDs,
169
- },
170
- } satisfies V3GlobaldataAssetWebpropertyListPostRequest;
171
-
172
- const response = await sdk.globalData.getWebProperties(request);
173
-
174
- expect(response).toBeDefined();
175
- expect(response.result.result?.length).toBe(webPropertyIDs.length);
176
- });
243
+ it(
244
+ "should perform full CRUD operations",
245
+ async () => {
246
+ const tag = Math.random().toString(36).substring(2, 15);
247
+ const name = `Test Collection TS - ${tag}`;
248
+ const description = `Description - ${tag}`;
249
+
250
+ // Create
251
+ const createRequest = {
252
+ crudCreateInputBody: {
253
+ name,
254
+ description,
255
+ query: COLLECTION_QUERY,
256
+ },
257
+ } satisfies V3CollectionsCrudCreateRequest;
258
+ const createResponse = await sdk.collections.create(createRequest);
259
+ const collectionUid = createResponse.result.result?.id ?? "";
260
+ expect(collectionUid).toBeTruthy();
261
+
262
+ // Get
263
+ const getRequest = {
264
+ collectionUid,
265
+ } satisfies V3CollectionsCrudGetRequest;
266
+ const getResponse = await sdk.collections.get(getRequest);
267
+ expect(getResponse.result.result?.name).toBe(name);
268
+
269
+ // List Events
270
+ const listEventsRequest = {
271
+ collectionUid,
272
+ } satisfies V3CollectionsListEventsRequest;
273
+ const listEventsResponse =
274
+ await sdk.collections.listEvents(listEventsRequest);
275
+ expect(listEventsResponse).toBeDefined();
276
+
277
+ // Aggregate
278
+ const aggregateRequest = {
279
+ collectionUid,
280
+ searchAggregateInputBody: {
281
+ field: "host.autonomous_system.name",
282
+ numberOfBuckets: 10,
283
+ query: "host.services.labels.value = 'REMOTE_ACCESS'",
284
+ },
285
+ } satisfies V3CollectionsSearchAggregateRequest;
286
+ const aggregateResponse =
287
+ await sdk.collections.aggregate(aggregateRequest);
288
+ expect(aggregateResponse).toBeDefined();
289
+
290
+ // Search
291
+ const searchRequest = {
292
+ collectionUid,
293
+ searchQueryInputBody: {
294
+ query: "host.services.labels.value = 'REMOTE_ACCESS'",
295
+ },
296
+ } satisfies V3CollectionsSearchQueryRequest;
297
+ const searchResponse = await sdk.collections.search(searchRequest);
298
+ expect(searchResponse).toBeDefined();
299
+
300
+ // Update
301
+ const newName = `Updated - ${tag}`;
302
+ const updateRequest = {
303
+ collectionUid,
304
+ crudUpdateInputBody: {
305
+ name: newName,
306
+ description,
307
+ query: COLLECTION_QUERY,
308
+ },
309
+ } satisfies V3CollectionsCrudUpdateRequest;
310
+ const updateResponse = await sdk.collections.update(updateRequest);
311
+ expect(updateResponse).toBeDefined();
312
+
313
+ const updatedGet = await sdk.collections.get(getRequest);
314
+ expect(updatedGet.result.result?.name).toBe(newName);
315
+
316
+ // Delete
317
+ const deleteRequest = {
318
+ collectionUid,
319
+ } satisfies V3CollectionsCrudDeleteRequest;
320
+ await sdk.collections.delete(deleteRequest);
321
+
322
+ await expect(sdk.collections.get(getRequest)).rejects.toThrow();
323
+ },
324
+ 60_000
325
+ );
177
326
  });
178
327
 
179
- describe("Global Data Search", () => {
180
- it("should perform aggregate search", async () => {
181
- const request = {
182
- searchAggregateInputBody: {
183
- field: "web.endpoints.http.status_reason",
184
- numberOfBuckets: 2,
185
- query: "web.port: *",
186
- },
187
- } satisfies V3GlobaldataSearchAggregateRequest;
188
-
189
- const response = await sdk.globalData.aggregate(request);
190
-
191
- expect(response).toBeDefined();
192
- expect(response.result.result).toBeDefined();
328
+ // ---------------------------------------------------------------------------
329
+ // Account Management
330
+ // ---------------------------------------------------------------------------
331
+ describe("Account Management", () => {
332
+ describe("Organization", () => {
333
+ it("should get organization details", async () => {
334
+ const request = {
335
+ organizationId: orgId,
336
+ includeMemberCounts: true,
337
+ } satisfies V3AccountmanagementOrgDetailsRequest;
338
+
339
+ const response =
340
+ await sdk.accountManagement.getOrganizationDetails(request);
341
+ expect(response.result.result).toBeDefined();
342
+ });
343
+
344
+ it("should get organization credits", async () => {
345
+ const request = {
346
+ organizationId: orgId,
347
+ } satisfies V3AccountmanagementOrgCreditsRequest;
348
+
349
+ const response =
350
+ await sdk.accountManagement.getOrganizationCredits(request);
351
+ expect(response.result.result).toBeDefined();
352
+ });
353
+
354
+ it("should get organization credit usage", async () => {
355
+ const request = {
356
+ organizationId: orgId,
357
+ startDate: thirtyDaysAgo(),
358
+ granularity: "daily",
359
+ } satisfies V3AccountmanagementOrgCreditsUsageRequest;
360
+
361
+ const response =
362
+ await sdk.accountManagement.getOrganizationCreditUsage(request);
363
+ expect(response.result.result).toBeDefined();
364
+ });
193
365
  });
194
366
 
195
- it("should perform search query", async () => {
196
- const pageSize = 3;
197
-
198
- const request = {
199
- searchQueryInputBody: {
200
- query: "web.port: *",
201
- pageSize,
202
- fields: ["web.port"],
203
- },
204
- } satisfies V3GlobaldataSearchQueryRequest;
205
-
206
- const response = await sdk.globalData.search(request);
207
-
208
- expect(response).toBeDefined();
209
- expect(response.result.result).toBeDefined();
367
+ describe("Members", () => {
368
+ it("should list organization members", async () => {
369
+ const request = {
370
+ organizationId: orgId,
371
+ } satisfies V3AccountmanagementListOrgMembersRequest;
372
+
373
+ const response =
374
+ await sdk.accountManagement.listOrganizationMembers(request);
375
+ expect(response.result.result).toBeDefined();
376
+ });
377
+
378
+ it("should get member credit usage", async () => {
379
+ const membersResponse =
380
+ await sdk.accountManagement.listOrganizationMembers({
381
+ organizationId: orgId,
382
+ });
383
+ const userId =
384
+ membersResponse.result.result?.members?.[0]?.uid ?? "";
385
+ expect(userId).toBeTruthy();
386
+
387
+ const request = {
388
+ organizationId: orgId,
389
+ userId,
390
+ startDate: thirtyDaysAgo(),
391
+ granularity: "daily",
392
+ } satisfies V3AccountmanagementMemberCreditsUsageRequest;
393
+
394
+ const response =
395
+ await sdk.accountManagement.getMemberCreditUsage(request);
396
+ expect(response.result.result).toBeDefined();
397
+ });
210
398
  });
211
- });
212
-
213
- describe("Collections", () => {
214
- it("should perform full CRUD operations on collections", async () => {
215
- const randomString = Math.random().toString(36).substring(2, 15); // Make it random to prevent name collisions. Might require manual test clean up from time to time.
216
- const collectionName = `Test Collection NL - ${randomString}`;
217
- const collectionDescription = `Test Collection NL - ${randomString} description`;
218
- const collectionQuery =
219
- "host.services.protocol='SSH' and host.location.country = 'Netherlands' and host.services.port = 9100 and host.autonomous_system.name = 'WORLDSTREAM'";
220
-
221
- const createRequest = {
222
- crudCreateInputBody: {
223
- name: collectionName,
224
- description: collectionDescription,
225
- query: collectionQuery,
226
- },
227
- } satisfies V3CollectionsCrudCreateRequest;
228
-
229
- const response = await sdk.collections.create(createRequest);
230
- expect(response).toBeDefined();
231
-
232
- const collectionUid = response.result.result?.id ?? "";
233
- expect(collectionUid).toBeDefined();
234
-
235
- const getRequest = {
236
- collectionUid,
237
- } satisfies V3CollectionsCrudGetRequest;
238
-
239
- const getResult = await sdk.collections.get(getRequest);
240
- expect(getResult).toBeDefined();
241
-
242
- const listEventsRequest = {
243
- collectionUid,
244
- } satisfies V3CollectionsListEventsRequest;
245
-
246
- const listEventsResult = await sdk.collections.listEvents(
247
- listEventsRequest
248
- );
249
- expect(listEventsResult).toBeDefined();
250
-
251
- const searchAggregateRequest = {
252
- collectionUid,
253
- searchAggregateInputBody: {
254
- field: "host.autonomous_system.name",
255
- numberOfBuckets: 10,
256
- query: "host.services.labels.value = 'REMOTE_ACCESS'",
257
- },
258
- } satisfies V3CollectionsSearchAggregateRequest;
259
399
 
260
- const searchAggregateResult = await sdk.collections.aggregate(
261
- searchAggregateRequest
262
- );
263
- expect(searchAggregateResult).toBeDefined();
264
-
265
- const searchQueryRequest = {
266
- collectionUid,
267
- searchQueryInputBody: {
268
- query: "host.services.labels.value = 'REMOTE_ACCESS'",
269
- },
270
- } satisfies V3CollectionsSearchQueryRequest;
271
-
272
- const searchQueryResult = await sdk.collections.search(
273
- searchQueryRequest
274
- );
275
-
276
- expect(searchQueryResult).toBeDefined();
277
-
278
- const newDescription = `New desc - ${randomString} description`;
279
- const newName = `New name - ${randomString}`;
280
-
281
- const updateRequest = {
282
- collectionUid,
283
- crudUpdateInputBody: {
284
- description: newDescription,
285
- name: newName,
286
- query: collectionQuery,
287
- },
288
- } satisfies V3CollectionsCrudUpdateRequest;
289
-
290
- const updateResult = await sdk.collections.update(updateRequest);
291
- expect(updateResult).toBeDefined();
292
-
293
- const updatedGetResult = await sdk.collections.get(getRequest);
294
- expect(updatedGetResult.result.result?.description).toBe(newDescription);
295
-
296
- const deleteRequest = {
297
- collectionUid,
298
- } satisfies V3CollectionsCrudDeleteRequest;
299
-
300
- const deleteResult = await sdk.collections.delete(deleteRequest);
301
- expect(deleteResult).toBeDefined();
302
-
303
- await expect(sdk.collections.get(getRequest)).rejects.toThrow();
304
- }, 60_000); // Extra long-lived to ensure it we have time to complete these tests.
400
+ describe("User", () => {
401
+ it("should get user credits", async () => {
402
+ const response = await sdk.accountManagement.getUserCredits();
403
+ expect(response.result.result).toBeDefined();
404
+ });
405
+
406
+ it("should get user credit usage", async () => {
407
+ const request = {
408
+ startDate: thirtyDaysAgo(),
409
+ granularity: "daily",
410
+ } satisfies V3AccountmanagementUserCreditsUsageRequest;
411
+
412
+ const response =
413
+ await sdk.accountManagement.getUserCreditsUsage(request);
414
+ expect(response.result.result).toBeDefined();
415
+ });
416
+ });
305
417
  });
306
418
 
419
+ // ---------------------------------------------------------------------------
420
+ // Threat Hunting
421
+ // ---------------------------------------------------------------------------
307
422
  describe("Threat Hunting", () => {
308
423
  it("should perform value counts search", async () => {
309
424
  const request = {
@@ -320,9 +435,47 @@ describe("Censys SDK", () => {
320
435
  } satisfies V3ThreathuntingValueCountsRequest;
321
436
 
322
437
  const response = await sdk.threatHunting.valueCounts(request);
438
+ expect(response.result.result).toBeDefined();
439
+ });
440
+
441
+ it("should get host observations with certificate", async () => {
442
+ const request = {
443
+ certificateId: CERT_IDS[0],
444
+ } satisfies V3ThreathuntingGetHostObservationsWithCertificateRequest;
445
+
446
+ const response =
447
+ await sdk.threatHunting.getHostObservationsWithCertificate(request);
448
+ expect(response.result.result).toBeDefined();
449
+ });
450
+
451
+ it("should list threats", async () => {
452
+ const request = {} satisfies V3ThreathuntingThreatsListRequest;
323
453
 
324
- expect(response).toBeDefined();
454
+ const response = await sdk.threatHunting.listThreats(request);
325
455
  expect(response.result.result).toBeDefined();
326
456
  });
457
+
458
+ it("should create and get a tracked scan (Live Discovery)", async () => {
459
+ const createRequest = {
460
+ scansDiscoveryInputBody: {
461
+ target: {
462
+ hostPort: {
463
+ ip: "1.1.1.1",
464
+ port: 443,
465
+ },
466
+ },
467
+ },
468
+ } satisfies V3ThreathuntingScansDiscoveryRequest;
469
+
470
+ const createResponse =
471
+ await sdk.threatHunting.createTrackedScan(createRequest);
472
+ const scanId = createResponse.result.result?.trackedScanId ?? "";
473
+ expect(scanId).toBeTruthy();
474
+
475
+ const getRequest = { scanId } satisfies V3ThreathuntingScansGetRequest;
476
+ const getResponse =
477
+ await sdk.threatHunting.getTrackedScanThreatHunting(getRequest);
478
+ expect(getResponse.result.result).toBeDefined();
479
+ });
327
480
  });
328
481
  });