openapi: 3.2.0
info:
version: 1.0.0
title: References Stix API
description: 'API for CybelAngel''s Alerts.
Authentication uses standard [OAuth2 Bearer Tokens](https://tools.ietf.org/html/rfc6750).
Here is a simple example of how to fetch such a token with curl:
```shell
curl -X POST https://auth.cybelangel.com/oauth/token -H ''content-type: application/json -d ''{"client_id": "client_id", "client_secret": "client_secret", "audience": "https://platform.cybelangel.com/", "grant_type": "client_credentials"}
```
The received access token can then be used as a Bearer token to request our API.'
contact:
email: support@cybelangel.com
license:
url: https://cybelangel.com/
name: Proprietary
servers:
- url: https://api.cybelangel.com
tags:
- name: stix
description: Alerts - Stix
paths:
/v1/stix/alerts:
get:
tags:
- stix
summary: Search alerts in STIX 2.1 format
description: 'Search alerts according to user filters and return them as a Bundle in STIX 2.1 format.
See https://oasis-open.github.io/cti-documentation/stix/intro for more information on this format.
Note: Historical data is only available starting from January 1, 2024, and is retained for a maximum of 12 months.
Requests for data outside of this range will not return any results.'
operationId: stix_search_stix_alerts_stix_alerts_get
parameters:
- name: cursor
in: query
description: 'Set it to the the ''cursor'' value received from previous search request to iterate on the following alerts, beyond the limit set per request.
Searching from a cursor does not impact the total number of results.
Behavior is undefined if the filters and sort are changed between successive requests.
Note: with big datasets, iterating on cursor can be much slower than iterating on ''start_date'' filter.'
required: false
schema:
title: Cursor
description: 'Set it to the the ''cursor'' value received from previous search request to iterate on the following alerts, beyond the limit set per request.
Searching from a cursor does not impact the total number of results.
Behavior is undefined if the filters and sort are changed between successive requests.
Note: with big datasets, iterating on cursor can be much slower than iterating on ''start_date'' filter.'
anyOf: []
- name: order_by
in: query
description: 'Can be multiple fields with +/- for ascending/descending sort.
Fields can be ingestion_date, detection_date, ml_score.'
required: false
schema:
type: array
title: Order By
description: 'Can be multiple fields with +/- for ascending/descending sort.
Fields can be ingestion_date, detection_date, ml_score.'
default:
- +ingestion_date
- +detection_date
items:
type: string
pattern: '[+-]?(ingestion_date|detection_date|ml_score)'
minLength: 1
- name: stream_id
in: query
description: 'Stream id used to filter alerts belonging to some organization.
A client can only query alerts for its allowed streams.'
required: true
schema:
type: string
title: Stream Id
description: 'Stream id used to filter alerts belonging to some organization.
A client can only query alerts for its allowed streams.'
minLength: 1
examples:
- 90b18fad-b9ca-41db-bae1-b4964c1a4e84
examples:
default:
value: 90b18fad-b9ca-41db-bae1-b4964c1a4e84
- name: start_date
in: query
description: 'Minimal ingestion date. Expects a date with timezone information.
Note: Historical data is only available starting from January 1, 2024, and is retained for a maximum of 12 months.
Requests for data outside of this range will not return any results.'
required: true
schema:
type: string
title: Start Date
description: 'Minimal ingestion date. Expects a date with timezone information.
Note: Historical data is only available starting from January 1, 2024, and is retained for a maximum of 12 months.
Requests for data outside of this range will not return any results.'
format: date-time
examples:
- '2024-09-01T10:00:00.000Z'
examples:
default:
value: '2024-09-01T10:00:00.000Z'
- name: end_date
in: query
description: 'Maximal ingestion date. Expects a date with timezone information.
Note: Historical data is only available starting from January 1, 2024, and is retained for a maximum of 12 months.
Requests for data outside of this range will not return any results.'
required: false
schema:
title: End Date
description: 'Maximal ingestion date. Expects a date with timezone information.
Note: Historical data is only available starting from January 1, 2024, and is retained for a maximum of 12 months.
Requests for data outside of this range will not return any results.'
anyOf: []
- name: status
in: query
description: 'Select only alerts having one of the requested statuses.
By default selects only ''new'' alerts to exclude alerts automatically discarded by our ML tools or already processed by analysts.'
required: false
schema:
type: array
title: Status
description: 'Select only alerts having one of the requested statuses.
By default selects only ''new'' alerts to exclude alerts automatically discarded by our ML tools or already processed by analysts.'
default:
- new
items:
$ref: '#/components/schemas/AlertStatus'
- name: category
in: query
description: If set, select alerts with specified categories.
required: false
schema:
type: array
title: Category
description: If set, select alerts with specified categories.
default: []
items:
$ref: '#/components/schemas/AlertCategory'
- name: customer_assessment
in: query
description: 'If set, select only alerts having one of the requested customer assessments.
This is the **customer.assessment** field that may be set by clients using the API.'
required: false
schema:
type: array
title: Customer Assessment
description: 'If set, select only alerts having one of the requested customer assessments.
This is the **customer.assessment** field that may be set by clients using the API.'
default: []
items:
$ref: '#/components/schemas/CustomerAssessment'
- name: keyword
in: query
description: If set, select alerts matching specified keywords aliases.
required: false
schema:
type: array
title: Keyword
description: If set, select alerts matching specified keywords aliases.
default: []
items:
type: string
minLength: 1
- name: keyword_id
in: query
description: If set, select alerts matching specified keyword identifiers.
required: false
schema:
type: array
title: Keyword Id
description: If set, select alerts matching specified keyword identifiers.
default: []
items:
type: string
minLength: 1
- name: min_ml_score
in: query
description: If set, select alerts with equal or higher 'ml.score'.
required: false
schema:
type: integer
title: Min Ml Score
description: If set, select alerts with equal or higher 'ml.score'.
minimum: 0
maximum: 100
default: 0
- name: hostname
in: query
description: If set, select alerts with any specified hostname value.
required: false
schema:
type: array
title: Hostname
description: If set, select alerts with any specified hostname value.
default: []
items:
type: string
minLength: 1
- name: ip
in: query
description: If set, select alerts with specified IP address among 'ip', 'server_ip' or 'victim_ip' fields.
required: false
schema:
type: array
title: Ip
description: If set, select alerts with specified IP address among 'ip', 'server_ip' or 'victim_ip' fields.
default: []
items:
type: string
minLength: 1
- name: search_query
in: query
description: Words to search in alerts text fields.
required: false
schema:
title: Search Query
description: Words to search in alerts text fields.
anyOf: []
- name: alerts_limit
in: query
description: 'Max number of considered alerts. Increasing it will also increase the payload.
Note: it limits the number of alert considered by the query, but one alert can generate from zero to dozens of STIX objects.'
required: false
schema:
type: integer
title: Alerts Limit
description: 'Max number of considered alerts. Increasing it will also increase the payload.
Note: it limits the number of alert considered by the query, but one alert can generate from zero to dozens of STIX objects.'
minimum: 0
maximum: 1000
default: 10
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/StixAlertsResponse'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_ValidationError_'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_ForbiddenAccessError_'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_UnknownError_'
security:
- jwt: []
servers:
- url: https://api.cybelangel.com
components:
schemas:
CustomerAssessment:
type: string
enum:
- unknown
- true_positive
- false_positive
title: CustomerAssessment
description: 'Assessment of the alert quality: is it a real security threat?
Set by the API user to provide feedback to Cybelangel.
The default ''unknown'' value is present before user assessed the alert, or when removing that assessment.'
ValidationError:
type: object
title: ValidationError
description: Error on incorrect input fields
properties:
message:
type: string
title: Message
fields:
type: array
title: Fields
items:
$ref: '#/components/schemas/Field'
required:
- message
- fields
Field:
type: object
title: Field
description: Detail of an incorrect input field
properties:
name:
type: string
title: Name
msg:
type: string
title: Msg
input:
title: Input
anyOf:
- type: string
- type: array
items:
type: string
valid_input:
title: Valid Input
anyOf:
- type: string
- type: array
items:
type: string
required:
- name
- msg
APIErrorResponse_ValidationError_:
type: object
title: APIErrorResponse[ValidationError]
properties:
error:
$ref: '#/components/schemas/ValidationError'
required:
- error
APIErrorResponse_UnknownError_:
type: object
title: APIErrorResponse[UnknownError]
properties:
error:
$ref: '#/components/schemas/UnknownError'
required:
- error
ForbiddenAccessError:
type: object
title: ForbiddenAccessError
description: User cannot access some resource.
properties:
message:
type: string
title: Message
required:
- message
AlertStatus:
type: string
enum:
- new
- autodiscarded
- discarded
- interesting
- forwarded
- report_sent
title: AlertStatus
description: Status of alerts, set by cybelangel automated systems and analysts.
APIErrorResponse_ForbiddenAccessError_:
type: object
title: APIErrorResponse[ForbiddenAccessError]
properties:
error:
$ref: '#/components/schemas/ForbiddenAccessError'
required:
- error
UnknownError:
type: object
title: UnknownError
description: Unknown error on server-side, please contact support.
properties:
message:
type: string
title: Message
required:
- message
StixAlertsResponse:
type: object
title: StixAlertsResponse
description: Response to a search of STIX objects from alerts data.
properties:
stix_bundle:
type: object
title: Stix Bundle
description: 'STIX Bundle object used to aggregate STIX objects, both SDO, SCO and SRO.
See https://docs.oasis-open.org/cti/stix/v2.1/csprd01/stix-v2.1-csprd01.html#_Toc16070770 for more information.'
more:
type: boolean
title: More
description: Set to true when there are more alerts to retrieve with the same search request parameters and a new 'cursor'.
default: false
cursor:
title: Cursor
description: Set when there are more alerts to retrieve. It can be used in another search request, with the same parameters, to download the following alerts.
anyOf:
- type: string
required:
- stix_bundle
AlertCategory:
type: string
enum:
- adm
- fileserver
- codeshare
- dns
- database
- board
- clouddrive
- docshare
- paste
- leak
- rss
- social
title: AlertCategory
description: 'ADM stands for Asset Discovery and Monitoring.
DNS stands for Domain Name System.'
securitySchemes:
jwt:
type: http
scheme: bearer
bearerFormat: JWT