From 29025ae3174bdc3d6594ba58f37c610ab4cbda4e Mon Sep 17 00:00:00 2001 From: he2ss Date: Thu, 9 Apr 2026 12:29:45 +0200 Subject: [PATCH 1/2] add dev/prod codeartifact workflows (#19) --- .github/workflows/publish_sdk.yml | 97 ++++++++++++++++++++++++++ .github/workflows/publish_sdk_dev.yml | 57 +++++++++++++++ .github/workflows/publish_sdk_prod.yml | 80 +++++++++++++++++++++ 3 files changed, 234 insertions(+) create mode 100644 .github/workflows/publish_sdk.yml create mode 100644 .github/workflows/publish_sdk_dev.yml create mode 100644 .github/workflows/publish_sdk_prod.yml diff --git a/.github/workflows/publish_sdk.yml b/.github/workflows/publish_sdk.yml new file mode 100644 index 0000000..c7034a3 --- /dev/null +++ b/.github/workflows/publish_sdk.yml @@ -0,0 +1,97 @@ +name: "SDK publication" + +on: + workflow_call: + inputs: + domain: + type: string + description: "Domain to release" + required: true + default: "crowdsec-dev" + package: + type: string + description: "Package to release" + required: true + default: "crowdsec-tracker-api" + env: + type: string + description: "Environment to release" + required: true + default: "dev" + secrets: + AWS_PROD_ACCOUNT: + required: true + AWS_PROD_ROLE: + required: true + AWS_REGION: + required: true + +jobs: + generate-sdks: + runs-on: ubuntu-latest + permissions: + id-token: write + contents: read + name: publish python sdk client + env: + AWS_DEFAULT_REGION: ${{ secrets.AWS_REGION }} + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Configure AWS credentials for package publication + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ secrets.AWS_PROD_ROLE }} + role-session-name: github-action-codeartifact + aws-region: ${{ secrets.AWS_REGION }} + + - name: setup python + uses: actions/setup-python@v3 + with: + python-version: 3.11 + + - name: Install dependencies + run: | + export CODEARTIFACT_AUTH_TOKEN=$(aws codeartifact get-authorization-token --domain crowdsec-prod --domain-owner ${{ secrets.AWS_PROD_ACCOUNT }} --query authorizationToken --output text --region ${{ secrets.AWS_REGION }}) + pip install wheel twine build toml + + - name: Get package version + id: package-version + run: | + version=$(python -c "import toml; print(toml.load('pyproject.toml')['project']['version'])") + # replace - with . to match the package version + version=${version/-/.} + echo "version=$version" >> "$GITHUB_OUTPUT" + echo "Version : $version" + + - name: Build Python Package + run: | + python -m build + + - name: Configure AWS credentials for package publication + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ secrets.AWS_PROD_ROLE }} + role-session-name: github-action-codeartifact + aws-region: ${{ secrets.AWS_REGION }} + + - name: Delete old package + if: ${{ inputs.env }} == "dev" + run: | + package_name=${{ inputs.package }} + # normalize package name + package_name=${package_name/"_"/"-"} + echo "Deleting old package $package_name version ${{ steps.package-version.outputs.version }}" + aws codeartifact delete-package-versions --domain ${{ inputs.domain }} --domain-owner ${{ secrets.AWS_PROD_ACCOUNT }} \ + --repository crowdsec --format pypi \ + --package $package_name --versions ${{ steps.package-version.outputs.version }} --region ${{ secrets.AWS_REGION }} || true + + - name: Publish python Package + run: | + package_name=${{ inputs.package }} + # normalize package name + package_name=${package_name/"_"/"-"} + echo "Publishing version ${{ steps.package-version.outputs.version }}" + aws codeartifact login --tool twine --domain ${{ inputs.domain }} --domain-owner ${{ secrets.AWS_PROD_ACCOUNT }} --region ${{ secrets.AWS_REGION }} --repository crowdsec && + twine upload --repository codeartifact dist/* diff --git a/.github/workflows/publish_sdk_dev.yml b/.github/workflows/publish_sdk_dev.yml new file mode 100644 index 0000000..6e90dbe --- /dev/null +++ b/.github/workflows/publish_sdk_dev.yml @@ -0,0 +1,57 @@ +name: "SDK publication (DEV)" + +on: + pull_request: + branches: + - dev + paths: + - "crowdsec_tracker_api/**" + - ".github/workflows/publish_sdk_dev.yml" + - ".github/workflows/publish_sdk.yml" + - "pyproject.toml" + +jobs: + test-package: + runs-on: ubuntu-latest + permissions: + id-token: write + contents: read + steps: + - uses: actions/checkout@v4 + - name: setup python + uses: actions/setup-python@v3 + with: + python-version: 3.11 + - name: Install dependencies + run: | + pip install -e . + - name: Run basic import + run: | + python -c "import crowdsec_tracker_api" + + publish-tracker-api-sdks-dev: + needs: test-package + uses: ./.github/workflows/publish_sdk.yml + with: + env: "dev" + domain: "crowdsec-prod" + package: "crowdsec-tracker-api" + secrets: + AWS_PROD_ROLE: ${{ secrets.AWS_CODEARTIFACT_PROD_ROLE }} + AWS_PROD_ACCOUNT: ${{ secrets.AWS_PROD_ACCOUNT }} + AWS_REGION: ${{ secrets.AWS_REGION }} + + delete-pr-and-branch: + needs: publish-tracker-api-sdks-dev + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + env: + GH_TOKEN: ${{ github.token }} + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Delete branch and PR + run: | + gh pr merge ${{ github.event.number }} --squash --auto diff --git a/.github/workflows/publish_sdk_prod.yml b/.github/workflows/publish_sdk_prod.yml new file mode 100644 index 0000000..7b5ce5c --- /dev/null +++ b/.github/workflows/publish_sdk_prod.yml @@ -0,0 +1,80 @@ +name: "Merge PR, release & publish SDKs (PROD)" + +on: + pull_request: + branches: + - main + paths: + - "crowdsec_tracker_api/**" + - ".github/workflows/publish_sdk_prod.yml" + - "pyproject.toml" + +jobs: + test-package: + runs-on: ubuntu-latest + permissions: + id-token: write + contents: read + steps: + - uses: actions/checkout@v4 + - name: setup python + uses: actions/setup-python@v3 + with: + python-version: 3.11 + - name: Install dependencies + run: | + pip install -e . + - name: Run basic import + run: | + python -c "import crowdsec_tracker_api" + + merge-to-main: + needs: test-package + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + env: + GH_TOKEN: ${{ github.token }} + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Merge PR to main + run: | + gh pr merge ${{ github.event.number }} --squash --auto + + make-release: + needs: merge-to-main + runs-on: ubuntu-latest + permissions: + contents: write + env: + GH_TOKEN: ${{ github.token }} + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install toml + - name: get package version + id: package-version + run: | + echo "version=$(python -c "import toml; print(toml.load('pyproject.toml')['project']['version'])")" >> "$GITHUB_OUTPUT" + - name: Create release + uses: ncipollo/release-action@v1 + with: + tag: ${{ steps.package-version.outputs.version }} + makeLatest: true + + publish-tracker-api-sdks-prod: + needs: make-release + uses: ./.github/workflows/publish_sdk.yml + with: + env: "prod" + domain: "crowdsec-prod" + package: "crowdsec-tracker-api" + secrets: + AWS_PROD_ROLE: ${{ secrets.AWS_CODEARTIFACT_PROD_ROLE }} + AWS_PROD_ACCOUNT: ${{ secrets.AWS_PROD_ACCOUNT }} + AWS_REGION: ${{ secrets.AWS_REGION }} From 74b277a3c281f24f495827116512e50b2a0dd9a1 Mon Sep 17 00:00:00 2001 From: he2ss <19668340+he2ss@users.noreply.github.com> Date: Thu, 9 Apr 2026 11:04:22 +0000 Subject: [PATCH 2/2] Update python SDK v0.15.22-dev80 --- crowdsec_tracker_api/__init__.py | 68 +- .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2877 bytes .../__pycache__/base_model.cpython-311.pyc | Bin 4407 -> 4370 bytes .../__pycache__/http_client.cpython-311.pyc | Bin 7797 -> 7760 bytes .../__pycache__/models.cpython-311.pyc | Bin 0 -> 80465 bytes crowdsec_tracker_api/models.py | 2224 ++++-- .../__pycache__/__init__.cpython-311.pyc | Bin 236 -> 199 bytes .../services/__pycache__/cves.cpython-311.pyc | Bin 0 -> 11011 bytes .../__pycache__/fingerprints.cpython-311.pyc | Bin 0 -> 10917 bytes .../__pycache__/integrations.cpython-311.pyc | Bin 0 -> 8074 bytes .../__pycache__/products.cpython-311.pyc | Bin 0 -> 3781 bytes .../tracker_events.cpython-311.pyc | Bin 0 -> 2913 bytes .../__pycache__/tracker_tags.cpython-311.pyc | Bin 0 -> 5697 bytes .../__pycache__/vendors.cpython-311.pyc | Bin 0 -> 10350 bytes crowdsec_tracker_api/services/cves.py | 49 +- crowdsec_tracker_api/services/fingerprints.py | 28 +- crowdsec_tracker_api/services/integrations.py | 4 +- crowdsec_tracker_api/services/products.py | 6 +- crowdsec_tracker_api/services/tags.py | 65 - .../services/tracker_events.py | 41 + crowdsec_tracker_api/services/tracker_tags.py | 115 + crowdsec_tracker_api/services/vendors.py | 173 +- doc/Cves.md | 80 +- doc/Fingerprints.md | 40 +- doc/Integrations.md | 4 + doc/Models.md | 623 +- doc/Products.md | 2 +- doc/README.md | 118 +- doc/Tags.md | 89 - doc/TrackerEvents.md | 53 + doc/TrackerTags.md | 173 + doc/Vendors.md | 274 +- let-openapi.json | 7114 ++++++++++++++++- pyproject.toml | 2 +- uv.lock | 332 + 35 files changed, 10340 insertions(+), 1337 deletions(-) create mode 100644 crowdsec_tracker_api/__pycache__/__init__.cpython-311.pyc create mode 100644 crowdsec_tracker_api/__pycache__/models.cpython-311.pyc create mode 100644 crowdsec_tracker_api/services/__pycache__/cves.cpython-311.pyc create mode 100644 crowdsec_tracker_api/services/__pycache__/fingerprints.cpython-311.pyc create mode 100644 crowdsec_tracker_api/services/__pycache__/integrations.cpython-311.pyc create mode 100644 crowdsec_tracker_api/services/__pycache__/products.cpython-311.pyc create mode 100644 crowdsec_tracker_api/services/__pycache__/tracker_events.cpython-311.pyc create mode 100644 crowdsec_tracker_api/services/__pycache__/tracker_tags.cpython-311.pyc create mode 100644 crowdsec_tracker_api/services/__pycache__/vendors.cpython-311.pyc delete mode 100644 crowdsec_tracker_api/services/tags.py create mode 100644 crowdsec_tracker_api/services/tracker_events.py create mode 100644 crowdsec_tracker_api/services/tracker_tags.py delete mode 100644 doc/Tags.md create mode 100644 doc/TrackerEvents.md create mode 100644 doc/TrackerTags.md create mode 100644 uv.lock diff --git a/crowdsec_tracker_api/__init__.py b/crowdsec_tracker_api/__init__.py index 1fb352c..565ea87 100644 --- a/crowdsec_tracker_api/__init__.py +++ b/crowdsec_tracker_api/__init__.py @@ -1,47 +1,34 @@ from enum import Enum from .models import * from .base_model import Page -from .services.integrations import Integrations from .services.cves import Cves from .services.vendors import Vendors from .services.products import Products -from .services.tags import Tags +from .services.tracker_tags import TrackerTags from .services.fingerprints import Fingerprints +from .services.tracker_events import TrackerEvents +from .services.integrations import Integrations from .http_client import ApiKeyAuth class Server(Enum): production_server = 'https://admin.api.crowdsec.net/v1' __all__ = [ - 'Integrations', 'Cves', 'Vendors', 'Products', - 'Tags', + 'TrackerTags', 'Fingerprints', - 'ApiKeyCredentials', - 'BasicAuthCredentials', - 'BlocklistSubscription', - 'CVESubscription', - 'FingerprintSubscription', - 'HTTPValidationError', - 'IntegrationCreateRequest', - 'IntegrationCreateResponse', - 'IntegrationGetResponse', - 'IntegrationGetResponsePage', - 'IntegrationType', - 'IntegrationUpdateRequest', - 'IntegrationUpdateResponse', - 'Links', - 'OutputFormat', - 'Stats', - 'ValidationError', + 'TrackerEvents', + 'Integrations', 'AdjustmentScore', 'AffectedComponent', 'AllowlistSubscription', 'AttackDetail', 'Behavior', - 'CVEEvent', + 'BlocklistSubscription', + 'CVEEventOutput', + 'CVEExploitationPhase', 'CVEResponseBase', 'CVEsubscription', 'CWE', @@ -49,37 +36,68 @@ class Server(Enum): 'Classifications', 'EntityType', 'ExploitationPhase', + 'ExploitationPhaseChangeEventItem', + 'ExploitationPhaseChangeEventsResponsePage', + 'FacetBucket', + 'FingerprintEventOutput', 'FingerprintRuleResponse', 'FingerprintRuleSummary', + 'FingerprintSubscription', 'FingerprintTimelineItem', 'GetCVEIPsResponsePage', + 'GetCVEProtectRulesResponse', 'GetCVEResponse', 'GetCVESubscribedIntegrationsResponsePage', - 'GetCVEsFilterBy', 'GetCVEsResponsePage', 'GetCVEsSortBy', 'GetCVEsSortOrder', 'GetFingerprintIPsResponsePage', 'GetFingerprintRulesResponsePage', 'GetFingerprintSubscribedIntegrationsResponsePage', + 'GetVendorIPsResponsePage', + 'GetVendorSubscribedIntegrationsResponsePage', + 'HTTPValidationError', 'History', 'IPItem', 'IntegrationResponse', 'IntervalOptions', + 'IpsDetailsStats', + 'Links', 'Location', 'LookupImpactCVEItem', 'LookupImpactFingerprintItem', 'LookupImpactResponsePage', - 'LookupListItem', - 'LookupListResponsePage', + 'LookupListItemWithStats', + 'LookupListWithStatsResponsePage', 'MitreTechnique', + 'OutputFormat', + 'ProtectRule', + 'ProtectRuleTag', 'Reference', 'ScoreBreakdown', 'Scores', 'SinceOptions', 'SubscribeCVEIntegrationRequest', 'SubscribeFingerprintIntegrationRequest', + 'SubscribeVendorIntegrationRequest', + 'ThreatContext', 'TimelineItem', + 'TopProductItem', + 'ValidationError', + 'VendorSortBy', + 'VendorStatsResponse', + 'VendorSubscription', + 'ApiKeyCredentials', + 'BasicAuthCredentials', + 'CVESubscription', + 'IntegrationCreateRequest', + 'IntegrationCreateResponse', + 'IntegrationGetResponse', + 'IntegrationGetResponsePage', + 'IntegrationType', + 'IntegrationUpdateRequest', + 'IntegrationUpdateResponse', + 'Stats', 'ApiKeyAuth', 'Server', 'Page' diff --git a/crowdsec_tracker_api/__pycache__/__init__.cpython-311.pyc b/crowdsec_tracker_api/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3ee642f4ad514ac79f7393c0374ea1f68768fa6 GIT binary patch literal 2877 zcma)8OLH4V5T3PUN!H6x*(N+pisE4?EZ_(!s%+sTE=*!9kx+Zt+U$<4L9>s{%*rvR z9H@eSkUIw`;E!CcTer>ht2%bNF{EPev z)Zc25KJy9j>~|oZAQ!m?MV?_A26E@z5}g~UcbS&FvRT&HJe~I{W<}E#TJ>sXP19An z;ML8#rfam}HO;1`7ii0Cn{7?k>7ut}E@`?!m%SBpMbk~X>aCe;2AV^+klXqJxovFx zQUaUdA3tX26uFB(8|J#Z)JNOPPZhjv$nw4)c~6aaV7#x8Bl{GqcW;b2ysP)H?*>ef zwIdd|ks}n{7%3M@Lk=t zfZ*%UJK0U|0+KaU*HoSQl3d(%zl*r=z~6l*U|25i zo}6F@?CJ$x82Et8&Mu|F86{lwqX*n!BvjiWo4Z25W`2Q%O{lEx;h{Yy0h66Q8aSgF z@pkXtzTVfnkq9Fp*VOn?NCP7D_8tvwj^!et$C!g=j`vc4=hc>a_xEMHM{Ul@332pX zm{u5bS>N{s5$A*R5SBEn=FJ(XH?$!XwSfl$dvg2#BzS6~ih9|&X**c#MG)9RuIEBJ zzub)+ehlH1exWcyG5V3`+3Z~AClvgiXAFpkDeIMMe2yZQ5%O6f(f#**2mG}ubOe!#@uxm?N(?=lxN`8psuN4#k2R*_w> zRV(7rm(LgN*YMpIN;<7#!WRDRFhc?K1|EUcC)xB7nWB931H#Sk1XB z^_E;zARF8Cu0A&$fRM+hhW8=%xtu>F{)o%kVUUFL>R}L!qVT{AZAWjZipW>H_A;LL|atnv((%{~Ek>XSFJJx~#Rne>k_Xy!t`lkxK_ zpOw3w$t9aUE7BSa!5GmCfb~eoX5kFA2SEsHQT0mi=;Die-i*JSMEGhlQrnpNPOcz7>0uyK5)&=pNCXKy}l^vMIGJ)={p|WqAXr=d~O0 zed2TW5QggF!mH3Q0Jn tiawbX+f_1eO;Dj-lnvv?1)A-C8vLWse=k{;Z;i&>1-k4XSJh8D>OV{P^Bn*H literal 0 HcmV?d00001 diff --git a/crowdsec_tracker_api/__pycache__/base_model.cpython-311.pyc b/crowdsec_tracker_api/__pycache__/base_model.cpython-311.pyc index a48f15d154982d0e684afc810c60b74f0dc1dd88..7b9a0cdefda6b2affaefc7f9e5919d8067cf4fcf 100644 GIT binary patch delta 96 zcmdn4G)akjIWI340}w1~zrK-Mnb|E^KO;XkRlle-FE6!7KfXM_C|kd%ELAtLAQMif prvl{?OHxzfi&L`olZ*1pQ;JiQ<4cMXle1Hc;()mZYY{7pG+FCl}?Hrxd3q$Cnf(CTFJ>#RHXYc3~3bVfn>a{cCe9pM(Ga{aq%p delta 143 zcmca$^VNoXIWI340}!y^oV$_x9AkE+enx(7s(w*vUS4XEetda;QMP`3Nq&Bgen4eO zMt+{Yv7Vu!o}r0;Vo|P{iGEIIl70bL0wk_qoLQ2pTacKXotU0l43&s4PRWi>PX!v6 iSdw3)UtE${l9{YuT$H?7o=KF4 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%0D&Sj zu>Hf}MHCjX)`%o$hD?|k z(jetMfz9<~2VwAHD@y@(;Gv>QVd&a0^$A7t&FV;yy&7n(h&CX94ZP`5f}#nAUPg_o zq!g4hkfuioiY6F(8M#+SDKGbh(u}Cl7f{YX?j9v5nqcS)NV7Uh`NI97G&LH~=|RFw zI7}%K?fN2KuCiUjrD!6Jhrx?mxsJdX@K9T#a?crZ$FvmZ+~fl`rC{3fVzK%%=iXX% z?&$we-FGnKAYdyYmbp8q$lTvnZSJJ0>T-WsTHcrYI@Uc5NYRMBq)^-A@%ve$Ab1(& zL@aCMpc*6k=nFdxc9ucDGSgCSors z)S-9;0ld7`KmZ3syfQ(~zw!715wAQvWDqYbSQ3mIW6!R^FCs{XgCRsZZc2KpcG#S@ zCsHcmk|8#9bt30;Z+pJ`YipAsIj4;>M;I_+#9mUUZBa!42?dG}(GXvFBGeEOX>vjc zq&W~L(U~FTV`47p_;gKpy((*1PRxNtt2tRaJ1&O}iQmEEgaH*Dh`ppx)A30ux*2jA zM9d|Di#8mpjVL;oErFs(ylGgO$K%Ij2$&!fCZ62Y!#5s@!+GIiEc$<3?h5vj|E1$K zcaW^YfcYSn&Ew#w3<_=K2C8fNjC8drrS z8Y|IWNeJTqrnwt#pSxpV?uLP{T|M}<);CMMt|N4tSlV7lNJ3n<1UjRQL;=9DqlKs^ zLj(tt9lN;AU4_ZYOBQ7kGA+fPh;xxhctM~ZexcQlyQE( zPnR^z;*2*~0+r-4E>OwGgq#U4#DZa#hjEuQ%;K|AiBmfqNW6h91VB!qg;)$kaEWBc oE^dtI6*BWcnh|fl5Y9c~O)|sk(lpRSRGK>iY09Hemux2g{}|=VW&i*H literal 0 HcmV?d00001 diff --git a/crowdsec_tracker_api/models.py b/crowdsec_tracker_api/models.py index 94c0744..a997724 100644 --- a/crowdsec_tracker_api/models.py +++ b/crowdsec_tracker_api/models.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: -# timestamp: 2026-02-24T17:00:06+00:00 +# timestamp: 2026-04-09T11:04:11+00:00 from __future__ import annotations @@ -13,98 +13,17 @@ from .base_model import BaseModelSdk, RootModelSdk -class ApiKeyCredentials(BaseModelSdk): - api_key: Annotated[ - str, Field(description='API key for the integration', title='Api Key') - ] - - -class BasicAuthCredentials(BaseModelSdk): - username: Annotated[ - str, - Field(description='Basic auth username for the integration', title='Username'), - ] - password: Annotated[ - str, - Field(description='Basic auth password for the integration', title='Password'), - ] - - -class BlocklistSubscription(BaseModelSdk): - id: Annotated[str, Field(title='Id')] - remediation: Annotated[Optional[str], Field(title='Remediation')] = None - - -class CVESubscription(BaseModelSdk): - id: Annotated[str, Field(description='CVE ID', title='Id')] - - -class FingerprintSubscription(BaseModelSdk): - id: Annotated[str, Field(title='Id')] - - -class IntegrationType(StrEnum): - FIREWALL_INTEGRATION = 'firewall_integration' - REMEDIATION_COMPONENT_INTEGRATION = 'remediation_component_integration' - - -class Links(BaseModelSdk): - first: Annotated[ - Optional[str], Field(examples=['/api/v1/users?limit=1&offset1'], title='First') - ] = None - last: Annotated[ - Optional[str], Field(examples=['/api/v1/users?limit=1&offset1'], title='Last') - ] = None - self: Annotated[ - Optional[str], Field(examples=['/api/v1/users?limit=1&offset1'], title='Self') - ] = None - next: Annotated[ - Optional[str], Field(examples=['/api/v1/users?limit=1&offset1'], title='Next') - ] = None - prev: Annotated[ - Optional[str], Field(examples=['/api/v1/users?limit=1&offset1'], title='Prev') - ] = None - - -class OutputFormat(StrEnum): - PLAIN_TEXT = 'plain_text' - F5 = 'f5' - REMEDIATION_COMPONENT = 'remediation_component' - FORTIGATE = 'fortigate' - PALOALTO = 'paloalto' - CHECKPOINT = 'checkpoint' - CISCO = 'cisco' - JUNIPER = 'juniper' - MIKROTIK = 'mikrotik' - PFSENSE = 'pfsense' - OPNSENSE = 'opnsense' - SOPHOS = 'sophos' - - -class Stats(BaseModelSdk): - count: Annotated[ - int, - Field( - description='Number of total blocklists items the integration will pull', - title='Count', - ), - ] - - -class ValidationError(BaseModelSdk): - loc: Annotated[List[Union[str, int]], Field(title='Location')] - msg: Annotated[str, Field(title='Message')] - type: Annotated[str, Field(title='Error Type')] - - class AdjustmentScore(BaseModelSdk): - total: Annotated[int, Field(description='Total score adjustment', title='Total')] + total: Annotated[ + Optional[int], Field(description='Total score adjustment', title='Total') + ] = 0 recency: Annotated[ - int, Field(description='Recency score adjustment', title='Recency') - ] + Optional[int], Field(description='Recency score adjustment', title='Recency') + ] = 0 low_info: Annotated[ - int, Field(description='Low information score adjustment', title='Low Info') - ] + Optional[int], + Field(description='Low information score adjustment', title='Low Info'), + ] = 0 class AffectedComponent(BaseModelSdk): @@ -142,13 +61,29 @@ class Behavior(BaseModelSdk): ] -class CVEEvent(BaseModelSdk): - date: Annotated[datetime, Field(description='Date of the event', title='Date')] - description: Annotated[ - str, Field(description='Description of the event', title='Description') - ] - label: Annotated[str, Field(description='Label of the event', title='Label')] - name: Annotated[str, Field(description='Name of the event', title='Name')] +class BlocklistSubscription(BaseModelSdk): + id: Annotated[str, Field(title='Id')] + remediation: Annotated[Optional[str], Field(title='Remediation')] = None + + +class CVEEventOutput(BaseModelSdk): + name: Annotated[str, Field(title='Name')] + date: Annotated[str, Field(title='Date')] + description: Annotated[str, Field(title='Description')] + label: Annotated[str, Field(title='Label')] + sorting_priority: Annotated[int, Field(title='Sorting Priority')] + + +class CVEExploitationPhase(StrEnum): + INSUFFICIENT_DATA = 'insufficient_data' + EARLY_EXPLOITATION = 'early_exploitation' + FRESH_AND_POPULAR = 'fresh_and_popular' + TARGETED_EXPLOITATION = 'targeted_exploitation' + MASS_EXPLOITATION = 'mass_exploitation' + BACKGROUND_NOISE = 'background_noise' + UNPOPULAR = 'unpopular' + WEARING_OUT = 'wearing_out' + UNCLASSIFIED = 'unclassified' class CvssScore(RootModelSdk[float]): @@ -212,138 +147,41 @@ class ExploitationPhase(BaseModelSdk): ] -class FingerprintRuleResponse(BaseModelSdk): - id: Annotated[str, Field(description='Fingerprint rule identifier', title='Id')] - name: Annotated[str, Field(description='Fingerprint rule name', title='Name')] - title: Annotated[str, Field(description='Fingerprint rule title', title='Title')] - affected_components: Annotated[ - List[AffectedComponent], - Field(description='List of affected components', title='Affected Components'), +class ExploitationPhaseChangeEventItem(BaseModelSdk): + cve_id: Annotated[str, Field(description='CVE identifier', title='Cve Id')] + name: Annotated[str, Field(description='Event type name', title='Name')] + date: Annotated[str, Field(description='Date of the phase change', title='Date')] + label: Annotated[ + str, Field(description='Human-readable event label', title='Label') ] - crowdsec_score: Annotated[ - int, - Field( - description='Live Exploit Tracker score for the fingerprint rule', - ge=0, - le=10, - title='Crowdsec Score', - ), + description: Annotated[ + str, Field(description='Rendered event description', title='Description') ] - opportunity_score: Annotated[ - Optional[int], - Field(description='Opportunity score', ge=0, le=5, title='Opportunity Score'), - ] = 0 - momentum_score: Annotated[ - Optional[int], - Field(description='Momentum score', ge=0, le=5, title='Momentum Score'), - ] = 0 - first_seen: Annotated[ - Optional[datetime], Field(description='First seen date', title='First Seen') - ] = None - last_seen: Annotated[ - Optional[datetime], Field(description='Last seen date', title='Last Seen') - ] = None - nb_ips: Annotated[ - int, Field(description='Number of unique IPs observed', ge=0, title='Nb Ips') + previous_phase: Annotated[ + str, + Field(description='Previous exploitation phase label', title='Previous Phase'), ] - rule_release_date: Annotated[ - Optional[datetime], - Field( - description='Release date of the fingerprint rule', - title='Rule Release Date', - ), - ] = None - exploitation_phase: Annotated[ - ExploitationPhase, Field(description='Current exploitation phase') + new_phase: Annotated[ + str, Field(description='New exploitation phase label', title='New Phase') ] - adjustment_score: Annotated[ - Optional[AdjustmentScore], Field(description='Score adjustment details') - ] = None - hype_score: Annotated[ - Optional[int], - Field( - description='Hype score (raw momentum component)', - ge=0, - le=5, - title='Hype Score', - ), - ] = 0 - tags: Annotated[ - Optional[List[str]], - Field(description='Tags associated with the fingerprint rule', title='Tags'), - ] = None - description: Annotated[ - Optional[str], - Field(description='Fingerprint rule description', title='Description'), - ] = None - references: Annotated[ - Optional[List[str]], - Field( - description='Reference links for the fingerprint rule', title='References' - ), - ] = None - crowdsec_analysis: Annotated[ - Optional[str], - Field( - description='CrowdSec analysis for this fingerprint rule', - title='Crowdsec Analysis', - ), - ] = None - events: Annotated[ - Optional[List[CVEEvent]], - Field( - description='List of events related to the fingerprint rule', title='Events' - ), - ] = None -class FingerprintRuleSummary(BaseModelSdk): - id: Annotated[str, Field(description='Fingerprint rule identifier', title='Id')] - name: Annotated[str, Field(description='Fingerprint rule name', title='Name')] - title: Annotated[str, Field(description='Fingerprint rule title', title='Title')] - affected_components: Annotated[ - List[AffectedComponent], - Field(description='List of affected components', title='Affected Components'), - ] - crowdsec_score: Annotated[ - int, - Field( - description='Live Exploit Tracker score for the fingerprint rule', - ge=0, - le=10, - title='Crowdsec Score', - ), - ] - opportunity_score: Annotated[ - Optional[int], - Field(description='Opportunity score', ge=0, le=5, title='Opportunity Score'), - ] = 0 - momentum_score: Annotated[ - Optional[int], - Field(description='Momentum score', ge=0, le=5, title='Momentum Score'), - ] = 0 - first_seen: Annotated[ - Optional[datetime], Field(description='First seen date', title='First Seen') - ] = None - last_seen: Annotated[ - Optional[datetime], Field(description='Last seen date', title='Last Seen') - ] = None - nb_ips: Annotated[ - int, Field(description='Number of unique IPs observed', ge=0, title='Nb Ips') - ] - rule_release_date: Annotated[ - Optional[datetime], - Field( - description='Release date of the fingerprint rule', - title='Rule Release Date', - ), - ] = None - exploitation_phase: Annotated[ - ExploitationPhase, Field(description='Current exploitation phase') +class FacetBucket(BaseModelSdk): + value: Annotated[str, Field(description='Facet value', title='Value')] + count: Annotated[ + int, Field(description='Number of IPs matching this value', ge=0, title='Count') ] - adjustment_score: Annotated[ - Optional[AdjustmentScore], Field(description='Score adjustment details') - ] = None + + +class FingerprintEventOutput(BaseModelSdk): + name: Annotated[str, Field(title='Name')] + date: Annotated[str, Field(title='Date')] + description: Annotated[str, Field(title='Description')] + label: Annotated[str, Field(title='Label')] + + +class FingerprintSubscription(BaseModelSdk): + id: Annotated[str, Field(title='Id')] class FingerprintTimelineItem(BaseModelSdk): @@ -356,206 +194,79 @@ class FingerprintTimelineItem(BaseModelSdk): ] -class GetCVEResponse(BaseModelSdk): - id: Annotated[str, Field(description='ID of the CVE', title='Id')] - name: Annotated[str, Field(description='Name of the CVE', title='Name')] - title: Annotated[str, Field(description='Title of the CVE', title='Title')] - affected_components: Annotated[ - List[AffectedComponent], - Field(description='List of affected components', title='Affected Components'), +class GetCVEsSortBy(StrEnum): + RULE_RELEASE_DATE = 'rule_release_date' + TRENDING = 'trending' + NB_IPS = 'nb_ips' + NAME = 'name' + FIRST_SEEN = 'first_seen' + + +class GetCVEsSortOrder(StrEnum): + ASC = 'asc' + DESC = 'desc' + + +class History(BaseModelSdk): + first_seen: Annotated[ + datetime, Field(description='First seen timestamp', title='First Seen') ] - crowdsec_score: Annotated[ - int, - Field( - description='Live Exploit Tracker score of the CVE', - ge=0, - le=10, - title='Crowdsec Score', - ), - ] - opportunity_score: Annotated[ - Optional[int], - Field( - description="Opportunity score indicating if it's an opportunistic(0) or targeted(5) attack (between 0-5)", - ge=0, - le=5, - title='Opportunity Score', - ), - ] = 0 - momentum_score: Annotated[ - Optional[int], - Field( - description="Momentum score indicating the vulnerability's trendiness based on signal comparison with the previous month. Higher scores (4-5) indicate significantly more signals this month than last month's average, while lower scores (0-1) indicate declining activity (between 0-5)", - ge=0, - le=5, - title='Momentum Score', - ), - ] = 0 - first_seen: Annotated[ - Optional[datetime], Field(description='First seen date', title='First Seen') - ] = None last_seen: Annotated[ - Optional[datetime], Field(description='Last seen date', title='Last Seen') - ] = None - nb_ips: Annotated[ - int, Field(description='Number of unique IPs affected', ge=0, title='Nb Ips') - ] - published_date: Annotated[ - datetime, Field(description='Published date of the CVE', title='Published Date') - ] - cvss_score: Annotated[ - Optional[CvssScore], - Field(description='CVSS score of the CVE', title='Cvss Score'), - ] = None - has_public_exploit: Annotated[ - bool, - Field( - description='Indicates if there is a public exploit for the CVE', - title='Has Public Exploit', - ), - ] - rule_release_date: Annotated[ - Optional[datetime], - Field( - description='Release date of the associated detection rule', - title='Rule Release Date', - ), - ] = None - exploitation_phase: Annotated[ - ExploitationPhase, Field(description='Current exploitation phase of the CVE') - ] - adjustment_score: Annotated[ - Optional[AdjustmentScore], - Field( - description='Score adjustments applied to the CVE score based on various factors' - ), - ] = None - hype_score: Annotated[ - Optional[int], - Field( - description='Hype score (raw momentum component)', - ge=0, - le=5, - title='Hype Score', - ), - ] = 0 - tags: Annotated[ - Optional[List[str]], - Field(description='Tags associated with the CVE', title='Tags'), - ] = None - references: Annotated[ - List[str], - Field(description='List of references for the CVE', title='References'), - ] - description: Annotated[ - str, Field(description='Description of the CVE', title='Description') - ] - crowdsec_analysis: Annotated[ - Optional[str], - Field(description='CrowdSec analysis of the CVE', title='Crowdsec Analysis'), - ] = None - cwes: Annotated[ - List[CWE], - Field(description='List of CWEs associated with the CVE', title='Cwes'), + datetime, Field(description='Last seen timestamp', title='Last Seen') ] - events: Annotated[ - Optional[List[CVEEvent]], - Field(description='List of events related to the CVE', title='Events'), - ] = None - - -class GetCVEsFilterBy(StrEnum): - IS_PUBLIC = 'is_public' - - -class GetCVEsSortBy(StrEnum): - RULE_RELEASE_DATE = 'rule_release_date' - TRENDING = 'trending' - NB_IPS = 'nb_ips' - NAME = 'name' - - -class GetCVEsSortOrder(StrEnum): - ASC = 'asc' - DESC = 'desc' + full_age: Annotated[int, Field(description='Full age in days', title='Full Age')] + days_age: Annotated[int, Field(description='Days age', title='Days Age')] -class GetFingerprintRulesResponsePage(BaseModelSdk): - items: Annotated[List[FingerprintRuleSummary], Field(title='Items')] - total: Annotated[int, Field(ge=0, title='Total')] - page: Annotated[int, Field(ge=1, title='Page')] - size: Annotated[int, Field(ge=1, title='Size')] - pages: Annotated[int, Field(ge=0, title='Pages')] - links: Links +class IntervalOptions(StrEnum): + HOUR = 'hour' + DAY = 'day' + WEEK = 'week' -class History(BaseModelSdk): - first_seen: Annotated[ - datetime, Field(description='First seen timestamp', title='First Seen') +class IpsDetailsStats(BaseModelSdk): + total: Annotated[ + int, Field(description='Total number of matching IPs', ge=0, title='Total') ] - last_seen: Annotated[ - datetime, Field(description='Last seen timestamp', title='Last Seen') + reputation: Annotated[ + List[FacetBucket], + Field(description='IP count by reputation', title='Reputation'), + ] + country: Annotated[ + List[FacetBucket], + Field(description='IP count by country (top 5)', title='Country'), + ] + as_name: Annotated[ + List[FacetBucket], + Field(description='IP count by AS name (top 5)', title='As Name'), + ] + cves: Annotated[ + List[FacetBucket], Field(description='IP count by CVE (top 5)', title='Cves') + ] + classifications: Annotated[ + List[FacetBucket], + Field( + description='IP count by classification (top 5)', title='Classifications' + ), ] - full_age: Annotated[int, Field(description='Full age in days', title='Full Age')] - days_age: Annotated[int, Field(description='Days age', title='Days Age')] -class IntegrationResponse(BaseModelSdk): - tags: Annotated[Optional[List[str]], Field(title='Tags')] = [] - organization_id: Annotated[str, Field(title='Organization Id')] - created_at: Annotated[ - Optional[datetime], - Field(description='Time the integration was created', title='Created At'), - ] = None - entity_type: Annotated[EntityType, Field(description='Type of the integration')] - id: Annotated[ - Optional[str], Field(description='ID of the integration', title='Id') +class Links(BaseModelSdk): + first: Annotated[ + Optional[str], Field(examples=['/api/v1/users?limit=1&offset1'], title='First') ] = None - blocklists: Annotated[ - Optional[List[BlocklistSubscription]], Field(title='Blocklists') - ] = [] - allowlists: Annotated[ - Optional[List[AllowlistSubscription]], Field(title='Allowlists') - ] = [] - cves: Annotated[Optional[List[CVEsubscription]], Field(title='Cves')] = [] - fingerprints: Annotated[ - Optional[List[FingerprintSubscription]], Field(title='Fingerprints') - ] = [] - name: Annotated[str, Field(description='Name of the integration', title='Name')] - updated_at: Annotated[ - Optional[datetime], - Field(description='Last time the integration was updated', title='Updated At'), + last: Annotated[ + Optional[str], Field(examples=['/api/v1/users?limit=1&offset1'], title='Last') ] = None - description: Annotated[ - Optional[str], - Field(description='Description of the integration', title='Description'), + self: Annotated[ + Optional[str], Field(examples=['/api/v1/users?limit=1&offset1'], title='Self') ] = None - output_format: Annotated[ - OutputFormat, Field(description='Output format of the integration') - ] - last_pull: Annotated[ - Optional[datetime], - Field( - description='Last time the integration pulled blocklists', title='Last Pull' - ), + next: Annotated[ + Optional[str], Field(examples=['/api/v1/users?limit=1&offset1'], title='Next') ] = None - pull_limit: Annotated[ - Optional[int], - Field(description='Maximum number of items to pull', title='Pull Limit'), + prev: Annotated[ + Optional[str], Field(examples=['/api/v1/users?limit=1&offset1'], title='Prev') ] = None - enable_ip_aggregation: Annotated[ - Optional[bool], - Field( - description='Whether to enable IP aggregation into ranges', - title='Enable Ip Aggregation', - ), - ] = False - - -class IntervalOptions(StrEnum): - HOUR = 'hour' - DAY = 'day' - WEEK = 'week' class Location(BaseModelSdk): @@ -571,227 +282,46 @@ class Location(BaseModelSdk): ] = None -class LookupImpactCVEItem(BaseModelSdk): - id: Annotated[str, Field(description='ID of the CVE', title='Id')] - name: Annotated[str, Field(description='Name of the CVE', title='Name')] - title: Annotated[str, Field(description='Title of the CVE', title='Title')] - affected_components: Annotated[ - List[AffectedComponent], - Field(description='List of affected components', title='Affected Components'), - ] - crowdsec_score: Annotated[ - int, - Field( - description='Live Exploit Tracker score of the CVE', - ge=0, - le=10, - title='Crowdsec Score', - ), - ] - opportunity_score: Annotated[ +class LookupListItemWithStats(BaseModelSdk): + value: Annotated[str, Field(description='Lookup entry value', title='Value')] + nb_cves: Annotated[ + Optional[int], Field(description='Number of CVEs', ge=0, title='Nb Cves') + ] = 0 + nb_fingerprints: Annotated[ + Optional[int], + Field(description='Number of fingerprint rules', ge=0, title='Nb Fingerprints'), + ] = 0 + nb_ips: Annotated[ Optional[int], Field( - description="Opportunity score indicating if it's an opportunistic(0) or targeted(5) attack (between 0-5)", + description='Total number of unique IPs targeting this entry', ge=0, - le=5, - title='Opportunity Score', + title='Nb Ips', ), ] = 0 - momentum_score: Annotated[ + nb_ips_cves: Annotated[ + Optional[int], + Field(description='Number of IPs across CVEs', ge=0, title='Nb Ips Cves'), + ] = 0 + nb_ips_fingerprints: Annotated[ Optional[int], Field( - description="Momentum score indicating the vulnerability's trendiness based on signal comparison with the previous month. Higher scores (4-5) indicate significantly more signals this month than last month's average, while lower scores (0-1) indicate declining activity (between 0-5)", + description='Number of IPs across fingerprint rules', ge=0, - le=5, - title='Momentum Score', + title='Nb Ips Fingerprints', ), ] = 0 - first_seen: Annotated[ - Optional[datetime], Field(description='First seen date', title='First Seen') - ] = None - last_seen: Annotated[ - Optional[datetime], Field(description='Last seen date', title='Last Seen') - ] = None - nb_ips: Annotated[ - int, Field(description='Number of unique IPs affected', ge=0, title='Nb Ips') - ] - published_date: Annotated[ - datetime, Field(description='Published date of the CVE', title='Published Date') - ] - cvss_score: Annotated[ - Optional[CvssScore], - Field(description='CVSS score of the CVE', title='Cvss Score'), - ] = None - has_public_exploit: Annotated[ - bool, - Field( - description='Indicates if there is a public exploit for the CVE', - title='Has Public Exploit', - ), - ] - rule_release_date: Annotated[ + latest_rule_release: Annotated[ Optional[datetime], Field( - description='Release date of the associated detection rule', - title='Rule Release Date', + description='Most recent rule release date for this entry', + title='Latest Rule Release', ), ] = None - exploitation_phase: Annotated[ - ExploitationPhase, Field(description='Current exploitation phase of the CVE') - ] - adjustment_score: Annotated[ - Optional[AdjustmentScore], - Field( - description='Score adjustments applied to the CVE score based on various factors' - ), - ] = None - hype_score: Annotated[ - Optional[int], - Field( - description='Hype score (raw momentum component)', - ge=0, - le=5, - title='Hype Score', - ), - ] = 0 - tags: Annotated[ - Optional[List[str]], - Field(description='Tags associated with the CVE', title='Tags'), - ] = None - references: Annotated[ - List[str], - Field(description='List of references for the CVE', title='References'), - ] - description: Annotated[ - str, Field(description='Description of the CVE', title='Description') - ] - crowdsec_analysis: Annotated[ - Optional[str], - Field(description='CrowdSec analysis of the CVE', title='Crowdsec Analysis'), - ] = None - cwes: Annotated[ - List[CWE], - Field(description='List of CWEs associated with the CVE', title='Cwes'), - ] - events: Annotated[ - Optional[List[CVEEvent]], - Field(description='List of events related to the CVE', title='Events'), - ] = None - type: Annotated[ - Literal['cve'], Field(description='Resource type', title='Type') - ] = 'cve' - - -class LookupImpactFingerprintItem(BaseModelSdk): - id: Annotated[str, Field(description='Fingerprint rule identifier', title='Id')] - name: Annotated[str, Field(description='Fingerprint rule name', title='Name')] - title: Annotated[str, Field(description='Fingerprint rule title', title='Title')] - affected_components: Annotated[ - List[AffectedComponent], - Field(description='List of affected components', title='Affected Components'), - ] - crowdsec_score: Annotated[ - int, - Field( - description='Live Exploit Tracker score for the fingerprint rule', - ge=0, - le=10, - title='Crowdsec Score', - ), - ] - opportunity_score: Annotated[ - Optional[int], - Field(description='Opportunity score', ge=0, le=5, title='Opportunity Score'), - ] = 0 - momentum_score: Annotated[ - Optional[int], - Field(description='Momentum score', ge=0, le=5, title='Momentum Score'), - ] = 0 - first_seen: Annotated[ - Optional[datetime], Field(description='First seen date', title='First Seen') - ] = None - last_seen: Annotated[ - Optional[datetime], Field(description='Last seen date', title='Last Seen') - ] = None - nb_ips: Annotated[ - int, Field(description='Number of unique IPs observed', ge=0, title='Nb Ips') - ] - rule_release_date: Annotated[ - Optional[datetime], - Field( - description='Release date of the fingerprint rule', - title='Rule Release Date', - ), - ] = None - exploitation_phase: Annotated[ - ExploitationPhase, Field(description='Current exploitation phase') - ] - adjustment_score: Annotated[ - Optional[AdjustmentScore], Field(description='Score adjustment details') - ] = None - hype_score: Annotated[ - Optional[int], - Field( - description='Hype score (raw momentum component)', - ge=0, - le=5, - title='Hype Score', - ), - ] = 0 - tags: Annotated[ - Optional[List[str]], - Field(description='Tags associated with the fingerprint rule', title='Tags'), - ] = None - description: Annotated[ - Optional[str], - Field(description='Fingerprint rule description', title='Description'), - ] = None - references: Annotated[ - Optional[List[str]], - Field( - description='Reference links for the fingerprint rule', title='References' - ), - ] = None - crowdsec_analysis: Annotated[ - Optional[str], - Field( - description='CrowdSec analysis for this fingerprint rule', - title='Crowdsec Analysis', - ), - ] = None - events: Annotated[ - Optional[List[CVEEvent]], - Field( - description='List of events related to the fingerprint rule', title='Events' - ), - ] = None - type: Annotated[ - Literal['fingerprint'], Field(description='Resource type', title='Type') - ] = 'fingerprint' - - -class Items(RootModelSdk[Union[LookupImpactCVEItem, LookupImpactFingerprintItem]]): - root: Annotated[ - Union[LookupImpactCVEItem, LookupImpactFingerprintItem], - Field(discriminator='type'), - ] - - -class LookupImpactResponsePage(BaseModelSdk): - items: Annotated[List[Items], Field(title='Items')] - total: Annotated[int, Field(ge=0, title='Total')] - page: Annotated[int, Field(ge=1, title='Page')] - size: Annotated[int, Field(ge=1, title='Size')] - pages: Annotated[int, Field(ge=0, title='Pages')] - links: Links -class LookupListItem(BaseModelSdk): - value: Annotated[str, Field(description='Lookup entry value', title='Value')] - - -class LookupListResponsePage(BaseModelSdk): - items: Annotated[List[LookupListItem], Field(title='Items')] +class LookupListWithStatsResponsePage(BaseModelSdk): + items: Annotated[List[LookupListItemWithStats], Field(title='Items')] total: Annotated[int, Field(ge=0, title='Total')] page: Annotated[int, Field(ge=1, title='Page')] size: Annotated[int, Field(ge=1, title='Size')] @@ -807,6 +337,26 @@ class MitreTechnique(BaseModelSdk): ] +class OutputFormat(StrEnum): + PLAIN_TEXT = 'plain_text' + F5 = 'f5' + REMEDIATION_COMPONENT = 'remediation_component' + FORTIGATE = 'fortigate' + PALOALTO = 'paloalto' + CHECKPOINT = 'checkpoint' + CISCO = 'cisco' + JUNIPER = 'juniper' + MIKROTIK = 'mikrotik' + PFSENSE = 'pfsense' + OPNSENSE = 'opnsense' + SOPHOS = 'sophos' + + +class ProtectRuleTag(BaseModelSdk): + tag: Annotated[str, Field(description='Tag identifier', title='Tag')] + label: Annotated[str, Field(description='Human-readable tag label', title='Label')] + + class Reference(BaseModelSdk): name: Annotated[str, Field(description='Reference name', title='Name')] label: Annotated[str, Field(description='Reference label', title='Label')] @@ -856,6 +406,53 @@ class SubscribeFingerprintIntegrationRequest(BaseModelSdk): ] +class SubscribeVendorIntegrationRequest(BaseModelSdk): + model_config = ConfigDict( + extra='forbid', + ) + name: Annotated[ + str, Field(description='Name of the integration to subscribe', title='Name') + ] + + +class ThreatContext(BaseModelSdk): + attacker_countries: Annotated[ + Optional[Dict[str, int]], + Field( + description='Attacker country distribution (country code → count)', + title='Attacker Countries', + ), + ] = None + defender_countries: Annotated[ + Optional[Dict[str, int]], + Field( + description='Defender country distribution (country code → count)', + title='Defender Countries', + ), + ] = None + industry_types: Annotated[ + Optional[Dict[str, int]], + Field( + description='Industry type distribution (type → count)', + title='Industry Types', + ), + ] = None + industry_risk_profiles: Annotated[ + Optional[Dict[str, int]], + Field( + description='Industry risk profile distribution (profile → count)', + title='Industry Risk Profiles', + ), + ] = None + attacker_objectives: Annotated[ + Optional[Dict[str, int]], + Field( + description='Attacker objective distribution (objective → count)', + title='Attacker Objectives', + ), + ] = None + + class TimelineItem(BaseModelSdk): timestamp: Annotated[ datetime, @@ -866,91 +463,144 @@ class TimelineItem(BaseModelSdk): ] -class IntegrationsGetIntegrationsQueryParameters(BaseModelSdk): - tag: Annotated[ - Optional[List[str]], +class TopProductItem(BaseModelSdk): + value: Annotated[str, Field(description='Product name', title='Value')] + nb_ips_cves: Annotated[ + Optional[int], + Field(description='Number of IPs across CVEs', ge=0, title='Nb Ips Cves'), + ] = 0 + nb_ips_fingerprints: Annotated[ + Optional[int], Field( - description='List of tags associated with the integrations (any of)', - title='Tag', + description='Number of IPs across fingerprint rules', + ge=0, + title='Nb Ips Fingerprints', ), - ] = None + ] = 0 -class IntegrationsGetIntegrationPathParameters(BaseModelSdk): - integration_id: Annotated[str, Field(title='Integration Id')] +class ValidationError(BaseModelSdk): + loc: Annotated[List[Union[str, int]], Field(title='Location')] + msg: Annotated[str, Field(title='Message')] + type: Annotated[str, Field(title='Error Type')] -class IntegrationsUpdateIntegrationPathParameters(BaseModelSdk): - integration_id: Annotated[str, Field(title='Integration Id')] +class VendorSortBy(StrEnum): + VALUE = 'value' + NB_CVES = 'nb_cves' + NB_IPS = 'nb_ips' + LATEST_RULE_RELEASE = 'latest_rule_release' -class IntegrationsDeleteIntegrationQueryParameters(BaseModelSdk): - force: Annotated[ - Optional[bool], +class VendorStatsResponse(BaseModelSdk): + value: Annotated[str, Field(description='Vendor name', title='Value')] + nb_cves: Annotated[ + Optional[int], Field(description='Number of CVEs', ge=0, title='Nb Cves') + ] = 0 + nb_fingerprints: Annotated[ + Optional[int], + Field(description='Number of fingerprint rules', ge=0, title='Nb Fingerprints'), + ] = 0 + nb_ips: Annotated[ + Optional[int], Field( - description='Force delete the integration even if it has active subscriptions (it will unsubscribe from all lists)', - title='Force', + description='Total number of unique IPs targeting this vendor', + ge=0, + title='Nb Ips', ), - ] = False + ] = 0 + nb_ips_cves: Annotated[ + Optional[int], + Field(description='Number of IPs across CVEs', ge=0, title='Nb Ips Cves'), + ] = 0 + nb_ips_fingerprints: Annotated[ + Optional[int], + Field( + description='Number of IPs across fingerprint rules', + ge=0, + title='Nb Ips Fingerprints', + ), + ] = 0 + top_products: Annotated[ + Optional[List[TopProductItem]], + Field( + description='Top products for this vendor sorted by total IPs descending', + title='Top Products', + ), + ] = None -class IntegrationsDeleteIntegrationPathParameters(BaseModelSdk): - integration_id: Annotated[str, Field(title='Integration Id')] +class VendorSubscription(BaseModelSdk): + id: Annotated[str, Field(title='Id')] -class IntegrationsHeadIntegrationContentPathParameters(BaseModelSdk): - integration_id: Annotated[ - str, Field(examples=['5f9d88b9e5c4f5b9a3d3e8b1'], title='Integration Id') +class ApiKeyCredentials(BaseModelSdk): + api_key: Annotated[ + str, Field(description='API key for the integration', title='Api Key') ] -class PageSize(RootModelSdk[int]): - root: Annotated[ - int, - Field( - description='Maximum number of items to return, 0 means no limit (default), should be greater than 10000', - ge=10000, - title='Page Size', - ), +class BasicAuthCredentials(BaseModelSdk): + username: Annotated[ + str, + Field(description='Basic auth username for the integration', title='Username'), + ] + password: Annotated[ + str, + Field(description='Basic auth password for the integration', title='Password'), ] -class IntegrationsGetIntegrationContentQueryParameters(BaseModelSdk): - page: Annotated[ - Optional[int], Field(description='Page number to return', ge=1, title='Page') - ] = 1 - page_size: Annotated[ - Optional[PageSize], - Field( - description='Maximum number of items to return, 0 means no limit (default), should be greater than 10000', - title='Page Size', - ), - ] = None - pull_limit: Annotated[Optional[int], Field(title='Pull Limit')] = None - enable_ip_aggregation: Annotated[ - Optional[bool], Field(title='Enable Ip Aggregation') - ] = False +class CVESubscription(BaseModelSdk): + id: Annotated[str, Field(description='CVE ID', title='Id')] -class IntegrationsGetIntegrationContentPathParameters(BaseModelSdk): - integration_id: Annotated[ - str, Field(examples=['5f9d88b9e5c4f5b9a3d3e8b1'], title='Integration Id') - ] +class IntegrationType(StrEnum): + FIREWALL_INTEGRATION = 'firewall_integration' + REMEDIATION_COMPONENT_INTEGRATION = 'remediation_component_integration' -class IntegrationsGetIntegrationContentStreamQueryParameters(BaseModelSdk): - startup: Annotated[ +class IntegrationUpdateRequest(BaseModelSdk): + model_config = ConfigDict( + extra='forbid', + ) + name: Annotated[ + Optional[str], Field(description='New name', min_length=1, title='Name') + ] = None + description: Annotated[ + Optional[str], + Field(description='New description', min_length=1, title='Description'), + ] = None + output_format: Annotated[ + Optional[OutputFormat], Field(description='New output format') + ] = None + regenerate_credentials: Annotated[ Optional[bool], Field( - description="Set to true if it's the first run to fetch all the content, otherwise only changes since the last pull.", - title='Startup', + description='Regenerate credentials for the integration', + title='Regenerate Credentials', + ), + ] = None + pull_limit: Annotated[ + Optional[int], + Field(description='Maximum number of items to pull', title='Pull Limit'), + ] = None + enable_ip_aggregation: Annotated[ + Optional[bool], + Field( + description='Whether to enable IP aggregation into ranges', + title='Enable Ip Aggregation', ), ] = False -class IntegrationsGetIntegrationContentStreamPathParameters(BaseModelSdk): - integration_id: Annotated[ - str, Field(examples=['5f9d88b9e5c4f5b9a3d3e8b1'], title='Integration Id') +class Stats(BaseModelSdk): + count: Annotated[ + int, + Field( + description='Number of total blocklists items the integration will pull', + title='Count', + ), ] @@ -965,9 +615,9 @@ class CvesGetCvesQueryParameters(BaseModelSdk): Optional[GetCVEsSortOrder], Field(description='Sort order: ascending or descending', title='Sort Order'), ] = 'desc' - filters: Annotated[ - Optional[List[GetCVEsFilterBy]], - Field(description='Filters to apply on the CVE list', title='Filters'), + exploitation_phase: Annotated[ + Optional[CVEExploitationPhase], + Field(description='Filter by exploitation phase', title='Exploitation Phase'), ] = None page: Annotated[ Optional[int], Field(description='Page number', ge=1, title='Page') @@ -981,6 +631,10 @@ class CvesGetCvePathParameters(BaseModelSdk): cve_id: Annotated[str, Field(title='Cve Id')] +class CvesGetCveProtectRulesPathParameters(BaseModelSdk): + cve_id: Annotated[str, Field(title='Cve Id')] + + class CvesDownloadCveIpsPathParameters(BaseModelSdk): cve_id: Annotated[str, Field(title='Cve Id')] @@ -1016,6 +670,20 @@ class CvesGetCveIpsDetailsPathParameters(BaseModelSdk): cve_id: Annotated[str, Field(title='Cve Id')] +class CvesGetCveIpsDetailsStatsQueryParameters(BaseModelSdk): + since: Annotated[ + Optional[Since], + Field( + description='Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d', + title='Since', + ), + ] = '14d' + + +class CvesGetCveIpsDetailsStatsPathParameters(BaseModelSdk): + cve_id: Annotated[str, Field(title='Cve Id')] + + class CvesSubscribeIntegrationToCvePathParameters(BaseModelSdk): cve_id: Annotated[str, Field(title='Cve Id')] @@ -1055,6 +723,72 @@ class VendorsGetVendorsQueryParameters(BaseModelSdk): query: Annotated[ Optional[str], Field(description='Search query for vendors', title='Query') ] = None + sort_by: Annotated[ + Optional[VendorSortBy], + Field( + description='Sort by: value, nb_cves, nb_ips, latest_rule_release', + title='Sort By', + ), + ] = None + sort_order: Annotated[ + Optional[GetCVEsSortOrder], + Field(description='Sort order: asc or desc', title='Sort Order'), + ] = 'desc' + page: Annotated[ + Optional[int], Field(description='Page number', ge=1, title='Page') + ] = 1 + size: Annotated[ + Optional[int], Field(description='Page size', ge=1, le=100, title='Size') + ] = 50 + + +class VendorsGetVendorStatsPathParameters(BaseModelSdk): + vendor: Annotated[str, Field(title='Vendor')] + + +class VendorsDownloadVendorIpsPathParameters(BaseModelSdk): + vendor: Annotated[str, Field(title='Vendor')] + + +class VendorsGetVendorIpsDetailsQueryParameters(BaseModelSdk): + since: Annotated[ + Optional[Since], + Field( + description='Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d', + title='Since', + ), + ] = '14d' + page: Annotated[ + Optional[int], Field(description='Page number', ge=1, title='Page') + ] = 1 + size: Annotated[ + Optional[int], Field(description='Page size', ge=1, le=100, title='Size') + ] = 50 + + +class VendorsGetVendorIpsDetailsPathParameters(BaseModelSdk): + vendor: Annotated[str, Field(title='Vendor')] + + +class VendorsGetVendorIpsDetailsStatsQueryParameters(BaseModelSdk): + since: Annotated[ + Optional[Since], + Field( + description='Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d', + title='Since', + ), + ] = '14d' + + +class VendorsGetVendorIpsDetailsStatsPathParameters(BaseModelSdk): + vendor: Annotated[str, Field(title='Vendor')] + + +class VendorsSubscribeIntegrationToVendorPathParameters(BaseModelSdk): + vendor: Annotated[str, Field(title='Vendor')] + + +class VendorsGetVendorSubscribedIntegrationsQueryParameters(BaseModelSdk): page: Annotated[ Optional[int], Field(description='Page number', ge=1, title='Page') ] = 1 @@ -1063,6 +797,15 @@ class VendorsGetVendorsQueryParameters(BaseModelSdk): ] = 50 +class VendorsGetVendorSubscribedIntegrationsPathParameters(BaseModelSdk): + vendor: Annotated[str, Field(title='Vendor')] + + +class VendorsUnsubscribeIntegrationFromVendorPathParameters(BaseModelSdk): + vendor: Annotated[str, Field(title='Vendor')] + integration_name: Annotated[str, Field(title='Integration Name')] + + class VendorsGetVendorImpactQueryParameters(BaseModelSdk): sort_by: Annotated[ Optional[GetCVEsSortBy], Field(description='Field to sort by', title='Sort By') @@ -1115,7 +858,39 @@ class ProductsGetProductImpactPathParameters(BaseModelSdk): product: Annotated[str, Field(title='Product')] -class TagsGetTagsQueryParameters(BaseModelSdk): +class TrackerTagsGetTagsQueryParameters(BaseModelSdk): + query: Annotated[ + Optional[str], Field(description='Search query for tags', title='Query') + ] = None + page: Annotated[ + Optional[int], Field(description='Page number', ge=1, title='Page') + ] = 1 + size: Annotated[ + Optional[int], Field(description='Page size', ge=1, le=100, title='Size') + ] = 50 + + +class TrackerTagsGetTagImpactQueryParameters(BaseModelSdk): + sort_by: Annotated[ + Optional[GetCVEsSortBy], Field(description='Field to sort by', title='Sort By') + ] = 'rule_release_date' + sort_order: Annotated[ + Optional[GetCVEsSortOrder], + Field(description='Sort order: ascending or descending', title='Sort Order'), + ] = 'desc' + page: Annotated[ + Optional[int], Field(description='Page number', ge=1, title='Page') + ] = 1 + size: Annotated[ + Optional[int], Field(description='Page size', ge=1, le=100, title='Size') + ] = 50 + + +class TrackerTagsGetTagImpactPathParameters(BaseModelSdk): + tag: Annotated[str, Field(title='Tag')] + + +class TrackerTagsGetTrackerTagsQueryParameters(BaseModelSdk): query: Annotated[ Optional[str], Field(description='Search query for tags', title='Query') ] = None @@ -1127,7 +902,7 @@ class TagsGetTagsQueryParameters(BaseModelSdk): ] = 50 -class TagsGetTagImpactQueryParameters(BaseModelSdk): +class TrackerTagsGetTrackerTagImpactQueryParameters(BaseModelSdk): sort_by: Annotated[ Optional[GetCVEsSortBy], Field(description='Field to sort by', title='Sort By') ] = 'rule_release_date' @@ -1143,7 +918,7 @@ class TagsGetTagImpactQueryParameters(BaseModelSdk): ] = 50 -class TagsGetTagImpactPathParameters(BaseModelSdk): +class TrackerTagsGetTrackerTagImpactPathParameters(BaseModelSdk): tag: Annotated[str, Field(title='Tag')] @@ -1159,12 +934,6 @@ class FingerprintsGetFingerprintRulesQueryParameters(BaseModelSdk): Optional[GetCVEsSortOrder], Field(description='Sort order: ascending or descending', title='Sort Order'), ] = 'desc' - filters: Annotated[ - Optional[List[GetCVEsFilterBy]], - Field( - description='Filters to apply on the fingerprint rule list', title='Filters' - ), - ] = None page: Annotated[ Optional[int], Field(description='Page number', ge=1, title='Page') ] = 1 @@ -1197,6 +966,20 @@ class FingerprintsGetFingerprintIpsDetailsPathParameters(BaseModelSdk): fingerprint: Annotated[str, Field(title='Fingerprint')] +class FingerprintsGetFingerprintIpsDetailsStatsQueryParameters(BaseModelSdk): + since: Annotated[ + Optional[Since], + Field( + description='Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d', + title='Since', + ), + ] = '14d' + + +class FingerprintsGetFingerprintIpsDetailsStatsPathParameters(BaseModelSdk): + fingerprint: Annotated[str, Field(title='Fingerprint')] + + class FingerprintsSubscribeIntegrationToFingerprintPathParameters(BaseModelSdk): fingerprint: Annotated[str, Field(title='Fingerprint')] @@ -1223,28 +1006,864 @@ class FingerprintsGetFingerprintTimelineQueryParameters(BaseModelSdk): since_days: Annotated[ Optional[SinceOptions], Field( - description='Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days.' + description='Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days.' + ), + ] = 7 + interval: Annotated[ + Optional[IntervalOptions], + Field( + description="Interval for aggregating timeline data. Options: 'hour', 'day', 'week'. Default is adapted based on 'since' parameter.", + title='Interval', + ), + ] = None + + +class FingerprintsGetFingerprintTimelinePathParameters(BaseModelSdk): + fingerprint: Annotated[str, Field(title='Fingerprint')] + + +class FingerprintsGetFingerprintRulePathParameters(BaseModelSdk): + fingerprint: Annotated[str, Field(title='Fingerprint')] + + +class TrackerEventsGetExploitationPhaseChangeEventsQueryParameters(BaseModelSdk): + since: Annotated[ + Optional[str], + Field( + description="Duration string (e.g. '30d', '24h') to filter events", + title='Since', + ), + ] = '30d' + sort_order: Annotated[ + Optional[GetCVEsSortOrder], + Field(description='Sort order: ascending or descending', title='Sort Order'), + ] = 'desc' + cve_id: Annotated[ + Optional[str], + Field(description='Filter by CVE identifier (exact match)', title='Cve Id'), + ] = None + previous_phase: Annotated[ + Optional[CVEExploitationPhase], + Field( + description='Filter by previous exploitation phase name', + title='Previous Phase', + ), + ] = None + new_phase: Annotated[ + Optional[CVEExploitationPhase], + Field(description='Filter by new exploitation phase name', title='New Phase'), + ] = None + page: Annotated[ + Optional[int], Field(description='Page number', ge=1, title='Page') + ] = 1 + size: Annotated[ + Optional[int], Field(description='Page size', ge=1, le=100, title='Size') + ] = 50 + + +class IntegrationsGetIntegrationsQueryParameters(BaseModelSdk): + tag: Annotated[ + Optional[List[str]], + Field( + description='List of tags associated with the integrations (any of)', + title='Tag', + ), + ] = None + page: Annotated[ + Optional[int], Field(description='Page number', ge=1, title='Page') + ] = 1 + size: Annotated[ + Optional[int], Field(description='Page size', ge=1, le=100, title='Size') + ] = 50 + + +class IntegrationsGetIntegrationPathParameters(BaseModelSdk): + integration_id: Annotated[str, Field(title='Integration Id')] + + +class IntegrationsUpdateIntegrationPathParameters(BaseModelSdk): + integration_id: Annotated[str, Field(title='Integration Id')] + + +class IntegrationsDeleteIntegrationQueryParameters(BaseModelSdk): + force: Annotated[ + Optional[bool], + Field( + description='Force delete the integration even if it has active subscriptions (it will unsubscribe from all lists)', + title='Force', + ), + ] = False + + +class IntegrationsDeleteIntegrationPathParameters(BaseModelSdk): + integration_id: Annotated[str, Field(title='Integration Id')] + + +class IntegrationsHeadIntegrationContentPathParameters(BaseModelSdk): + integration_id: Annotated[ + str, Field(examples=['5f9d88b9e5c4f5b9a3d3e8b1'], title='Integration Id') + ] + + +class PageSize(RootModelSdk[int]): + root: Annotated[ + int, + Field( + description='Maximum number of items to return, 0 means no limit (default), should be greater than 10000', + ge=10000, + title='Page Size', + ), + ] + + +class IntegrationsGetIntegrationContentQueryParameters(BaseModelSdk): + page: Annotated[ + Optional[int], Field(description='Page number to return', ge=1, title='Page') + ] = 1 + page_size: Annotated[ + Optional[PageSize], + Field( + description='Maximum number of items to return, 0 means no limit (default), should be greater than 10000', + title='Page Size', + ), + ] = None + pull_limit: Annotated[Optional[int], Field(title='Pull Limit')] = None + enable_ip_aggregation: Annotated[ + Optional[bool], Field(title='Enable Ip Aggregation') + ] = False + + +class IntegrationsGetIntegrationContentPathParameters(BaseModelSdk): + integration_id: Annotated[ + str, Field(examples=['5f9d88b9e5c4f5b9a3d3e8b1'], title='Integration Id') + ] + + +class IntegrationsGetIntegrationContentStreamQueryParameters(BaseModelSdk): + startup: Annotated[ + Optional[bool], + Field( + description="Set to true if it's the first run to fetch all the content, otherwise only changes since the last pull.", + title='Startup', + ), + ] = False + + +class IntegrationsGetIntegrationContentStreamPathParameters(BaseModelSdk): + integration_id: Annotated[ + str, Field(examples=['5f9d88b9e5c4f5b9a3d3e8b1'], title='Integration Id') + ] + + +class CVEResponseBase(BaseModelSdk): + id: Annotated[str, Field(description='ID of the CVE', title='Id')] + name: Annotated[str, Field(description='Name of the CVE', title='Name')] + title: Annotated[str, Field(description='Title of the CVE', title='Title')] + affected_components: Annotated[ + List[AffectedComponent], + Field(description='List of affected components', title='Affected Components'), + ] + crowdsec_score: Annotated[ + int, + Field( + description='Live Exploit Tracker score of the CVE', + ge=0, + le=10, + title='Crowdsec Score', + ), + ] + opportunity_score: Annotated[ + Optional[int], + Field( + description="Opportunity score indicating if it's an opportunistic(0) or targeted(5) attack (between 0-5)", + ge=0, + le=5, + title='Opportunity Score', + ), + ] = 0 + momentum_score: Annotated[ + Optional[int], + Field( + description="Momentum score indicating the vulnerability's trendiness based on signal comparison with the previous month. Higher scores (4-5) indicate significantly more signals this month than last month's average, while lower scores (0-1) indicate declining activity (between 0-5)", + ge=0, + le=5, + title='Momentum Score', + ), + ] = 0 + first_seen: Annotated[ + Optional[datetime], Field(description='First seen date', title='First Seen') + ] = None + last_seen: Annotated[ + Optional[datetime], Field(description='Last seen date', title='Last Seen') + ] = None + nb_ips: Annotated[ + int, Field(description='Number of unique IPs affected', ge=0, title='Nb Ips') + ] + published_date: Annotated[ + datetime, Field(description='Published date of the CVE', title='Published Date') + ] + cvss_score: Annotated[ + Optional[CvssScore], + Field(description='CVSS score of the CVE', title='Cvss Score'), + ] = None + has_public_exploit: Annotated[ + bool, + Field( + description='Indicates if there is a public exploit for the CVE', + title='Has Public Exploit', + ), + ] + rule_release_date: Annotated[ + Optional[datetime], + Field( + description='Release date of the associated detection rule', + title='Rule Release Date', + ), + ] = None + exploitation_phase: Annotated[ + ExploitationPhase, Field(description='Current exploitation phase of the CVE') + ] + adjustment_score: Annotated[ + Optional[AdjustmentScore], + Field( + description='Score adjustments applied to the CVE score based on various factors' + ), + ] = None + threat_context: Annotated[ + Optional[ThreatContext], + Field( + description='Threat context (attacker/defender countries, industries, objectives)' + ), + ] = None + + +class ExploitationPhaseChangeEventsResponsePage(BaseModelSdk): + items: Annotated[List[ExploitationPhaseChangeEventItem], Field(title='Items')] + total: Annotated[int, Field(ge=0, title='Total')] + page: Annotated[int, Field(ge=1, title='Page')] + size: Annotated[int, Field(ge=1, title='Size')] + pages: Annotated[int, Field(ge=0, title='Pages')] + links: Links + + +class FingerprintRuleResponse(BaseModelSdk): + id: Annotated[str, Field(description='Fingerprint rule identifier', title='Id')] + name: Annotated[str, Field(description='Fingerprint rule name', title='Name')] + title: Annotated[str, Field(description='Fingerprint rule title', title='Title')] + affected_components: Annotated[ + List[AffectedComponent], + Field(description='List of affected components', title='Affected Components'), + ] + crowdsec_score: Annotated[ + int, + Field( + description='Live Exploit Tracker score for the fingerprint rule', + ge=0, + le=10, + title='Crowdsec Score', + ), + ] + opportunity_score: Annotated[ + Optional[int], + Field(description='Opportunity score', ge=0, le=5, title='Opportunity Score'), + ] = 0 + momentum_score: Annotated[ + Optional[int], + Field(description='Momentum score', ge=0, le=5, title='Momentum Score'), + ] = 0 + first_seen: Annotated[ + Optional[datetime], Field(description='First seen date', title='First Seen') + ] = None + last_seen: Annotated[ + Optional[datetime], Field(description='Last seen date', title='Last Seen') + ] = None + nb_ips: Annotated[ + int, Field(description='Number of unique IPs observed', ge=0, title='Nb Ips') + ] + rule_release_date: Annotated[ + Optional[datetime], + Field( + description='Release date of the fingerprint rule', + title='Rule Release Date', + ), + ] = None + exploitation_phase: Annotated[ + ExploitationPhase, Field(description='Current exploitation phase') + ] + adjustment_score: Annotated[ + Optional[AdjustmentScore], Field(description='Score adjustment details') + ] = None + threat_context: Annotated[ + Optional[ThreatContext], + Field( + description='Threat context (attacker/defender countries, industries, objectives)' + ), + ] = None + tags: Annotated[ + Optional[List[str]], + Field(description='Tags associated with the fingerprint rule', title='Tags'), + ] = None + description: Annotated[ + Optional[str], + Field(description='Fingerprint rule description', title='Description'), + ] = None + references: Annotated[ + Optional[List[str]], + Field( + description='Reference links for the fingerprint rule', title='References' + ), + ] = None + crowdsec_analysis: Annotated[ + Optional[str], + Field( + description='CrowdSec analysis for this fingerprint rule', + title='Crowdsec Analysis', + ), + ] = None + events: Annotated[ + Optional[List[FingerprintEventOutput]], + Field( + description='List of events related to the fingerprint rule', title='Events' + ), + ] = None + + +class FingerprintRuleSummary(BaseModelSdk): + id: Annotated[str, Field(description='Fingerprint rule identifier', title='Id')] + name: Annotated[str, Field(description='Fingerprint rule name', title='Name')] + title: Annotated[str, Field(description='Fingerprint rule title', title='Title')] + affected_components: Annotated[ + List[AffectedComponent], + Field(description='List of affected components', title='Affected Components'), + ] + crowdsec_score: Annotated[ + int, + Field( + description='Live Exploit Tracker score for the fingerprint rule', + ge=0, + le=10, + title='Crowdsec Score', + ), + ] + opportunity_score: Annotated[ + Optional[int], + Field(description='Opportunity score', ge=0, le=5, title='Opportunity Score'), + ] = 0 + momentum_score: Annotated[ + Optional[int], + Field(description='Momentum score', ge=0, le=5, title='Momentum Score'), + ] = 0 + first_seen: Annotated[ + Optional[datetime], Field(description='First seen date', title='First Seen') + ] = None + last_seen: Annotated[ + Optional[datetime], Field(description='Last seen date', title='Last Seen') + ] = None + nb_ips: Annotated[ + int, Field(description='Number of unique IPs observed', ge=0, title='Nb Ips') + ] + rule_release_date: Annotated[ + Optional[datetime], + Field( + description='Release date of the fingerprint rule', + title='Rule Release Date', + ), + ] = None + exploitation_phase: Annotated[ + ExploitationPhase, Field(description='Current exploitation phase') + ] + adjustment_score: Annotated[ + Optional[AdjustmentScore], Field(description='Score adjustment details') + ] = None + threat_context: Annotated[ + Optional[ThreatContext], + Field( + description='Threat context (attacker/defender countries, industries, objectives)' + ), + ] = None + + +class GetCVEResponse(BaseModelSdk): + id: Annotated[str, Field(description='ID of the CVE', title='Id')] + name: Annotated[str, Field(description='Name of the CVE', title='Name')] + title: Annotated[str, Field(description='Title of the CVE', title='Title')] + affected_components: Annotated[ + List[AffectedComponent], + Field(description='List of affected components', title='Affected Components'), + ] + crowdsec_score: Annotated[ + int, + Field( + description='Live Exploit Tracker score of the CVE', + ge=0, + le=10, + title='Crowdsec Score', + ), + ] + opportunity_score: Annotated[ + Optional[int], + Field( + description="Opportunity score indicating if it's an opportunistic(0) or targeted(5) attack (between 0-5)", + ge=0, + le=5, + title='Opportunity Score', + ), + ] = 0 + momentum_score: Annotated[ + Optional[int], + Field( + description="Momentum score indicating the vulnerability's trendiness based on signal comparison with the previous month. Higher scores (4-5) indicate significantly more signals this month than last month's average, while lower scores (0-1) indicate declining activity (between 0-5)", + ge=0, + le=5, + title='Momentum Score', + ), + ] = 0 + first_seen: Annotated[ + Optional[datetime], Field(description='First seen date', title='First Seen') + ] = None + last_seen: Annotated[ + Optional[datetime], Field(description='Last seen date', title='Last Seen') + ] = None + nb_ips: Annotated[ + int, Field(description='Number of unique IPs affected', ge=0, title='Nb Ips') + ] + published_date: Annotated[ + datetime, Field(description='Published date of the CVE', title='Published Date') + ] + cvss_score: Annotated[ + Optional[CvssScore], + Field(description='CVSS score of the CVE', title='Cvss Score'), + ] = None + has_public_exploit: Annotated[ + bool, + Field( + description='Indicates if there is a public exploit for the CVE', + title='Has Public Exploit', + ), + ] + rule_release_date: Annotated[ + Optional[datetime], + Field( + description='Release date of the associated detection rule', + title='Rule Release Date', + ), + ] = None + exploitation_phase: Annotated[ + ExploitationPhase, Field(description='Current exploitation phase of the CVE') + ] + adjustment_score: Annotated[ + Optional[AdjustmentScore], + Field( + description='Score adjustments applied to the CVE score based on various factors' + ), + ] = None + threat_context: Annotated[ + Optional[ThreatContext], + Field( + description='Threat context (attacker/defender countries, industries, objectives)' + ), + ] = None + tags: Annotated[ + Optional[List[str]], + Field(description='Tags associated with the CVE', title='Tags'), + ] = None + references: Annotated[ + List[str], + Field(description='List of references for the CVE', title='References'), + ] + description: Annotated[ + str, Field(description='Description of the CVE', title='Description') + ] + crowdsec_analysis: Annotated[ + Optional[str], + Field(description='CrowdSec analysis of the CVE', title='Crowdsec Analysis'), + ] = None + cwes: Annotated[ + List[CWE], + Field(description='List of CWEs associated with the CVE', title='Cwes'), + ] + events: Annotated[ + Optional[List[CVEEventOutput]], + Field(description='List of events related to the CVE', title='Events'), + ] = None + + +class GetCVEsResponsePage(BaseModelSdk): + items: Annotated[List[CVEResponseBase], Field(title='Items')] + total: Annotated[int, Field(ge=0, title='Total')] + page: Annotated[int, Field(ge=1, title='Page')] + size: Annotated[int, Field(ge=1, title='Size')] + pages: Annotated[int, Field(ge=0, title='Pages')] + links: Links + + +class GetFingerprintRulesResponsePage(BaseModelSdk): + items: Annotated[List[FingerprintRuleSummary], Field(title='Items')] + total: Annotated[int, Field(ge=0, title='Total')] + page: Annotated[int, Field(ge=1, title='Page')] + size: Annotated[int, Field(ge=1, title='Size')] + pages: Annotated[int, Field(ge=0, title='Pages')] + links: Links + + +class HTTPValidationError(BaseModelSdk): + detail: Annotated[Optional[List[ValidationError]], Field(title='Detail')] = None + + +class IPItem(BaseModelSdk): + ip: Annotated[str, Field(description='IP address', title='Ip')] + reputation: Annotated[ + Optional[str], Field(description='Reputation of the IP', title='Reputation') + ] = None + ip_range: Annotated[ + Optional[str], Field(description='IP range', title='Ip Range') + ] = None + ip_range_score: Annotated[ + Optional[int], Field(description='IP range score', title='Ip Range Score') + ] = None + ip_range_24: Annotated[ + Optional[str], Field(description='IP range /24', title='Ip Range 24') + ] = None + ip_range_24_reputation: Annotated[ + Optional[str], + Field(description='IP range /24 reputation', title='Ip Range 24 Reputation'), + ] = None + ip_range_24_score: Annotated[ + Optional[int], + Field(description='IP range /24 score', title='Ip Range 24 Score'), + ] = None + as_name: Annotated[Optional[str], Field(description='AS name', title='As Name')] = ( + None + ) + as_num: Annotated[Optional[int], Field(description='AS number', title='As Num')] = ( + None + ) + background_noise_score: Annotated[ + Optional[int], + Field(description='Background noise score', title='Background Noise Score'), + ] = None + background_noise: Annotated[ + Optional[str], + Field(description='Background noise level', title='Background Noise'), + ] = None + confidence: Annotated[ + Optional[str], Field(description='Confidence level', title='Confidence') + ] = None + location: Annotated[ + Optional[Location], Field(description='IP location information') + ] = None + reverse_dns: Annotated[ + Optional[str], Field(description='Reverse DNS', title='Reverse Dns') + ] = None + behaviors: Annotated[ + Optional[List[Behavior]], + Field(description='List of behaviors', title='Behaviors'), + ] = None + references: Annotated[ + Optional[List[Reference]], + Field(description='List of references', title='References'), + ] = None + history: Annotated[Optional[History], Field(description='Historical data')] = None + classifications: Annotated[ + Optional[Classifications], Field(description='Classification data') + ] = None + mitre_techniques: Annotated[ + Optional[List[MitreTechnique]], + Field(description='MITRE techniques', title='Mitre Techniques'), + ] = None + cves: Annotated[ + Optional[List[str]], Field(description='List of CVEs', title='Cves') + ] = None + attack_details: Annotated[ + Optional[List[AttackDetail]], + Field(description='Attack details', title='Attack Details'), + ] = None + target_countries: Annotated[ + Optional[Dict[str, int]], + Field(description='Target countries', title='Target Countries'), + ] = None + scores: Annotated[Optional[Scores], Field(description='Scoring information')] = None + + +class IntegrationResponse(BaseModelSdk): + tags: Annotated[Optional[List[str]], Field(title='Tags')] = [] + organization_id: Annotated[str, Field(title='Organization Id')] + created_at: Annotated[ + Optional[datetime], + Field(description='Time the integration was created', title='Created At'), + ] = None + entity_type: Annotated[EntityType, Field(description='Type of the integration')] + id: Annotated[ + Optional[str], Field(description='ID of the integration', title='Id') + ] = None + blocklists: Annotated[ + Optional[List[BlocklistSubscription]], Field(title='Blocklists') + ] = [] + allowlists: Annotated[ + Optional[List[AllowlistSubscription]], Field(title='Allowlists') + ] = [] + cves: Annotated[Optional[List[CVEsubscription]], Field(title='Cves')] = None + fingerprints: Annotated[ + Optional[List[FingerprintSubscription]], Field(title='Fingerprints') + ] = None + vendors: Annotated[Optional[List[VendorSubscription]], Field(title='Vendors')] = ( + None + ) + name: Annotated[str, Field(description='Name of the integration', title='Name')] + updated_at: Annotated[ + Optional[datetime], + Field(description='Last time the integration was updated', title='Updated At'), + ] = None + description: Annotated[ + Optional[str], + Field(description='Description of the integration', title='Description'), + ] = None + output_format: Annotated[ + OutputFormat, Field(description='Output format of the integration') + ] + last_pull: Annotated[ + Optional[datetime], + Field( + description='Last time the integration pulled blocklists', title='Last Pull' + ), + ] = None + pull_limit: Annotated[ + Optional[int], + Field(description='Maximum number of items to pull', title='Pull Limit'), + ] = None + enable_ip_aggregation: Annotated[ + Optional[bool], + Field( + description='Whether to enable IP aggregation into ranges', + title='Enable Ip Aggregation', + ), + ] = False + + +class LookupImpactCVEItem(BaseModelSdk): + id: Annotated[str, Field(description='ID of the CVE', title='Id')] + name: Annotated[str, Field(description='Name of the CVE', title='Name')] + title: Annotated[str, Field(description='Title of the CVE', title='Title')] + affected_components: Annotated[ + List[AffectedComponent], + Field(description='List of affected components', title='Affected Components'), + ] + crowdsec_score: Annotated[ + int, + Field( + description='Live Exploit Tracker score of the CVE', + ge=0, + le=10, + title='Crowdsec Score', + ), + ] + opportunity_score: Annotated[ + Optional[int], + Field( + description="Opportunity score indicating if it's an opportunistic(0) or targeted(5) attack (between 0-5)", + ge=0, + le=5, + title='Opportunity Score', + ), + ] = 0 + momentum_score: Annotated[ + Optional[int], + Field( + description="Momentum score indicating the vulnerability's trendiness based on signal comparison with the previous month. Higher scores (4-5) indicate significantly more signals this month than last month's average, while lower scores (0-1) indicate declining activity (between 0-5)", + ge=0, + le=5, + title='Momentum Score', + ), + ] = 0 + first_seen: Annotated[ + Optional[datetime], Field(description='First seen date', title='First Seen') + ] = None + last_seen: Annotated[ + Optional[datetime], Field(description='Last seen date', title='Last Seen') + ] = None + nb_ips: Annotated[ + int, Field(description='Number of unique IPs affected', ge=0, title='Nb Ips') + ] + published_date: Annotated[ + datetime, Field(description='Published date of the CVE', title='Published Date') + ] + cvss_score: Annotated[ + Optional[CvssScore], + Field(description='CVSS score of the CVE', title='Cvss Score'), + ] = None + has_public_exploit: Annotated[ + bool, + Field( + description='Indicates if there is a public exploit for the CVE', + title='Has Public Exploit', + ), + ] + rule_release_date: Annotated[ + Optional[datetime], + Field( + description='Release date of the associated detection rule', + title='Rule Release Date', + ), + ] = None + exploitation_phase: Annotated[ + ExploitationPhase, Field(description='Current exploitation phase of the CVE') + ] + adjustment_score: Annotated[ + Optional[AdjustmentScore], + Field( + description='Score adjustments applied to the CVE score based on various factors' + ), + ] = None + threat_context: Annotated[ + Optional[ThreatContext], + Field( + description='Threat context (attacker/defender countries, industries, objectives)' + ), + ] = None + tags: Annotated[ + Optional[List[str]], + Field(description='Tags associated with the CVE', title='Tags'), + ] = None + references: Annotated[ + List[str], + Field(description='List of references for the CVE', title='References'), + ] + description: Annotated[ + str, Field(description='Description of the CVE', title='Description') + ] + crowdsec_analysis: Annotated[ + Optional[str], + Field(description='CrowdSec analysis of the CVE', title='Crowdsec Analysis'), + ] = None + cwes: Annotated[ + List[CWE], + Field(description='List of CWEs associated with the CVE', title='Cwes'), + ] + events: Annotated[ + Optional[List[CVEEventOutput]], + Field(description='List of events related to the CVE', title='Events'), + ] = None + type: Annotated[ + Literal['cve'], Field(description='Resource type', title='Type') + ] = 'cve' + + +class LookupImpactFingerprintItem(BaseModelSdk): + id: Annotated[str, Field(description='Fingerprint rule identifier', title='Id')] + name: Annotated[str, Field(description='Fingerprint rule name', title='Name')] + title: Annotated[str, Field(description='Fingerprint rule title', title='Title')] + affected_components: Annotated[ + List[AffectedComponent], + Field(description='List of affected components', title='Affected Components'), + ] + crowdsec_score: Annotated[ + int, + Field( + description='Live Exploit Tracker score for the fingerprint rule', + ge=0, + le=10, + title='Crowdsec Score', + ), + ] + opportunity_score: Annotated[ + Optional[int], + Field(description='Opportunity score', ge=0, le=5, title='Opportunity Score'), + ] = 0 + momentum_score: Annotated[ + Optional[int], + Field(description='Momentum score', ge=0, le=5, title='Momentum Score'), + ] = 0 + first_seen: Annotated[ + Optional[datetime], Field(description='First seen date', title='First Seen') + ] = None + last_seen: Annotated[ + Optional[datetime], Field(description='Last seen date', title='Last Seen') + ] = None + nb_ips: Annotated[ + int, Field(description='Number of unique IPs observed', ge=0, title='Nb Ips') + ] + rule_release_date: Annotated[ + Optional[datetime], + Field( + description='Release date of the fingerprint rule', + title='Rule Release Date', + ), + ] = None + exploitation_phase: Annotated[ + ExploitationPhase, Field(description='Current exploitation phase') + ] + adjustment_score: Annotated[ + Optional[AdjustmentScore], Field(description='Score adjustment details') + ] = None + threat_context: Annotated[ + Optional[ThreatContext], + Field( + description='Threat context (attacker/defender countries, industries, objectives)' + ), + ] = None + tags: Annotated[ + Optional[List[str]], + Field(description='Tags associated with the fingerprint rule', title='Tags'), + ] = None + description: Annotated[ + Optional[str], + Field(description='Fingerprint rule description', title='Description'), + ] = None + references: Annotated[ + Optional[List[str]], + Field( + description='Reference links for the fingerprint rule', title='References' ), - ] = 7 - interval: Annotated[ - Optional[IntervalOptions], + ] = None + crowdsec_analysis: Annotated[ + Optional[str], Field( - description="Interval for aggregating timeline data. Options: 'hour', 'day', 'week'. Default is adapted based on 'since' parameter.", - title='Interval', + description='CrowdSec analysis for this fingerprint rule', + title='Crowdsec Analysis', + ), + ] = None + events: Annotated[ + Optional[List[FingerprintEventOutput]], + Field( + description='List of events related to the fingerprint rule', title='Events' ), ] = None + type: Annotated[ + Literal['fingerprint'], Field(description='Resource type', title='Type') + ] = 'fingerprint' -class FingerprintsGetFingerprintTimelinePathParameters(BaseModelSdk): - fingerprint: Annotated[str, Field(title='Fingerprint')] +class Items(RootModelSdk[Union[LookupImpactCVEItem, LookupImpactFingerprintItem]]): + root: Annotated[ + Union[LookupImpactCVEItem, LookupImpactFingerprintItem], + Field(discriminator='type'), + ] -class FingerprintsGetFingerprintRulePathParameters(BaseModelSdk): - fingerprint: Annotated[str, Field(title='Fingerprint')] +class LookupImpactResponsePage(BaseModelSdk): + items: Annotated[List[Items], Field(title='Items')] + total: Annotated[int, Field(ge=0, title='Total')] + page: Annotated[int, Field(ge=1, title='Page')] + size: Annotated[int, Field(ge=1, title='Size')] + pages: Annotated[int, Field(ge=0, title='Pages')] + links: Links -class HTTPValidationError(BaseModelSdk): - detail: Annotated[Optional[List[ValidationError]], Field(title='Detail')] = None +class ProtectRule(BaseModelSdk): + link: Annotated[str, Field(description='URL to the rule source', title='Link')] + published_date: Annotated[ + Optional[datetime], + Field(description='Date the rule was published', title='Published Date'), + ] = None + tags: Annotated[ + Optional[List[ProtectRuleTag]], + Field(description='Tags associated with the rule', title='Tags'), + ] = None + name: Annotated[str, Field(description='Rule name', title='Name')] + label: Annotated[str, Field(description='Human-readable rule label', title='Label')] + content: Annotated[ + Optional[str], Field(description='Rule content/definition', title='Content') + ] = None class IntegrationCreateRequest(BaseModelSdk): @@ -1335,6 +1954,13 @@ class IntegrationCreateResponse(BaseModelSdk): title='Fingerprints', ), ] + vendors: Annotated[ + List[VendorSubscription], + Field( + description='Vendors that are subscribed by the integration', + title='Vendors', + ), + ] endpoint: Annotated[ AnyUrl, Field( @@ -1423,6 +2049,13 @@ class IntegrationGetResponse(BaseModelSdk): title='Fingerprints', ), ] + vendors: Annotated[ + List[VendorSubscription], + Field( + description='Vendors that are subscribed by the integration', + title='Vendors', + ), + ] endpoint: Annotated[ AnyUrl, Field( @@ -1459,40 +2092,6 @@ class IntegrationGetResponsePage(BaseModelSdk): links: Links -class IntegrationUpdateRequest(BaseModelSdk): - model_config = ConfigDict( - extra='forbid', - ) - name: Annotated[ - Optional[str], Field(description='New name', min_length=1, title='Name') - ] = None - description: Annotated[ - Optional[str], - Field(description='New description', min_length=1, title='Description'), - ] = None - output_format: Annotated[ - Optional[OutputFormat], Field(description='New output format') - ] = None - regenerate_credentials: Annotated[ - Optional[bool], - Field( - description='Regenerate credentials for the integration', - title='Regenerate Credentials', - ), - ] = None - pull_limit: Annotated[ - Optional[int], - Field(description='Maximum number of items to pull', title='Pull Limit'), - ] = None - enable_ip_aggregation: Annotated[ - Optional[bool], - Field( - description='Whether to enable IP aggregation into ranges', - title='Enable Ip Aggregation', - ), - ] = False - - class IntegrationUpdateResponse(BaseModelSdk): id: Annotated[str, Field(description='ID of the integration', title='Id')] name: Annotated[ @@ -1547,6 +2146,13 @@ class IntegrationUpdateResponse(BaseModelSdk): title='Fingerprints', ), ] + vendors: Annotated[ + List[VendorSubscription], + Field( + description='Vendors that are subscribed by the integration', + title='Vendors', + ), + ] endpoint: Annotated[ AnyUrl, Field( @@ -1578,78 +2184,21 @@ class IntegrationUpdateResponse(BaseModelSdk): ] = None -class CVEResponseBase(BaseModelSdk): - id: Annotated[str, Field(description='ID of the CVE', title='Id')] - name: Annotated[str, Field(description='Name of the CVE', title='Name')] - title: Annotated[str, Field(description='Title of the CVE', title='Title')] - affected_components: Annotated[ - List[AffectedComponent], - Field(description='List of affected components', title='Affected Components'), - ] - crowdsec_score: Annotated[ - int, - Field( - description='Live Exploit Tracker score of the CVE', - ge=0, - le=10, - title='Crowdsec Score', - ), - ] - opportunity_score: Annotated[ - Optional[int], - Field( - description="Opportunity score indicating if it's an opportunistic(0) or targeted(5) attack (between 0-5)", - ge=0, - le=5, - title='Opportunity Score', - ), - ] = 0 - momentum_score: Annotated[ - Optional[int], - Field( - description="Momentum score indicating the vulnerability's trendiness based on signal comparison with the previous month. Higher scores (4-5) indicate significantly more signals this month than last month's average, while lower scores (0-1) indicate declining activity (between 0-5)", - ge=0, - le=5, - title='Momentum Score', - ), - ] = 0 - first_seen: Annotated[ - Optional[datetime], Field(description='First seen date', title='First Seen') - ] = None - last_seen: Annotated[ - Optional[datetime], Field(description='Last seen date', title='Last Seen') - ] = None - nb_ips: Annotated[ - int, Field(description='Number of unique IPs affected', ge=0, title='Nb Ips') - ] - published_date: Annotated[ - datetime, Field(description='Published date of the CVE', title='Published Date') - ] - cvss_score: Annotated[ - Optional[CvssScore], - Field(description='CVSS score of the CVE', title='Cvss Score'), - ] = None - has_public_exploit: Annotated[ - bool, - Field( - description='Indicates if there is a public exploit for the CVE', - title='Has Public Exploit', - ), - ] - rule_release_date: Annotated[ - Optional[datetime], - Field( - description='Release date of the associated detection rule', - title='Rule Release Date', - ), - ] = None - exploitation_phase: Annotated[ - ExploitationPhase, Field(description='Current exploitation phase of the CVE') - ] - adjustment_score: Annotated[ - Optional[AdjustmentScore], +class GetCVEIPsResponsePage(BaseModelSdk): + items: Annotated[List[IPItem], Field(title='Items')] + total: Annotated[int, Field(ge=0, title='Total')] + page: Annotated[int, Field(ge=1, title='Page')] + size: Annotated[int, Field(ge=1, title='Size')] + pages: Annotated[int, Field(ge=0, title='Pages')] + links: Links + + +class GetCVEProtectRulesResponse(BaseModelSdk): + protect_rules: Annotated[ + Optional[List[ProtectRule]], Field( - description='Score adjustments applied to the CVE score based on various factors' + description='Protection/detection rules associated with the CVE', + title='Protect Rules', ), ] = None @@ -1663,8 +2212,8 @@ class GetCVESubscribedIntegrationsResponsePage(BaseModelSdk): links: Links -class GetCVEsResponsePage(BaseModelSdk): - items: Annotated[List[CVEResponseBase], Field(title='Items')] +class GetFingerprintIPsResponsePage(BaseModelSdk): + items: Annotated[List[IPItem], Field(title='Items')] total: Annotated[int, Field(ge=0, title='Total')] page: Annotated[int, Field(ge=1, title='Page')] size: Annotated[int, Field(ge=1, title='Size')] @@ -1681,82 +2230,7 @@ class GetFingerprintSubscribedIntegrationsResponsePage(BaseModelSdk): links: Links -class IPItem(BaseModelSdk): - ip: Annotated[str, Field(description='IP address', title='Ip')] - reputation: Annotated[ - Optional[str], Field(description='Reputation of the IP', title='Reputation') - ] = None - ip_range: Annotated[ - Optional[str], Field(description='IP range', title='Ip Range') - ] = None - ip_range_score: Annotated[ - Optional[int], Field(description='IP range score', title='Ip Range Score') - ] = None - ip_range_24: Annotated[ - Optional[str], Field(description='IP range /24', title='Ip Range 24') - ] = None - ip_range_24_reputation: Annotated[ - Optional[str], - Field(description='IP range /24 reputation', title='Ip Range 24 Reputation'), - ] = None - ip_range_24_score: Annotated[ - Optional[int], - Field(description='IP range /24 score', title='Ip Range 24 Score'), - ] = None - as_name: Annotated[Optional[str], Field(description='AS name', title='As Name')] = ( - None - ) - as_num: Annotated[Optional[int], Field(description='AS number', title='As Num')] = ( - None - ) - background_noise_score: Annotated[ - Optional[int], - Field(description='Background noise score', title='Background Noise Score'), - ] = None - background_noise: Annotated[ - Optional[str], - Field(description='Background noise level', title='Background Noise'), - ] = None - confidence: Annotated[ - Optional[str], Field(description='Confidence level', title='Confidence') - ] = None - location: Annotated[ - Optional[Location], Field(description='IP location information') - ] = None - reverse_dns: Annotated[ - Optional[str], Field(description='Reverse DNS', title='Reverse Dns') - ] = None - behaviors: Annotated[ - Optional[List[Behavior]], - Field(description='List of behaviors', title='Behaviors'), - ] = None - references: Annotated[ - Optional[List[Reference]], - Field(description='List of references', title='References'), - ] = None - history: Annotated[Optional[History], Field(description='Historical data')] = None - classifications: Annotated[ - Optional[Classifications], Field(description='Classification data') - ] = None - mitre_techniques: Annotated[ - Optional[List[MitreTechnique]], - Field(description='MITRE techniques', title='Mitre Techniques'), - ] = None - cves: Annotated[ - Optional[List[str]], Field(description='List of CVEs', title='Cves') - ] = None - attack_details: Annotated[ - Optional[List[AttackDetail]], - Field(description='Attack details', title='Attack Details'), - ] = None - target_countries: Annotated[ - Optional[Dict[str, int]], - Field(description='Target countries', title='Target Countries'), - ] = None - scores: Annotated[Optional[Scores], Field(description='Scoring information')] = None - - -class GetCVEIPsResponsePage(BaseModelSdk): +class GetVendorIPsResponsePage(BaseModelSdk): items: Annotated[List[IPItem], Field(title='Items')] total: Annotated[int, Field(ge=0, title='Total')] page: Annotated[int, Field(ge=1, title='Page')] @@ -1765,8 +2239,8 @@ class GetCVEIPsResponsePage(BaseModelSdk): links: Links -class GetFingerprintIPsResponsePage(BaseModelSdk): - items: Annotated[List[IPItem], Field(title='Items')] +class GetVendorSubscribedIntegrationsResponsePage(BaseModelSdk): + items: Annotated[List[IntegrationResponse], Field(title='Items')] total: Annotated[int, Field(ge=0, title='Total')] page: Annotated[int, Field(ge=1, title='Page')] size: Annotated[int, Field(ge=1, title='Size')] diff --git a/crowdsec_tracker_api/services/__pycache__/__init__.cpython-311.pyc b/crowdsec_tracker_api/services/__pycache__/__init__.cpython-311.pyc index 031bdb7d0eae45a1fed0bcf1318710282ae9beff..6cde4f41796f3bfce543b3d6a8a350828c6db025 100644 GIT binary patch delta 78 zcmaFEc$|@YIWI340}w1~zdn)Mlrd_eqp(p?S*mVgL8d;8PEXBCElMm&O^Gi~$<|LU Z$}dkTPEC$4DN0PvPA!TDDxJ965di6A8_xg$ delta 115 zcmX@k_=b^tIWI340}!y^oI8=*l(BxIqi}e9Nq&Bgen4eOMt+{Yv7Vu!o}r0;Vo|P{ ziGEIIl70bL0wk_qoLQ2pTacKXotU0l43&s4PRWi>Pt8j$N-W7Q(l0JaEXhpPFD^=+ H*yacTCYvWJ diff --git a/crowdsec_tracker_api/services/__pycache__/cves.cpython-311.pyc b/crowdsec_tracker_api/services/__pycache__/cves.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea719cd198e2ea34e748028ee4a3b77de9fddb4f GIT binary patch literal 11011 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 Bx@-Ud literal 0 HcmV?d00001 diff --git a/crowdsec_tracker_api/services/__pycache__/fingerprints.cpython-311.pyc b/crowdsec_tracker_api/services/__pycache__/fingerprints.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04ea77927b373bffcd2968200051afc3c33a6943 GIT binary patch literal 10917 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 literal 0 HcmV?d00001 diff --git a/crowdsec_tracker_api/services/__pycache__/tracker_events.cpython-311.pyc b/crowdsec_tracker_api/services/__pycache__/tracker_events.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03451fcba98e2e76d9884e8fc1d543971f2f4aad GIT binary patch literal 2913 zcma)8O>7&-6`tiTm&+wrltkK*9SN~x$2QxFl$0MhffLj*T*p8wyR}*%o5N~JR&>Q$ zPCGmMX5O2bH*em1^X>k@aclzR=Erw~e`E>yJ2Jxpyef}=2hA6R5~_v7#WoXat&E$| zu&;-D%W#cW*3Gs|*94hCvte!tTQjs;c{ks(U0cn~g@snpEw&ujQM?t7wMuSD_4DC) zYr>sS>+Nu|Rd&l7$&gco7OoOnWcGC(?1VQhZiQ;+NY#0O>|#}u)?zziOP4#Ws!Quk zCl1GFbVO zfQ1xh=2ho(wA=>9INpt$(Aw|Capy!BuqbY%2Bmaji+OYdIv<1A7;!a9+zc(#4AZI3 z4D`>kxj~jSYF>5REX`#IGpTi5gY&_g7MfL0p4!VfT7XqWmSg6g;V_{N@WwWN40vlB zU-~b8oaN~RyauzE$LZwNtXtS1mo&EsUaUxGiTjNUjGtVE6NxALn{YhwR=w`iRuI+v zPEc#`_C+dKqZYBazB(@rA3PzgUxUNEE)S*2S={B(V&iFuz*bBlU@>W;@-m+c3>Pc&J*-PeMd9F63jbMAKK28_iLTY z90R$wdn72ep^*-Zi7JqPUm^D_=aby0xx3cX9c${^kv~RYS1X*H8!eFT$< z)L)&W(x6N<9-yxuETAwef~diyE!sTx+MI$n%*HD70xHKkoUI1!uJAfdh_cK_?BZ6} z=-|aMM6kvh7AoH=IcQb9;l3keXzSMVBfg#w$hsYG%a`+bIaP^K(^jEoKzjM#YroO1 zVFaEjG;>QIy*#7bdI9z+_Q?4mppk3lGfF_vvwFo|p=aMRuERbzpYFBp#HIhtrzXwz zNTBtcoilbctI=x6)ZF4)br|K@G|F{$sS~yX03`sZS>@r`M$?a0*b?ANkzHzpUCO)& zPz|zD$17Io_;J(g_}p&^X>PT-Ci5X`LgpY(5s&^zs+KgvcEb;aG|mfvziim{sgTD; z^63^U1;a(b%wS^J?)c&6}_1DRLIl`ZKHT^tnx|o z)8>ZWpR8=;?oI6aZ126|dr9#O)Z4G7?cJhxr|9)(_78O8e5gGn8E5Px_+3BaP+6t zMa&f-$#KY;6Tdns&H-4QL9F0-Nn{0N&qQA85Hfxg#`!Uv8xW*lE~V{_b7`A=;H91aL2a`8#s2*9Wd8WqhrXRZ zy*YonzwcoG&A0on9qm_k^((sv6H{3iHbHv7G&#sB)+D=Tl9}1fN^Ou+0*g%S`Lg_( zGsr8}CVTcL`(NLjdSg&ff+DF*C)0DA<@tf51Y-o0l~i{eyXiKQB)>2yE2-Ks-S_*c z3ZZgRbr(TX{&FwVt5`$@z+mUoy*jZ;-J9` zC`0GV(oj}g#-AX;@slI7c;7FnoZxTZTtvk*Y;)Md^irXGVjWBK=^g%4kYS9)KY!9!$tc9T?LZ=EKhP Px2GPek;l&&SN`}8Mt}t~ literal 0 HcmV?d00001 diff --git a/crowdsec_tracker_api/services/__pycache__/tracker_tags.cpython-311.pyc b/crowdsec_tracker_api/services/__pycache__/tracker_tags.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1976e9f087c058960fb4a1e35f7a8aa0dec8db5f GIT binary patch literal 5697 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 None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_tracker_api/1.108.1") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_tracker_api/v0.15.22-dev80") def get_cves( self, query: Optional[str] = None, sort_by: Optional[GetCVEsSortBy] = GetCVEsSortBy("rule_release_date"), sort_order: Optional[GetCVEsSortOrder] = GetCVEsSortOrder("desc"), - filters: Optional[list[GetCVEsFilterBy]] = None, + exploitation_phase: Optional[CVEExploitationPhase] = None, page: int = 1, size: int = 50, )-> GetCVEsResponsePage: @@ -58,6 +58,26 @@ def get_cve( return GetCVEResponse(**response.json()) + def get_cve_protect_rules( + self, + cve_id: str, + )-> GetCVEProtectRulesResponse: + endpoint_url = "/cves/{cve_id}/protect-rules" + loc = locals() + headers = {} + params = {} + path_params = json.loads( + CvesGetCveProtectRulesPathParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + + response = self.http_client.get( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return GetCVEProtectRulesResponse(**response.json()) + def download_cve_ips( self, cve_id: str, @@ -105,6 +125,31 @@ def get_cve_ips_details( return GetCVEIPsResponsePage(_client=self, **response.json()) + def get_cve_ips_details_stats( + self, + cve_id: str, + since: Optional[str] = "14d", + )-> IpsDetailsStats: + endpoint_url = "/cves/{cve_id}/ips-details-stats" + loc = locals() + headers = {} + params = json.loads( + CvesGetCveIpsDetailsStatsQueryParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + path_params = json.loads( + CvesGetCveIpsDetailsStatsPathParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + + response = self.http_client.get( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return IpsDetailsStats(**response.json()) + def get_cve_subscribed_integrations( self, cve_id: str, diff --git a/crowdsec_tracker_api/services/fingerprints.py b/crowdsec_tracker_api/services/fingerprints.py index aa7861c..7bec4ec 100644 --- a/crowdsec_tracker_api/services/fingerprints.py +++ b/crowdsec_tracker_api/services/fingerprints.py @@ -11,14 +11,13 @@ class Fingerprints(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_tracker_api/1.108.1") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_tracker_api/v0.15.22-dev80") def get_fingerprint_rules( self, query: Optional[str] = None, sort_by: Optional[GetCVEsSortBy] = GetCVEsSortBy("rule_release_date"), sort_order: Optional[GetCVEsSortOrder] = GetCVEsSortOrder("desc"), - filters: Optional[list[GetCVEsFilterBy]] = None, page: int = 1, size: int = 50, )-> GetFingerprintRulesResponsePage: @@ -85,6 +84,31 @@ def get_fingerprint_ips_details( return GetFingerprintIPsResponsePage(_client=self, **response.json()) + def get_fingerprint_ips_details_stats( + self, + fingerprint: str, + since: Optional[str] = "14d", + )-> IpsDetailsStats: + endpoint_url = "/fingerprints/{fingerprint}/ips-details-stats" + loc = locals() + headers = {} + params = json.loads( + FingerprintsGetFingerprintIpsDetailsStatsQueryParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + path_params = json.loads( + FingerprintsGetFingerprintIpsDetailsStatsPathParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + + response = self.http_client.get( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return IpsDetailsStats(**response.json()) + def get_fingerprint_subscribed_integrations( self, fingerprint: str, diff --git a/crowdsec_tracker_api/services/integrations.py b/crowdsec_tracker_api/services/integrations.py index 46ed4a7..a57910b 100644 --- a/crowdsec_tracker_api/services/integrations.py +++ b/crowdsec_tracker_api/services/integrations.py @@ -11,11 +11,13 @@ class Integrations(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_tracker_api/1.108.1") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_tracker_api/v0.15.22-dev80") def get_integrations( self, tag: Optional[list[str]] = None, + page: int = 1, + size: int = 50, )-> IntegrationGetResponsePage: endpoint_url = "/integrations" loc = locals() diff --git a/crowdsec_tracker_api/services/products.py b/crowdsec_tracker_api/services/products.py index 4c18648..4b6918b 100644 --- a/crowdsec_tracker_api/services/products.py +++ b/crowdsec_tracker_api/services/products.py @@ -11,14 +11,14 @@ class Products(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_tracker_api/1.108.1") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_tracker_api/v0.15.22-dev80") def get_products( self, query: Optional[str] = None, page: int = 1, size: int = 50, - )-> LookupListResponsePage: + )-> LookupListWithStatsResponsePage: endpoint_url = "/products" loc = locals() headers = {} @@ -33,7 +33,7 @@ def get_products( url=endpoint_url, path_params=path_params, params=params, headers=headers ) - return LookupListResponsePage(_client=self, **response.json()) + return LookupListWithStatsResponsePage(_client=self, **response.json()) def get_product_impact( self, diff --git a/crowdsec_tracker_api/services/tags.py b/crowdsec_tracker_api/services/tags.py deleted file mode 100644 index 891fba5..0000000 --- a/crowdsec_tracker_api/services/tags.py +++ /dev/null @@ -1,65 +0,0 @@ -import json -from types import NoneType -from typing import Optional, Union, Annotated - -from ..models import * -from ..base_model import Page, Service -from pydantic import BaseModel, Field -from pydantic.fields import FieldInfo -from httpx import Auth -from ..http_client import HttpClient - -class Tags(Service): - def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_tracker_api/1.108.1") - - def get_tags( - self, - query: Optional[str] = None, - page: int = 1, - size: int = 50, - )-> LookupListResponsePage: - endpoint_url = "/tags" - loc = locals() - headers = {} - params = json.loads( - TagsGetTagsQueryParameters(**loc).model_dump_json( - exclude_none=True - ) - ) - path_params = {} - - response = self.http_client.get( - url=endpoint_url, path_params=path_params, params=params, headers=headers - ) - - return LookupListResponsePage(_client=self, **response.json()) - - def get_tag_impact( - self, - tag: str, - sort_by: Optional[GetCVEsSortBy] = GetCVEsSortBy("rule_release_date"), - sort_order: Optional[GetCVEsSortOrder] = GetCVEsSortOrder("desc"), - page: int = 1, - size: int = 50, - )-> LookupImpactResponsePage: - endpoint_url = "/tags/{tag}" - loc = locals() - headers = {} - params = json.loads( - TagsGetTagImpactQueryParameters(**loc).model_dump_json( - exclude_none=True - ) - ) - path_params = json.loads( - TagsGetTagImpactPathParameters(**loc).model_dump_json( - exclude_none=True - ) - ) - - response = self.http_client.get( - url=endpoint_url, path_params=path_params, params=params, headers=headers - ) - - return LookupImpactResponsePage(_client=self, **response.json()) - \ No newline at end of file diff --git a/crowdsec_tracker_api/services/tracker_events.py b/crowdsec_tracker_api/services/tracker_events.py new file mode 100644 index 0000000..20a45c4 --- /dev/null +++ b/crowdsec_tracker_api/services/tracker_events.py @@ -0,0 +1,41 @@ +import json +from types import NoneType +from typing import Optional, Union, Annotated + +from ..models import * +from ..base_model import Page, Service +from pydantic import BaseModel, Field +from pydantic.fields import FieldInfo +from httpx import Auth +from ..http_client import HttpClient + +class TrackerEvents(Service): + def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_tracker_api/v0.15.22-dev80") + + def get_exploitation_phase_change_events( + self, + since: str = "30d", + sort_order: Optional[GetCVEsSortOrder] = GetCVEsSortOrder("desc"), + cve_id: Optional[str] = None, + previous_phase: Optional[CVEExploitationPhase] = None, + new_phase: Optional[CVEExploitationPhase] = None, + page: int = 1, + size: int = 50, + )-> ExploitationPhaseChangeEventsResponsePage: + endpoint_url = "/tracker-events/exploitation-phase-change" + loc = locals() + headers = {} + params = json.loads( + TrackerEventsGetExploitationPhaseChangeEventsQueryParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + path_params = {} + + response = self.http_client.get( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return ExploitationPhaseChangeEventsResponsePage(_client=self, **response.json()) + \ No newline at end of file diff --git a/crowdsec_tracker_api/services/tracker_tags.py b/crowdsec_tracker_api/services/tracker_tags.py new file mode 100644 index 0000000..7a4fce4 --- /dev/null +++ b/crowdsec_tracker_api/services/tracker_tags.py @@ -0,0 +1,115 @@ +import json +from types import NoneType +from typing import Optional, Union, Annotated + +from ..models import * +from ..base_model import Page, Service +from pydantic import BaseModel, Field +from pydantic.fields import FieldInfo +from httpx import Auth +from ..http_client import HttpClient + +class TrackerTags(Service): + def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_tracker_api/v0.15.22-dev80") + + def get_tags( + self, + query: Optional[str] = None, + page: int = 1, + size: int = 50, + )-> LookupListWithStatsResponsePage: + endpoint_url = "/tags" + loc = locals() + headers = {} + params = json.loads( + TrackerTagsGetTagsQueryParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + path_params = {} + + response = self.http_client.get( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return LookupListWithStatsResponsePage(_client=self, **response.json()) + + def get_tag_impact( + self, + tag: str, + sort_by: Optional[GetCVEsSortBy] = GetCVEsSortBy("rule_release_date"), + sort_order: Optional[GetCVEsSortOrder] = GetCVEsSortOrder("desc"), + page: int = 1, + size: int = 50, + )-> LookupImpactResponsePage: + endpoint_url = "/tags/{tag}" + loc = locals() + headers = {} + params = json.loads( + TrackerTagsGetTagImpactQueryParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + path_params = json.loads( + TrackerTagsGetTagImpactPathParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + + response = self.http_client.get( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return LookupImpactResponsePage(_client=self, **response.json()) + + def get_tracker_tags( + self, + query: Optional[str] = None, + page: int = 1, + size: int = 50, + )-> LookupListWithStatsResponsePage: + endpoint_url = "/tracker-tags" + loc = locals() + headers = {} + params = json.loads( + TrackerTagsGetTrackerTagsQueryParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + path_params = {} + + response = self.http_client.get( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return LookupListWithStatsResponsePage(_client=self, **response.json()) + + def get_tracker_tag_impact( + self, + tag: str, + sort_by: Optional[GetCVEsSortBy] = GetCVEsSortBy("rule_release_date"), + sort_order: Optional[GetCVEsSortOrder] = GetCVEsSortOrder("desc"), + page: int = 1, + size: int = 50, + )-> LookupImpactResponsePage: + endpoint_url = "/tracker-tags/{tag}" + loc = locals() + headers = {} + params = json.loads( + TrackerTagsGetTrackerTagImpactQueryParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + path_params = json.loads( + TrackerTagsGetTrackerTagImpactPathParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + + response = self.http_client.get( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return LookupImpactResponsePage(_client=self, **response.json()) + \ No newline at end of file diff --git a/crowdsec_tracker_api/services/vendors.py b/crowdsec_tracker_api/services/vendors.py index 6058dc9..52ce24f 100644 --- a/crowdsec_tracker_api/services/vendors.py +++ b/crowdsec_tracker_api/services/vendors.py @@ -11,14 +11,16 @@ class Vendors(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_tracker_api/1.108.1") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_tracker_api/v0.15.22-dev80") def get_vendors( self, query: Optional[str] = None, + sort_by: Optional[VendorSortBy] = None, + sort_order: Optional[GetCVEsSortOrder] = GetCVEsSortOrder("desc"), page: int = 1, size: int = 50, - )-> LookupListResponsePage: + )-> LookupListWithStatsResponsePage: endpoint_url = "/vendors" loc = locals() headers = {} @@ -33,7 +35,172 @@ def get_vendors( url=endpoint_url, path_params=path_params, params=params, headers=headers ) - return LookupListResponsePage(_client=self, **response.json()) + return LookupListWithStatsResponsePage(_client=self, **response.json()) + + def get_vendor_stats( + self, + vendor: str, + )-> VendorStatsResponse: + endpoint_url = "/vendors/{vendor}/stats" + loc = locals() + headers = {} + params = {} + path_params = json.loads( + VendorsGetVendorStatsPathParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + + response = self.http_client.get( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return VendorStatsResponse(**response.json()) + + def download_vendor_ips( + self, + vendor: str, + )-> str: + endpoint_url = "/vendors/{vendor}/ips-download" + loc = locals() + headers = {} + params = {} + path_params = json.loads( + VendorsDownloadVendorIpsPathParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + + response = self.http_client.get( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return response.text + + def get_vendor_ips_details( + self, + vendor: str, + since: Optional[str] = "14d", + page: int = 1, + size: int = 50, + )-> GetVendorIPsResponsePage: + endpoint_url = "/vendors/{vendor}/ips-details" + loc = locals() + headers = {} + params = json.loads( + VendorsGetVendorIpsDetailsQueryParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + path_params = json.loads( + VendorsGetVendorIpsDetailsPathParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + + response = self.http_client.get( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return GetVendorIPsResponsePage(_client=self, **response.json()) + + def get_vendor_ips_details_stats( + self, + vendor: str, + since: Optional[str] = "14d", + )-> IpsDetailsStats: + endpoint_url = "/vendors/{vendor}/ips-details-stats" + loc = locals() + headers = {} + params = json.loads( + VendorsGetVendorIpsDetailsStatsQueryParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + path_params = json.loads( + VendorsGetVendorIpsDetailsStatsPathParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + + response = self.http_client.get( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return IpsDetailsStats(**response.json()) + + def get_vendor_subscribed_integrations( + self, + vendor: str, + page: int = 1, + size: int = 50, + )-> GetVendorSubscribedIntegrationsResponsePage: + endpoint_url = "/vendors/{vendor}/integrations" + loc = locals() + headers = {} + params = json.loads( + VendorsGetVendorSubscribedIntegrationsQueryParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + path_params = json.loads( + VendorsGetVendorSubscribedIntegrationsPathParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + + response = self.http_client.get( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return GetVendorSubscribedIntegrationsResponsePage(_client=self, **response.json()) + + def subscribe_integration_to_vendor( + self, + request: SubscribeVendorIntegrationRequest, + vendor: str, + ): + endpoint_url = "/vendors/{vendor}/integrations" + loc = locals() + headers = {} + params = {} + path_params = json.loads( + VendorsSubscribeIntegrationToVendorPathParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + + payload = json.loads( + request.model_dump_json( + exclude_none=True + ) + ) if "request" in loc else None + response = self.http_client.post( + url=endpoint_url, path_params=path_params, params=params, headers=headers, json=payload + ) + + return None + + def unsubscribe_integration_from_vendor( + self, + vendor: str, + integration_name: str, + ): + endpoint_url = "/vendors/{vendor}/integrations/{integration_name}" + loc = locals() + headers = {} + params = {} + path_params = json.loads( + VendorsUnsubscribeIntegrationFromVendorPathParameters(**loc).model_dump_json( + exclude_none=True + ) + ) + + response = self.http_client.delete( + url=endpoint_url, path_params=path_params, params=params, headers=headers + ) + + return None def get_vendor_impact( self, diff --git a/doc/Cves.md b/doc/Cves.md index fad591b..2f7739c 100644 --- a/doc/Cves.md +++ b/doc/Cves.md @@ -5,8 +5,10 @@ | ------ | ----------- | | [get_cves](#get_cves) | Get a paginated list of CVEs that CrowdSec is tracking | | [get_cve](#get_cve) | Get information about a specific CVE ID | +| [get_cve_protect_rules](#get_cve_protect_rules) | Get protection/detection rules associated with a specific CVE ID | | [download_cve_ips](#download_cve_ips) | Download the list of IPs exploiting a specific CVE ID in raw format | | [get_cve_ips_details](#get_cve_ips_details) | Get detailed information about IPs exploiting a specific CVE ID | +| [get_cve_ips_details_stats](#get_cve_ips_details_stats) | Get aggregated statistics about IPs exploiting a specific CVE ID | | [get_cve_subscribed_integrations](#get_cve_subscribed_integrations) | Get the list of integrations subscribed to a specific CVE ID | | [subscribe_integration_to_cve](#subscribe_integration_to_cve) | Subscribe an integration to receive threats related to a specific CVE ID | | [unsubscribe_integration_from_cve](#unsubscribe_integration_from_cve) | Unsubscribe an integration from receiving threats related to a specific CVE ID | @@ -23,7 +25,7 @@ | query | Optional[str] | Search query for CVEs | False | None | | sort_by | Optional[GetCVEsSortBy] | Field to sort by | False | GetCVEsSortBy("rule_release_date") | | sort_order | Optional[GetCVEsSortOrder] | Sort order: ascending or descending | False | GetCVEsSortOrder("desc") | -| filters | Optional[list[GetCVEsFilterBy]] | Filters to apply on the CVE list | False | None | +| exploitation_phase | Optional[CVEExploitationPhase] | Filter by exploitation phase | False | None | | page | int | Page number | False | 1 | | size | int | Page size | False | 50 | ### Returns: @@ -47,7 +49,7 @@ try: query=None, sort_by=rule_release_date, sort_order=desc, - filters=None, + exploitation_phase=None, page=1, size=50, ) @@ -93,6 +95,42 @@ except HTTPStatusError as e: ``` +## **get_cve_protect_rules** +### Get protection/detection rules associated with a specific CVE ID +- Endpoint: `/cves/{cve_id}/protect-rules` +- Method: `GET` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| cve_id | str | | True | | +### Returns: +[GetCVEProtectRulesResponse](./Models.md#getcveprotectrulesresponse) +### Errors: +| Code | Description | +| ---- | ----------- | +| 404 | CVE Not Found | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_tracker_api import ( + Cves, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = Cves(auth=auth) +try: + response = client.get_cve_protect_rules( + cve_id='cve_id', + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + + ## **download_cve_ips** ### Download the list of IPs exploiting a specific CVE ID in raw format - Endpoint: `/cves/{cve_id}/ips-download` @@ -171,6 +209,44 @@ except HTTPStatusError as e: ``` +## **get_cve_ips_details_stats** +### Get aggregated statistics about IPs exploiting a specific CVE ID +- Endpoint: `/cves/{cve_id}/ips-details-stats` +- Method: `GET` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| cve_id | str | | True | | +| since | Optional[str] | Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d | False | "14d" | +### Returns: +[IpsDetailsStats](./Models.md#ipsdetailsstats) +### Errors: +| Code | Description | +| ---- | ----------- | +| 404 | CVE Not Found | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_tracker_api import ( + Cves, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = Cves(auth=auth) +try: + response = client.get_cve_ips_details_stats( + cve_id='cve_id', + since=14d, + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + + ## **get_cve_subscribed_integrations** ### Get the list of integrations subscribed to a specific CVE ID - Endpoint: `/cves/{cve_id}/integrations` diff --git a/doc/Fingerprints.md b/doc/Fingerprints.md index 4a4e862..4c4b167 100644 --- a/doc/Fingerprints.md +++ b/doc/Fingerprints.md @@ -6,6 +6,7 @@ | [get_fingerprint_rules](#get_fingerprint_rules) | Get a paginated list of fingerprint rules | | [download_fingerprint_ips](#download_fingerprint_ips) | Download the list of IPs exploiting a specific fingerprint rule in raw format | | [get_fingerprint_ips_details](#get_fingerprint_ips_details) | Get detailed information about IPs exploiting a specific fingerprint rule | +| [get_fingerprint_ips_details_stats](#get_fingerprint_ips_details_stats) | Get aggregated statistics about IPs exploiting a specific fingerprint rule | | [get_fingerprint_subscribed_integrations](#get_fingerprint_subscribed_integrations) | Get the list of integrations subscribed to a specific fingerprint rule | | [subscribe_integration_to_fingerprint](#subscribe_integration_to_fingerprint) | Subscribe an integration to receive threats related to a specific fingerprint rule | | [unsubscribe_integration_from_fingerprint](#unsubscribe_integration_from_fingerprint) | Unsubscribe an integration from receiving threats related to a specific fingerprint rule | @@ -23,7 +24,6 @@ | query | Optional[str] | Search query for fingerprint rules | False | None | | sort_by | Optional[GetCVEsSortBy] | Field to sort by | False | GetCVEsSortBy("rule_release_date") | | sort_order | Optional[GetCVEsSortOrder] | Sort order: ascending or descending | False | GetCVEsSortOrder("desc") | -| filters | Optional[list[GetCVEsFilterBy]] | Filters to apply on the fingerprint rule list | False | None | | page | int | Page number | False | 1 | | size | int | Page size | False | 50 | ### Returns: @@ -47,7 +47,6 @@ try: query=None, sort_by=rule_release_date, sort_order=desc, - filters=None, page=1, size=50, ) @@ -133,6 +132,43 @@ except HTTPStatusError as e: ``` +## **get_fingerprint_ips_details_stats** +### Get aggregated statistics about IPs exploiting a specific fingerprint rule +- Endpoint: `/fingerprints/{fingerprint}/ips-details-stats` +- Method: `GET` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| fingerprint | str | | True | | +| since | Optional[str] | Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d | False | "14d" | +### Returns: +[IpsDetailsStats](./Models.md#ipsdetailsstats) +### Errors: +| Code | Description | +| ---- | ----------- | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_tracker_api import ( + Fingerprints, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = Fingerprints(auth=auth) +try: + response = client.get_fingerprint_ips_details_stats( + fingerprint='fingerprint', + since=14d, + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + + ## **get_fingerprint_subscribed_integrations** ### Get the list of integrations subscribed to a specific fingerprint rule - Endpoint: `/fingerprints/{fingerprint}/integrations` diff --git a/doc/Integrations.md b/doc/Integrations.md index 987126d..04a7b66 100644 --- a/doc/Integrations.md +++ b/doc/Integrations.md @@ -21,6 +21,8 @@ | Parameter | Type | Description | Required | Default | | --------- | ---- | ----------- | -------- | ------- | | tag | Optional[list[str]] | List of tags associated with the integrations (any of) | False | None | +| page | int | Page number | False | 1 | +| size | int | Page size | False | 50 | ### Returns: [IntegrationGetResponsePage](./Models.md#integrationgetresponsepage) ### Errors: @@ -40,6 +42,8 @@ client = Integrations(auth=auth) try: response = client.get_integrations( tag=None, + page=1, + size=50, ) print(response) except HTTPStatusError as e: diff --git a/doc/Models.md b/doc/Models.md index 9909bfb..8c4f5af 100644 --- a/doc/Models.md +++ b/doc/Models.md @@ -1,203 +1,6 @@ -# **ApiKeyCredentials** -## Required: -api_key -## Properties -| Property | Type | Description | Example | -|----------|------|-------------|---------| -| api_key | str | API key for the integration || - -# **BasicAuthCredentials** -## Required: -username, password -## Properties -| Property | Type | Description | Example | -|----------|------|-------------|---------| -| username | str | Basic auth username for the integration || -| password | str | Basic auth password for the integration || - -# **BlocklistSubscription** -## Required: -id -## Properties -| Property | Type | Description | Example | -|----------|------|-------------|---------| -| id | str | None || -| remediation | Optional[str] | None || - -# **CVESubscription** -## Required: -id -## Properties -| Property | Type | Description | Example | -|----------|------|-------------|---------| -| id | str | CVE ID || - -# **FingerprintSubscription** -## Required: -id -## Properties -| Property | Type | Description | Example | -|----------|------|-------------|---------| -| id | str | None || - -# **HTTPValidationError** -## Properties -| Property | Type | Description | Example | -|----------|------|-------------|---------| -| detail | list[ValidationError] | None || - -# **IntegrationCreateRequest** -## Required: -name, entity_type, output_format -## Properties -| Property | Type | Description | Example | -|----------|------|-------------|---------| -| name | str | Name of the integration || -| description | str | Description of the integration || -| entity_type | IntegrationType | None || -| output_format | OutputFormat | None || -| pull_limit | Optional[int] | Maximum number of items to pull || -| enable_ip_aggregation | bool | Whether to enable IP aggregation into ranges || - -# **IntegrationCreateResponse** -## Required: -id, name, organization_id, created_at, updated_at, entity_type, output_format, blocklists, cves, fingerprints, endpoint, credentials -## Properties -| Property | Type | Description | Example | -|----------|------|-------------|---------| -| id | str | ID of the integration || -| name | str | Name of the integration. Should be unique within the organization || -| organization_id | str | ID of the owner organization || -| description | str | Description of the integration || -| created_at | str | Time the integration was created || -| updated_at | str | Last time the integration was updated || -| entity_type | IntegrationType | None || -| output_format | OutputFormat | None || -| last_pull | Optional[str] | Last time the integration pulled blocklists || -| blocklists | list[BlocklistSubscription] | Blocklists that are subscribed by the integration || -| cves | list[CVESubscription] | CVEs that are subscribed by the integration || -| fingerprints | list[FingerprintSubscription] | Fingerprints that are subscribed by the integration || -| endpoint | str | Url that should be used by the firewall or the remediation component to fetch the integration's content || -| stats | Stats | None || -| tags | list[str] | Tags associated with the integration || -| pull_limit | Optional[int] | Maximum number of items to pull || -| enable_ip_aggregation | bool | Whether to enable IP aggregation into ranges || -| credentials | Union[ApiKeyCredentials, BasicAuthCredentials] | Credentials that were generated for the integration || - -# **IntegrationGetResponse** -## Required: -id, name, organization_id, created_at, updated_at, entity_type, output_format, blocklists, cves, fingerprints, endpoint -## Properties -| Property | Type | Description | Example | -|----------|------|-------------|---------| -| id | str | ID of the integration || -| name | str | Name of the integration. Should be unique within the organization || -| organization_id | str | ID of the owner organization || -| description | str | Description of the integration || -| created_at | str | Time the integration was created || -| updated_at | str | Last time the integration was updated || -| entity_type | IntegrationType | None || -| output_format | OutputFormat | None || -| last_pull | Optional[str] | Last time the integration pulled blocklists || -| blocklists | list[BlocklistSubscription] | Blocklists that are subscribed by the integration || -| cves | list[CVESubscription] | CVEs that are subscribed by the integration || -| fingerprints | list[FingerprintSubscription] | Fingerprints that are subscribed by the integration || -| endpoint | str | Url that should be used by the firewall or the remediation component to fetch the integration's content || -| stats | Stats | None || -| tags | list[str] | Tags associated with the integration || -| pull_limit | Optional[int] | Maximum number of items to pull || -| enable_ip_aggregation | bool | Whether to enable IP aggregation into ranges || - -# **IntegrationGetResponsePage** -## Required: -items, total, page, size, pages, links -## Properties -| Property | Type | Description | Example | -|----------|------|-------------|---------| -| items | list[IntegrationGetResponse] | None || -| total | int | None || -| page | int | None || -| size | int | None || -| pages | int | None || -| links | Links | None || - -# **IntegrationType** -## Enum: -FIREWALL_INTEGRATION, REMEDIATION_COMPONENT_INTEGRATION - -# **IntegrationUpdateRequest** -## Properties -| Property | Type | Description | Example | -|----------|------|-------------|---------| -| name | str | New name || -| description | str | New description || -| output_format | OutputFormat | None || -| regenerate_credentials | bool | Regenerate credentials for the integration || -| pull_limit | Optional[int] | Maximum number of items to pull || -| enable_ip_aggregation | bool | Whether to enable IP aggregation into ranges || - -# **IntegrationUpdateResponse** -## Required: -id, name, organization_id, created_at, updated_at, entity_type, output_format, blocklists, cves, fingerprints, endpoint -## Properties -| Property | Type | Description | Example | -|----------|------|-------------|---------| -| id | str | ID of the integration || -| name | str | Name of the integration. Should be unique within the organization || -| organization_id | str | ID of the owner organization || -| description | str | Description of the integration || -| created_at | str | Time the integration was created || -| updated_at | str | Last time the integration was updated || -| entity_type | IntegrationType | None || -| output_format | OutputFormat | None || -| last_pull | Optional[str] | Last time the integration pulled blocklists || -| blocklists | list[BlocklistSubscription] | Blocklists that are subscribed by the integration || -| cves | list[CVESubscription] | CVEs that are subscribed by the integration || -| fingerprints | list[FingerprintSubscription] | Fingerprints that are subscribed by the integration || -| endpoint | str | Url that should be used by the firewall or the remediation component to fetch the integration's content || -| stats | Stats | None || -| tags | list[str] | Tags associated with the integration || -| pull_limit | Optional[int] | Maximum number of items to pull || -| enable_ip_aggregation | bool | Whether to enable IP aggregation into ranges || -| credentials | Optional[ApiKeyCredentials, BasicAuthCredentials] | Credentials for the integration || - -# **Links** -## Properties -| Property | Type | Description | Example | -|----------|------|-------------|---------| -| first | Optional[str] | None || -| last | Optional[str] | None || -| self | Optional[str] | None || -| next | Optional[str] | None || -| prev | Optional[str] | None || - -# **OutputFormat** -## Enum: -PLAIN_TEXT, F5, REMEDIATION_COMPONENT, FORTIGATE, PALOALTO, CHECKPOINT, CISCO, JUNIPER, MIKROTIK, PFSENSE, OPNSENSE, SOPHOS - -# **Stats** -## Required: -count -## Properties -| Property | Type | Description | Example | -|----------|------|-------------|---------| -| count | int | Number of total blocklists items the integration will pull || - -# **ValidationError** -## Required: -loc, msg, type -## Properties -| Property | Type | Description | Example | -|----------|------|-------------|---------| -| loc | list[Union[str, int]] | None || -| msg | str | None || -| type | str | None || - # **AdjustmentScore** -## Required: -total, recency, low_info ## Properties | Property | Type | Description | Example | |----------|------|-------------|---------| @@ -241,16 +44,30 @@ name, label, description | label | str | Behavior label || | description | str | Behavior description || -# **CVEEvent** +# **BlocklistSubscription** ## Required: -date, description, label, name +id ## Properties | Property | Type | Description | Example | |----------|------|-------------|---------| -| date | str | Date of the event || -| description | str | Description of the event || -| label | str | Label of the event || -| name | str | Name of the event || +| id | str | None || +| remediation | Optional[str] | None || + +# **CVEEventOutput** +## Required: +name, date, description, label, sorting_priority +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| name | str | None || +| date | str | None || +| description | str | None || +| label | str | None || +| sorting_priority | int | None || + +# **CVEExploitationPhase** +## Enum: +INSUFFICIENT_DATA, EARLY_EXPLOITATION, FRESH_AND_POPULAR, TARGETED_EXPLOITATION, MASS_EXPLOITATION, BACKGROUND_NOISE, UNPOPULAR, WEARING_OUT, UNCLASSIFIED # **CVEResponseBase** ## Required: @@ -274,6 +91,7 @@ id, name, title, affected_components, crowdsec_score, nb_ips, published_date, ha | rule_release_date | Optional[str] | Release date of the associated detection rule || | exploitation_phase | ExploitationPhase | None || | adjustment_score | Optional[AdjustmentScore] | Score adjustments applied to the CVE score based on various factors || +| threat_context | Optional[ThreatContext] | Threat context (attacker/defender countries, industries, objectives) || # **CVEsubscription** ## Required: @@ -324,6 +142,53 @@ name, label, description | label | str | Label of the exploitation phase || | description | str | Description of the exploitation phase || +# **ExploitationPhaseChangeEventItem** +## Required: +cve_id, name, date, label, description, previous_phase, new_phase +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| cve_id | str | CVE identifier || +| name | str | Event type name || +| date | str | Date of the phase change || +| label | str | Human-readable event label || +| description | str | Rendered event description || +| previous_phase | str | Previous exploitation phase label || +| new_phase | str | New exploitation phase label || + +# **ExploitationPhaseChangeEventsResponsePage** +## Required: +items, total, page, size, pages, links +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| items | list[ExploitationPhaseChangeEventItem] | None || +| total | int | None || +| page | int | None || +| size | int | None || +| pages | int | None || +| links | Links | None || + +# **FacetBucket** +## Required: +value, count +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| value | str | Facet value || +| count | int | Number of IPs matching this value || + +# **FingerprintEventOutput** +## Required: +name, date, description, label +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| name | str | None || +| date | str | None || +| description | str | None || +| label | str | None || + # **FingerprintRuleResponse** ## Required: id, name, title, affected_components, crowdsec_score, nb_ips, exploitation_phase @@ -343,12 +208,12 @@ id, name, title, affected_components, crowdsec_score, nb_ips, exploitation_phase | rule_release_date | Optional[str] | Release date of the fingerprint rule || | exploitation_phase | ExploitationPhase | None || | adjustment_score | Optional[AdjustmentScore] | Score adjustment details || -| hype_score | int | Hype score (raw momentum component) || +| threat_context | Optional[ThreatContext] | Threat context (attacker/defender countries, industries, objectives) || | tags | list[str] | Tags associated with the fingerprint rule || | description | Optional[str] | Fingerprint rule description || | references | list[str] | Reference links for the fingerprint rule || | crowdsec_analysis | Optional[str] | CrowdSec analysis for this fingerprint rule || -| events | list[CVEEvent] | List of events related to the fingerprint rule || +| events | list[FingerprintEventOutput] | List of events related to the fingerprint rule || # **FingerprintRuleSummary** ## Required: @@ -369,6 +234,15 @@ id, name, title, affected_components, crowdsec_score, nb_ips, exploitation_phase | rule_release_date | Optional[str] | Release date of the fingerprint rule || | exploitation_phase | ExploitationPhase | None || | adjustment_score | Optional[AdjustmentScore] | Score adjustment details || +| threat_context | Optional[ThreatContext] | Threat context (attacker/defender countries, industries, objectives) || + +# **FingerprintSubscription** +## Required: +id +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| id | str | None || # **FingerprintTimelineItem** ## Required: @@ -392,6 +266,12 @@ items, total, page, size, pages, links | pages | int | None || | links | Links | None || +# **GetCVEProtectRulesResponse** +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| protect_rules | list[ProtectRule] | Protection/detection rules associated with the CVE || + # **GetCVEResponse** ## Required: id, name, title, affected_components, crowdsec_score, nb_ips, published_date, has_public_exploit, exploitation_phase, references, description, crowdsec_analysis, cwes @@ -414,13 +294,13 @@ id, name, title, affected_components, crowdsec_score, nb_ips, published_date, ha | rule_release_date | Optional[str] | Release date of the associated detection rule || | exploitation_phase | ExploitationPhase | None || | adjustment_score | Optional[AdjustmentScore] | Score adjustments applied to the CVE score based on various factors || -| hype_score | int | Hype score (raw momentum component) || +| threat_context | Optional[ThreatContext] | Threat context (attacker/defender countries, industries, objectives) || | tags | list[str] | Tags associated with the CVE || | references | list[str] | List of references for the CVE || | description | str | Description of the CVE || | crowdsec_analysis | Optional[str] | CrowdSec analysis of the CVE || | cwes | list[CWE] | List of CWEs associated with the CVE || -| events | list[CVEEvent] | List of events related to the CVE || +| events | list[CVEEventOutput] | List of events related to the CVE || # **GetCVESubscribedIntegrationsResponsePage** ## Required: @@ -435,10 +315,6 @@ items, total, page, size, pages, links | pages | int | None || | links | Links | None || -# **GetCVEsFilterBy** -## Enum: -IS_PUBLIC - # **GetCVEsResponsePage** ## Required: items, total, page, size, pages, links @@ -454,7 +330,7 @@ items, total, page, size, pages, links # **GetCVEsSortBy** ## Enum: -RULE_RELEASE_DATE, TRENDING, NB_IPS, NAME +RULE_RELEASE_DATE, TRENDING, NB_IPS, NAME, FIRST_SEEN # **GetCVEsSortOrder** ## Enum: @@ -499,6 +375,38 @@ items, total, page, size, pages, links | pages | int | None || | links | Links | None || +# **GetVendorIPsResponsePage** +## Required: +items, total, page, size, pages, links +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| items | list[IPItem] | None || +| total | int | None || +| page | int | None || +| size | int | None || +| pages | int | None || +| links | Links | None || + +# **GetVendorSubscribedIntegrationsResponsePage** +## Required: +items, total, page, size, pages, links +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| items | list[IntegrationResponse] | None || +| total | int | None || +| page | int | None || +| size | int | None || +| pages | int | None || +| links | Links | None || + +# **HTTPValidationError** +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| detail | list[ValidationError] | None || + # **History** ## Required: first_seen, last_seen, full_age, days_age @@ -553,8 +461,9 @@ organization_id, entity_type, name, output_format | id | str | ID of the integration || | blocklists | list[BlocklistSubscription] | None || | allowlists | list[AllowlistSubscription] | None || -| cves | list[CVEsubscription] | None || -| fingerprints | list[FingerprintSubscription] | None || +| cves | Optional[list[CVEsubscription]] | None || +| fingerprints | Optional[list[FingerprintSubscription]] | None || +| vendors | Optional[list[VendorSubscription]] | None || | name | str | Name of the integration || | updated_at | str | Last time the integration was updated || | description | Optional[str] | Description of the integration || @@ -567,6 +476,29 @@ organization_id, entity_type, name, output_format ## Enum: HOUR, DAY, WEEK +# **IpsDetailsStats** +## Required: +total, reputation, country, as_name, cves, classifications +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| total | int | Total number of matching IPs || +| reputation | list[FacetBucket] | IP count by reputation || +| country | list[FacetBucket] | IP count by country (top 5) || +| as_name | list[FacetBucket] | IP count by AS name (top 5) || +| cves | list[FacetBucket] | IP count by CVE (top 5) || +| classifications | list[FacetBucket] | IP count by classification (top 5) || + +# **Links** +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| first | Optional[str] | None || +| last | Optional[str] | None || +| self | Optional[str] | None || +| next | Optional[str] | None || +| prev | Optional[str] | None || + # **Location** ## Properties | Property | Type | Description | Example | @@ -598,13 +530,13 @@ id, name, title, affected_components, crowdsec_score, nb_ips, published_date, ha | rule_release_date | Optional[str] | Release date of the associated detection rule || | exploitation_phase | ExploitationPhase | None || | adjustment_score | Optional[AdjustmentScore] | Score adjustments applied to the CVE score based on various factors || -| hype_score | int | Hype score (raw momentum component) || +| threat_context | Optional[ThreatContext] | Threat context (attacker/defender countries, industries, objectives) || | tags | list[str] | Tags associated with the CVE || | references | list[str] | List of references for the CVE || | description | str | Description of the CVE || | crowdsec_analysis | Optional[str] | CrowdSec analysis of the CVE || | cwes | list[CWE] | List of CWEs associated with the CVE || -| events | list[CVEEvent] | List of events related to the CVE || +| events | list[CVEEventOutput] | List of events related to the CVE || | type | str | Resource type || # **LookupImpactFingerprintItem** @@ -626,12 +558,12 @@ id, name, title, affected_components, crowdsec_score, nb_ips, exploitation_phase | rule_release_date | Optional[str] | Release date of the fingerprint rule || | exploitation_phase | ExploitationPhase | None || | adjustment_score | Optional[AdjustmentScore] | Score adjustment details || -| hype_score | int | Hype score (raw momentum component) || +| threat_context | Optional[ThreatContext] | Threat context (attacker/defender countries, industries, objectives) || | tags | list[str] | Tags associated with the fingerprint rule || | description | Optional[str] | Fingerprint rule description || | references | list[str] | Reference links for the fingerprint rule || | crowdsec_analysis | Optional[str] | CrowdSec analysis for this fingerprint rule || -| events | list[CVEEvent] | List of events related to the fingerprint rule || +| events | list[FingerprintEventOutput] | List of events related to the fingerprint rule || | type | str | Resource type || # **LookupImpactResponsePage** @@ -647,21 +579,27 @@ items, total, page, size, pages, links | pages | int | None || | links | Links | None || -# **LookupListItem** +# **LookupListItemWithStats** ## Required: value ## Properties | Property | Type | Description | Example | |----------|------|-------------|---------| | value | str | Lookup entry value || +| nb_cves | int | Number of CVEs || +| nb_fingerprints | int | Number of fingerprint rules || +| nb_ips | int | Total number of unique IPs targeting this entry || +| nb_ips_cves | int | Number of IPs across CVEs || +| nb_ips_fingerprints | int | Number of IPs across fingerprint rules || +| latest_rule_release | Optional[str] | Most recent rule release date for this entry || -# **LookupListResponsePage** +# **LookupListWithStatsResponsePage** ## Required: items, total, page, size, pages, links ## Properties | Property | Type | Description | Example | |----------|------|-------------|---------| -| items | list[LookupListItem] | None || +| items | list[LookupListItemWithStats] | None || | total | int | None || | page | int | None || | size | int | None || @@ -678,6 +616,32 @@ name, label, description | label | str | MITRE technique label || | description | str | MITRE technique description || +# **OutputFormat** +## Enum: +PLAIN_TEXT, F5, REMEDIATION_COMPONENT, FORTIGATE, PALOALTO, CHECKPOINT, CISCO, JUNIPER, MIKROTIK, PFSENSE, OPNSENSE, SOPHOS + +# **ProtectRule** +## Required: +link, name, label +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| link | str | URL to the rule source || +| published_date | Optional[str] | Date the rule was published || +| tags | list[ProtectRuleTag] | Tags associated with the rule || +| name | str | Rule name || +| label | str | Human-readable rule label || +| content | Optional[str] | Rule content/definition || + +# **ProtectRuleTag** +## Required: +tag, label +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| tag | str | Tag identifier || +| label | str | Human-readable tag label || + # **Reference** ## Required: name, label, description @@ -729,6 +693,24 @@ name |----------|------|-------------|---------| | name | str | Name of the integration to subscribe || +# **SubscribeVendorIntegrationRequest** +## Required: +name +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| name | str | Name of the integration to subscribe || + +# **ThreatContext** +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| attacker_countries | Attacker Countries | Attacker country distribution (country code → count) || +| defender_countries | Defender Countries | Defender country distribution (country code → count) || +| industry_types | Industry Types | Industry type distribution (type → count) || +| industry_risk_profiles | Industry Risk Profiles | Industry risk profile distribution (profile → count) || +| attacker_objectives | Attacker Objectives | Attacker objective distribution (objective → count) || + # **TimelineItem** ## Required: timestamp, count @@ -736,4 +718,201 @@ timestamp, count | Property | Type | Description | Example | |----------|------|-------------|---------| | timestamp | str | Timestamp of the timeline event || -| count | int | Count of occurrences at the timestamp || \ No newline at end of file +| count | int | Count of occurrences at the timestamp || + +# **TopProductItem** +## Required: +value +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| value | str | Product name || +| nb_ips_cves | int | Number of IPs across CVEs || +| nb_ips_fingerprints | int | Number of IPs across fingerprint rules || + +# **ValidationError** +## Required: +loc, msg, type +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| loc | list[Union[str, int]] | None || +| msg | str | None || +| type | str | None || + +# **VendorSortBy** +## Enum: +VALUE, NB_CVES, NB_IPS, LATEST_RULE_RELEASE + +# **VendorStatsResponse** +## Required: +value +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| value | str | Vendor name || +| nb_cves | int | Number of CVEs || +| nb_fingerprints | int | Number of fingerprint rules || +| nb_ips | int | Total number of unique IPs targeting this vendor || +| nb_ips_cves | int | Number of IPs across CVEs || +| nb_ips_fingerprints | int | Number of IPs across fingerprint rules || +| top_products | list[TopProductItem] | Top products for this vendor sorted by total IPs descending || + +# **VendorSubscription** +## Required: +id +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| id | str | None || + +# **ApiKeyCredentials** +## Required: +api_key +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| api_key | str | API key for the integration || + +# **BasicAuthCredentials** +## Required: +username, password +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| username | str | Basic auth username for the integration || +| password | str | Basic auth password for the integration || + +# **CVESubscription** +## Required: +id +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| id | str | CVE ID || + +# **IntegrationCreateRequest** +## Required: +name, entity_type, output_format +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| name | str | Name of the integration || +| description | str | Description of the integration || +| entity_type | IntegrationType | None || +| output_format | OutputFormat | None || +| pull_limit | Optional[int] | Maximum number of items to pull || +| enable_ip_aggregation | bool | Whether to enable IP aggregation into ranges || + +# **IntegrationCreateResponse** +## Required: +id, name, organization_id, created_at, updated_at, entity_type, output_format, blocklists, cves, fingerprints, vendors, endpoint, credentials +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| id | str | ID of the integration || +| name | str | Name of the integration. Should be unique within the organization || +| organization_id | str | ID of the owner organization || +| description | str | Description of the integration || +| created_at | str | Time the integration was created || +| updated_at | str | Last time the integration was updated || +| entity_type | IntegrationType | None || +| output_format | OutputFormat | None || +| last_pull | Optional[str] | Last time the integration pulled blocklists || +| blocklists | list[BlocklistSubscription] | Blocklists that are subscribed by the integration || +| cves | list[CVESubscription] | CVEs that are subscribed by the integration || +| fingerprints | list[FingerprintSubscription] | Fingerprints that are subscribed by the integration || +| vendors | list[VendorSubscription] | Vendors that are subscribed by the integration || +| endpoint | str | Url that should be used by the firewall or the remediation component to fetch the integration's content || +| stats | Stats | None || +| tags | list[str] | Tags associated with the integration || +| pull_limit | Optional[int] | Maximum number of items to pull || +| enable_ip_aggregation | bool | Whether to enable IP aggregation into ranges || +| credentials | Union[ApiKeyCredentials, BasicAuthCredentials] | Credentials that were generated for the integration || + +# **IntegrationGetResponse** +## Required: +id, name, organization_id, created_at, updated_at, entity_type, output_format, blocklists, cves, fingerprints, vendors, endpoint +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| id | str | ID of the integration || +| name | str | Name of the integration. Should be unique within the organization || +| organization_id | str | ID of the owner organization || +| description | str | Description of the integration || +| created_at | str | Time the integration was created || +| updated_at | str | Last time the integration was updated || +| entity_type | IntegrationType | None || +| output_format | OutputFormat | None || +| last_pull | Optional[str] | Last time the integration pulled blocklists || +| blocklists | list[BlocklistSubscription] | Blocklists that are subscribed by the integration || +| cves | list[CVESubscription] | CVEs that are subscribed by the integration || +| fingerprints | list[FingerprintSubscription] | Fingerprints that are subscribed by the integration || +| vendors | list[VendorSubscription] | Vendors that are subscribed by the integration || +| endpoint | str | Url that should be used by the firewall or the remediation component to fetch the integration's content || +| stats | Stats | None || +| tags | list[str] | Tags associated with the integration || +| pull_limit | Optional[int] | Maximum number of items to pull || +| enable_ip_aggregation | bool | Whether to enable IP aggregation into ranges || + +# **IntegrationGetResponsePage** +## Required: +items, total, page, size, pages, links +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| items | list[IntegrationGetResponse] | None || +| total | int | None || +| page | int | None || +| size | int | None || +| pages | int | None || +| links | Links | None || + +# **IntegrationType** +## Enum: +FIREWALL_INTEGRATION, REMEDIATION_COMPONENT_INTEGRATION + +# **IntegrationUpdateRequest** +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| name | str | New name || +| description | str | New description || +| output_format | OutputFormat | None || +| regenerate_credentials | bool | Regenerate credentials for the integration || +| pull_limit | Optional[int] | Maximum number of items to pull || +| enable_ip_aggregation | bool | Whether to enable IP aggregation into ranges || + +# **IntegrationUpdateResponse** +## Required: +id, name, organization_id, created_at, updated_at, entity_type, output_format, blocklists, cves, fingerprints, vendors, endpoint +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| id | str | ID of the integration || +| name | str | Name of the integration. Should be unique within the organization || +| organization_id | str | ID of the owner organization || +| description | str | Description of the integration || +| created_at | str | Time the integration was created || +| updated_at | str | Last time the integration was updated || +| entity_type | IntegrationType | None || +| output_format | OutputFormat | None || +| last_pull | Optional[str] | Last time the integration pulled blocklists || +| blocklists | list[BlocklistSubscription] | Blocklists that are subscribed by the integration || +| cves | list[CVESubscription] | CVEs that are subscribed by the integration || +| fingerprints | list[FingerprintSubscription] | Fingerprints that are subscribed by the integration || +| vendors | list[VendorSubscription] | Vendors that are subscribed by the integration || +| endpoint | str | Url that should be used by the firewall or the remediation component to fetch the integration's content || +| stats | Stats | None || +| tags | list[str] | Tags associated with the integration || +| pull_limit | Optional[int] | Maximum number of items to pull || +| enable_ip_aggregation | bool | Whether to enable IP aggregation into ranges || +| credentials | Optional[ApiKeyCredentials, BasicAuthCredentials] | Credentials for the integration || + +# **Stats** +## Required: +count +## Properties +| Property | Type | Description | Example | +|----------|------|-------------|---------| +| count | int | Number of total blocklists items the integration will pull || \ No newline at end of file diff --git a/doc/Products.md b/doc/Products.md index 945b3e5..90f8cba 100644 --- a/doc/Products.md +++ b/doc/Products.md @@ -18,7 +18,7 @@ | page | int | Page number | False | 1 | | size | int | Page size | False | 50 | ### Returns: -[LookupListResponsePage](./Models.md#lookuplistresponsepage) +[LookupListWithStatsResponsePage](./Models.md#lookuplistwithstatsresponsepage) ### Errors: | Code | Description | | ---- | ----------- | diff --git a/doc/README.md b/doc/README.md index 1127917..d7596ce 100644 --- a/doc/README.md +++ b/doc/README.md @@ -11,53 +11,21 @@ You can find a Quickstart about this SDK, following this [documentation](https:/ ## API Endpoint services -[Integrations](./Integrations.md) - [Cves](./Cves.md) [Vendors](./Vendors.md) [Products](./Products.md) -[Tags](./Tags.md) +[TrackerTags](./TrackerTags.md) [Fingerprints](./Fingerprints.md) -## API Endpoint models - -[ApiKeyCredentials](./Models.md#apikeycredentials) - -[BasicAuthCredentials](./Models.md#basicauthcredentials) - -[BlocklistSubscription](./Models.md#blocklistsubscription) - -[CVESubscription](./Models.md#cvesubscription) - -[FingerprintSubscription](./Models.md#fingerprintsubscription) - -[HTTPValidationError](./Models.md#httpvalidationerror) - -[IntegrationCreateRequest](./Models.md#integrationcreaterequest) - -[IntegrationCreateResponse](./Models.md#integrationcreateresponse) - -[IntegrationGetResponse](./Models.md#integrationgetresponse) - -[IntegrationGetResponsePage](./Models.md#integrationgetresponsepage) - -[IntegrationType](./Models.md#integrationtype) - -[IntegrationUpdateRequest](./Models.md#integrationupdaterequest) - -[IntegrationUpdateResponse](./Models.md#integrationupdateresponse) - -[Links](./Models.md#links) - -[OutputFormat](./Models.md#outputformat) +[TrackerEvents](./TrackerEvents.md) -[Stats](./Models.md#stats) +[Integrations](./Integrations.md) -[ValidationError](./Models.md#validationerror) +## API Endpoint models [AdjustmentScore](./Models.md#adjustmentscore) @@ -69,7 +37,11 @@ You can find a Quickstart about this SDK, following this [documentation](https:/ [Behavior](./Models.md#behavior) -[CVEEvent](./Models.md#cveevent) +[BlocklistSubscription](./Models.md#blocklistsubscription) + +[CVEEventOutput](./Models.md#cveeventoutput) + +[CVEExploitationPhase](./Models.md#cveexploitationphase) [CVEResponseBase](./Models.md#cveresponsebase) @@ -85,20 +57,30 @@ You can find a Quickstart about this SDK, following this [documentation](https:/ [ExploitationPhase](./Models.md#exploitationphase) +[ExploitationPhaseChangeEventItem](./Models.md#exploitationphasechangeeventitem) + +[ExploitationPhaseChangeEventsResponsePage](./Models.md#exploitationphasechangeeventsresponsepage) + +[FacetBucket](./Models.md#facetbucket) + +[FingerprintEventOutput](./Models.md#fingerprinteventoutput) + [FingerprintRuleResponse](./Models.md#fingerprintruleresponse) [FingerprintRuleSummary](./Models.md#fingerprintrulesummary) +[FingerprintSubscription](./Models.md#fingerprintsubscription) + [FingerprintTimelineItem](./Models.md#fingerprinttimelineitem) [GetCVEIPsResponsePage](./Models.md#getcveipsresponsepage) +[GetCVEProtectRulesResponse](./Models.md#getcveprotectrulesresponse) + [GetCVEResponse](./Models.md#getcveresponse) [GetCVESubscribedIntegrationsResponsePage](./Models.md#getcvesubscribedintegrationsresponsepage) -[GetCVEsFilterBy](./Models.md#getcvesfilterby) - [GetCVEsResponsePage](./Models.md#getcvesresponsepage) [GetCVEsSortBy](./Models.md#getcvessortby) @@ -111,6 +93,12 @@ You can find a Quickstart about this SDK, following this [documentation](https:/ [GetFingerprintSubscribedIntegrationsResponsePage](./Models.md#getfingerprintsubscribedintegrationsresponsepage) +[GetVendorIPsResponsePage](./Models.md#getvendoripsresponsepage) + +[GetVendorSubscribedIntegrationsResponsePage](./Models.md#getvendorsubscribedintegrationsresponsepage) + +[HTTPValidationError](./Models.md#httpvalidationerror) + [History](./Models.md#history) [IPItem](./Models.md#ipitem) @@ -119,6 +107,10 @@ You can find a Quickstart about this SDK, following this [documentation](https:/ [IntervalOptions](./Models.md#intervaloptions) +[IpsDetailsStats](./Models.md#ipsdetailsstats) + +[Links](./Models.md#links) + [Location](./Models.md#location) [LookupImpactCVEItem](./Models.md#lookupimpactcveitem) @@ -127,12 +119,18 @@ You can find a Quickstart about this SDK, following this [documentation](https:/ [LookupImpactResponsePage](./Models.md#lookupimpactresponsepage) -[LookupListItem](./Models.md#lookuplistitem) +[LookupListItemWithStats](./Models.md#lookuplistitemwithstats) -[LookupListResponsePage](./Models.md#lookuplistresponsepage) +[LookupListWithStatsResponsePage](./Models.md#lookuplistwithstatsresponsepage) [MitreTechnique](./Models.md#mitretechnique) +[OutputFormat](./Models.md#outputformat) + +[ProtectRule](./Models.md#protectrule) + +[ProtectRuleTag](./Models.md#protectruletag) + [Reference](./Models.md#reference) [ScoreBreakdown](./Models.md#scorebreakdown) @@ -145,4 +143,40 @@ You can find a Quickstart about this SDK, following this [documentation](https:/ [SubscribeFingerprintIntegrationRequest](./Models.md#subscribefingerprintintegrationrequest) -[TimelineItem](./Models.md#timelineitem) \ No newline at end of file +[SubscribeVendorIntegrationRequest](./Models.md#subscribevendorintegrationrequest) + +[ThreatContext](./Models.md#threatcontext) + +[TimelineItem](./Models.md#timelineitem) + +[TopProductItem](./Models.md#topproductitem) + +[ValidationError](./Models.md#validationerror) + +[VendorSortBy](./Models.md#vendorsortby) + +[VendorStatsResponse](./Models.md#vendorstatsresponse) + +[VendorSubscription](./Models.md#vendorsubscription) + +[ApiKeyCredentials](./Models.md#apikeycredentials) + +[BasicAuthCredentials](./Models.md#basicauthcredentials) + +[CVESubscription](./Models.md#cvesubscription) + +[IntegrationCreateRequest](./Models.md#integrationcreaterequest) + +[IntegrationCreateResponse](./Models.md#integrationcreateresponse) + +[IntegrationGetResponse](./Models.md#integrationgetresponse) + +[IntegrationGetResponsePage](./Models.md#integrationgetresponsepage) + +[IntegrationType](./Models.md#integrationtype) + +[IntegrationUpdateRequest](./Models.md#integrationupdaterequest) + +[IntegrationUpdateResponse](./Models.md#integrationupdateresponse) + +[Stats](./Models.md#stats) \ No newline at end of file diff --git a/doc/Tags.md b/doc/Tags.md deleted file mode 100644 index afca4ce..0000000 --- a/doc/Tags.md +++ /dev/null @@ -1,89 +0,0 @@ - - -# Tags Methods -| Method | Description | -| ------ | ----------- | -| [get_tags](#get_tags) | Get a paginated list of tags | -| [get_tag_impact](#get_tag_impact) | Get CVE and fingerprint rules affecting a tag | - -## **get_tags** -### Get a paginated list of tags -- Endpoint: `/tags` -- Method: `GET` - -### Parameters: -| Parameter | Type | Description | Required | Default | -| --------- | ---- | ----------- | -------- | ------- | -| query | Optional[str] | Search query for tags | False | None | -| page | int | Page number | False | 1 | -| size | int | Page size | False | 50 | -### Returns: -[LookupListResponsePage](./Models.md#lookuplistresponsepage) -### Errors: -| Code | Description | -| ---- | ----------- | -| 422 | Validation Error | -### Usage - -```python -from crowdsec_tracker_api import ( - Tags, - ApiKeyAuth, -) -from httpx import HTTPStatusError -auth = ApiKeyAuth(api_key='your_api_key') -client = Tags(auth=auth) -try: - response = client.get_tags( - query=None, - page=1, - size=50, - ) - print(response) -except HTTPStatusError as e: - print(f"An error occurred: {e.response.status_code} - {e.response.text}") -``` - - -## **get_tag_impact** -### Get CVE and fingerprint rules affecting a tag -- Endpoint: `/tags/{tag}` -- Method: `GET` - -### Parameters: -| Parameter | Type | Description | Required | Default | -| --------- | ---- | ----------- | -------- | ------- | -| tag | str | | True | | -| sort_by | Optional[GetCVEsSortBy] | Field to sort by | False | GetCVEsSortBy("rule_release_date") | -| sort_order | Optional[GetCVEsSortOrder] | Sort order: ascending or descending | False | GetCVEsSortOrder("desc") | -| page | int | Page number | False | 1 | -| size | int | Page size | False | 50 | -### Returns: -[LookupImpactResponsePage](./Models.md#lookupimpactresponsepage) -### Errors: -| Code | Description | -| ---- | ----------- | -| 422 | Validation Error | -### Usage - -```python -from crowdsec_tracker_api import ( - Tags, - ApiKeyAuth, -) -from httpx import HTTPStatusError -auth = ApiKeyAuth(api_key='your_api_key') -client = Tags(auth=auth) -try: - response = client.get_tag_impact( - tag='tag', - sort_by=rule_release_date, - sort_order=desc, - page=1, - size=50, - ) - print(response) -except HTTPStatusError as e: - print(f"An error occurred: {e.response.status_code} - {e.response.text}") -``` - diff --git a/doc/TrackerEvents.md b/doc/TrackerEvents.md new file mode 100644 index 0000000..2663182 --- /dev/null +++ b/doc/TrackerEvents.md @@ -0,0 +1,53 @@ + + +# TrackerEvents Methods +| Method | Description | +| ------ | ----------- | +| [get_exploitation_phase_change_events](#get_exploitation_phase_change_events) | Get a paginated list of exploitation phase change events across tracked CVEs | + +## **get_exploitation_phase_change_events** +### Get a paginated list of exploitation phase change events across tracked CVEs +- Endpoint: `/tracker-events/exploitation-phase-change` +- Method: `GET` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| since | str | Duration string (e.g. '30d', '24h') to filter events | False | "30d" | +| sort_order | Optional[GetCVEsSortOrder] | Sort order: ascending or descending | False | GetCVEsSortOrder("desc") | +| cve_id | Optional[str] | Filter by CVE identifier (exact match) | False | None | +| previous_phase | Optional[CVEExploitationPhase] | Filter by previous exploitation phase name | False | None | +| new_phase | Optional[CVEExploitationPhase] | Filter by new exploitation phase name | False | None | +| page | int | Page number | False | 1 | +| size | int | Page size | False | 50 | +### Returns: +[ExploitationPhaseChangeEventsResponsePage](./Models.md#exploitationphasechangeeventsresponsepage) +### Errors: +| Code | Description | +| ---- | ----------- | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_tracker_api import ( + TrackerEvents, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = TrackerEvents(auth=auth) +try: + response = client.get_exploitation_phase_change_events( + since=30d, + sort_order=desc, + cve_id=None, + previous_phase=None, + new_phase=None, + page=1, + size=50, + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + diff --git a/doc/TrackerTags.md b/doc/TrackerTags.md new file mode 100644 index 0000000..5d7cc9d --- /dev/null +++ b/doc/TrackerTags.md @@ -0,0 +1,173 @@ + + +# TrackerTags Methods +| Method | Description | +| ------ | ----------- | +| [get_tags](#get_tags) | Get a paginated list of tags | +| [get_tag_impact](#get_tag_impact) | Get CVE and fingerprint rules affecting a tag | +| [get_tracker_tags](#get_tracker_tags) | Get a paginated list of tracker tags | +| [get_tracker_tag_impact](#get_tracker_tag_impact) | Get CVE and fingerprint rules affecting a tracker tag | + +## **get_tags** +### Get a paginated list of tags +- Endpoint: `/tags` +- Method: `GET` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| query | Optional[str] | Search query for tags | False | None | +| page | int | Page number | False | 1 | +| size | int | Page size | False | 50 | +### Returns: +[LookupListWithStatsResponsePage](./Models.md#lookuplistwithstatsresponsepage) +### Errors: +| Code | Description | +| ---- | ----------- | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_tracker_api import ( + TrackerTags, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = TrackerTags(auth=auth) +try: + response = client.get_tags( + query=None, + page=1, + size=50, + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + + +## **get_tag_impact** +### Get CVE and fingerprint rules affecting a tag +- Endpoint: `/tags/{tag}` +- Method: `GET` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| tag | str | | True | | +| sort_by | Optional[GetCVEsSortBy] | Field to sort by | False | GetCVEsSortBy("rule_release_date") | +| sort_order | Optional[GetCVEsSortOrder] | Sort order: ascending or descending | False | GetCVEsSortOrder("desc") | +| page | int | Page number | False | 1 | +| size | int | Page size | False | 50 | +### Returns: +[LookupImpactResponsePage](./Models.md#lookupimpactresponsepage) +### Errors: +| Code | Description | +| ---- | ----------- | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_tracker_api import ( + TrackerTags, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = TrackerTags(auth=auth) +try: + response = client.get_tag_impact( + tag='tag', + sort_by=rule_release_date, + sort_order=desc, + page=1, + size=50, + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + + +## **get_tracker_tags** +### Get a paginated list of tracker tags +- Endpoint: `/tracker-tags` +- Method: `GET` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| query | Optional[str] | Search query for tags | False | None | +| page | int | Page number | False | 1 | +| size | int | Page size | False | 50 | +### Returns: +[LookupListWithStatsResponsePage](./Models.md#lookuplistwithstatsresponsepage) +### Errors: +| Code | Description | +| ---- | ----------- | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_tracker_api import ( + TrackerTags, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = TrackerTags(auth=auth) +try: + response = client.get_tracker_tags( + query=None, + page=1, + size=50, + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + + +## **get_tracker_tag_impact** +### Get CVE and fingerprint rules affecting a tracker tag +- Endpoint: `/tracker-tags/{tag}` +- Method: `GET` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| tag | str | | True | | +| sort_by | Optional[GetCVEsSortBy] | Field to sort by | False | GetCVEsSortBy("rule_release_date") | +| sort_order | Optional[GetCVEsSortOrder] | Sort order: ascending or descending | False | GetCVEsSortOrder("desc") | +| page | int | Page number | False | 1 | +| size | int | Page size | False | 50 | +### Returns: +[LookupImpactResponsePage](./Models.md#lookupimpactresponsepage) +### Errors: +| Code | Description | +| ---- | ----------- | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_tracker_api import ( + TrackerTags, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = TrackerTags(auth=auth) +try: + response = client.get_tracker_tag_impact( + tag='tag', + sort_by=rule_release_date, + sort_order=desc, + page=1, + size=50, + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + diff --git a/doc/Vendors.md b/doc/Vendors.md index 67129ed..cb016c0 100644 --- a/doc/Vendors.md +++ b/doc/Vendors.md @@ -4,6 +4,13 @@ | Method | Description | | ------ | ----------- | | [get_vendors](#get_vendors) | Get a paginated list of vendors | +| [get_vendor_stats](#get_vendor_stats) | Get statistics for a vendor including CVE/fingerprint counts, IP counts, and top affected products | +| [download_vendor_ips](#download_vendor_ips) | Download the list of IPs exploiting a specific vendor in raw format | +| [get_vendor_ips_details](#get_vendor_ips_details) | Get detailed information about IPs exploiting a specific vendor | +| [get_vendor_ips_details_stats](#get_vendor_ips_details_stats) | Get aggregated statistics about IPs exploiting a specific vendor | +| [get_vendor_subscribed_integrations](#get_vendor_subscribed_integrations) | Get the list of integrations subscribed to a specific vendor | +| [subscribe_integration_to_vendor](#subscribe_integration_to_vendor) | Subscribe an integration to receive threats related to a specific vendor | +| [unsubscribe_integration_from_vendor](#unsubscribe_integration_from_vendor) | Unsubscribe an integration from receiving threats related to a specific vendor | | [get_vendor_impact](#get_vendor_impact) | Get CVE and fingerprint rules affecting a vendor | ## **get_vendors** @@ -15,10 +22,12 @@ | Parameter | Type | Description | Required | Default | | --------- | ---- | ----------- | -------- | ------- | | query | Optional[str] | Search query for vendors | False | None | +| sort_by | Optional[VendorSortBy] | Sort by: value, nb_cves, nb_ips, latest_rule_release | False | None | +| sort_order | Optional[GetCVEsSortOrder] | Sort order: asc or desc | False | GetCVEsSortOrder("desc") | | page | int | Page number | False | 1 | | size | int | Page size | False | 50 | ### Returns: -[LookupListResponsePage](./Models.md#lookuplistresponsepage) +[LookupListWithStatsResponsePage](./Models.md#lookuplistwithstatsresponsepage) ### Errors: | Code | Description | | ---- | ----------- | @@ -36,6 +45,195 @@ client = Vendors(auth=auth) try: response = client.get_vendors( query=None, + sort_by=None, + sort_order=desc, + page=1, + size=50, + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + + +## **get_vendor_stats** +### Get statistics for a vendor including CVE/fingerprint counts, IP counts, and top affected products +- Endpoint: `/vendors/{vendor}/stats` +- Method: `GET` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| vendor | str | | True | | +### Returns: +[VendorStatsResponse](./Models.md#vendorstatsresponse) +### Errors: +| Code | Description | +| ---- | ----------- | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_tracker_api import ( + Vendors, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = Vendors(auth=auth) +try: + response = client.get_vendor_stats( + vendor='vendor', + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + + +## **download_vendor_ips** +### Download the list of IPs exploiting a specific vendor in raw format +- Endpoint: `/vendors/{vendor}/ips-download` +- Method: `GET` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| vendor | str | | True | | +### Returns: +[str](./Models.md#str) +### Errors: +| Code | Description | +| ---- | ----------- | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_tracker_api import ( + Vendors, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = Vendors(auth=auth) +try: + response = client.download_vendor_ips( + vendor='vendor', + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + + +## **get_vendor_ips_details** +### Get detailed information about IPs exploiting a specific vendor +- Endpoint: `/vendors/{vendor}/ips-details` +- Method: `GET` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| vendor | str | | True | | +| since | Optional[str] | Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d | False | "14d" | +| page | int | Page number | False | 1 | +| size | int | Page size | False | 50 | +### Returns: +[GetVendorIPsResponsePage](./Models.md#getvendoripsresponsepage) +### Errors: +| Code | Description | +| ---- | ----------- | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_tracker_api import ( + Vendors, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = Vendors(auth=auth) +try: + response = client.get_vendor_ips_details( + vendor='vendor', + since=14d, + page=1, + size=50, + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + + +## **get_vendor_ips_details_stats** +### Get aggregated statistics about IPs exploiting a specific vendor +- Endpoint: `/vendors/{vendor}/ips-details-stats` +- Method: `GET` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| vendor | str | | True | | +| since | Optional[str] | Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d | False | "14d" | +### Returns: +[IpsDetailsStats](./Models.md#ipsdetailsstats) +### Errors: +| Code | Description | +| ---- | ----------- | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_tracker_api import ( + Vendors, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = Vendors(auth=auth) +try: + response = client.get_vendor_ips_details_stats( + vendor='vendor', + since=14d, + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + + +## **get_vendor_subscribed_integrations** +### Get the list of integrations subscribed to a specific vendor +- Endpoint: `/vendors/{vendor}/integrations` +- Method: `GET` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| vendor | str | | True | | +| page | int | Page number | False | 1 | +| size | int | Page size | False | 50 | +### Returns: +[GetVendorSubscribedIntegrationsResponsePage](./Models.md#getvendorsubscribedintegrationsresponsepage) +### Errors: +| Code | Description | +| ---- | ----------- | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_tracker_api import ( + Vendors, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = Vendors(auth=auth) +try: + response = client.get_vendor_subscribed_integrations( + vendor='vendor', page=1, size=50, ) @@ -45,6 +243,80 @@ except HTTPStatusError as e: ``` +## **subscribe_integration_to_vendor** +### Subscribe an integration to receive threats related to a specific vendor +- Endpoint: `/vendors/{vendor}/integrations` +- Method: `POST` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| request | [SubscribeVendorIntegrationRequest](./Models.md#subscribevendorintegrationrequest) | Request body | Yes | - | +| vendor | str | | True | | +### Errors: +| Code | Description | +| ---- | ----------- | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_tracker_api import ( + Vendors, + ApiKeyAuth, + SubscribeVendorIntegrationRequest, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = Vendors(auth=auth) +request = SubscribeVendorIntegrationRequest( + name=None, +) +try: + response = client.subscribe_integration_to_vendor( + request=request, + vendor='vendor', + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + + +## **unsubscribe_integration_from_vendor** +### Unsubscribe an integration from receiving threats related to a specific vendor +- Endpoint: `/vendors/{vendor}/integrations/{integration_name}` +- Method: `DELETE` + +### Parameters: +| Parameter | Type | Description | Required | Default | +| --------- | ---- | ----------- | -------- | ------- | +| vendor | str | | True | | +| integration_name | str | | True | | +### Errors: +| Code | Description | +| ---- | ----------- | +| 422 | Validation Error | +### Usage + +```python +from crowdsec_tracker_api import ( + Vendors, + ApiKeyAuth, +) +from httpx import HTTPStatusError +auth = ApiKeyAuth(api_key='your_api_key') +client = Vendors(auth=auth) +try: + response = client.unsubscribe_integration_from_vendor( + vendor='vendor', + integration_name='integration_name', + ) + print(response) +except HTTPStatusError as e: + print(f"An error occurred: {e.response.status_code} - {e.response.text}") +``` + + ## **get_vendor_impact** ### Get CVE and fingerprint rules affecting a vendor - Endpoint: `/vendors/{vendor}` diff --git a/let-openapi.json b/let-openapi.json index 1fee82c..d546985 100644 --- a/let-openapi.json +++ b/let-openapi.json @@ -1 +1,7113 @@ -{"openapi": "3.1.0", "info": {"title": "LET API", "description": "This is the API to manage Crowdsec Live Exploit Tracker service", "contact": {"name": "CrowdSec", "url": "https://crowdsec.net/", "email": "info@crowdsec.net"}, "version": "1.108.1"}, "paths": {"/integrations": {"post": {"tags": ["Integrations"], "summary": "Create Integration", "description": "Create an integration to a firewall or remediation component, owned by your organization. The name should be unique within the organization. This operation is submitted to quotas.", "operationId": "createIntegration", "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/IntegrationCreateRequest"}}}}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/IntegrationCreateResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "get": {"tags": ["Integrations"], "summary": "Get Integrations", "description": "Get integrations owned by your organization", "operationId": "getIntegrations", "parameters": [{"name": "tag", "in": "query", "required": false, "schema": {"anyOf": [{"type": "array", "items": {"type": "string"}}, {"type": "null"}], "description": "List of tags associated with the integrations (any of)", "title": "Tag"}, "description": "List of tags associated with the integrations (any of)"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/IntegrationGetResponsePage"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/integrations/{integration_id}": {"get": {"tags": ["Integrations"], "summary": "Get Integration", "description": "Get an integration by ID", "operationId": "getIntegration", "parameters": [{"name": "integration_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Integration Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/IntegrationGetResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "patch": {"tags": ["Integrations"], "summary": "Update Integration", "description": "Update the integration details", "operationId": "updateIntegration", "parameters": [{"name": "integration_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Integration Id"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/IntegrationUpdateRequest"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/IntegrationUpdateResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "delete": {"tags": ["Integrations"], "summary": "Delete Integration", "description": "Delete the integration by ID", "operationId": "deleteIntegration", "parameters": [{"name": "integration_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Integration Id"}}, {"name": "force", "in": "query", "required": false, "schema": {"type": "boolean", "description": "Force delete the integration even if it has active subscriptions (it will unsubscribe from all lists)", "default": false, "title": "Force"}, "description": "Force delete the integration even if it has active subscriptions (it will unsubscribe from all lists)"}], "responses": {"204": {"description": "Successful Response"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/integrations/{integration_id}/content": {"head": {"tags": ["Integrations"], "summary": "Head Integration Content", "description": "Check if the integration has content", "operationId": "headIntegrationContent", "parameters": [{"name": "integration_id", "in": "path", "required": true, "schema": {"type": "string", "format": "ObjectId", "examples": ["5f9d88b9e5c4f5b9a3d3e8b1"], "title": "Integration Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "404": {"description": "Integration not found"}, "204": {"description": "Integration has no subscribed blocklists or no content available"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "get": {"tags": ["Integrations"], "summary": "Get Integration Content", "description": "Get the ips associated to the integration in plain text format. The content can be paginated to accomodate limits in firewalls.", "operationId": "getIntegrationContent", "parameters": [{"name": "integration_id", "in": "path", "required": true, "schema": {"type": "string", "format": "ObjectId", "examples": ["5f9d88b9e5c4f5b9a3d3e8b1"], "title": "Integration Id"}}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "description": "Page number to return", "default": 1, "title": "Page"}, "description": "Page number to return"}, {"name": "page_size", "in": "query", "required": false, "schema": {"anyOf": [{"type": "integer", "minimum": 10000}, {"type": "null"}], "description": "Maximum number of items to return, 0 means no limit (default), should be greater than 10000", "title": "Page Size"}, "description": "Maximum number of items to return, 0 means no limit (default), should be greater than 10000"}, {"name": "pull_limit", "in": "query", "required": false, "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Pull Limit"}}, {"name": "enable_ip_aggregation", "in": "query", "required": false, "schema": {"type": "boolean", "default": false, "title": "Enable Ip Aggregation"}}], "responses": {"200": {"description": "Successful Response", "content": {"text/plain": {"schema": {"type": "string"}}}}, "404": {"description": "Integration not found"}, "204": {"description": "Integration has no subscribed blocklists or no content available"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/integrations/{integration_id}/v1/decisions/stream": {"get": {"tags": ["Integrations"], "summary": "Get Integration Content Stream", "description": "Get the ips associated to the integration in a format compatible with a remediation component. As for the remediation components, you can fetch the full content with startup=true or only the changes since the last pull", "operationId": "getIntegrationContentStream", "parameters": [{"name": "integration_id", "in": "path", "required": true, "schema": {"type": "string", "format": "ObjectId", "examples": ["5f9d88b9e5c4f5b9a3d3e8b1"], "title": "Integration Id"}}, {"name": "startup", "in": "query", "required": false, "schema": {"type": "boolean", "description": "Set to true if it's the first run to fetch all the content, otherwise only changes since the last pull.", "default": false, "title": "Startup"}, "description": "Set to true if it's the first run to fetch all the content, otherwise only changes since the last pull."}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "404": {"description": "Integration not found"}, "204": {"description": "Integration has no subscribed blocklists or no content available"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/cves": {"get": {"tags": ["Cves"], "summary": "Get list of CVEs CrowdSec is tracking", "description": "Get a paginated list of CVEs that CrowdSec is tracking", "operationId": "getCves", "parameters": [{"name": "query", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Search query for CVEs", "title": "Query"}, "description": "Search query for CVEs"}, {"name": "sort_by", "in": "query", "required": false, "schema": {"anyOf": [{"$ref": "#/components/schemas/GetCVEsSortBy"}, {"type": "null"}], "description": "Field to sort by", "default": "rule_release_date", "title": "Sort By"}, "description": "Field to sort by"}, {"name": "sort_order", "in": "query", "required": false, "schema": {"anyOf": [{"$ref": "#/components/schemas/GetCVEsSortOrder"}, {"type": "null"}], "description": "Sort order: ascending or descending", "default": "desc", "title": "Sort Order"}, "description": "Sort order: ascending or descending"}, {"name": "filters", "in": "query", "required": false, "schema": {"anyOf": [{"type": "array", "items": {"$ref": "#/components/schemas/GetCVEsFilterBy"}}, {"type": "null"}], "description": "Filters to apply on the CVE list", "title": "Filters"}, "description": "Filters to apply on the CVE list"}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "description": "Page number", "default": 1, "title": "Page"}, "description": "Page number"}, {"name": "size", "in": "query", "required": false, "schema": {"type": "integer", "maximum": 100, "minimum": 1, "description": "Page size", "default": 50, "title": "Size"}, "description": "Page size"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetCVEsResponsePage"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/cves/{cve_id}": {"get": {"tags": ["Cves"], "summary": "Get CVE ID informations", "description": "Get information about a specific CVE ID", "operationId": "getCve", "parameters": [{"name": "cve_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Cve Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetCVEResponse"}}}}, "404": {"description": "CVE Not Found"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/cves/{cve_id}/ips-download": {"get": {"tags": ["Cves"], "summary": "Download IPs exploiting a CVE ID (raw)", "description": "Download the list of IPs exploiting a specific CVE ID in raw format", "operationId": "downloadCveIps", "parameters": [{"name": "cve_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Cve Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"text/plain": {"schema": {"type": "string"}}}}, "404": {"description": "CVE Not Found"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/cves/{cve_id}/ips-details": {"get": {"tags": ["Cves"], "summary": "Get IPs details exploiting a CVE ID", "description": "Get detailed information about IPs exploiting a specific CVE ID", "operationId": "getCveIpsDetails", "parameters": [{"name": "cve_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Cve Id"}}, {"name": "since", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string", "pattern": "^\\d+[hd]$"}, {"type": "null"}], "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d", "default": "14d", "title": "Since"}, "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d"}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "description": "Page number", "default": 1, "title": "Page"}, "description": "Page number"}, {"name": "size", "in": "query", "required": false, "schema": {"type": "integer", "maximum": 100, "minimum": 1, "description": "Page size", "default": 50, "title": "Size"}, "description": "Page size"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetCVEIPsResponsePage"}}}}, "404": {"description": "CVE Not Found"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/cves/{cve_id}/integrations": {"post": {"tags": ["Cves"], "summary": "Subscribe an integration to a CVE ID", "description": "Subscribe an integration to receive threats related to a specific CVE ID", "operationId": "subscribeIntegrationToCve", "parameters": [{"name": "cve_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Cve Id"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubscribeCVEIntegrationRequest"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "404": {"description": "Integration Not Found"}, "400": {"description": "CVE Already Subscribed"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "get": {"tags": ["Cves"], "summary": "Get subscribed integrations for a CVE ID", "description": "Get the list of integrations subscribed to a specific CVE ID", "operationId": "getCveSubscribedIntegrations", "parameters": [{"name": "cve_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Cve Id"}}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "description": "Page number", "default": 1, "title": "Page"}, "description": "Page number"}, {"name": "size", "in": "query", "required": false, "schema": {"type": "integer", "maximum": 100, "minimum": 1, "description": "Page size", "default": 50, "title": "Size"}, "description": "Page size"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetCVESubscribedIntegrationsResponsePage"}}}}, "404": {"description": "CVE Not Found"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/cves/{cve_id}/integrations/{integration_name}": {"delete": {"tags": ["Cves"], "summary": "Unsubscribe an integration from a CVE ID", "description": "Unsubscribe an integration from receiving threats related to a specific CVE ID", "operationId": "unsubscribeIntegrationFromCve", "parameters": [{"name": "cve_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Cve Id"}}, {"name": "integration_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Integration Name"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "404": {"description": "Integration Not Found"}, "400": {"description": "CVE Already Unsubscribed"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/cves/{cve_id}/timeline": {"get": {"tags": ["Cves"], "summary": "Get timeline data for a CVE ID", "description": "Get timeline data of occurrences for a specific CVE ID", "operationId": "getCveTimeline", "parameters": [{"name": "cve_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Cve Id"}}, {"name": "since_days", "in": "query", "required": false, "schema": {"$ref": "#/components/schemas/SinceOptions", "description": "Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days.", "default": 7}, "description": "Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days."}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/TimelineItem"}, "title": "Response Getcvetimeline"}}}}, "404": {"description": "CVE Not Found"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/vendors": {"get": {"tags": ["Vendors"], "summary": "Get list of vendors", "description": "Get a paginated list of vendors", "operationId": "getVendors", "parameters": [{"name": "query", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Search query for vendors", "title": "Query"}, "description": "Search query for vendors"}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "description": "Page number", "default": 1, "title": "Page"}, "description": "Page number"}, {"name": "size", "in": "query", "required": false, "schema": {"type": "integer", "maximum": 100, "minimum": 1, "description": "Page size", "default": 50, "title": "Size"}, "description": "Page size"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LookupListResponsePage"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/vendors/{vendor}": {"get": {"tags": ["Vendors"], "summary": "Get vendor impact", "description": "Get CVE and fingerprint rules affecting a vendor", "operationId": "getVendorImpact", "parameters": [{"name": "vendor", "in": "path", "required": true, "schema": {"type": "string", "title": "Vendor"}}, {"name": "sort_by", "in": "query", "required": false, "schema": {"anyOf": [{"$ref": "#/components/schemas/GetCVEsSortBy"}, {"type": "null"}], "description": "Field to sort by", "default": "rule_release_date", "title": "Sort By"}, "description": "Field to sort by"}, {"name": "sort_order", "in": "query", "required": false, "schema": {"anyOf": [{"$ref": "#/components/schemas/GetCVEsSortOrder"}, {"type": "null"}], "description": "Sort order: ascending or descending", "default": "desc", "title": "Sort Order"}, "description": "Sort order: ascending or descending"}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "description": "Page number", "default": 1, "title": "Page"}, "description": "Page number"}, {"name": "size", "in": "query", "required": false, "schema": {"type": "integer", "maximum": 100, "minimum": 1, "description": "Page size", "default": 50, "title": "Size"}, "description": "Page size"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LookupImpactResponsePage"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/products": {"get": {"tags": ["Products"], "summary": "Get list of products", "description": "Get a paginated list of products", "operationId": "getProducts", "parameters": [{"name": "query", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Search query for products", "title": "Query"}, "description": "Search query for products"}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "description": "Page number", "default": 1, "title": "Page"}, "description": "Page number"}, {"name": "size", "in": "query", "required": false, "schema": {"type": "integer", "maximum": 100, "minimum": 1, "description": "Page size", "default": 50, "title": "Size"}, "description": "Page size"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LookupListResponsePage"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/products/{product}": {"get": {"tags": ["Products"], "summary": "Get product impact", "description": "Get CVE and fingerprint rules affecting a product", "operationId": "getProductImpact", "parameters": [{"name": "product", "in": "path", "required": true, "schema": {"type": "string", "title": "Product"}}, {"name": "sort_by", "in": "query", "required": false, "schema": {"anyOf": [{"$ref": "#/components/schemas/GetCVEsSortBy"}, {"type": "null"}], "description": "Field to sort by", "default": "rule_release_date", "title": "Sort By"}, "description": "Field to sort by"}, {"name": "sort_order", "in": "query", "required": false, "schema": {"anyOf": [{"$ref": "#/components/schemas/GetCVEsSortOrder"}, {"type": "null"}], "description": "Sort order: ascending or descending", "default": "desc", "title": "Sort Order"}, "description": "Sort order: ascending or descending"}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "description": "Page number", "default": 1, "title": "Page"}, "description": "Page number"}, {"name": "size", "in": "query", "required": false, "schema": {"type": "integer", "maximum": 100, "minimum": 1, "description": "Page size", "default": 50, "title": "Size"}, "description": "Page size"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LookupImpactResponsePage"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/tags": {"get": {"tags": ["Tags"], "summary": "Get list of tags", "description": "Get a paginated list of tags", "operationId": "getTags", "parameters": [{"name": "query", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Search query for tags", "title": "Query"}, "description": "Search query for tags"}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "description": "Page number", "default": 1, "title": "Page"}, "description": "Page number"}, {"name": "size", "in": "query", "required": false, "schema": {"type": "integer", "maximum": 100, "minimum": 1, "description": "Page size", "default": 50, "title": "Size"}, "description": "Page size"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LookupListResponsePage"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/tags/{tag}": {"get": {"tags": ["Tags"], "summary": "Get tag impact", "description": "Get CVE and fingerprint rules affecting a tag", "operationId": "getTagImpact", "parameters": [{"name": "tag", "in": "path", "required": true, "schema": {"type": "string", "title": "Tag"}}, {"name": "sort_by", "in": "query", "required": false, "schema": {"anyOf": [{"$ref": "#/components/schemas/GetCVEsSortBy"}, {"type": "null"}], "description": "Field to sort by", "default": "rule_release_date", "title": "Sort By"}, "description": "Field to sort by"}, {"name": "sort_order", "in": "query", "required": false, "schema": {"anyOf": [{"$ref": "#/components/schemas/GetCVEsSortOrder"}, {"type": "null"}], "description": "Sort order: ascending or descending", "default": "desc", "title": "Sort Order"}, "description": "Sort order: ascending or descending"}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "description": "Page number", "default": 1, "title": "Page"}, "description": "Page number"}, {"name": "size", "in": "query", "required": false, "schema": {"type": "integer", "maximum": 100, "minimum": 1, "description": "Page size", "default": 50, "title": "Size"}, "description": "Page size"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LookupImpactResponsePage"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/fingerprints": {"get": {"tags": ["Fingerprints"], "summary": "Get list of fingerprint rules", "description": "Get a paginated list of fingerprint rules", "operationId": "getFingerprintRules", "parameters": [{"name": "query", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Search query for fingerprint rules", "title": "Query"}, "description": "Search query for fingerprint rules"}, {"name": "sort_by", "in": "query", "required": false, "schema": {"anyOf": [{"$ref": "#/components/schemas/GetCVEsSortBy"}, {"type": "null"}], "description": "Field to sort by", "default": "rule_release_date", "title": "Sort By"}, "description": "Field to sort by"}, {"name": "sort_order", "in": "query", "required": false, "schema": {"anyOf": [{"$ref": "#/components/schemas/GetCVEsSortOrder"}, {"type": "null"}], "description": "Sort order: ascending or descending", "default": "desc", "title": "Sort Order"}, "description": "Sort order: ascending or descending"}, {"name": "filters", "in": "query", "required": false, "schema": {"anyOf": [{"type": "array", "items": {"$ref": "#/components/schemas/GetCVEsFilterBy"}}, {"type": "null"}], "description": "Filters to apply on the fingerprint rule list", "title": "Filters"}, "description": "Filters to apply on the fingerprint rule list"}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "description": "Page number", "default": 1, "title": "Page"}, "description": "Page number"}, {"name": "size", "in": "query", "required": false, "schema": {"type": "integer", "maximum": 100, "minimum": 1, "description": "Page size", "default": 50, "title": "Size"}, "description": "Page size"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetFingerprintRulesResponsePage"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/fingerprints/{fingerprint}/ips-download": {"get": {"tags": ["Fingerprints"], "summary": "Download IPs exploiting a fingerprint rule (raw)", "description": "Download the list of IPs exploiting a specific fingerprint rule in raw format", "operationId": "downloadFingerprintIps", "parameters": [{"name": "fingerprint", "in": "path", "required": true, "schema": {"type": "string", "title": "Fingerprint"}}], "responses": {"200": {"description": "Successful Response", "content": {"text/plain": {"schema": {"type": "string"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/fingerprints/{fingerprint}/ips-details": {"get": {"tags": ["Fingerprints"], "summary": "Get IP details exploiting a fingerprint rule", "description": "Get detailed information about IPs exploiting a specific fingerprint rule", "operationId": "getFingerprintIpsDetails", "parameters": [{"name": "fingerprint", "in": "path", "required": true, "schema": {"type": "string", "title": "Fingerprint"}}, {"name": "since", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string", "pattern": "^\\d+[hd]$"}, {"type": "null"}], "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d", "default": "14d", "title": "Since"}, "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d"}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "description": "Page number", "default": 1, "title": "Page"}, "description": "Page number"}, {"name": "size", "in": "query", "required": false, "schema": {"type": "integer", "maximum": 100, "minimum": 1, "description": "Page size", "default": 50, "title": "Size"}, "description": "Page size"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetFingerprintIPsResponsePage"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/fingerprints/{fingerprint}/integrations": {"post": {"tags": ["Fingerprints"], "summary": "Subscribe an integration to a fingerprint rule", "description": "Subscribe an integration to receive threats related to a specific fingerprint rule", "operationId": "subscribeIntegrationToFingerprint", "parameters": [{"name": "fingerprint", "in": "path", "required": true, "schema": {"type": "string", "title": "Fingerprint"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubscribeFingerprintIntegrationRequest"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "get": {"tags": ["Fingerprints"], "summary": "Get subscribed integrations for a fingerprint rule", "description": "Get the list of integrations subscribed to a specific fingerprint rule", "operationId": "getFingerprintSubscribedIntegrations", "parameters": [{"name": "fingerprint", "in": "path", "required": true, "schema": {"type": "string", "title": "Fingerprint"}}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "description": "Page number", "default": 1, "title": "Page"}, "description": "Page number"}, {"name": "size", "in": "query", "required": false, "schema": {"type": "integer", "maximum": 100, "minimum": 1, "description": "Page size", "default": 50, "title": "Size"}, "description": "Page size"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetFingerprintSubscribedIntegrationsResponsePage"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/fingerprints/{fingerprint}/integrations/{integration_name}": {"delete": {"tags": ["Fingerprints"], "summary": "Unsubscribe an integration from a fingerprint rule", "description": "Unsubscribe an integration from receiving threats related to a specific fingerprint rule", "operationId": "unsubscribeIntegrationFromFingerprint", "parameters": [{"name": "fingerprint", "in": "path", "required": true, "schema": {"type": "string", "title": "Fingerprint"}}, {"name": "integration_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Integration Name"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/fingerprints/{fingerprint}/timeline": {"get": {"tags": ["Fingerprints"], "summary": "Get timeline data for a fingerprint rule", "description": "Get timeline data of occurrences for a specific fingerprint rule", "operationId": "getFingerprintTimeline", "parameters": [{"name": "fingerprint", "in": "path", "required": true, "schema": {"type": "string", "title": "Fingerprint"}}, {"name": "since_days", "in": "query", "required": false, "schema": {"$ref": "#/components/schemas/SinceOptions", "description": "Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days.", "default": 7}, "description": "Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days."}, {"name": "interval", "in": "query", "required": false, "schema": {"anyOf": [{"$ref": "#/components/schemas/IntervalOptions"}, {"type": "null"}], "description": "Interval for aggregating timeline data. Options: 'hour', 'day', 'week'. Default is adapted based on 'since' parameter.", "title": "Interval"}, "description": "Interval for aggregating timeline data. Options: 'hour', 'day', 'week'. Default is adapted based on 'since' parameter."}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/FingerprintTimelineItem"}, "title": "Response Getfingerprinttimeline"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/fingerprints/{fingerprint}": {"get": {"tags": ["Fingerprints"], "summary": "Get fingerprint rule information", "description": "Get information about a specific fingerprint rule", "operationId": "getFingerprintRule", "parameters": [{"name": "fingerprint", "in": "path", "required": true, "schema": {"type": "string", "title": "Fingerprint"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FingerprintRuleResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}}, "components": {"schemas": {"ApiKeyCredentials": {"properties": {"api_key": {"type": "string", "title": "Api Key", "description": "API key for the integration"}}, "type": "object", "required": ["api_key"], "title": "ApiKeyCredentials"}, "BasicAuthCredentials": {"properties": {"username": {"type": "string", "title": "Username", "description": "Basic auth username for the integration"}, "password": {"type": "string", "title": "Password", "description": "Basic auth password for the integration"}}, "type": "object", "required": ["username", "password"], "title": "BasicAuthCredentials"}, "BlocklistSubscription": {"properties": {"id": {"type": "string", "title": "Id"}, "remediation": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Remediation"}}, "type": "object", "required": ["id"], "title": "BlocklistSubscription"}, "CVESubscription": {"properties": {"id": {"type": "string", "title": "Id", "description": "CVE ID"}}, "type": "object", "required": ["id"], "title": "CVESubscription"}, "FingerprintSubscription": {"properties": {"id": {"type": "string", "title": "Id"}}, "type": "object", "required": ["id"], "title": "FingerprintSubscription"}, "HTTPValidationError": {"properties": {"detail": {"items": {"$ref": "#/components/schemas/ValidationError"}, "type": "array", "title": "Detail"}}, "type": "object", "title": "HTTPValidationError"}, "IntegrationCreateRequest": {"properties": {"name": {"type": "string", "minLength": 1, "title": "Name", "description": "Name of the integration"}, "description": {"type": "string", "minLength": 1, "title": "Description", "description": "Description of the integration"}, "entity_type": {"$ref": "#/components/schemas/IntegrationType", "description": "Type of the integration"}, "output_format": {"$ref": "#/components/schemas/OutputFormat", "description": "Output format of the integration"}, "pull_limit": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Pull Limit", "description": "Maximum number of items to pull"}, "enable_ip_aggregation": {"type": "boolean", "title": "Enable Ip Aggregation", "description": "Whether to enable IP aggregation into ranges", "default": false}}, "additionalProperties": false, "type": "object", "required": ["name", "entity_type", "output_format"], "title": "IntegrationCreateRequest"}, "IntegrationCreateResponse": {"properties": {"id": {"type": "string", "title": "Id", "description": "ID of the integration"}, "name": {"type": "string", "title": "Name", "description": "Name of the integration. Should be unique within the organization"}, "organization_id": {"type": "string", "title": "Organization Id", "description": "ID of the owner organization"}, "description": {"type": "string", "title": "Description", "description": "Description of the integration"}, "created_at": {"type": "string", "format": "date-time", "title": "Created At", "description": "Time the integration was created"}, "updated_at": {"type": "string", "format": "date-time", "title": "Updated At", "description": "Last time the integration was updated"}, "entity_type": {"$ref": "#/components/schemas/IntegrationType", "description": "Type of the integration"}, "output_format": {"$ref": "#/components/schemas/OutputFormat", "description": "Output format of the integration"}, "last_pull": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Last Pull", "description": "Last time the integration pulled blocklists"}, "blocklists": {"items": {"$ref": "#/components/schemas/BlocklistSubscription"}, "type": "array", "title": "Blocklists", "description": "Blocklists that are subscribed by the integration"}, "cves": {"items": {"$ref": "#/components/schemas/CVESubscription"}, "type": "array", "title": "Cves", "description": "CVEs that are subscribed by the integration"}, "fingerprints": {"items": {"$ref": "#/components/schemas/FingerprintSubscription"}, "type": "array", "title": "Fingerprints", "description": "Fingerprints that are subscribed by the integration"}, "endpoint": {"type": "string", "maxLength": 2083, "minLength": 1, "format": "uri", "title": "Endpoint", "description": "Url that should be used by the firewall or the remediation component to fetch the integration's content"}, "stats": {"$ref": "#/components/schemas/Stats", "description": "Stats of the integration", "default": {"count": 0}}, "tags": {"items": {"type": "string"}, "type": "array", "title": "Tags", "description": "Tags associated with the integration", "default": []}, "pull_limit": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Pull Limit", "description": "Maximum number of items to pull"}, "enable_ip_aggregation": {"type": "boolean", "title": "Enable Ip Aggregation", "description": "Whether to enable IP aggregation into ranges", "default": false}, "credentials": {"anyOf": [{"$ref": "#/components/schemas/ApiKeyCredentials"}, {"$ref": "#/components/schemas/BasicAuthCredentials"}], "title": "Credentials", "description": "Credentials that were generated for the integration"}}, "type": "object", "required": ["id", "name", "organization_id", "created_at", "updated_at", "entity_type", "output_format", "blocklists", "cves", "fingerprints", "endpoint", "credentials"], "title": "IntegrationCreateResponse"}, "IntegrationGetResponse": {"properties": {"id": {"type": "string", "title": "Id", "description": "ID of the integration"}, "name": {"type": "string", "title": "Name", "description": "Name of the integration. Should be unique within the organization"}, "organization_id": {"type": "string", "title": "Organization Id", "description": "ID of the owner organization"}, "description": {"type": "string", "title": "Description", "description": "Description of the integration"}, "created_at": {"type": "string", "format": "date-time", "title": "Created At", "description": "Time the integration was created"}, "updated_at": {"type": "string", "format": "date-time", "title": "Updated At", "description": "Last time the integration was updated"}, "entity_type": {"$ref": "#/components/schemas/IntegrationType", "description": "Type of the integration"}, "output_format": {"$ref": "#/components/schemas/OutputFormat", "description": "Output format of the integration"}, "last_pull": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Last Pull", "description": "Last time the integration pulled blocklists"}, "blocklists": {"items": {"$ref": "#/components/schemas/BlocklistSubscription"}, "type": "array", "title": "Blocklists", "description": "Blocklists that are subscribed by the integration"}, "cves": {"items": {"$ref": "#/components/schemas/CVESubscription"}, "type": "array", "title": "Cves", "description": "CVEs that are subscribed by the integration"}, "fingerprints": {"items": {"$ref": "#/components/schemas/FingerprintSubscription"}, "type": "array", "title": "Fingerprints", "description": "Fingerprints that are subscribed by the integration"}, "endpoint": {"type": "string", "maxLength": 2083, "minLength": 1, "format": "uri", "title": "Endpoint", "description": "Url that should be used by the firewall or the remediation component to fetch the integration's content"}, "stats": {"$ref": "#/components/schemas/Stats", "description": "Stats of the integration", "default": {"count": 0}}, "tags": {"items": {"type": "string"}, "type": "array", "title": "Tags", "description": "Tags associated with the integration", "default": []}, "pull_limit": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Pull Limit", "description": "Maximum number of items to pull"}, "enable_ip_aggregation": {"type": "boolean", "title": "Enable Ip Aggregation", "description": "Whether to enable IP aggregation into ranges", "default": false}}, "type": "object", "required": ["id", "name", "organization_id", "created_at", "updated_at", "entity_type", "output_format", "blocklists", "cves", "fingerprints", "endpoint"], "title": "IntegrationGetResponse"}, "IntegrationGetResponsePage": {"properties": {"items": {"items": {"$ref": "#/components/schemas/IntegrationGetResponse"}, "type": "array", "title": "Items"}, "total": {"type": "integer", "minimum": 0.0, "title": "Total"}, "page": {"type": "integer", "minimum": 1.0, "title": "Page"}, "size": {"type": "integer", "minimum": 1.0, "title": "Size"}, "pages": {"type": "integer", "minimum": 0.0, "title": "Pages"}, "links": {"$ref": "#/components/schemas/Links", "readOnly": true}}, "type": "object", "required": ["items", "total", "page", "size", "pages", "links"], "title": "IntegrationGetResponsePage"}, "IntegrationType": {"type": "string", "enum": ["firewall_integration", "remediation_component_integration"], "title": "IntegrationType"}, "IntegrationUpdateRequest": {"properties": {"name": {"type": "string", "minLength": 1, "title": "Name", "description": "New name"}, "description": {"type": "string", "minLength": 1, "title": "Description", "description": "New description"}, "output_format": {"$ref": "#/components/schemas/OutputFormat", "description": "New output format"}, "regenerate_credentials": {"type": "boolean", "title": "Regenerate Credentials", "description": "Regenerate credentials for the integration"}, "pull_limit": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Pull Limit", "description": "Maximum number of items to pull"}, "enable_ip_aggregation": {"type": "boolean", "title": "Enable Ip Aggregation", "description": "Whether to enable IP aggregation into ranges", "default": false}}, "additionalProperties": false, "type": "object", "title": "IntegrationUpdateRequest"}, "IntegrationUpdateResponse": {"properties": {"id": {"type": "string", "title": "Id", "description": "ID of the integration"}, "name": {"type": "string", "title": "Name", "description": "Name of the integration. Should be unique within the organization"}, "organization_id": {"type": "string", "title": "Organization Id", "description": "ID of the owner organization"}, "description": {"type": "string", "title": "Description", "description": "Description of the integration"}, "created_at": {"type": "string", "format": "date-time", "title": "Created At", "description": "Time the integration was created"}, "updated_at": {"type": "string", "format": "date-time", "title": "Updated At", "description": "Last time the integration was updated"}, "entity_type": {"$ref": "#/components/schemas/IntegrationType", "description": "Type of the integration"}, "output_format": {"$ref": "#/components/schemas/OutputFormat", "description": "Output format of the integration"}, "last_pull": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Last Pull", "description": "Last time the integration pulled blocklists"}, "blocklists": {"items": {"$ref": "#/components/schemas/BlocklistSubscription"}, "type": "array", "title": "Blocklists", "description": "Blocklists that are subscribed by the integration"}, "cves": {"items": {"$ref": "#/components/schemas/CVESubscription"}, "type": "array", "title": "Cves", "description": "CVEs that are subscribed by the integration"}, "fingerprints": {"items": {"$ref": "#/components/schemas/FingerprintSubscription"}, "type": "array", "title": "Fingerprints", "description": "Fingerprints that are subscribed by the integration"}, "endpoint": {"type": "string", "maxLength": 2083, "minLength": 1, "format": "uri", "title": "Endpoint", "description": "Url that should be used by the firewall or the remediation component to fetch the integration's content"}, "stats": {"$ref": "#/components/schemas/Stats", "description": "Stats of the integration", "default": {"count": 0}}, "tags": {"items": {"type": "string"}, "type": "array", "title": "Tags", "description": "Tags associated with the integration", "default": []}, "pull_limit": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Pull Limit", "description": "Maximum number of items to pull"}, "enable_ip_aggregation": {"type": "boolean", "title": "Enable Ip Aggregation", "description": "Whether to enable IP aggregation into ranges", "default": false}, "credentials": {"anyOf": [{"$ref": "#/components/schemas/ApiKeyCredentials"}, {"$ref": "#/components/schemas/BasicAuthCredentials"}, {"type": "null"}], "title": "Credentials", "description": "Credentials for the integration"}}, "type": "object", "required": ["id", "name", "organization_id", "created_at", "updated_at", "entity_type", "output_format", "blocklists", "cves", "fingerprints", "endpoint"], "title": "IntegrationUpdateResponse"}, "Links": {"properties": {"first": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "First", "examples": ["/api/v1/users?limit=1&offset1"]}, "last": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Last", "examples": ["/api/v1/users?limit=1&offset1"]}, "self": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Self", "examples": ["/api/v1/users?limit=1&offset1"]}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Next", "examples": ["/api/v1/users?limit=1&offset1"]}, "prev": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Prev", "examples": ["/api/v1/users?limit=1&offset1"]}}, "type": "object", "title": "Links"}, "OutputFormat": {"type": "string", "enum": ["plain_text", "f5", "remediation_component", "fortigate", "paloalto", "checkpoint", "cisco", "juniper", "mikrotik", "pfsense", "opnsense", "sophos"], "title": "OutputFormat"}, "Stats": {"properties": {"count": {"type": "integer", "title": "Count", "description": "Number of total blocklists items the integration will pull"}}, "type": "object", "required": ["count"], "title": "Stats"}, "ValidationError": {"properties": {"loc": {"items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, "type": "array", "title": "Location"}, "msg": {"type": "string", "title": "Message"}, "type": {"type": "string", "title": "Error Type"}}, "type": "object", "required": ["loc", "msg", "type"], "title": "ValidationError"}, "AdjustmentScore": {"properties": {"total": {"type": "integer", "title": "Total", "description": "Total score adjustment"}, "recency": {"type": "integer", "title": "Recency", "description": "Recency score adjustment"}, "low_info": {"type": "integer", "title": "Low Info", "description": "Low information score adjustment"}}, "type": "object", "required": ["total", "recency", "low_info"], "title": "AdjustmentScore"}, "AffectedComponent": {"properties": {"vendor": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Vendor", "description": "Vendor of the affected component"}, "product": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Product", "description": "Product name of the affected component"}}, "type": "object", "title": "AffectedComponent", "description": "Affected Component in a CVE"}, "AllowlistSubscription": {"properties": {"id": {"type": "string", "title": "Id"}}, "type": "object", "required": ["id"], "title": "AllowlistSubscription"}, "AttackDetail": {"properties": {"name": {"type": "string", "title": "Name", "description": "Attack detail name"}, "label": {"type": "string", "title": "Label", "description": "Attack detail label"}, "description": {"type": "string", "title": "Description", "description": "Attack detail description"}, "references": {"items": {"type": "string"}, "type": "array", "title": "References", "description": "Attack detail references"}}, "type": "object", "required": ["name", "label", "description"], "title": "AttackDetail"}, "Behavior": {"properties": {"name": {"type": "string", "title": "Name", "description": "Behavior name"}, "label": {"type": "string", "title": "Label", "description": "Behavior label"}, "description": {"type": "string", "title": "Description", "description": "Behavior description"}}, "type": "object", "required": ["name", "label", "description"], "title": "Behavior"}, "CVEEvent": {"properties": {"date": {"type": "string", "format": "date-time", "title": "Date", "description": "Date of the event"}, "description": {"type": "string", "title": "Description", "description": "Description of the event"}, "label": {"type": "string", "title": "Label", "description": "Label of the event"}, "name": {"type": "string", "title": "Name", "description": "Name of the event"}}, "type": "object", "required": ["date", "description", "label", "name"], "title": "CVEEvent", "description": "CVE Event Information"}, "CVEResponseBase": {"properties": {"id": {"type": "string", "title": "Id", "description": "ID of the CVE"}, "name": {"type": "string", "title": "Name", "description": "Name of the CVE"}, "title": {"type": "string", "title": "Title", "description": "Title of the CVE"}, "affected_components": {"items": {"$ref": "#/components/schemas/AffectedComponent"}, "type": "array", "title": "Affected Components", "description": "List of affected components"}, "crowdsec_score": {"type": "integer", "maximum": 10.0, "minimum": 0.0, "title": "Crowdsec Score", "description": "Live Exploit Tracker score of the CVE"}, "opportunity_score": {"type": "integer", "maximum": 5.0, "minimum": 0.0, "title": "Opportunity Score", "description": "Opportunity score indicating if it's an opportunistic(0) or targeted(5) attack (between 0-5)", "default": 0}, "momentum_score": {"type": "integer", "maximum": 5.0, "minimum": 0.0, "title": "Momentum Score", "description": "Momentum score indicating the vulnerability's trendiness based on signal comparison with the previous month. Higher scores (4-5) indicate significantly more signals this month than last month's average, while lower scores (0-1) indicate declining activity (between 0-5)", "default": 0}, "first_seen": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "First Seen", "description": "First seen date"}, "last_seen": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Last Seen", "description": "Last seen date"}, "nb_ips": {"type": "integer", "minimum": 0.0, "title": "Nb Ips", "description": "Number of unique IPs affected"}, "published_date": {"type": "string", "format": "date-time", "title": "Published Date", "description": "Published date of the CVE"}, "cvss_score": {"anyOf": [{"type": "number", "maximum": 10.0, "minimum": 0.0}, {"type": "null"}], "title": "Cvss Score", "description": "CVSS score of the CVE"}, "has_public_exploit": {"type": "boolean", "title": "Has Public Exploit", "description": "Indicates if there is a public exploit for the CVE"}, "rule_release_date": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Rule Release Date", "description": "Release date of the associated detection rule"}, "exploitation_phase": {"$ref": "#/components/schemas/ExploitationPhase", "description": "Current exploitation phase of the CVE"}, "adjustment_score": {"anyOf": [{"$ref": "#/components/schemas/AdjustmentScore"}, {"type": "null"}], "description": "Score adjustments applied to the CVE score based on various factors"}}, "type": "object", "required": ["id", "name", "title", "affected_components", "crowdsec_score", "nb_ips", "published_date", "has_public_exploit", "exploitation_phase"], "title": "CVEResponseBase", "description": "GET CVE ID Response"}, "CVEsubscription": {"properties": {"id": {"type": "string", "title": "Id"}}, "type": "object", "required": ["id"], "title": "CVEsubscription"}, "CWE": {"properties": {"name": {"type": "string", "title": "Name", "description": "Name of the CWE"}, "label": {"type": "string", "title": "Label", "description": "Label of the CWE"}, "description": {"type": "string", "title": "Description", "description": "Description of the CWE"}}, "type": "object", "required": ["name", "label", "description"], "title": "CWE", "description": "CWE Information"}, "Classification": {"properties": {"name": {"type": "string", "title": "Name", "description": "Classification name"}, "label": {"type": "string", "title": "Label", "description": "Classification label"}, "description": {"type": "string", "title": "Description", "description": "Classification description"}}, "type": "object", "required": ["name", "label", "description"], "title": "Classification"}, "Classifications": {"properties": {"false_positives": {"items": {"$ref": "#/components/schemas/Classification"}, "type": "array", "title": "False Positives", "description": "False positive classifications"}, "classifications": {"items": {"$ref": "#/components/schemas/Classification"}, "type": "array", "title": "Classifications", "description": "Main classifications"}}, "type": "object", "title": "Classifications"}, "EntityType": {"type": "string", "enum": ["org", "tag", "engine", "firewall_integration", "remediation_component_integration", "remediation_component", "log_processor"], "title": "EntityType"}, "ExploitationPhase": {"properties": {"name": {"type": "string", "title": "Name", "description": "Name of the exploitation phase"}, "label": {"type": "string", "title": "Label", "description": "Label of the exploitation phase"}, "description": {"type": "string", "title": "Description", "description": "Description of the exploitation phase"}}, "type": "object", "required": ["name", "label", "description"], "title": "ExploitationPhase"}, "FingerprintRuleResponse": {"properties": {"id": {"type": "string", "title": "Id", "description": "Fingerprint rule identifier"}, "name": {"type": "string", "title": "Name", "description": "Fingerprint rule name"}, "title": {"type": "string", "title": "Title", "description": "Fingerprint rule title"}, "affected_components": {"items": {"$ref": "#/components/schemas/AffectedComponent"}, "type": "array", "title": "Affected Components", "description": "List of affected components"}, "crowdsec_score": {"type": "integer", "maximum": 10.0, "minimum": 0.0, "title": "Crowdsec Score", "description": "Live Exploit Tracker score for the fingerprint rule"}, "opportunity_score": {"type": "integer", "maximum": 5.0, "minimum": 0.0, "title": "Opportunity Score", "description": "Opportunity score", "default": 0}, "momentum_score": {"type": "integer", "maximum": 5.0, "minimum": 0.0, "title": "Momentum Score", "description": "Momentum score", "default": 0}, "first_seen": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "First Seen", "description": "First seen date"}, "last_seen": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Last Seen", "description": "Last seen date"}, "nb_ips": {"type": "integer", "minimum": 0.0, "title": "Nb Ips", "description": "Number of unique IPs observed"}, "rule_release_date": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Rule Release Date", "description": "Release date of the fingerprint rule"}, "exploitation_phase": {"$ref": "#/components/schemas/ExploitationPhase", "description": "Current exploitation phase"}, "adjustment_score": {"anyOf": [{"$ref": "#/components/schemas/AdjustmentScore"}, {"type": "null"}], "description": "Score adjustment details"}, "hype_score": {"type": "integer", "maximum": 5.0, "minimum": 0.0, "title": "Hype Score", "description": "Hype score (raw momentum component)", "default": 0}, "tags": {"items": {"type": "string"}, "type": "array", "title": "Tags", "description": "Tags associated with the fingerprint rule"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Description", "description": "Fingerprint rule description"}, "references": {"items": {"type": "string"}, "type": "array", "title": "References", "description": "Reference links for the fingerprint rule"}, "crowdsec_analysis": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Crowdsec Analysis", "description": "CrowdSec analysis for this fingerprint rule"}, "events": {"items": {"$ref": "#/components/schemas/CVEEvent"}, "type": "array", "title": "Events", "description": "List of events related to the fingerprint rule"}}, "type": "object", "required": ["id", "name", "title", "affected_components", "crowdsec_score", "nb_ips", "exploitation_phase"], "title": "FingerprintRuleResponse"}, "FingerprintRuleSummary": {"properties": {"id": {"type": "string", "title": "Id", "description": "Fingerprint rule identifier"}, "name": {"type": "string", "title": "Name", "description": "Fingerprint rule name"}, "title": {"type": "string", "title": "Title", "description": "Fingerprint rule title"}, "affected_components": {"items": {"$ref": "#/components/schemas/AffectedComponent"}, "type": "array", "title": "Affected Components", "description": "List of affected components"}, "crowdsec_score": {"type": "integer", "maximum": 10.0, "minimum": 0.0, "title": "Crowdsec Score", "description": "Live Exploit Tracker score for the fingerprint rule"}, "opportunity_score": {"type": "integer", "maximum": 5.0, "minimum": 0.0, "title": "Opportunity Score", "description": "Opportunity score", "default": 0}, "momentum_score": {"type": "integer", "maximum": 5.0, "minimum": 0.0, "title": "Momentum Score", "description": "Momentum score", "default": 0}, "first_seen": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "First Seen", "description": "First seen date"}, "last_seen": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Last Seen", "description": "Last seen date"}, "nb_ips": {"type": "integer", "minimum": 0.0, "title": "Nb Ips", "description": "Number of unique IPs observed"}, "rule_release_date": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Rule Release Date", "description": "Release date of the fingerprint rule"}, "exploitation_phase": {"$ref": "#/components/schemas/ExploitationPhase", "description": "Current exploitation phase"}, "adjustment_score": {"anyOf": [{"$ref": "#/components/schemas/AdjustmentScore"}, {"type": "null"}], "description": "Score adjustment details"}}, "type": "object", "required": ["id", "name", "title", "affected_components", "crowdsec_score", "nb_ips", "exploitation_phase"], "title": "FingerprintRuleSummary"}, "FingerprintTimelineItem": {"properties": {"timestamp": {"type": "string", "format": "date-time", "title": "Timestamp", "description": "Timestamp of the timeline event"}, "count": {"type": "integer", "title": "Count", "description": "Count of occurrences at the timestamp"}}, "type": "object", "required": ["timestamp", "count"], "title": "FingerprintTimelineItem"}, "GetCVEIPsResponsePage": {"properties": {"items": {"items": {"$ref": "#/components/schemas/IPItem"}, "type": "array", "title": "Items"}, "total": {"type": "integer", "minimum": 0.0, "title": "Total"}, "page": {"type": "integer", "minimum": 1.0, "title": "Page"}, "size": {"type": "integer", "minimum": 1.0, "title": "Size"}, "pages": {"type": "integer", "minimum": 0.0, "title": "Pages"}, "links": {"$ref": "#/components/schemas/Links", "readOnly": true}}, "type": "object", "required": ["items", "total", "page", "size", "pages", "links"], "title": "GetCVEIPsResponsePage"}, "GetCVEResponse": {"properties": {"id": {"type": "string", "title": "Id", "description": "ID of the CVE"}, "name": {"type": "string", "title": "Name", "description": "Name of the CVE"}, "title": {"type": "string", "title": "Title", "description": "Title of the CVE"}, "affected_components": {"items": {"$ref": "#/components/schemas/AffectedComponent"}, "type": "array", "title": "Affected Components", "description": "List of affected components"}, "crowdsec_score": {"type": "integer", "maximum": 10.0, "minimum": 0.0, "title": "Crowdsec Score", "description": "Live Exploit Tracker score of the CVE"}, "opportunity_score": {"type": "integer", "maximum": 5.0, "minimum": 0.0, "title": "Opportunity Score", "description": "Opportunity score indicating if it's an opportunistic(0) or targeted(5) attack (between 0-5)", "default": 0}, "momentum_score": {"type": "integer", "maximum": 5.0, "minimum": 0.0, "title": "Momentum Score", "description": "Momentum score indicating the vulnerability's trendiness based on signal comparison with the previous month. Higher scores (4-5) indicate significantly more signals this month than last month's average, while lower scores (0-1) indicate declining activity (between 0-5)", "default": 0}, "first_seen": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "First Seen", "description": "First seen date"}, "last_seen": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Last Seen", "description": "Last seen date"}, "nb_ips": {"type": "integer", "minimum": 0.0, "title": "Nb Ips", "description": "Number of unique IPs affected"}, "published_date": {"type": "string", "format": "date-time", "title": "Published Date", "description": "Published date of the CVE"}, "cvss_score": {"anyOf": [{"type": "number", "maximum": 10.0, "minimum": 0.0}, {"type": "null"}], "title": "Cvss Score", "description": "CVSS score of the CVE"}, "has_public_exploit": {"type": "boolean", "title": "Has Public Exploit", "description": "Indicates if there is a public exploit for the CVE"}, "rule_release_date": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Rule Release Date", "description": "Release date of the associated detection rule"}, "exploitation_phase": {"$ref": "#/components/schemas/ExploitationPhase", "description": "Current exploitation phase of the CVE"}, "adjustment_score": {"anyOf": [{"$ref": "#/components/schemas/AdjustmentScore"}, {"type": "null"}], "description": "Score adjustments applied to the CVE score based on various factors"}, "hype_score": {"type": "integer", "maximum": 5.0, "minimum": 0.0, "title": "Hype Score", "description": "Hype score (raw momentum component)", "default": 0}, "tags": {"items": {"type": "string"}, "type": "array", "title": "Tags", "description": "Tags associated with the CVE"}, "references": {"items": {"type": "string"}, "type": "array", "title": "References", "description": "List of references for the CVE"}, "description": {"type": "string", "title": "Description", "description": "Description of the CVE"}, "crowdsec_analysis": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Crowdsec Analysis", "description": "CrowdSec analysis of the CVE"}, "cwes": {"items": {"$ref": "#/components/schemas/CWE"}, "type": "array", "title": "Cwes", "description": "List of CWEs associated with the CVE"}, "events": {"items": {"$ref": "#/components/schemas/CVEEvent"}, "type": "array", "title": "Events", "description": "List of events related to the CVE"}}, "type": "object", "required": ["id", "name", "title", "affected_components", "crowdsec_score", "nb_ips", "published_date", "has_public_exploit", "exploitation_phase", "references", "description", "crowdsec_analysis", "cwes"], "title": "GetCVEResponse"}, "GetCVESubscribedIntegrationsResponsePage": {"properties": {"items": {"items": {"$ref": "#/components/schemas/IntegrationResponse"}, "type": "array", "title": "Items"}, "total": {"type": "integer", "minimum": 0.0, "title": "Total"}, "page": {"type": "integer", "minimum": 1.0, "title": "Page"}, "size": {"type": "integer", "minimum": 1.0, "title": "Size"}, "pages": {"type": "integer", "minimum": 0.0, "title": "Pages"}, "links": {"$ref": "#/components/schemas/Links", "readOnly": true}}, "type": "object", "required": ["items", "total", "page", "size", "pages", "links"], "title": "GetCVESubscribedIntegrationsResponsePage"}, "GetCVEsFilterBy": {"type": "string", "enum": ["is_public"], "title": "GetCVEsFilterBy"}, "GetCVEsResponsePage": {"properties": {"items": {"items": {"$ref": "#/components/schemas/CVEResponseBase"}, "type": "array", "title": "Items"}, "total": {"type": "integer", "minimum": 0.0, "title": "Total"}, "page": {"type": "integer", "minimum": 1.0, "title": "Page"}, "size": {"type": "integer", "minimum": 1.0, "title": "Size"}, "pages": {"type": "integer", "minimum": 0.0, "title": "Pages"}, "links": {"$ref": "#/components/schemas/Links", "readOnly": true}}, "type": "object", "required": ["items", "total", "page", "size", "pages", "links"], "title": "GetCVEsResponsePage"}, "GetCVEsSortBy": {"type": "string", "enum": ["rule_release_date", "trending", "nb_ips", "name"], "title": "GetCVEsSortBy"}, "GetCVEsSortOrder": {"type": "string", "enum": ["asc", "desc"], "title": "GetCVEsSortOrder"}, "GetFingerprintIPsResponsePage": {"properties": {"items": {"items": {"$ref": "#/components/schemas/IPItem"}, "type": "array", "title": "Items"}, "total": {"type": "integer", "minimum": 0.0, "title": "Total"}, "page": {"type": "integer", "minimum": 1.0, "title": "Page"}, "size": {"type": "integer", "minimum": 1.0, "title": "Size"}, "pages": {"type": "integer", "minimum": 0.0, "title": "Pages"}, "links": {"$ref": "#/components/schemas/Links", "readOnly": true}}, "type": "object", "required": ["items", "total", "page", "size", "pages", "links"], "title": "GetFingerprintIPsResponsePage"}, "GetFingerprintRulesResponsePage": {"properties": {"items": {"items": {"$ref": "#/components/schemas/FingerprintRuleSummary"}, "type": "array", "title": "Items"}, "total": {"type": "integer", "minimum": 0.0, "title": "Total"}, "page": {"type": "integer", "minimum": 1.0, "title": "Page"}, "size": {"type": "integer", "minimum": 1.0, "title": "Size"}, "pages": {"type": "integer", "minimum": 0.0, "title": "Pages"}, "links": {"$ref": "#/components/schemas/Links", "readOnly": true}}, "type": "object", "required": ["items", "total", "page", "size", "pages", "links"], "title": "GetFingerprintRulesResponsePage"}, "GetFingerprintSubscribedIntegrationsResponsePage": {"properties": {"items": {"items": {"$ref": "#/components/schemas/IntegrationResponse"}, "type": "array", "title": "Items"}, "total": {"type": "integer", "minimum": 0.0, "title": "Total"}, "page": {"type": "integer", "minimum": 1.0, "title": "Page"}, "size": {"type": "integer", "minimum": 1.0, "title": "Size"}, "pages": {"type": "integer", "minimum": 0.0, "title": "Pages"}, "links": {"$ref": "#/components/schemas/Links", "readOnly": true}}, "type": "object", "required": ["items", "total", "page", "size", "pages", "links"], "title": "GetFingerprintSubscribedIntegrationsResponsePage"}, "History": {"properties": {"first_seen": {"type": "string", "format": "date-time", "title": "First Seen", "description": "First seen timestamp"}, "last_seen": {"type": "string", "format": "date-time", "title": "Last Seen", "description": "Last seen timestamp"}, "full_age": {"type": "integer", "title": "Full Age", "description": "Full age in days"}, "days_age": {"type": "integer", "title": "Days Age", "description": "Days age"}}, "type": "object", "required": ["first_seen", "last_seen", "full_age", "days_age"], "title": "History"}, "IPItem": {"properties": {"ip": {"type": "string", "title": "Ip", "description": "IP address"}, "reputation": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reputation", "description": "Reputation of the IP"}, "ip_range": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Ip Range", "description": "IP range"}, "ip_range_score": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Ip Range Score", "description": "IP range score"}, "ip_range_24": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Ip Range 24", "description": "IP range /24"}, "ip_range_24_reputation": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Ip Range 24 Reputation", "description": "IP range /24 reputation"}, "ip_range_24_score": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Ip Range 24 Score", "description": "IP range /24 score"}, "as_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "As Name", "description": "AS name"}, "as_num": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "As Num", "description": "AS number"}, "background_noise_score": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Background Noise Score", "description": "Background noise score"}, "background_noise": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Background Noise", "description": "Background noise level"}, "confidence": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Confidence", "description": "Confidence level"}, "location": {"anyOf": [{"$ref": "#/components/schemas/Location"}, {"type": "null"}], "description": "IP location information"}, "reverse_dns": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reverse Dns", "description": "Reverse DNS"}, "behaviors": {"items": {"$ref": "#/components/schemas/Behavior"}, "type": "array", "title": "Behaviors", "description": "List of behaviors"}, "references": {"items": {"$ref": "#/components/schemas/Reference"}, "type": "array", "title": "References", "description": "List of references"}, "history": {"anyOf": [{"$ref": "#/components/schemas/History"}, {"type": "null"}], "description": "Historical data"}, "classifications": {"anyOf": [{"$ref": "#/components/schemas/Classifications"}, {"type": "null"}], "description": "Classification data"}, "mitre_techniques": {"items": {"$ref": "#/components/schemas/MitreTechnique"}, "type": "array", "title": "Mitre Techniques", "description": "MITRE techniques"}, "cves": {"items": {"type": "string"}, "type": "array", "title": "Cves", "description": "List of CVEs"}, "attack_details": {"items": {"$ref": "#/components/schemas/AttackDetail"}, "type": "array", "title": "Attack Details", "description": "Attack details"}, "target_countries": {"additionalProperties": {"type": "integer"}, "type": "object", "title": "Target Countries", "description": "Target countries"}, "scores": {"anyOf": [{"$ref": "#/components/schemas/Scores"}, {"type": "null"}], "description": "Scoring information"}}, "type": "object", "required": ["ip"], "title": "IPItem"}, "IntegrationResponse": {"properties": {"tags": {"items": {"type": "string"}, "type": "array", "title": "Tags", "default": []}, "organization_id": {"type": "string", "title": "Organization Id"}, "created_at": {"type": "string", "format": "date-time", "title": "Created At", "description": "Time the integration was created"}, "entity_type": {"$ref": "#/components/schemas/EntityType", "description": "Type of the integration"}, "id": {"type": "string", "title": "Id", "description": "ID of the integration"}, "blocklists": {"items": {"$ref": "#/components/schemas/BlocklistSubscription"}, "type": "array", "title": "Blocklists", "default": []}, "allowlists": {"items": {"$ref": "#/components/schemas/AllowlistSubscription"}, "type": "array", "title": "Allowlists", "default": []}, "cves": {"items": {"$ref": "#/components/schemas/CVEsubscription"}, "type": "array", "title": "Cves", "default": []}, "fingerprints": {"items": {"$ref": "#/components/schemas/FingerprintSubscription"}, "type": "array", "title": "Fingerprints", "default": []}, "name": {"type": "string", "title": "Name", "description": "Name of the integration"}, "updated_at": {"type": "string", "format": "date-time", "title": "Updated At", "description": "Last time the integration was updated"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Description", "description": "Description of the integration"}, "output_format": {"$ref": "#/components/schemas/OutputFormat", "description": "Output format of the integration"}, "last_pull": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Last Pull", "description": "Last time the integration pulled blocklists"}, "pull_limit": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Pull Limit", "description": "Maximum number of items to pull"}, "enable_ip_aggregation": {"type": "boolean", "title": "Enable Ip Aggregation", "description": "Whether to enable IP aggregation into ranges", "default": false}}, "type": "object", "required": ["organization_id", "entity_type", "name", "output_format"], "title": "IntegrationResponse"}, "IntervalOptions": {"type": "string", "enum": ["hour", "day", "week"], "title": "IntervalOptions"}, "Location": {"properties": {"country": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Country", "description": "Country code"}, "city": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "City", "description": "City name"}, "latitude": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Latitude", "description": "Latitude coordinate"}, "longitude": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Longitude", "description": "Longitude coordinate"}}, "type": "object", "title": "Location"}, "LookupImpactCVEItem": {"properties": {"id": {"type": "string", "title": "Id", "description": "ID of the CVE"}, "name": {"type": "string", "title": "Name", "description": "Name of the CVE"}, "title": {"type": "string", "title": "Title", "description": "Title of the CVE"}, "affected_components": {"items": {"$ref": "#/components/schemas/AffectedComponent"}, "type": "array", "title": "Affected Components", "description": "List of affected components"}, "crowdsec_score": {"type": "integer", "maximum": 10.0, "minimum": 0.0, "title": "Crowdsec Score", "description": "Live Exploit Tracker score of the CVE"}, "opportunity_score": {"type": "integer", "maximum": 5.0, "minimum": 0.0, "title": "Opportunity Score", "description": "Opportunity score indicating if it's an opportunistic(0) or targeted(5) attack (between 0-5)", "default": 0}, "momentum_score": {"type": "integer", "maximum": 5.0, "minimum": 0.0, "title": "Momentum Score", "description": "Momentum score indicating the vulnerability's trendiness based on signal comparison with the previous month. Higher scores (4-5) indicate significantly more signals this month than last month's average, while lower scores (0-1) indicate declining activity (between 0-5)", "default": 0}, "first_seen": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "First Seen", "description": "First seen date"}, "last_seen": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Last Seen", "description": "Last seen date"}, "nb_ips": {"type": "integer", "minimum": 0.0, "title": "Nb Ips", "description": "Number of unique IPs affected"}, "published_date": {"type": "string", "format": "date-time", "title": "Published Date", "description": "Published date of the CVE"}, "cvss_score": {"anyOf": [{"type": "number", "maximum": 10.0, "minimum": 0.0}, {"type": "null"}], "title": "Cvss Score", "description": "CVSS score of the CVE"}, "has_public_exploit": {"type": "boolean", "title": "Has Public Exploit", "description": "Indicates if there is a public exploit for the CVE"}, "rule_release_date": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Rule Release Date", "description": "Release date of the associated detection rule"}, "exploitation_phase": {"$ref": "#/components/schemas/ExploitationPhase", "description": "Current exploitation phase of the CVE"}, "adjustment_score": {"anyOf": [{"$ref": "#/components/schemas/AdjustmentScore"}, {"type": "null"}], "description": "Score adjustments applied to the CVE score based on various factors"}, "hype_score": {"type": "integer", "maximum": 5.0, "minimum": 0.0, "title": "Hype Score", "description": "Hype score (raw momentum component)", "default": 0}, "tags": {"items": {"type": "string"}, "type": "array", "title": "Tags", "description": "Tags associated with the CVE"}, "references": {"items": {"type": "string"}, "type": "array", "title": "References", "description": "List of references for the CVE"}, "description": {"type": "string", "title": "Description", "description": "Description of the CVE"}, "crowdsec_analysis": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Crowdsec Analysis", "description": "CrowdSec analysis of the CVE"}, "cwes": {"items": {"$ref": "#/components/schemas/CWE"}, "type": "array", "title": "Cwes", "description": "List of CWEs associated with the CVE"}, "events": {"items": {"$ref": "#/components/schemas/CVEEvent"}, "type": "array", "title": "Events", "description": "List of events related to the CVE"}, "type": {"type": "string", "const": "cve", "title": "Type", "description": "Resource type", "default": "cve"}}, "type": "object", "required": ["id", "name", "title", "affected_components", "crowdsec_score", "nb_ips", "published_date", "has_public_exploit", "exploitation_phase", "references", "description", "crowdsec_analysis", "cwes"], "title": "LookupImpactCVEItem"}, "LookupImpactFingerprintItem": {"properties": {"id": {"type": "string", "title": "Id", "description": "Fingerprint rule identifier"}, "name": {"type": "string", "title": "Name", "description": "Fingerprint rule name"}, "title": {"type": "string", "title": "Title", "description": "Fingerprint rule title"}, "affected_components": {"items": {"$ref": "#/components/schemas/AffectedComponent"}, "type": "array", "title": "Affected Components", "description": "List of affected components"}, "crowdsec_score": {"type": "integer", "maximum": 10.0, "minimum": 0.0, "title": "Crowdsec Score", "description": "Live Exploit Tracker score for the fingerprint rule"}, "opportunity_score": {"type": "integer", "maximum": 5.0, "minimum": 0.0, "title": "Opportunity Score", "description": "Opportunity score", "default": 0}, "momentum_score": {"type": "integer", "maximum": 5.0, "minimum": 0.0, "title": "Momentum Score", "description": "Momentum score", "default": 0}, "first_seen": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "First Seen", "description": "First seen date"}, "last_seen": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Last Seen", "description": "Last seen date"}, "nb_ips": {"type": "integer", "minimum": 0.0, "title": "Nb Ips", "description": "Number of unique IPs observed"}, "rule_release_date": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Rule Release Date", "description": "Release date of the fingerprint rule"}, "exploitation_phase": {"$ref": "#/components/schemas/ExploitationPhase", "description": "Current exploitation phase"}, "adjustment_score": {"anyOf": [{"$ref": "#/components/schemas/AdjustmentScore"}, {"type": "null"}], "description": "Score adjustment details"}, "hype_score": {"type": "integer", "maximum": 5.0, "minimum": 0.0, "title": "Hype Score", "description": "Hype score (raw momentum component)", "default": 0}, "tags": {"items": {"type": "string"}, "type": "array", "title": "Tags", "description": "Tags associated with the fingerprint rule"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Description", "description": "Fingerprint rule description"}, "references": {"items": {"type": "string"}, "type": "array", "title": "References", "description": "Reference links for the fingerprint rule"}, "crowdsec_analysis": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Crowdsec Analysis", "description": "CrowdSec analysis for this fingerprint rule"}, "events": {"items": {"$ref": "#/components/schemas/CVEEvent"}, "type": "array", "title": "Events", "description": "List of events related to the fingerprint rule"}, "type": {"type": "string", "const": "fingerprint", "title": "Type", "description": "Resource type", "default": "fingerprint"}}, "type": "object", "required": ["id", "name", "title", "affected_components", "crowdsec_score", "nb_ips", "exploitation_phase"], "title": "LookupImpactFingerprintItem"}, "LookupImpactResponsePage": {"properties": {"items": {"items": {"oneOf": [{"$ref": "#/components/schemas/LookupImpactCVEItem"}, {"$ref": "#/components/schemas/LookupImpactFingerprintItem"}], "discriminator": {"propertyName": "type", "mapping": {"cve": "#/components/schemas/LookupImpactCVEItem", "fingerprint": "#/components/schemas/LookupImpactFingerprintItem"}}}, "type": "array", "title": "Items"}, "total": {"type": "integer", "minimum": 0.0, "title": "Total"}, "page": {"type": "integer", "minimum": 1.0, "title": "Page"}, "size": {"type": "integer", "minimum": 1.0, "title": "Size"}, "pages": {"type": "integer", "minimum": 0.0, "title": "Pages"}, "links": {"$ref": "#/components/schemas/Links", "readOnly": true}}, "type": "object", "required": ["items", "total", "page", "size", "pages", "links"], "title": "LookupImpactResponsePage"}, "LookupListItem": {"properties": {"value": {"type": "string", "title": "Value", "description": "Lookup entry value"}}, "type": "object", "required": ["value"], "title": "LookupListItem"}, "LookupListResponsePage": {"properties": {"items": {"items": {"$ref": "#/components/schemas/LookupListItem"}, "type": "array", "title": "Items"}, "total": {"type": "integer", "minimum": 0.0, "title": "Total"}, "page": {"type": "integer", "minimum": 1.0, "title": "Page"}, "size": {"type": "integer", "minimum": 1.0, "title": "Size"}, "pages": {"type": "integer", "minimum": 0.0, "title": "Pages"}, "links": {"$ref": "#/components/schemas/Links", "readOnly": true}}, "type": "object", "required": ["items", "total", "page", "size", "pages", "links"], "title": "LookupListResponsePage"}, "MitreTechnique": {"properties": {"name": {"type": "string", "title": "Name", "description": "MITRE technique ID"}, "label": {"type": "string", "title": "Label", "description": "MITRE technique label"}, "description": {"type": "string", "title": "Description", "description": "MITRE technique description"}}, "type": "object", "required": ["name", "label", "description"], "title": "MitreTechnique"}, "Reference": {"properties": {"name": {"type": "string", "title": "Name", "description": "Reference name"}, "label": {"type": "string", "title": "Label", "description": "Reference label"}, "description": {"type": "string", "title": "Description", "description": "Reference description"}}, "type": "object", "required": ["name", "label", "description"], "title": "Reference"}, "ScoreBreakdown": {"properties": {"aggressiveness": {"type": "integer", "title": "Aggressiveness", "description": "Aggressiveness score"}, "threat": {"type": "integer", "title": "Threat", "description": "Threat score"}, "trust": {"type": "integer", "title": "Trust", "description": "Trust score"}, "anomaly": {"type": "integer", "title": "Anomaly", "description": "Anomaly score"}, "total": {"type": "integer", "title": "Total", "description": "Total score"}}, "type": "object", "required": ["aggressiveness", "threat", "trust", "anomaly", "total"], "title": "ScoreBreakdown"}, "Scores": {"properties": {"overall": {"$ref": "#/components/schemas/ScoreBreakdown", "description": "Overall scores"}, "last_day": {"$ref": "#/components/schemas/ScoreBreakdown", "description": "Last day scores"}, "last_week": {"$ref": "#/components/schemas/ScoreBreakdown", "description": "Last week scores"}, "last_month": {"$ref": "#/components/schemas/ScoreBreakdown", "description": "Last month scores"}}, "type": "object", "required": ["overall", "last_day", "last_week", "last_month"], "title": "Scores"}, "SinceOptions": {"type": "integer", "enum": [1, 7, 30], "title": "SinceOptions"}, "SubscribeCVEIntegrationRequest": {"properties": {"name": {"type": "string", "title": "Name", "description": "Name of the integration to subscribe"}}, "additionalProperties": false, "type": "object", "required": ["name"], "title": "SubscribeCVEIntegrationRequest"}, "SubscribeFingerprintIntegrationRequest": {"properties": {"name": {"type": "string", "title": "Name", "description": "Name of the integration to subscribe"}}, "additionalProperties": false, "type": "object", "required": ["name"], "title": "SubscribeFingerprintIntegrationRequest"}, "TimelineItem": {"properties": {"timestamp": {"type": "string", "format": "date-time", "title": "Timestamp", "description": "Timestamp of the timeline event"}, "count": {"type": "integer", "title": "Count", "description": "Count of occurrences at the timestamp"}}, "type": "object", "required": ["timestamp", "count"], "title": "TimelineItem"}}, "securitySchemes": {"ApiKeyAuth": {"type": "apiKey", "in": "header", "name": "x-api-key", "description": "If integration key is provided, can also work to get integration content"}, "BasicAuth": {"type": "http", "scheme": "basic", "description": "Basic Auth for integration content endpoint only"}}}, "security": [{"ApiKeyAuth": []}, {"BasicAuth": []}], "servers": [{"url": "https://admin.api.crowdsec.net/v1", "description": "Production server"}]} \ No newline at end of file +{ + "openapi": "3.1.0", + "info": { + "title": "LET API", + "description": "This is the API to manage Crowdsec Live Exploit Tracker service", + "version": "v0.15.22-dev80", + "contact": { + "name": "CrowdSec", + "url": "https://crowdsec.net", + "email": "info@crowdsec.net" + } + }, + "servers": [ + { + "url": "https://admin.api.crowdsec.net/v1", + "description": "Production server" + } + ], + "paths": { + "/cves": { + "get": { + "tags": [ + "Cves" + ], + "summary": "Get list of CVEs CrowdSec is tracking", + "description": "Get a paginated list of CVEs that CrowdSec is tracking", + "operationId": "getCves", + "parameters": [ + { + "name": "query", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Search query for CVEs", + "title": "Query" + }, + "description": "Search query for CVEs" + }, + { + "name": "sort_by", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/GetCVEsSortBy" + }, + { + "type": "null" + } + ], + "description": "Field to sort by", + "default": "rule_release_date", + "title": "Sort By" + }, + "description": "Field to sort by" + }, + { + "name": "sort_order", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/GetCVEsSortOrder" + }, + { + "type": "null" + } + ], + "description": "Sort order: ascending or descending", + "default": "desc", + "title": "Sort Order" + }, + "description": "Sort order: ascending or descending" + }, + { + "name": "exploitation_phase", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/CVEExploitationPhase" + }, + { + "type": "null" + } + ], + "description": "Filter by exploitation phase", + "title": "Exploitation Phase" + }, + "description": "Filter by exploitation phase" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetCVEsResponsePage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/cves/{cve_id}": { + "get": { + "tags": [ + "Cves" + ], + "summary": "Get CVE ID informations", + "description": "Get information about a specific CVE ID", + "operationId": "getCve", + "parameters": [ + { + "name": "cve_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Cve Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetCVEResponse" + } + } + } + }, + "404": { + "description": "CVE Not Found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/cves/{cve_id}/protect-rules": { + "get": { + "tags": [ + "Cves" + ], + "summary": "Get protection rules for a CVE ID", + "description": "Get protection/detection rules associated with a specific CVE ID", + "operationId": "getCveProtectRules", + "parameters": [ + { + "name": "cve_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Cve Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetCVEProtectRulesResponse" + } + } + } + }, + "404": { + "description": "CVE Not Found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/cves/{cve_id}/ips-download": { + "get": { + "tags": [ + "Cves" + ], + "summary": "Download IPs exploiting a CVE ID (raw)", + "description": "Download the list of IPs exploiting a specific CVE ID in raw format", + "operationId": "downloadCveIps", + "parameters": [ + { + "name": "cve_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Cve Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + }, + "404": { + "description": "CVE Not Found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/cves/{cve_id}/ips-details": { + "get": { + "tags": [ + "Cves" + ], + "summary": "Get IPs details exploiting a CVE ID", + "description": "Get detailed information about IPs exploiting a specific CVE ID", + "operationId": "getCveIpsDetails", + "parameters": [ + { + "name": "cve_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Cve Id" + } + }, + { + "name": "since", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "pattern": "^\\d+[hd]$" + }, + { + "type": "null" + } + ], + "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d", + "default": "14d", + "title": "Since" + }, + "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetCVEIPsResponsePage" + } + } + } + }, + "404": { + "description": "CVE Not Found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/cves/{cve_id}/ips-details-stats": { + "get": { + "tags": [ + "Cves" + ], + "summary": "Get stats about IPs exploiting a CVE ID", + "description": "Get aggregated statistics about IPs exploiting a specific CVE ID", + "operationId": "getCveIpsDetailsStats", + "parameters": [ + { + "name": "cve_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Cve Id" + } + }, + { + "name": "since", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "pattern": "^\\d+[hd]$" + }, + { + "type": "null" + } + ], + "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d", + "default": "14d", + "title": "Since" + }, + "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IpsDetailsStats" + } + } + } + }, + "404": { + "description": "CVE Not Found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/cves/{cve_id}/integrations": { + "post": { + "tags": [ + "Cves" + ], + "summary": "Subscribe an integration to a CVE ID", + "description": "Subscribe an integration to receive threats related to a specific CVE ID", + "operationId": "subscribeIntegrationToCve", + "parameters": [ + { + "name": "cve_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Cve Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SubscribeCVEIntegrationRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "Integration Not Found" + }, + "400": { + "description": "CVE Already Subscribed" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "Cves" + ], + "summary": "Get subscribed integrations for a CVE ID", + "description": "Get the list of integrations subscribed to a specific CVE ID", + "operationId": "getCveSubscribedIntegrations", + "parameters": [ + { + "name": "cve_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Cve Id" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetCVESubscribedIntegrationsResponsePage" + } + } + } + }, + "404": { + "description": "CVE Not Found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/cves/{cve_id}/integrations/{integration_name}": { + "delete": { + "tags": [ + "Cves" + ], + "summary": "Unsubscribe an integration from a CVE ID", + "description": "Unsubscribe an integration from receiving threats related to a specific CVE ID", + "operationId": "unsubscribeIntegrationFromCve", + "parameters": [ + { + "name": "cve_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Cve Id" + } + }, + { + "name": "integration_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Integration Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "Integration Not Found" + }, + "400": { + "description": "CVE Already Unsubscribed" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/cves/{cve_id}/timeline": { + "get": { + "tags": [ + "Cves" + ], + "summary": "Get timeline data for a CVE ID", + "description": "Get timeline data of occurrences for a specific CVE ID", + "operationId": "getCveTimeline", + "parameters": [ + { + "name": "cve_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Cve Id" + } + }, + { + "name": "since_days", + "in": "query", + "required": false, + "schema": { + "$ref": "#/components/schemas/SinceOptions", + "description": "Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days.", + "default": 7 + }, + "description": "Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TimelineItem" + }, + "title": "Response Getcvetimeline" + } + } + } + }, + "404": { + "description": "CVE Not Found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/vendors": { + "get": { + "tags": [ + "Vendors" + ], + "summary": "Get list of vendors", + "description": "Get a paginated list of vendors", + "operationId": "getVendors", + "parameters": [ + { + "name": "query", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Search query for vendors", + "title": "Query" + }, + "description": "Search query for vendors" + }, + { + "name": "sort_by", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/VendorSortBy" + }, + { + "type": "null" + } + ], + "description": "Sort by: value, nb_cves, nb_ips, latest_rule_release", + "title": "Sort By" + }, + "description": "Sort by: value, nb_cves, nb_ips, latest_rule_release" + }, + { + "name": "sort_order", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/GetCVEsSortOrder" + }, + { + "type": "null" + } + ], + "description": "Sort order: asc or desc", + "default": "desc", + "title": "Sort Order" + }, + "description": "Sort order: asc or desc" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LookupListWithStatsResponsePage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/vendors/{vendor}/stats": { + "get": { + "tags": [ + "Vendors" + ], + "summary": "Get vendor statistics", + "description": "Get statistics for a vendor including CVE/fingerprint counts, IP counts, and top affected products", + "operationId": "getVendorStats", + "parameters": [ + { + "name": "vendor", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Vendor" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VendorStatsResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/vendors/{vendor}/ips-download": { + "get": { + "tags": [ + "Vendors" + ], + "summary": "Download IPs exploiting a vendor (raw)", + "description": "Download the list of IPs exploiting a specific vendor in raw format", + "operationId": "downloadVendorIps", + "parameters": [ + { + "name": "vendor", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Vendor" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/vendors/{vendor}/ips-details": { + "get": { + "tags": [ + "Vendors" + ], + "summary": "Get IP details exploiting a vendor", + "description": "Get detailed information about IPs exploiting a specific vendor", + "operationId": "getVendorIpsDetails", + "parameters": [ + { + "name": "vendor", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Vendor" + } + }, + { + "name": "since", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "pattern": "^\\d+[hd]$" + }, + { + "type": "null" + } + ], + "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d", + "default": "14d", + "title": "Since" + }, + "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetVendorIPsResponsePage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/vendors/{vendor}/ips-details-stats": { + "get": { + "tags": [ + "Vendors" + ], + "summary": "Get stats about IPs exploiting a vendor", + "description": "Get aggregated statistics about IPs exploiting a specific vendor", + "operationId": "getVendorIpsDetailsStats", + "parameters": [ + { + "name": "vendor", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Vendor" + } + }, + { + "name": "since", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "pattern": "^\\d+[hd]$" + }, + { + "type": "null" + } + ], + "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d", + "default": "14d", + "title": "Since" + }, + "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IpsDetailsStats" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/vendors/{vendor}/integrations": { + "post": { + "tags": [ + "Vendors" + ], + "summary": "Subscribe an integration to a vendor", + "description": "Subscribe an integration to receive threats related to a specific vendor", + "operationId": "subscribeIntegrationToVendor", + "parameters": [ + { + "name": "vendor", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Vendor" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SubscribeVendorIntegrationRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "Vendors" + ], + "summary": "Get subscribed integrations for a vendor", + "description": "Get the list of integrations subscribed to a specific vendor", + "operationId": "getVendorSubscribedIntegrations", + "parameters": [ + { + "name": "vendor", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Vendor" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetVendorSubscribedIntegrationsResponsePage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/vendors/{vendor}/integrations/{integration_name}": { + "delete": { + "tags": [ + "Vendors" + ], + "summary": "Unsubscribe an integration from a vendor", + "description": "Unsubscribe an integration from receiving threats related to a specific vendor", + "operationId": "unsubscribeIntegrationFromVendor", + "parameters": [ + { + "name": "vendor", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Vendor" + } + }, + { + "name": "integration_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Integration Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/vendors/{vendor}": { + "get": { + "tags": [ + "Vendors" + ], + "summary": "Get vendor impact", + "description": "Get CVE and fingerprint rules affecting a vendor", + "operationId": "getVendorImpact", + "parameters": [ + { + "name": "vendor", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Vendor" + } + }, + { + "name": "sort_by", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/GetCVEsSortBy" + }, + { + "type": "null" + } + ], + "description": "Field to sort by", + "default": "rule_release_date", + "title": "Sort By" + }, + "description": "Field to sort by" + }, + { + "name": "sort_order", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/GetCVEsSortOrder" + }, + { + "type": "null" + } + ], + "description": "Sort order: ascending or descending", + "default": "desc", + "title": "Sort Order" + }, + "description": "Sort order: ascending or descending" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LookupImpactResponsePage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/products": { + "get": { + "tags": [ + "Products" + ], + "summary": "Get list of products", + "description": "Get a paginated list of products", + "operationId": "getProducts", + "parameters": [ + { + "name": "query", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Search query for products", + "title": "Query" + }, + "description": "Search query for products" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LookupListWithStatsResponsePage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/products/{product}": { + "get": { + "tags": [ + "Products" + ], + "summary": "Get product impact", + "description": "Get CVE and fingerprint rules affecting a product", + "operationId": "getProductImpact", + "parameters": [ + { + "name": "product", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Product" + } + }, + { + "name": "sort_by", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/GetCVEsSortBy" + }, + { + "type": "null" + } + ], + "description": "Field to sort by", + "default": "rule_release_date", + "title": "Sort By" + }, + "description": "Field to sort by" + }, + { + "name": "sort_order", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/GetCVEsSortOrder" + }, + { + "type": "null" + } + ], + "description": "Sort order: ascending or descending", + "default": "desc", + "title": "Sort Order" + }, + "description": "Sort order: ascending or descending" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LookupImpactResponsePage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/tags": { + "get": { + "tags": [ + "Tracker Tags" + ], + "summary": "Get list of tags", + "description": "Get a paginated list of tags", + "operationId": "getTags", + "parameters": [ + { + "name": "query", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Search query for tags", + "title": "Query" + }, + "description": "Search query for tags" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LookupListWithStatsResponsePage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/tags/{tag}": { + "get": { + "tags": [ + "Tracker Tags" + ], + "summary": "Get tag impact", + "description": "Get CVE and fingerprint rules affecting a tag", + "operationId": "getTagImpact", + "parameters": [ + { + "name": "tag", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Tag" + } + }, + { + "name": "sort_by", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/GetCVEsSortBy" + }, + { + "type": "null" + } + ], + "description": "Field to sort by", + "default": "rule_release_date", + "title": "Sort By" + }, + "description": "Field to sort by" + }, + { + "name": "sort_order", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/GetCVEsSortOrder" + }, + { + "type": "null" + } + ], + "description": "Sort order: ascending or descending", + "default": "desc", + "title": "Sort Order" + }, + "description": "Sort order: ascending or descending" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LookupImpactResponsePage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/tracker-tags": { + "get": { + "tags": [ + "Tracker Tags" + ], + "summary": "Get list of tracker tags", + "description": "Get a paginated list of tracker tags", + "operationId": "getTrackerTags", + "parameters": [ + { + "name": "query", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Search query for tags", + "title": "Query" + }, + "description": "Search query for tags" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LookupListWithStatsResponsePage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/tracker-tags/{tag}": { + "get": { + "tags": [ + "Tracker Tags" + ], + "summary": "Get tracker tag impact", + "description": "Get CVE and fingerprint rules affecting a tracker tag", + "operationId": "getTrackerTagImpact", + "parameters": [ + { + "name": "tag", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Tag" + } + }, + { + "name": "sort_by", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/GetCVEsSortBy" + }, + { + "type": "null" + } + ], + "description": "Field to sort by", + "default": "rule_release_date", + "title": "Sort By" + }, + "description": "Field to sort by" + }, + { + "name": "sort_order", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/GetCVEsSortOrder" + }, + { + "type": "null" + } + ], + "description": "Sort order: ascending or descending", + "default": "desc", + "title": "Sort Order" + }, + "description": "Sort order: ascending or descending" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LookupImpactResponsePage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/fingerprints": { + "get": { + "tags": [ + "Fingerprints" + ], + "summary": "Get list of fingerprint rules", + "description": "Get a paginated list of fingerprint rules", + "operationId": "getFingerprintRules", + "parameters": [ + { + "name": "query", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Search query for fingerprint rules", + "title": "Query" + }, + "description": "Search query for fingerprint rules" + }, + { + "name": "sort_by", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/GetCVEsSortBy" + }, + { + "type": "null" + } + ], + "description": "Field to sort by", + "default": "rule_release_date", + "title": "Sort By" + }, + "description": "Field to sort by" + }, + { + "name": "sort_order", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/GetCVEsSortOrder" + }, + { + "type": "null" + } + ], + "description": "Sort order: ascending or descending", + "default": "desc", + "title": "Sort Order" + }, + "description": "Sort order: ascending or descending" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetFingerprintRulesResponsePage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/fingerprints/{fingerprint}/ips-download": { + "get": { + "tags": [ + "Fingerprints" + ], + "summary": "Download IPs exploiting a fingerprint rule (raw)", + "description": "Download the list of IPs exploiting a specific fingerprint rule in raw format", + "operationId": "downloadFingerprintIps", + "parameters": [ + { + "name": "fingerprint", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Fingerprint" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/fingerprints/{fingerprint}/ips-details": { + "get": { + "tags": [ + "Fingerprints" + ], + "summary": "Get IP details exploiting a fingerprint rule", + "description": "Get detailed information about IPs exploiting a specific fingerprint rule", + "operationId": "getFingerprintIpsDetails", + "parameters": [ + { + "name": "fingerprint", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Fingerprint" + } + }, + { + "name": "since", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "pattern": "^\\d+[hd]$" + }, + { + "type": "null" + } + ], + "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d", + "default": "14d", + "title": "Since" + }, + "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetFingerprintIPsResponsePage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/fingerprints/{fingerprint}/ips-details-stats": { + "get": { + "tags": [ + "Fingerprints" + ], + "summary": "Get stats about IPs exploiting a fingerprint rule", + "description": "Get aggregated statistics about IPs exploiting a specific fingerprint rule", + "operationId": "getFingerprintIpsDetailsStats", + "parameters": [ + { + "name": "fingerprint", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Fingerprint" + } + }, + { + "name": "since", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "pattern": "^\\d+[hd]$" + }, + { + "type": "null" + } + ], + "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d", + "default": "14d", + "title": "Since" + }, + "description": "Filter IPs seen since this date, format duration (e.g., 7d, 24h), default to 14d" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IpsDetailsStats" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/fingerprints/{fingerprint}/integrations": { + "post": { + "tags": [ + "Fingerprints" + ], + "summary": "Subscribe an integration to a fingerprint rule", + "description": "Subscribe an integration to receive threats related to a specific fingerprint rule", + "operationId": "subscribeIntegrationToFingerprint", + "parameters": [ + { + "name": "fingerprint", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Fingerprint" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SubscribeFingerprintIntegrationRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "Fingerprints" + ], + "summary": "Get subscribed integrations for a fingerprint rule", + "description": "Get the list of integrations subscribed to a specific fingerprint rule", + "operationId": "getFingerprintSubscribedIntegrations", + "parameters": [ + { + "name": "fingerprint", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Fingerprint" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetFingerprintSubscribedIntegrationsResponsePage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/fingerprints/{fingerprint}/integrations/{integration_name}": { + "delete": { + "tags": [ + "Fingerprints" + ], + "summary": "Unsubscribe an integration from a fingerprint rule", + "description": "Unsubscribe an integration from receiving threats related to a specific fingerprint rule", + "operationId": "unsubscribeIntegrationFromFingerprint", + "parameters": [ + { + "name": "fingerprint", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Fingerprint" + } + }, + { + "name": "integration_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Integration Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/fingerprints/{fingerprint}/timeline": { + "get": { + "tags": [ + "Fingerprints" + ], + "summary": "Get timeline data for a fingerprint rule", + "description": "Get timeline data of occurrences for a specific fingerprint rule", + "operationId": "getFingerprintTimeline", + "parameters": [ + { + "name": "fingerprint", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Fingerprint" + } + }, + { + "name": "since_days", + "in": "query", + "required": false, + "schema": { + "$ref": "#/components/schemas/SinceOptions", + "description": "Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days.", + "default": 7 + }, + "description": "Time range for the timeline data (in days). Options: 1 (1 day), 7 (1 week), 30 (1 month). Default is 7 days." + }, + { + "name": "interval", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/IntervalOptions" + }, + { + "type": "null" + } + ], + "description": "Interval for aggregating timeline data. Options: 'hour', 'day', 'week'. Default is adapted based on 'since' parameter.", + "title": "Interval" + }, + "description": "Interval for aggregating timeline data. Options: 'hour', 'day', 'week'. Default is adapted based on 'since' parameter." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FingerprintTimelineItem" + }, + "title": "Response Getfingerprinttimeline" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/fingerprints/{fingerprint}": { + "get": { + "tags": [ + "Fingerprints" + ], + "summary": "Get fingerprint rule information", + "description": "Get information about a specific fingerprint rule", + "operationId": "getFingerprintRule", + "parameters": [ + { + "name": "fingerprint", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Fingerprint" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FingerprintRuleResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/tracker-events/exploitation-phase-change": { + "get": { + "tags": [ + "Tracker events" + ], + "summary": "Get exploitation phase change events", + "description": "Get a paginated list of exploitation phase change events across tracked CVEs", + "operationId": "getExploitationPhaseChangeEvents", + "parameters": [ + { + "name": "since", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "Duration string (e.g. '30d', '24h') to filter events", + "default": "30d", + "title": "Since" + }, + "description": "Duration string (e.g. '30d', '24h') to filter events" + }, + { + "name": "sort_order", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/GetCVEsSortOrder" + }, + { + "type": "null" + } + ], + "description": "Sort order: ascending or descending", + "default": "desc", + "title": "Sort Order" + }, + "description": "Sort order: ascending or descending" + }, + { + "name": "cve_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Filter by CVE identifier (exact match)", + "title": "Cve Id" + }, + "description": "Filter by CVE identifier (exact match)" + }, + { + "name": "previous_phase", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/CVEExploitationPhase" + }, + { + "type": "null" + } + ], + "description": "Filter by previous exploitation phase name", + "title": "Previous Phase" + }, + "description": "Filter by previous exploitation phase name" + }, + { + "name": "new_phase", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/CVEExploitationPhase" + }, + { + "type": "null" + } + ], + "description": "Filter by new exploitation phase name", + "title": "New Phase" + }, + "description": "Filter by new exploitation phase name" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExploitationPhaseChangeEventsResponsePage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/integrations": { + "post": { + "tags": [ + "Integrations" + ], + "summary": "Create Integration", + "description": "Create an integration to a firewall or remediation component, owned by your organization. The name should be unique within the organization. This operation is submitted to quotas.", + "operationId": "createIntegration", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationCreateRequest" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationCreateResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "Integrations" + ], + "summary": "Get Integrations", + "description": "Get integrations owned by your organization", + "operationId": "getIntegrations", + "parameters": [ + { + "name": "tag", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "List of tags associated with the integrations (any of)", + "title": "Tag" + }, + "description": "List of tags associated with the integrations (any of)" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number", + "default": 1, + "title": "Page" + }, + "description": "Page number" + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Page size", + "default": 50, + "title": "Size" + }, + "description": "Page size" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationGetResponsePage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/integrations/{integration_id}": { + "get": { + "tags": [ + "Integrations" + ], + "summary": "Get Integration", + "description": "Get an integration by ID", + "operationId": "getIntegration", + "parameters": [ + { + "name": "integration_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Integration Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationGetResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Integrations" + ], + "summary": "Update Integration", + "description": "Update the integration details", + "operationId": "updateIntegration", + "parameters": [ + { + "name": "integration_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Integration Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationUpdateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationUpdateResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Integrations" + ], + "summary": "Delete Integration", + "description": "Delete the integration by ID", + "operationId": "deleteIntegration", + "parameters": [ + { + "name": "integration_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Integration Id" + } + }, + { + "name": "force", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Force delete the integration even if it has active subscriptions (it will unsubscribe from all lists)", + "default": false, + "title": "Force" + }, + "description": "Force delete the integration even if it has active subscriptions (it will unsubscribe from all lists)" + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/integrations/{integration_id}/content": { + "head": { + "tags": [ + "Integrations" + ], + "summary": "Head Integration Content", + "description": "Check if the integration has content", + "operationId": "headIntegrationContent", + "parameters": [ + { + "name": "integration_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "ObjectId", + "examples": [ + "5f9d88b9e5c4f5b9a3d3e8b1" + ], + "title": "Integration Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "Integration not found" + }, + "204": { + "description": "Integration has no subscribed blocklists or no content available" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "Integrations" + ], + "summary": "Get Integration Content", + "description": "Get the ips associated to the integration in plain text format. The content can be paginated to accomodate limits in firewalls.", + "operationId": "getIntegrationContent", + "parameters": [ + { + "name": "integration_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "ObjectId", + "examples": [ + "5f9d88b9e5c4f5b9a3d3e8b1" + ], + "title": "Integration Id" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number to return", + "default": 1, + "title": "Page" + }, + "description": "Page number to return" + }, + { + "name": "page_size", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer", + "minimum": 10000 + }, + { + "type": "null" + } + ], + "description": "Maximum number of items to return, 0 means no limit (default), should be greater than 10000", + "title": "Page Size" + }, + "description": "Maximum number of items to return, 0 means no limit (default), should be greater than 10000" + }, + { + "name": "pull_limit", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Pull Limit" + } + }, + { + "name": "enable_ip_aggregation", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": false, + "title": "Enable Ip Aggregation" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + }, + "404": { + "description": "Integration not found" + }, + "204": { + "description": "Integration has no subscribed blocklists or no content available" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/integrations/{integration_id}/v1/decisions/stream": { + "get": { + "tags": [ + "Integrations" + ], + "summary": "Get Integration Content Stream", + "description": "Get the ips associated to the integration in a format compatible with a remediation component. As for the remediation components, you can fetch the full content with startup=true or only the changes since the last pull", + "operationId": "getIntegrationContentStream", + "parameters": [ + { + "name": "integration_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "ObjectId", + "examples": [ + "5f9d88b9e5c4f5b9a3d3e8b1" + ], + "title": "Integration Id" + } + }, + { + "name": "startup", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Set to true if it's the first run to fetch all the content, otherwise only changes since the last pull.", + "default": false, + "title": "Startup" + }, + "description": "Set to true if it's the first run to fetch all the content, otherwise only changes since the last pull." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "Integration not found" + }, + "204": { + "description": "Integration has no subscribed blocklists or no content available" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "AdjustmentScore": { + "properties": { + "total": { + "type": "integer", + "title": "Total", + "description": "Total score adjustment", + "default": 0 + }, + "recency": { + "type": "integer", + "title": "Recency", + "description": "Recency score adjustment", + "default": 0 + }, + "low_info": { + "type": "integer", + "title": "Low Info", + "description": "Low information score adjustment", + "default": 0 + } + }, + "type": "object", + "title": "AdjustmentScore" + }, + "AffectedComponent": { + "properties": { + "vendor": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Vendor", + "description": "Vendor of the affected component" + }, + "product": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Product", + "description": "Product name of the affected component" + } + }, + "type": "object", + "title": "AffectedComponent", + "description": "Affected Component in a CVE" + }, + "AllowlistSubscription": { + "properties": { + "id": { + "type": "string", + "title": "Id" + } + }, + "type": "object", + "required": [ + "id" + ], + "title": "AllowlistSubscription" + }, + "AttackDetail": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Attack detail name" + }, + "label": { + "type": "string", + "title": "Label", + "description": "Attack detail label" + }, + "description": { + "type": "string", + "title": "Description", + "description": "Attack detail description" + }, + "references": { + "items": { + "type": "string" + }, + "type": "array", + "title": "References", + "description": "Attack detail references" + } + }, + "type": "object", + "required": [ + "name", + "label", + "description" + ], + "title": "AttackDetail" + }, + "Behavior": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Behavior name" + }, + "label": { + "type": "string", + "title": "Label", + "description": "Behavior label" + }, + "description": { + "type": "string", + "title": "Description", + "description": "Behavior description" + } + }, + "type": "object", + "required": [ + "name", + "label", + "description" + ], + "title": "Behavior" + }, + "BlocklistSubscription": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "remediation": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Remediation" + } + }, + "type": "object", + "required": [ + "id" + ], + "title": "BlocklistSubscription" + }, + "CVEEventOutput": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "date": { + "type": "string", + "title": "Date" + }, + "description": { + "type": "string", + "title": "Description" + }, + "label": { + "type": "string", + "title": "Label" + }, + "sorting_priority": { + "type": "integer", + "title": "Sorting Priority" + } + }, + "type": "object", + "required": [ + "name", + "date", + "description", + "label", + "sorting_priority" + ], + "title": "CVEEventOutput" + }, + "CVEExploitationPhase": { + "type": "string", + "enum": [ + "insufficient_data", + "early_exploitation", + "fresh_and_popular", + "targeted_exploitation", + "mass_exploitation", + "background_noise", + "unpopular", + "wearing_out", + "unclassified" + ], + "title": "CVEExploitationPhase" + }, + "CVEResponseBase": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "ID of the CVE" + }, + "name": { + "type": "string", + "title": "Name", + "description": "Name of the CVE" + }, + "title": { + "type": "string", + "title": "Title", + "description": "Title of the CVE" + }, + "affected_components": { + "items": { + "$ref": "#/components/schemas/AffectedComponent" + }, + "type": "array", + "title": "Affected Components", + "description": "List of affected components" + }, + "crowdsec_score": { + "type": "integer", + "maximum": 10.0, + "minimum": 0.0, + "title": "Crowdsec Score", + "description": "Live Exploit Tracker score of the CVE" + }, + "opportunity_score": { + "type": "integer", + "maximum": 5.0, + "minimum": 0.0, + "title": "Opportunity Score", + "description": "Opportunity score indicating if it's an opportunistic(0) or targeted(5) attack (between 0-5)", + "default": 0 + }, + "momentum_score": { + "type": "integer", + "maximum": 5.0, + "minimum": 0.0, + "title": "Momentum Score", + "description": "Momentum score indicating the vulnerability's trendiness based on signal comparison with the previous month. Higher scores (4-5) indicate significantly more signals this month than last month's average, while lower scores (0-1) indicate declining activity (between 0-5)", + "default": 0 + }, + "first_seen": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "First Seen", + "description": "First seen date" + }, + "last_seen": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Seen", + "description": "Last seen date" + }, + "nb_ips": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Ips", + "description": "Number of unique IPs affected" + }, + "published_date": { + "type": "string", + "format": "date-time", + "title": "Published Date", + "description": "Published date of the CVE" + }, + "cvss_score": { + "anyOf": [ + { + "type": "number", + "maximum": 10.0, + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Cvss Score", + "description": "CVSS score of the CVE" + }, + "has_public_exploit": { + "type": "boolean", + "title": "Has Public Exploit", + "description": "Indicates if there is a public exploit for the CVE" + }, + "rule_release_date": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Rule Release Date", + "description": "Release date of the associated detection rule" + }, + "exploitation_phase": { + "$ref": "#/components/schemas/ExploitationPhase", + "description": "Current exploitation phase of the CVE" + }, + "adjustment_score": { + "anyOf": [ + { + "$ref": "#/components/schemas/AdjustmentScore" + }, + { + "type": "null" + } + ], + "description": "Score adjustments applied to the CVE score based on various factors" + }, + "threat_context": { + "anyOf": [ + { + "$ref": "#/components/schemas/ThreatContext" + }, + { + "type": "null" + } + ], + "description": "Threat context (attacker/defender countries, industries, objectives)" + } + }, + "type": "object", + "required": [ + "id", + "name", + "title", + "affected_components", + "crowdsec_score", + "nb_ips", + "published_date", + "has_public_exploit", + "exploitation_phase" + ], + "title": "CVEResponseBase", + "description": "GET CVE ID Response" + }, + "CVEsubscription": { + "properties": { + "id": { + "type": "string", + "title": "Id" + } + }, + "type": "object", + "required": [ + "id" + ], + "title": "CVEsubscription" + }, + "CWE": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of the CWE" + }, + "label": { + "type": "string", + "title": "Label", + "description": "Label of the CWE" + }, + "description": { + "type": "string", + "title": "Description", + "description": "Description of the CWE" + } + }, + "type": "object", + "required": [ + "name", + "label", + "description" + ], + "title": "CWE", + "description": "CWE Information" + }, + "Classification": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Classification name" + }, + "label": { + "type": "string", + "title": "Label", + "description": "Classification label" + }, + "description": { + "type": "string", + "title": "Description", + "description": "Classification description" + } + }, + "type": "object", + "required": [ + "name", + "label", + "description" + ], + "title": "Classification" + }, + "Classifications": { + "properties": { + "false_positives": { + "items": { + "$ref": "#/components/schemas/Classification" + }, + "type": "array", + "title": "False Positives", + "description": "False positive classifications" + }, + "classifications": { + "items": { + "$ref": "#/components/schemas/Classification" + }, + "type": "array", + "title": "Classifications", + "description": "Main classifications" + } + }, + "type": "object", + "title": "Classifications" + }, + "EntityType": { + "type": "string", + "enum": [ + "org", + "tag", + "engine", + "firewall_integration", + "remediation_component_integration", + "remediation_component", + "log_processor" + ], + "title": "EntityType" + }, + "ExploitationPhase": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of the exploitation phase" + }, + "label": { + "type": "string", + "title": "Label", + "description": "Label of the exploitation phase" + }, + "description": { + "type": "string", + "title": "Description", + "description": "Description of the exploitation phase" + } + }, + "type": "object", + "required": [ + "name", + "label", + "description" + ], + "title": "ExploitationPhase" + }, + "ExploitationPhaseChangeEventItem": { + "properties": { + "cve_id": { + "type": "string", + "title": "Cve Id", + "description": "CVE identifier" + }, + "name": { + "type": "string", + "title": "Name", + "description": "Event type name" + }, + "date": { + "type": "string", + "title": "Date", + "description": "Date of the phase change" + }, + "label": { + "type": "string", + "title": "Label", + "description": "Human-readable event label" + }, + "description": { + "type": "string", + "title": "Description", + "description": "Rendered event description" + }, + "previous_phase": { + "type": "string", + "title": "Previous Phase", + "description": "Previous exploitation phase label" + }, + "new_phase": { + "type": "string", + "title": "New Phase", + "description": "New exploitation phase label" + } + }, + "type": "object", + "required": [ + "cve_id", + "name", + "date", + "label", + "description", + "previous_phase", + "new_phase" + ], + "title": "ExploitationPhaseChangeEventItem" + }, + "ExploitationPhaseChangeEventsResponsePage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/ExploitationPhaseChangeEventItem" + }, + "type": "array", + "title": "Items" + }, + "total": { + "type": "integer", + "minimum": 0.0, + "title": "Total" + }, + "page": { + "type": "integer", + "minimum": 1.0, + "title": "Page" + }, + "size": { + "type": "integer", + "minimum": 1.0, + "title": "Size" + }, + "pages": { + "type": "integer", + "minimum": 0.0, + "title": "Pages" + }, + "links": { + "$ref": "#/components/schemas/Links", + "readOnly": true + } + }, + "type": "object", + "required": [ + "items", + "total", + "page", + "size", + "pages", + "links" + ], + "title": "ExploitationPhaseChangeEventsResponsePage" + }, + "FacetBucket": { + "properties": { + "value": { + "type": "string", + "title": "Value", + "description": "Facet value" + }, + "count": { + "type": "integer", + "minimum": 0.0, + "title": "Count", + "description": "Number of IPs matching this value" + } + }, + "type": "object", + "required": [ + "value", + "count" + ], + "title": "FacetBucket" + }, + "FingerprintEventOutput": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "date": { + "type": "string", + "title": "Date" + }, + "description": { + "type": "string", + "title": "Description" + }, + "label": { + "type": "string", + "title": "Label" + } + }, + "type": "object", + "required": [ + "name", + "date", + "description", + "label" + ], + "title": "FingerprintEventOutput" + }, + "FingerprintRuleResponse": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Fingerprint rule identifier" + }, + "name": { + "type": "string", + "title": "Name", + "description": "Fingerprint rule name" + }, + "title": { + "type": "string", + "title": "Title", + "description": "Fingerprint rule title" + }, + "affected_components": { + "items": { + "$ref": "#/components/schemas/AffectedComponent" + }, + "type": "array", + "title": "Affected Components", + "description": "List of affected components" + }, + "crowdsec_score": { + "type": "integer", + "maximum": 10.0, + "minimum": 0.0, + "title": "Crowdsec Score", + "description": "Live Exploit Tracker score for the fingerprint rule" + }, + "opportunity_score": { + "type": "integer", + "maximum": 5.0, + "minimum": 0.0, + "title": "Opportunity Score", + "description": "Opportunity score", + "default": 0 + }, + "momentum_score": { + "type": "integer", + "maximum": 5.0, + "minimum": 0.0, + "title": "Momentum Score", + "description": "Momentum score", + "default": 0 + }, + "first_seen": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "First Seen", + "description": "First seen date" + }, + "last_seen": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Seen", + "description": "Last seen date" + }, + "nb_ips": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Ips", + "description": "Number of unique IPs observed" + }, + "rule_release_date": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Rule Release Date", + "description": "Release date of the fingerprint rule" + }, + "exploitation_phase": { + "$ref": "#/components/schemas/ExploitationPhase", + "description": "Current exploitation phase" + }, + "adjustment_score": { + "anyOf": [ + { + "$ref": "#/components/schemas/AdjustmentScore" + }, + { + "type": "null" + } + ], + "description": "Score adjustment details" + }, + "threat_context": { + "anyOf": [ + { + "$ref": "#/components/schemas/ThreatContext" + }, + { + "type": "null" + } + ], + "description": "Threat context (attacker/defender countries, industries, objectives)" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Tags", + "description": "Tags associated with the fingerprint rule" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "Fingerprint rule description" + }, + "references": { + "items": { + "type": "string" + }, + "type": "array", + "title": "References", + "description": "Reference links for the fingerprint rule" + }, + "crowdsec_analysis": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Crowdsec Analysis", + "description": "CrowdSec analysis for this fingerprint rule" + }, + "events": { + "items": { + "$ref": "#/components/schemas/FingerprintEventOutput" + }, + "type": "array", + "title": "Events", + "description": "List of events related to the fingerprint rule" + } + }, + "type": "object", + "required": [ + "id", + "name", + "title", + "affected_components", + "crowdsec_score", + "nb_ips", + "exploitation_phase" + ], + "title": "FingerprintRuleResponse" + }, + "FingerprintRuleSummary": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Fingerprint rule identifier" + }, + "name": { + "type": "string", + "title": "Name", + "description": "Fingerprint rule name" + }, + "title": { + "type": "string", + "title": "Title", + "description": "Fingerprint rule title" + }, + "affected_components": { + "items": { + "$ref": "#/components/schemas/AffectedComponent" + }, + "type": "array", + "title": "Affected Components", + "description": "List of affected components" + }, + "crowdsec_score": { + "type": "integer", + "maximum": 10.0, + "minimum": 0.0, + "title": "Crowdsec Score", + "description": "Live Exploit Tracker score for the fingerprint rule" + }, + "opportunity_score": { + "type": "integer", + "maximum": 5.0, + "minimum": 0.0, + "title": "Opportunity Score", + "description": "Opportunity score", + "default": 0 + }, + "momentum_score": { + "type": "integer", + "maximum": 5.0, + "minimum": 0.0, + "title": "Momentum Score", + "description": "Momentum score", + "default": 0 + }, + "first_seen": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "First Seen", + "description": "First seen date" + }, + "last_seen": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Seen", + "description": "Last seen date" + }, + "nb_ips": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Ips", + "description": "Number of unique IPs observed" + }, + "rule_release_date": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Rule Release Date", + "description": "Release date of the fingerprint rule" + }, + "exploitation_phase": { + "$ref": "#/components/schemas/ExploitationPhase", + "description": "Current exploitation phase" + }, + "adjustment_score": { + "anyOf": [ + { + "$ref": "#/components/schemas/AdjustmentScore" + }, + { + "type": "null" + } + ], + "description": "Score adjustment details" + }, + "threat_context": { + "anyOf": [ + { + "$ref": "#/components/schemas/ThreatContext" + }, + { + "type": "null" + } + ], + "description": "Threat context (attacker/defender countries, industries, objectives)" + } + }, + "type": "object", + "required": [ + "id", + "name", + "title", + "affected_components", + "crowdsec_score", + "nb_ips", + "exploitation_phase" + ], + "title": "FingerprintRuleSummary" + }, + "FingerprintSubscription": { + "properties": { + "id": { + "type": "string", + "title": "Id" + } + }, + "type": "object", + "required": [ + "id" + ], + "title": "FingerprintSubscription" + }, + "FingerprintTimelineItem": { + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "title": "Timestamp", + "description": "Timestamp of the timeline event" + }, + "count": { + "type": "integer", + "title": "Count", + "description": "Count of occurrences at the timestamp" + } + }, + "type": "object", + "required": [ + "timestamp", + "count" + ], + "title": "FingerprintTimelineItem" + }, + "GetCVEIPsResponsePage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/IPItem" + }, + "type": "array", + "title": "Items" + }, + "total": { + "type": "integer", + "minimum": 0.0, + "title": "Total" + }, + "page": { + "type": "integer", + "minimum": 1.0, + "title": "Page" + }, + "size": { + "type": "integer", + "minimum": 1.0, + "title": "Size" + }, + "pages": { + "type": "integer", + "minimum": 0.0, + "title": "Pages" + }, + "links": { + "$ref": "#/components/schemas/Links", + "readOnly": true + } + }, + "type": "object", + "required": [ + "items", + "total", + "page", + "size", + "pages", + "links" + ], + "title": "GetCVEIPsResponsePage" + }, + "GetCVEProtectRulesResponse": { + "properties": { + "protect_rules": { + "items": { + "$ref": "#/components/schemas/ProtectRule" + }, + "type": "array", + "title": "Protect Rules", + "description": "Protection/detection rules associated with the CVE" + } + }, + "type": "object", + "title": "GetCVEProtectRulesResponse", + "description": "Response for the protect rules endpoint." + }, + "GetCVEResponse": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "ID of the CVE" + }, + "name": { + "type": "string", + "title": "Name", + "description": "Name of the CVE" + }, + "title": { + "type": "string", + "title": "Title", + "description": "Title of the CVE" + }, + "affected_components": { + "items": { + "$ref": "#/components/schemas/AffectedComponent" + }, + "type": "array", + "title": "Affected Components", + "description": "List of affected components" + }, + "crowdsec_score": { + "type": "integer", + "maximum": 10.0, + "minimum": 0.0, + "title": "Crowdsec Score", + "description": "Live Exploit Tracker score of the CVE" + }, + "opportunity_score": { + "type": "integer", + "maximum": 5.0, + "minimum": 0.0, + "title": "Opportunity Score", + "description": "Opportunity score indicating if it's an opportunistic(0) or targeted(5) attack (between 0-5)", + "default": 0 + }, + "momentum_score": { + "type": "integer", + "maximum": 5.0, + "minimum": 0.0, + "title": "Momentum Score", + "description": "Momentum score indicating the vulnerability's trendiness based on signal comparison with the previous month. Higher scores (4-5) indicate significantly more signals this month than last month's average, while lower scores (0-1) indicate declining activity (between 0-5)", + "default": 0 + }, + "first_seen": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "First Seen", + "description": "First seen date" + }, + "last_seen": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Seen", + "description": "Last seen date" + }, + "nb_ips": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Ips", + "description": "Number of unique IPs affected" + }, + "published_date": { + "type": "string", + "format": "date-time", + "title": "Published Date", + "description": "Published date of the CVE" + }, + "cvss_score": { + "anyOf": [ + { + "type": "number", + "maximum": 10.0, + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Cvss Score", + "description": "CVSS score of the CVE" + }, + "has_public_exploit": { + "type": "boolean", + "title": "Has Public Exploit", + "description": "Indicates if there is a public exploit for the CVE" + }, + "rule_release_date": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Rule Release Date", + "description": "Release date of the associated detection rule" + }, + "exploitation_phase": { + "$ref": "#/components/schemas/ExploitationPhase", + "description": "Current exploitation phase of the CVE" + }, + "adjustment_score": { + "anyOf": [ + { + "$ref": "#/components/schemas/AdjustmentScore" + }, + { + "type": "null" + } + ], + "description": "Score adjustments applied to the CVE score based on various factors" + }, + "threat_context": { + "anyOf": [ + { + "$ref": "#/components/schemas/ThreatContext" + }, + { + "type": "null" + } + ], + "description": "Threat context (attacker/defender countries, industries, objectives)" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Tags", + "description": "Tags associated with the CVE" + }, + "references": { + "items": { + "type": "string" + }, + "type": "array", + "title": "References", + "description": "List of references for the CVE" + }, + "description": { + "type": "string", + "title": "Description", + "description": "Description of the CVE" + }, + "crowdsec_analysis": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Crowdsec Analysis", + "description": "CrowdSec analysis of the CVE" + }, + "cwes": { + "items": { + "$ref": "#/components/schemas/CWE" + }, + "type": "array", + "title": "Cwes", + "description": "List of CWEs associated with the CVE" + }, + "events": { + "items": { + "$ref": "#/components/schemas/CVEEventOutput" + }, + "type": "array", + "title": "Events", + "description": "List of events related to the CVE" + } + }, + "type": "object", + "required": [ + "id", + "name", + "title", + "affected_components", + "crowdsec_score", + "nb_ips", + "published_date", + "has_public_exploit", + "exploitation_phase", + "references", + "description", + "crowdsec_analysis", + "cwes" + ], + "title": "GetCVEResponse" + }, + "GetCVESubscribedIntegrationsResponsePage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/IntegrationResponse" + }, + "type": "array", + "title": "Items" + }, + "total": { + "type": "integer", + "minimum": 0.0, + "title": "Total" + }, + "page": { + "type": "integer", + "minimum": 1.0, + "title": "Page" + }, + "size": { + "type": "integer", + "minimum": 1.0, + "title": "Size" + }, + "pages": { + "type": "integer", + "minimum": 0.0, + "title": "Pages" + }, + "links": { + "$ref": "#/components/schemas/Links", + "readOnly": true + } + }, + "type": "object", + "required": [ + "items", + "total", + "page", + "size", + "pages", + "links" + ], + "title": "GetCVESubscribedIntegrationsResponsePage" + }, + "GetCVEsResponsePage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/CVEResponseBase" + }, + "type": "array", + "title": "Items" + }, + "total": { + "type": "integer", + "minimum": 0.0, + "title": "Total" + }, + "page": { + "type": "integer", + "minimum": 1.0, + "title": "Page" + }, + "size": { + "type": "integer", + "minimum": 1.0, + "title": "Size" + }, + "pages": { + "type": "integer", + "minimum": 0.0, + "title": "Pages" + }, + "links": { + "$ref": "#/components/schemas/Links", + "readOnly": true + } + }, + "type": "object", + "required": [ + "items", + "total", + "page", + "size", + "pages", + "links" + ], + "title": "GetCVEsResponsePage" + }, + "GetCVEsSortBy": { + "type": "string", + "enum": [ + "rule_release_date", + "trending", + "nb_ips", + "name", + "first_seen" + ], + "title": "GetCVEsSortBy" + }, + "GetCVEsSortOrder": { + "type": "string", + "enum": [ + "asc", + "desc" + ], + "title": "GetCVEsSortOrder" + }, + "GetFingerprintIPsResponsePage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/IPItem" + }, + "type": "array", + "title": "Items" + }, + "total": { + "type": "integer", + "minimum": 0.0, + "title": "Total" + }, + "page": { + "type": "integer", + "minimum": 1.0, + "title": "Page" + }, + "size": { + "type": "integer", + "minimum": 1.0, + "title": "Size" + }, + "pages": { + "type": "integer", + "minimum": 0.0, + "title": "Pages" + }, + "links": { + "$ref": "#/components/schemas/Links", + "readOnly": true + } + }, + "type": "object", + "required": [ + "items", + "total", + "page", + "size", + "pages", + "links" + ], + "title": "GetFingerprintIPsResponsePage" + }, + "GetFingerprintRulesResponsePage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/FingerprintRuleSummary" + }, + "type": "array", + "title": "Items" + }, + "total": { + "type": "integer", + "minimum": 0.0, + "title": "Total" + }, + "page": { + "type": "integer", + "minimum": 1.0, + "title": "Page" + }, + "size": { + "type": "integer", + "minimum": 1.0, + "title": "Size" + }, + "pages": { + "type": "integer", + "minimum": 0.0, + "title": "Pages" + }, + "links": { + "$ref": "#/components/schemas/Links", + "readOnly": true + } + }, + "type": "object", + "required": [ + "items", + "total", + "page", + "size", + "pages", + "links" + ], + "title": "GetFingerprintRulesResponsePage" + }, + "GetFingerprintSubscribedIntegrationsResponsePage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/IntegrationResponse" + }, + "type": "array", + "title": "Items" + }, + "total": { + "type": "integer", + "minimum": 0.0, + "title": "Total" + }, + "page": { + "type": "integer", + "minimum": 1.0, + "title": "Page" + }, + "size": { + "type": "integer", + "minimum": 1.0, + "title": "Size" + }, + "pages": { + "type": "integer", + "minimum": 0.0, + "title": "Pages" + }, + "links": { + "$ref": "#/components/schemas/Links", + "readOnly": true + } + }, + "type": "object", + "required": [ + "items", + "total", + "page", + "size", + "pages", + "links" + ], + "title": "GetFingerprintSubscribedIntegrationsResponsePage" + }, + "GetVendorIPsResponsePage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/IPItem" + }, + "type": "array", + "title": "Items" + }, + "total": { + "type": "integer", + "minimum": 0.0, + "title": "Total" + }, + "page": { + "type": "integer", + "minimum": 1.0, + "title": "Page" + }, + "size": { + "type": "integer", + "minimum": 1.0, + "title": "Size" + }, + "pages": { + "type": "integer", + "minimum": 0.0, + "title": "Pages" + }, + "links": { + "$ref": "#/components/schemas/Links", + "readOnly": true + } + }, + "type": "object", + "required": [ + "items", + "total", + "page", + "size", + "pages", + "links" + ], + "title": "GetVendorIPsResponsePage" + }, + "GetVendorSubscribedIntegrationsResponsePage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/IntegrationResponse" + }, + "type": "array", + "title": "Items" + }, + "total": { + "type": "integer", + "minimum": 0.0, + "title": "Total" + }, + "page": { + "type": "integer", + "minimum": 1.0, + "title": "Page" + }, + "size": { + "type": "integer", + "minimum": 1.0, + "title": "Size" + }, + "pages": { + "type": "integer", + "minimum": 0.0, + "title": "Pages" + }, + "links": { + "$ref": "#/components/schemas/Links", + "readOnly": true + } + }, + "type": "object", + "required": [ + "items", + "total", + "page", + "size", + "pages", + "links" + ], + "title": "GetVendorSubscribedIntegrationsResponsePage" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "History": { + "properties": { + "first_seen": { + "type": "string", + "format": "date-time", + "title": "First Seen", + "description": "First seen timestamp" + }, + "last_seen": { + "type": "string", + "format": "date-time", + "title": "Last Seen", + "description": "Last seen timestamp" + }, + "full_age": { + "type": "integer", + "title": "Full Age", + "description": "Full age in days" + }, + "days_age": { + "type": "integer", + "title": "Days Age", + "description": "Days age" + } + }, + "type": "object", + "required": [ + "first_seen", + "last_seen", + "full_age", + "days_age" + ], + "title": "History" + }, + "IPItem": { + "properties": { + "ip": { + "type": "string", + "title": "Ip", + "description": "IP address" + }, + "reputation": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reputation", + "description": "Reputation of the IP" + }, + "ip_range": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Ip Range", + "description": "IP range" + }, + "ip_range_score": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Ip Range Score", + "description": "IP range score" + }, + "ip_range_24": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Ip Range 24", + "description": "IP range /24" + }, + "ip_range_24_reputation": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Ip Range 24 Reputation", + "description": "IP range /24 reputation" + }, + "ip_range_24_score": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Ip Range 24 Score", + "description": "IP range /24 score" + }, + "as_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "As Name", + "description": "AS name" + }, + "as_num": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "As Num", + "description": "AS number" + }, + "background_noise_score": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Background Noise Score", + "description": "Background noise score" + }, + "background_noise": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Background Noise", + "description": "Background noise level" + }, + "confidence": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Confidence", + "description": "Confidence level" + }, + "location": { + "anyOf": [ + { + "$ref": "#/components/schemas/Location" + }, + { + "type": "null" + } + ], + "description": "IP location information" + }, + "reverse_dns": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reverse Dns", + "description": "Reverse DNS" + }, + "behaviors": { + "items": { + "$ref": "#/components/schemas/Behavior" + }, + "type": "array", + "title": "Behaviors", + "description": "List of behaviors" + }, + "references": { + "items": { + "$ref": "#/components/schemas/Reference" + }, + "type": "array", + "title": "References", + "description": "List of references" + }, + "history": { + "anyOf": [ + { + "$ref": "#/components/schemas/History" + }, + { + "type": "null" + } + ], + "description": "Historical data" + }, + "classifications": { + "anyOf": [ + { + "$ref": "#/components/schemas/Classifications" + }, + { + "type": "null" + } + ], + "description": "Classification data" + }, + "mitre_techniques": { + "items": { + "$ref": "#/components/schemas/MitreTechnique" + }, + "type": "array", + "title": "Mitre Techniques", + "description": "MITRE techniques" + }, + "cves": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Cves", + "description": "List of CVEs" + }, + "attack_details": { + "items": { + "$ref": "#/components/schemas/AttackDetail" + }, + "type": "array", + "title": "Attack Details", + "description": "Attack details" + }, + "target_countries": { + "additionalProperties": { + "type": "integer" + }, + "type": "object", + "title": "Target Countries", + "description": "Target countries" + }, + "scores": { + "anyOf": [ + { + "$ref": "#/components/schemas/Scores" + }, + { + "type": "null" + } + ], + "description": "Scoring information" + } + }, + "type": "object", + "required": [ + "ip" + ], + "title": "IPItem" + }, + "IntegrationResponse": { + "properties": { + "tags": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Tags", + "default": [] + }, + "organization_id": { + "type": "string", + "title": "Organization Id" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At", + "description": "Time the integration was created" + }, + "entity_type": { + "$ref": "#/components/schemas/EntityType", + "description": "Type of the integration" + }, + "id": { + "type": "string", + "title": "Id", + "description": "ID of the integration" + }, + "blocklists": { + "items": { + "$ref": "#/components/schemas/BlocklistSubscription" + }, + "type": "array", + "title": "Blocklists", + "default": [] + }, + "allowlists": { + "items": { + "$ref": "#/components/schemas/AllowlistSubscription" + }, + "type": "array", + "title": "Allowlists", + "default": [] + }, + "cves": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/CVEsubscription" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Cves" + }, + "fingerprints": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/FingerprintSubscription" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Fingerprints" + }, + "vendors": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/VendorSubscription" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Vendors" + }, + "name": { + "type": "string", + "title": "Name", + "description": "Name of the integration" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "title": "Updated At", + "description": "Last time the integration was updated" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "Description of the integration" + }, + "output_format": { + "$ref": "#/components/schemas/OutputFormat", + "description": "Output format of the integration" + }, + "last_pull": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Pull", + "description": "Last time the integration pulled blocklists" + }, + "pull_limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Pull Limit", + "description": "Maximum number of items to pull" + }, + "enable_ip_aggregation": { + "type": "boolean", + "title": "Enable Ip Aggregation", + "description": "Whether to enable IP aggregation into ranges", + "default": false + } + }, + "type": "object", + "required": [ + "organization_id", + "entity_type", + "name", + "output_format" + ], + "title": "IntegrationResponse" + }, + "IntervalOptions": { + "type": "string", + "enum": [ + "hour", + "day", + "week" + ], + "title": "IntervalOptions" + }, + "IpsDetailsStats": { + "properties": { + "total": { + "type": "integer", + "minimum": 0.0, + "title": "Total", + "description": "Total number of matching IPs" + }, + "reputation": { + "items": { + "$ref": "#/components/schemas/FacetBucket" + }, + "type": "array", + "title": "Reputation", + "description": "IP count by reputation" + }, + "country": { + "items": { + "$ref": "#/components/schemas/FacetBucket" + }, + "type": "array", + "title": "Country", + "description": "IP count by country (top 5)" + }, + "as_name": { + "items": { + "$ref": "#/components/schemas/FacetBucket" + }, + "type": "array", + "title": "As Name", + "description": "IP count by AS name (top 5)" + }, + "cves": { + "items": { + "$ref": "#/components/schemas/FacetBucket" + }, + "type": "array", + "title": "Cves", + "description": "IP count by CVE (top 5)" + }, + "classifications": { + "items": { + "$ref": "#/components/schemas/FacetBucket" + }, + "type": "array", + "title": "Classifications", + "description": "IP count by classification (top 5)" + } + }, + "type": "object", + "required": [ + "total", + "reputation", + "country", + "as_name", + "cves", + "classifications" + ], + "title": "IpsDetailsStats" + }, + "Links": { + "properties": { + "first": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "First", + "examples": [ + "/api/v1/users?limit=1&offset1" + ] + }, + "last": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Last", + "examples": [ + "/api/v1/users?limit=1&offset1" + ] + }, + "self": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Self", + "examples": [ + "/api/v1/users?limit=1&offset1" + ] + }, + "next": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next", + "examples": [ + "/api/v1/users?limit=1&offset1" + ] + }, + "prev": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Prev", + "examples": [ + "/api/v1/users?limit=1&offset1" + ] + } + }, + "type": "object", + "title": "Links" + }, + "Location": { + "properties": { + "country": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Country", + "description": "Country code" + }, + "city": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "City", + "description": "City name" + }, + "latitude": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Latitude", + "description": "Latitude coordinate" + }, + "longitude": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Longitude", + "description": "Longitude coordinate" + } + }, + "type": "object", + "title": "Location" + }, + "LookupImpactCVEItem": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "ID of the CVE" + }, + "name": { + "type": "string", + "title": "Name", + "description": "Name of the CVE" + }, + "title": { + "type": "string", + "title": "Title", + "description": "Title of the CVE" + }, + "affected_components": { + "items": { + "$ref": "#/components/schemas/AffectedComponent" + }, + "type": "array", + "title": "Affected Components", + "description": "List of affected components" + }, + "crowdsec_score": { + "type": "integer", + "maximum": 10.0, + "minimum": 0.0, + "title": "Crowdsec Score", + "description": "Live Exploit Tracker score of the CVE" + }, + "opportunity_score": { + "type": "integer", + "maximum": 5.0, + "minimum": 0.0, + "title": "Opportunity Score", + "description": "Opportunity score indicating if it's an opportunistic(0) or targeted(5) attack (between 0-5)", + "default": 0 + }, + "momentum_score": { + "type": "integer", + "maximum": 5.0, + "minimum": 0.0, + "title": "Momentum Score", + "description": "Momentum score indicating the vulnerability's trendiness based on signal comparison with the previous month. Higher scores (4-5) indicate significantly more signals this month than last month's average, while lower scores (0-1) indicate declining activity (between 0-5)", + "default": 0 + }, + "first_seen": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "First Seen", + "description": "First seen date" + }, + "last_seen": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Seen", + "description": "Last seen date" + }, + "nb_ips": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Ips", + "description": "Number of unique IPs affected" + }, + "published_date": { + "type": "string", + "format": "date-time", + "title": "Published Date", + "description": "Published date of the CVE" + }, + "cvss_score": { + "anyOf": [ + { + "type": "number", + "maximum": 10.0, + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Cvss Score", + "description": "CVSS score of the CVE" + }, + "has_public_exploit": { + "type": "boolean", + "title": "Has Public Exploit", + "description": "Indicates if there is a public exploit for the CVE" + }, + "rule_release_date": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Rule Release Date", + "description": "Release date of the associated detection rule" + }, + "exploitation_phase": { + "$ref": "#/components/schemas/ExploitationPhase", + "description": "Current exploitation phase of the CVE" + }, + "adjustment_score": { + "anyOf": [ + { + "$ref": "#/components/schemas/AdjustmentScore" + }, + { + "type": "null" + } + ], + "description": "Score adjustments applied to the CVE score based on various factors" + }, + "threat_context": { + "anyOf": [ + { + "$ref": "#/components/schemas/ThreatContext" + }, + { + "type": "null" + } + ], + "description": "Threat context (attacker/defender countries, industries, objectives)" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Tags", + "description": "Tags associated with the CVE" + }, + "references": { + "items": { + "type": "string" + }, + "type": "array", + "title": "References", + "description": "List of references for the CVE" + }, + "description": { + "type": "string", + "title": "Description", + "description": "Description of the CVE" + }, + "crowdsec_analysis": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Crowdsec Analysis", + "description": "CrowdSec analysis of the CVE" + }, + "cwes": { + "items": { + "$ref": "#/components/schemas/CWE" + }, + "type": "array", + "title": "Cwes", + "description": "List of CWEs associated with the CVE" + }, + "events": { + "items": { + "$ref": "#/components/schemas/CVEEventOutput" + }, + "type": "array", + "title": "Events", + "description": "List of events related to the CVE" + }, + "type": { + "type": "string", + "const": "cve", + "title": "Type", + "description": "Resource type", + "default": "cve" + } + }, + "type": "object", + "required": [ + "id", + "name", + "title", + "affected_components", + "crowdsec_score", + "nb_ips", + "published_date", + "has_public_exploit", + "exploitation_phase", + "references", + "description", + "crowdsec_analysis", + "cwes" + ], + "title": "LookupImpactCVEItem" + }, + "LookupImpactFingerprintItem": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Fingerprint rule identifier" + }, + "name": { + "type": "string", + "title": "Name", + "description": "Fingerprint rule name" + }, + "title": { + "type": "string", + "title": "Title", + "description": "Fingerprint rule title" + }, + "affected_components": { + "items": { + "$ref": "#/components/schemas/AffectedComponent" + }, + "type": "array", + "title": "Affected Components", + "description": "List of affected components" + }, + "crowdsec_score": { + "type": "integer", + "maximum": 10.0, + "minimum": 0.0, + "title": "Crowdsec Score", + "description": "Live Exploit Tracker score for the fingerprint rule" + }, + "opportunity_score": { + "type": "integer", + "maximum": 5.0, + "minimum": 0.0, + "title": "Opportunity Score", + "description": "Opportunity score", + "default": 0 + }, + "momentum_score": { + "type": "integer", + "maximum": 5.0, + "minimum": 0.0, + "title": "Momentum Score", + "description": "Momentum score", + "default": 0 + }, + "first_seen": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "First Seen", + "description": "First seen date" + }, + "last_seen": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Seen", + "description": "Last seen date" + }, + "nb_ips": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Ips", + "description": "Number of unique IPs observed" + }, + "rule_release_date": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Rule Release Date", + "description": "Release date of the fingerprint rule" + }, + "exploitation_phase": { + "$ref": "#/components/schemas/ExploitationPhase", + "description": "Current exploitation phase" + }, + "adjustment_score": { + "anyOf": [ + { + "$ref": "#/components/schemas/AdjustmentScore" + }, + { + "type": "null" + } + ], + "description": "Score adjustment details" + }, + "threat_context": { + "anyOf": [ + { + "$ref": "#/components/schemas/ThreatContext" + }, + { + "type": "null" + } + ], + "description": "Threat context (attacker/defender countries, industries, objectives)" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Tags", + "description": "Tags associated with the fingerprint rule" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "Fingerprint rule description" + }, + "references": { + "items": { + "type": "string" + }, + "type": "array", + "title": "References", + "description": "Reference links for the fingerprint rule" + }, + "crowdsec_analysis": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Crowdsec Analysis", + "description": "CrowdSec analysis for this fingerprint rule" + }, + "events": { + "items": { + "$ref": "#/components/schemas/FingerprintEventOutput" + }, + "type": "array", + "title": "Events", + "description": "List of events related to the fingerprint rule" + }, + "type": { + "type": "string", + "const": "fingerprint", + "title": "Type", + "description": "Resource type", + "default": "fingerprint" + } + }, + "type": "object", + "required": [ + "id", + "name", + "title", + "affected_components", + "crowdsec_score", + "nb_ips", + "exploitation_phase" + ], + "title": "LookupImpactFingerprintItem" + }, + "LookupImpactResponsePage": { + "properties": { + "items": { + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/LookupImpactCVEItem" + }, + { + "$ref": "#/components/schemas/LookupImpactFingerprintItem" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "cve": "#/components/schemas/LookupImpactCVEItem", + "fingerprint": "#/components/schemas/LookupImpactFingerprintItem" + } + } + }, + "type": "array", + "title": "Items" + }, + "total": { + "type": "integer", + "minimum": 0.0, + "title": "Total" + }, + "page": { + "type": "integer", + "minimum": 1.0, + "title": "Page" + }, + "size": { + "type": "integer", + "minimum": 1.0, + "title": "Size" + }, + "pages": { + "type": "integer", + "minimum": 0.0, + "title": "Pages" + }, + "links": { + "$ref": "#/components/schemas/Links", + "readOnly": true + } + }, + "type": "object", + "required": [ + "items", + "total", + "page", + "size", + "pages", + "links" + ], + "title": "LookupImpactResponsePage" + }, + "LookupListItemWithStats": { + "properties": { + "value": { + "type": "string", + "title": "Value", + "description": "Lookup entry value" + }, + "nb_cves": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Cves", + "description": "Number of CVEs", + "default": 0 + }, + "nb_fingerprints": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Fingerprints", + "description": "Number of fingerprint rules", + "default": 0 + }, + "nb_ips": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Ips", + "description": "Total number of unique IPs targeting this entry", + "default": 0 + }, + "nb_ips_cves": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Ips Cves", + "description": "Number of IPs across CVEs", + "default": 0 + }, + "nb_ips_fingerprints": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Ips Fingerprints", + "description": "Number of IPs across fingerprint rules", + "default": 0 + }, + "latest_rule_release": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Latest Rule Release", + "description": "Most recent rule release date for this entry" + } + }, + "type": "object", + "required": [ + "value" + ], + "title": "LookupListItemWithStats" + }, + "LookupListWithStatsResponsePage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/LookupListItemWithStats" + }, + "type": "array", + "title": "Items" + }, + "total": { + "type": "integer", + "minimum": 0.0, + "title": "Total" + }, + "page": { + "type": "integer", + "minimum": 1.0, + "title": "Page" + }, + "size": { + "type": "integer", + "minimum": 1.0, + "title": "Size" + }, + "pages": { + "type": "integer", + "minimum": 0.0, + "title": "Pages" + }, + "links": { + "$ref": "#/components/schemas/Links", + "readOnly": true + } + }, + "type": "object", + "required": [ + "items", + "total", + "page", + "size", + "pages", + "links" + ], + "title": "LookupListWithStatsResponsePage" + }, + "MitreTechnique": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "MITRE technique ID" + }, + "label": { + "type": "string", + "title": "Label", + "description": "MITRE technique label" + }, + "description": { + "type": "string", + "title": "Description", + "description": "MITRE technique description" + } + }, + "type": "object", + "required": [ + "name", + "label", + "description" + ], + "title": "MitreTechnique" + }, + "OutputFormat": { + "type": "string", + "enum": [ + "plain_text", + "f5", + "remediation_component", + "fortigate", + "paloalto", + "checkpoint", + "cisco", + "juniper", + "mikrotik", + "pfsense", + "opnsense", + "sophos" + ], + "title": "OutputFormat" + }, + "ProtectRule": { + "properties": { + "link": { + "type": "string", + "title": "Link", + "description": "URL to the rule source" + }, + "published_date": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Published Date", + "description": "Date the rule was published" + }, + "tags": { + "items": { + "$ref": "#/components/schemas/ProtectRuleTag" + }, + "type": "array", + "title": "Tags", + "description": "Tags associated with the rule" + }, + "name": { + "type": "string", + "title": "Name", + "description": "Rule name" + }, + "label": { + "type": "string", + "title": "Label", + "description": "Human-readable rule label" + }, + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Content", + "description": "Rule content/definition" + } + }, + "type": "object", + "required": [ + "link", + "name", + "label" + ], + "title": "ProtectRule", + "description": "A protection/detection rule reference from vuln_scores." + }, + "ProtectRuleTag": { + "properties": { + "tag": { + "type": "string", + "title": "Tag", + "description": "Tag identifier" + }, + "label": { + "type": "string", + "title": "Label", + "description": "Human-readable tag label" + } + }, + "type": "object", + "required": [ + "tag", + "label" + ], + "title": "ProtectRuleTag", + "description": "A tag on a protect rule reference." + }, + "Reference": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Reference name" + }, + "label": { + "type": "string", + "title": "Label", + "description": "Reference label" + }, + "description": { + "type": "string", + "title": "Description", + "description": "Reference description" + } + }, + "type": "object", + "required": [ + "name", + "label", + "description" + ], + "title": "Reference" + }, + "ScoreBreakdown": { + "properties": { + "aggressiveness": { + "type": "integer", + "title": "Aggressiveness", + "description": "Aggressiveness score" + }, + "threat": { + "type": "integer", + "title": "Threat", + "description": "Threat score" + }, + "trust": { + "type": "integer", + "title": "Trust", + "description": "Trust score" + }, + "anomaly": { + "type": "integer", + "title": "Anomaly", + "description": "Anomaly score" + }, + "total": { + "type": "integer", + "title": "Total", + "description": "Total score" + } + }, + "type": "object", + "required": [ + "aggressiveness", + "threat", + "trust", + "anomaly", + "total" + ], + "title": "ScoreBreakdown" + }, + "Scores": { + "properties": { + "overall": { + "$ref": "#/components/schemas/ScoreBreakdown", + "description": "Overall scores" + }, + "last_day": { + "$ref": "#/components/schemas/ScoreBreakdown", + "description": "Last day scores" + }, + "last_week": { + "$ref": "#/components/schemas/ScoreBreakdown", + "description": "Last week scores" + }, + "last_month": { + "$ref": "#/components/schemas/ScoreBreakdown", + "description": "Last month scores" + } + }, + "type": "object", + "required": [ + "overall", + "last_day", + "last_week", + "last_month" + ], + "title": "Scores" + }, + "SinceOptions": { + "type": "integer", + "enum": [ + 1, + 7, + 30 + ], + "title": "SinceOptions" + }, + "SubscribeCVEIntegrationRequest": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of the integration to subscribe" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "name" + ], + "title": "SubscribeCVEIntegrationRequest" + }, + "SubscribeFingerprintIntegrationRequest": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of the integration to subscribe" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "name" + ], + "title": "SubscribeFingerprintIntegrationRequest" + }, + "SubscribeVendorIntegrationRequest": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of the integration to subscribe" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "name" + ], + "title": "SubscribeVendorIntegrationRequest" + }, + "ThreatContext": { + "properties": { + "attacker_countries": { + "additionalProperties": { + "type": "integer" + }, + "type": "object", + "title": "Attacker Countries", + "description": "Attacker country distribution (country code \u2192 count)" + }, + "defender_countries": { + "additionalProperties": { + "type": "integer" + }, + "type": "object", + "title": "Defender Countries", + "description": "Defender country distribution (country code \u2192 count)" + }, + "industry_types": { + "additionalProperties": { + "type": "integer" + }, + "type": "object", + "title": "Industry Types", + "description": "Industry type distribution (type \u2192 count)" + }, + "industry_risk_profiles": { + "additionalProperties": { + "type": "integer" + }, + "type": "object", + "title": "Industry Risk Profiles", + "description": "Industry risk profile distribution (profile \u2192 count)" + }, + "attacker_objectives": { + "additionalProperties": { + "type": "integer" + }, + "type": "object", + "title": "Attacker Objectives", + "description": "Attacker objective distribution (objective \u2192 count)" + } + }, + "type": "object", + "title": "ThreatContext" + }, + "TimelineItem": { + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "title": "Timestamp", + "description": "Timestamp of the timeline event" + }, + "count": { + "type": "integer", + "title": "Count", + "description": "Count of occurrences at the timestamp" + } + }, + "type": "object", + "required": [ + "timestamp", + "count" + ], + "title": "TimelineItem" + }, + "TopProductItem": { + "properties": { + "value": { + "type": "string", + "title": "Value", + "description": "Product name" + }, + "nb_ips_cves": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Ips Cves", + "description": "Number of IPs across CVEs", + "default": 0 + }, + "nb_ips_fingerprints": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Ips Fingerprints", + "description": "Number of IPs across fingerprint rules", + "default": 0 + } + }, + "type": "object", + "required": [ + "value" + ], + "title": "TopProductItem" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + }, + "VendorSortBy": { + "type": "string", + "enum": [ + "value", + "nb_cves", + "nb_ips", + "latest_rule_release" + ], + "title": "VendorSortBy" + }, + "VendorStatsResponse": { + "properties": { + "value": { + "type": "string", + "title": "Value", + "description": "Vendor name" + }, + "nb_cves": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Cves", + "description": "Number of CVEs", + "default": 0 + }, + "nb_fingerprints": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Fingerprints", + "description": "Number of fingerprint rules", + "default": 0 + }, + "nb_ips": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Ips", + "description": "Total number of unique IPs targeting this vendor", + "default": 0 + }, + "nb_ips_cves": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Ips Cves", + "description": "Number of IPs across CVEs", + "default": 0 + }, + "nb_ips_fingerprints": { + "type": "integer", + "minimum": 0.0, + "title": "Nb Ips Fingerprints", + "description": "Number of IPs across fingerprint rules", + "default": 0 + }, + "top_products": { + "items": { + "$ref": "#/components/schemas/TopProductItem" + }, + "type": "array", + "title": "Top Products", + "description": "Top products for this vendor sorted by total IPs descending" + } + }, + "type": "object", + "required": [ + "value" + ], + "title": "VendorStatsResponse" + }, + "VendorSubscription": { + "properties": { + "id": { + "type": "string", + "title": "Id" + } + }, + "type": "object", + "required": [ + "id" + ], + "title": "VendorSubscription" + }, + "ApiKeyCredentials": { + "properties": { + "api_key": { + "type": "string", + "title": "Api Key", + "description": "API key for the integration" + } + }, + "type": "object", + "required": [ + "api_key" + ], + "title": "ApiKeyCredentials" + }, + "BasicAuthCredentials": { + "properties": { + "username": { + "type": "string", + "title": "Username", + "description": "Basic auth username for the integration" + }, + "password": { + "type": "string", + "title": "Password", + "description": "Basic auth password for the integration" + } + }, + "type": "object", + "required": [ + "username", + "password" + ], + "title": "BasicAuthCredentials" + }, + "CVESubscription": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "CVE ID" + } + }, + "type": "object", + "required": [ + "id" + ], + "title": "CVESubscription" + }, + "IntegrationCreateRequest": { + "properties": { + "name": { + "type": "string", + "minLength": 1, + "title": "Name", + "description": "Name of the integration" + }, + "description": { + "type": "string", + "minLength": 1, + "title": "Description", + "description": "Description of the integration" + }, + "entity_type": { + "$ref": "#/components/schemas/IntegrationType", + "description": "Type of the integration" + }, + "output_format": { + "$ref": "#/components/schemas/OutputFormat", + "description": "Output format of the integration" + }, + "pull_limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Pull Limit", + "description": "Maximum number of items to pull" + }, + "enable_ip_aggregation": { + "type": "boolean", + "title": "Enable Ip Aggregation", + "description": "Whether to enable IP aggregation into ranges", + "default": false + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "name", + "entity_type", + "output_format" + ], + "title": "IntegrationCreateRequest" + }, + "IntegrationCreateResponse": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "ID of the integration" + }, + "name": { + "type": "string", + "title": "Name", + "description": "Name of the integration. Should be unique within the organization" + }, + "organization_id": { + "type": "string", + "title": "Organization Id", + "description": "ID of the owner organization" + }, + "description": { + "type": "string", + "title": "Description", + "description": "Description of the integration" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At", + "description": "Time the integration was created" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "title": "Updated At", + "description": "Last time the integration was updated" + }, + "entity_type": { + "$ref": "#/components/schemas/IntegrationType", + "description": "Type of the integration" + }, + "output_format": { + "$ref": "#/components/schemas/OutputFormat", + "description": "Output format of the integration" + }, + "last_pull": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Pull", + "description": "Last time the integration pulled blocklists" + }, + "blocklists": { + "items": { + "$ref": "#/components/schemas/BlocklistSubscription" + }, + "type": "array", + "title": "Blocklists", + "description": "Blocklists that are subscribed by the integration" + }, + "cves": { + "items": { + "$ref": "#/components/schemas/CVESubscription" + }, + "type": "array", + "title": "Cves", + "description": "CVEs that are subscribed by the integration" + }, + "fingerprints": { + "items": { + "$ref": "#/components/schemas/FingerprintSubscription" + }, + "type": "array", + "title": "Fingerprints", + "description": "Fingerprints that are subscribed by the integration" + }, + "vendors": { + "items": { + "$ref": "#/components/schemas/VendorSubscription" + }, + "type": "array", + "title": "Vendors", + "description": "Vendors that are subscribed by the integration" + }, + "endpoint": { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri", + "title": "Endpoint", + "description": "Url that should be used by the firewall or the remediation component to fetch the integration's content" + }, + "stats": { + "$ref": "#/components/schemas/Stats", + "description": "Stats of the integration", + "default": { + "count": 0 + } + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Tags", + "description": "Tags associated with the integration", + "default": [] + }, + "pull_limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Pull Limit", + "description": "Maximum number of items to pull" + }, + "enable_ip_aggregation": { + "type": "boolean", + "title": "Enable Ip Aggregation", + "description": "Whether to enable IP aggregation into ranges", + "default": false + }, + "credentials": { + "anyOf": [ + { + "$ref": "#/components/schemas/ApiKeyCredentials" + }, + { + "$ref": "#/components/schemas/BasicAuthCredentials" + } + ], + "title": "Credentials", + "description": "Credentials that were generated for the integration" + } + }, + "type": "object", + "required": [ + "id", + "name", + "organization_id", + "created_at", + "updated_at", + "entity_type", + "output_format", + "blocklists", + "cves", + "fingerprints", + "vendors", + "endpoint", + "credentials" + ], + "title": "IntegrationCreateResponse" + }, + "IntegrationGetResponse": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "ID of the integration" + }, + "name": { + "type": "string", + "title": "Name", + "description": "Name of the integration. Should be unique within the organization" + }, + "organization_id": { + "type": "string", + "title": "Organization Id", + "description": "ID of the owner organization" + }, + "description": { + "type": "string", + "title": "Description", + "description": "Description of the integration" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At", + "description": "Time the integration was created" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "title": "Updated At", + "description": "Last time the integration was updated" + }, + "entity_type": { + "$ref": "#/components/schemas/IntegrationType", + "description": "Type of the integration" + }, + "output_format": { + "$ref": "#/components/schemas/OutputFormat", + "description": "Output format of the integration" + }, + "last_pull": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Pull", + "description": "Last time the integration pulled blocklists" + }, + "blocklists": { + "items": { + "$ref": "#/components/schemas/BlocklistSubscription" + }, + "type": "array", + "title": "Blocklists", + "description": "Blocklists that are subscribed by the integration" + }, + "cves": { + "items": { + "$ref": "#/components/schemas/CVESubscription" + }, + "type": "array", + "title": "Cves", + "description": "CVEs that are subscribed by the integration" + }, + "fingerprints": { + "items": { + "$ref": "#/components/schemas/FingerprintSubscription" + }, + "type": "array", + "title": "Fingerprints", + "description": "Fingerprints that are subscribed by the integration" + }, + "vendors": { + "items": { + "$ref": "#/components/schemas/VendorSubscription" + }, + "type": "array", + "title": "Vendors", + "description": "Vendors that are subscribed by the integration" + }, + "endpoint": { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri", + "title": "Endpoint", + "description": "Url that should be used by the firewall or the remediation component to fetch the integration's content" + }, + "stats": { + "$ref": "#/components/schemas/Stats", + "description": "Stats of the integration", + "default": { + "count": 0 + } + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Tags", + "description": "Tags associated with the integration", + "default": [] + }, + "pull_limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Pull Limit", + "description": "Maximum number of items to pull" + }, + "enable_ip_aggregation": { + "type": "boolean", + "title": "Enable Ip Aggregation", + "description": "Whether to enable IP aggregation into ranges", + "default": false + } + }, + "type": "object", + "required": [ + "id", + "name", + "organization_id", + "created_at", + "updated_at", + "entity_type", + "output_format", + "blocklists", + "cves", + "fingerprints", + "vendors", + "endpoint" + ], + "title": "IntegrationGetResponse" + }, + "IntegrationGetResponsePage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/IntegrationGetResponse" + }, + "type": "array", + "title": "Items" + }, + "total": { + "type": "integer", + "minimum": 0.0, + "title": "Total" + }, + "page": { + "type": "integer", + "minimum": 1.0, + "title": "Page" + }, + "size": { + "type": "integer", + "minimum": 1.0, + "title": "Size" + }, + "pages": { + "type": "integer", + "minimum": 0.0, + "title": "Pages" + }, + "links": { + "$ref": "#/components/schemas/Links", + "readOnly": true + } + }, + "type": "object", + "required": [ + "items", + "total", + "page", + "size", + "pages", + "links" + ], + "title": "IntegrationGetResponsePage" + }, + "IntegrationType": { + "type": "string", + "enum": [ + "firewall_integration", + "remediation_component_integration" + ], + "title": "IntegrationType" + }, + "IntegrationUpdateRequest": { + "properties": { + "name": { + "type": "string", + "minLength": 1, + "title": "Name", + "description": "New name" + }, + "description": { + "type": "string", + "minLength": 1, + "title": "Description", + "description": "New description" + }, + "output_format": { + "$ref": "#/components/schemas/OutputFormat", + "description": "New output format" + }, + "regenerate_credentials": { + "type": "boolean", + "title": "Regenerate Credentials", + "description": "Regenerate credentials for the integration" + }, + "pull_limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Pull Limit", + "description": "Maximum number of items to pull" + }, + "enable_ip_aggregation": { + "type": "boolean", + "title": "Enable Ip Aggregation", + "description": "Whether to enable IP aggregation into ranges", + "default": false + } + }, + "additionalProperties": false, + "type": "object", + "title": "IntegrationUpdateRequest" + }, + "IntegrationUpdateResponse": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "ID of the integration" + }, + "name": { + "type": "string", + "title": "Name", + "description": "Name of the integration. Should be unique within the organization" + }, + "organization_id": { + "type": "string", + "title": "Organization Id", + "description": "ID of the owner organization" + }, + "description": { + "type": "string", + "title": "Description", + "description": "Description of the integration" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At", + "description": "Time the integration was created" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "title": "Updated At", + "description": "Last time the integration was updated" + }, + "entity_type": { + "$ref": "#/components/schemas/IntegrationType", + "description": "Type of the integration" + }, + "output_format": { + "$ref": "#/components/schemas/OutputFormat", + "description": "Output format of the integration" + }, + "last_pull": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Pull", + "description": "Last time the integration pulled blocklists" + }, + "blocklists": { + "items": { + "$ref": "#/components/schemas/BlocklistSubscription" + }, + "type": "array", + "title": "Blocklists", + "description": "Blocklists that are subscribed by the integration" + }, + "cves": { + "items": { + "$ref": "#/components/schemas/CVESubscription" + }, + "type": "array", + "title": "Cves", + "description": "CVEs that are subscribed by the integration" + }, + "fingerprints": { + "items": { + "$ref": "#/components/schemas/FingerprintSubscription" + }, + "type": "array", + "title": "Fingerprints", + "description": "Fingerprints that are subscribed by the integration" + }, + "vendors": { + "items": { + "$ref": "#/components/schemas/VendorSubscription" + }, + "type": "array", + "title": "Vendors", + "description": "Vendors that are subscribed by the integration" + }, + "endpoint": { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri", + "title": "Endpoint", + "description": "Url that should be used by the firewall or the remediation component to fetch the integration's content" + }, + "stats": { + "$ref": "#/components/schemas/Stats", + "description": "Stats of the integration", + "default": { + "count": 0 + } + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Tags", + "description": "Tags associated with the integration", + "default": [] + }, + "pull_limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Pull Limit", + "description": "Maximum number of items to pull" + }, + "enable_ip_aggregation": { + "type": "boolean", + "title": "Enable Ip Aggregation", + "description": "Whether to enable IP aggregation into ranges", + "default": false + }, + "credentials": { + "anyOf": [ + { + "$ref": "#/components/schemas/ApiKeyCredentials" + }, + { + "$ref": "#/components/schemas/BasicAuthCredentials" + }, + { + "type": "null" + } + ], + "title": "Credentials", + "description": "Credentials for the integration" + } + }, + "type": "object", + "required": [ + "id", + "name", + "organization_id", + "created_at", + "updated_at", + "entity_type", + "output_format", + "blocklists", + "cves", + "fingerprints", + "vendors", + "endpoint" + ], + "title": "IntegrationUpdateResponse" + }, + "Stats": { + "properties": { + "count": { + "type": "integer", + "title": "Count", + "description": "Number of total blocklists items the integration will pull" + } + }, + "type": "object", + "required": [ + "count" + ], + "title": "Stats" + } + }, + "securitySchemes": { + "ApiKeyAuth": { + "type": "apiKey", + "in": "header", + "name": "x-api-key", + "description": "If integration key is provided, can also work to get integration content" + }, + "BasicAuth": { + "type": "http", + "scheme": "basic", + "description": "Basic Auth for integration content endpoint only" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BasicAuth": [] + } + ] +} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index f3f7494..147fe22 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "crowdsec_tracker_api" -version = "1.108.1" +version = "v0.15.22-dev80" license = { text = "MIT" } authors = [ { name="crowdsec", email="info@crowdsec.net" } diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..6465825 --- /dev/null +++ b/uv.lock @@ -0,0 +1,332 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, +] + +[[package]] +name = "botocore" +version = "1.42.86" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jmespath" }, + { name = "python-dateutil" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/8c/a99259dbd8734e5e3f57cf223e225457e9c6be3821e6310519df2d362234/botocore-1.42.86.tar.gz", hash = "sha256:baa49e93b4c92d63e0c8288026ee1ef8de83f182743127cc9175504440a48e49", size = 15176910, upload-time = "2026-04-09T01:00:34.636Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/63/af7dda21ea68b8f85013e3f253c48435cacf07e41face86032d217df82a2/botocore-1.42.86-py3-none-any.whl", hash = "sha256:443387337864e069f7e4e885ccdc81592725b5598ca966514af3e9776bce0bfe", size = 14857738, upload-time = "2026-04-09T01:00:30.166Z" }, +] + +[[package]] +name = "certifi" +version = "2026.2.25" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, +] + +[[package]] +name = "crowdsec-tracker-api" +version = "0.15.22.dev80" +source = { editable = "." } +dependencies = [ + { name = "botocore" }, + { name = "httpx" }, + { name = "pydantic", extra = ["email", "timezone"] }, +] + +[package.metadata] +requires-dist = [ + { name = "botocore" }, + { name = "httpx", specifier = "==0.27.0" }, + { name = "pydantic", extras = ["email", "timezone"], specifier = ">=2.5.0,<3.0.0" }, +] + +[[package]] +name = "dnspython" +version = "2.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", size = 368251, upload-time = "2025-09-07T18:58:00.022Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" }, +] + +[[package]] +name = "email-validator" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", size = 51238, upload-time = "2025-08-26T13:09:06.831Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", size = 35604, upload-time = "2025-08-26T13:09:05.858Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, + { name = "sniffio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/3da5bdf4408b8b2800061c339f240c1802f2e82d55e50bd39c5a881f47f0/httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5", size = 126413, upload-time = "2024-02-21T13:07:52.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/7b/ddacf6dcebb42466abd03f368782142baa82e08fc0c1f8eaa05b4bae87d5/httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5", size = 75590, upload-time = "2024-02-21T13:07:50.455Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "jmespath" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/59/322338183ecda247fb5d1763a6cbe46eff7222eaeebafd9fa65d4bf5cb11/jmespath-1.1.0.tar.gz", hash = "sha256:472c87d80f36026ae83c6ddd0f1d05d4e510134ed462851fd5f754c8c3cbb88d", size = 27377, upload-time = "2026-01-22T16:35:26.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/2f/967ba146e6d58cf6a652da73885f52fc68001525b4197effc174321d70b4/jmespath-1.1.0-py3-none-any.whl", hash = "sha256:a5663118de4908c91729bea0acadca56526eb2698e83de10cd116ae0f4e97c64", size = 20419, upload-time = "2026-01-22T16:35:24.919Z" }, +] + +[[package]] +name = "pydantic" +version = "2.12.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, +] + +[package.optional-dependencies] +email = [ + { name = "email-validator" }, +] +timezone = [ + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] + +[[package]] +name = "pydantic-core" +version = "2.41.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, + { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, + { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, + { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, + { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, + { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, + { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, + { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" }, + { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" }, + { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" }, + { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, + { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, + { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, + { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, + { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, + { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, + { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, + { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, + { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, + { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, + { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, + { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, + { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, + { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, + { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, + { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, + { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, + { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, + { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, + { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, + { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, + { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, + { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, + { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, + { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, + { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, + { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, + { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, + { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, + { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, + { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, + { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, + { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, + { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, + { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, + { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, + { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/f5/cd531b2d15a671a40c0f66cf06bc3570a12cd56eef98960068ebbad1bf5a/tzdata-2026.1.tar.gz", hash = "sha256:67658a1903c75917309e753fdc349ac0efd8c27db7a0cb406a25be4840f87f98", size = 197639, upload-time = "2026-04-03T11:25:22.002Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/70/d460bd685a170790ec89317e9bd33047988e4bce507b831f5db771e142de/tzdata-2026.1-py2.py3-none-any.whl", hash = "sha256:4b1d2be7ac37ceafd7327b961aa3a54e467efbdb563a23655fbfe0d39cfc42a9", size = 348952, upload-time = "2026-04-03T11:25:20.313Z" }, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +]