openapi: 3.1.0
info:
version: 1.0.0
title: References
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'
paths:
/v1/alerts:
get:
tags:
- alerts
summary: Search alerts
description: 'Search alerts according to user filters.
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: alerts_search_alerts_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:
- type: string
- 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:
- type: string
format: date-time
- 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:
- type: string
minLength: 1
- name: limit
in: query
description: Max number of returned alerts. Increasing it will also increase the payload.
required: false
schema:
type: integer
title: Limit
description: Max number of returned alerts. Increasing it will also increase the payload.
minimum: 0
maximum: 1000
default: 10
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/AlertList'
'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_'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_NotFoundError_'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_UnknownError_'
security:
- jwt: []
servers:
- url: 'https://api.cybelangel.com'
'/v1/alerts/{alert_id}':
get:
tags:
- alerts
summary: Get an alert
description: 'Get an alert by its unique id.
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: alerts_search_an_alert_alerts__alert_id__get
parameters:
- name: alert_id
in: path
description: ID of an alert.
required: true
schema:
type: string
title: Alert Id
description: ID of an alert.
minLength: 1
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/PublicAlert'
'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_'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_NotFoundError_'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_UnknownError_'
security:
- jwt: []
servers:
- url: 'https://api.cybelangel.com'
'/v1/alerts/{alert_id}/customer':
patch:
tags:
- alerts
summary: Set customer fields
description: Allow to edit customer-maintained fields in an alert published by the API.
The only use now is to assess the alerts.
These assessments may then be used by CybelAngel to improve the alerts automated filtering.
operationId: alerts_patch_an_alert_alerts__alert_id__customer_patch
parameters:
- name: alert_id
in: path
description: ID of an alert.
required: true
schema:
type: string
title: Alert Id
description: ID of an alert.
minLength: 1
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AlertRequestCustomerFieldsPatch'
responses:
'204':
description: No Content
'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_'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_NotFoundError_'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_UnknownError_'
security:
- jwt: []
servers:
- url: 'https://api.cybelangel.com'
'/v1/alerts/{alert_id}/credentials':
get:
tags:
- alerts
summary: Get leak alert credentials (deprecated)
description: This endpoint is deprecated and will be removed in a future release.
Use /v1/alerts//leak-credentials instead.
operationId: alerts_get_alert_credentials_deprecated_alerts__alert_id__credentials_get
parameters:
- name: alert_id
in: path
description: ID of an alert.
required: true
schema:
type: string
title: Alert Id
description: ID of an alert.
minLength: 1
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/CredentialsResponse'
'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_'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_NotFoundError_'
'410':
description: Gone
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_GoneError_'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_UnknownError_'
deprecated: true
security:
- jwt: []
servers:
- url: 'https://api.cybelangel.com'
'/v1/alerts/{alert_id}/leak-credentials':
get:
tags:
- alerts
summary: Get leak alert credentials
description: Get credentials associated with an alert.
operationId: alerts_get_alert_credentials_alerts__alert_id__leak_credentials_get
parameters:
- name: alert_id
in: path
description: ID of an alert.
required: true
schema:
type: string
title: Alert Id
description: ID of an alert.
minLength: 1
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/CredentialsResponse'
'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_'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_NotFoundError_'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_UnknownError_'
security:
- jwt: []
servers:
- url: 'https://api.cybelangel.com'
'/v1/alerts/{alert_id}/codeshare-findings':
get:
tags:
- alerts
summary: Get codeshare alert findings
description: 'Get sensitive code snippets for a codeshare alert.
Note: downloading hundreds of thousands of findings may take a few dozen seconds.'
operationId: alerts_get_codeshare_findings_alerts__alert_id__codeshare_findings_get
parameters:
- name: alert_id
in: path
description: ID of an alert.
required: true
schema:
type: string
title: Alert Id
description: ID of an alert.
minLength: 1
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/FindingsResponse'
'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_'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_NotFoundError_'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_UnknownError_'
security:
- jwt: []
servers:
- url: 'https://api.cybelangel.com'
'/v1/alerts/{alert_id}/dns-screenshot':
get:
tags:
- alerts
summary: Get DNS alert screenshot.
description: 'Get the website screenshot associated with a DNS alert.
If a screenshot is present, it is returned as a PNG file.
If no screenshot was taken for the alert, a 204 NO_CONTENT is returned.
If the alert is older than 180 days a GONE response is returned.'
operationId: alerts_get_alert_dns_screenshot_alerts__alert_id__dns_screenshot_get
parameters:
- name: alert_id
in: path
description: ID of an alert.
required: true
schema:
type: string
title: Alert Id
description: ID of an alert.
minLength: 1
responses:
'200':
description: OK
content:
image/png:
schema:
type: string
contentMediaType: application/octet-stream
'204':
description: No Content
'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_'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_NotFoundError_'
'410':
description: Gone
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_GoneError_'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_UnknownError_'
security:
- jwt: []
servers:
- url: 'https://api.cybelangel.com'
/v1/leak-credentials:
get:
tags:
- alerts
summary: Get leak credentials
description: Get leak credentials we collected.
operationId: alerts_get_leak_credentials_leak_credentials_get
parameters:
- 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.
required: true
schema:
type: string
title: Start Date
description: Minimal ingestion date. Expects a date with timezone information.
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.
required: false
schema:
title: End Date
description: Maximal ingestion date. Expects a date with timezone information.
anyOf:
- type: string
format: date-time
- name: match
in: query
description: Words to search in credentials logins and targets.
required: false
schema:
title: Match
description: Words to search in credentials logins and targets.
anyOf:
- type: string
minLength: 1
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/CredentialsResponse'
'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_'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_NotFoundError_'
'410':
description: Gone
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_GoneError_'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/APIErrorResponse_UnknownError_'
security:
- jwt: []
servers:
- url: 'https://api.cybelangel.com'
/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'
tags:
- name: alerts
description: Alerts
- name: stix
description: Alerts - Stix
components:
securitySchemes:
jwt:
type: http
scheme: bearer
bearerFormat: JWT
schemas:
AlertStatus:
type: string
enum:
- new
- autodiscarded
- discarded
- interesting
- forwarded
- report_sent
title: AlertStatus
description: 'Status of alerts, set by cybelangel automated systems and analysts.'
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.
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.
AlertList:
type: object
title: AlertList
description: List of alerts.
properties:
total:
type: integer
title: Total
description: Total number of alerts matching the request.
message:
title: Message
description: Additional information in case of non-blocking issue with the query.
anyOf:
- type: string
alerts:
type: array
title: Alerts
items:
$ref: '#/components/schemas/PublicAlert'
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:
- total
- alerts
PublicAlert:
type: object
title: PublicAlert
description: Represents an Alert in our raw data
properties:
id:
type: string
title: Id
description: Id of the incident report sent for this alert.
examples:
- '08c846af-fe9f-4bb3-9061-a3ddbebd1f11:7d14caa9-63ac-4c984-b8a3-98b9dc75f975'
stream_id:
type: string
title: Stream Id
description: |-
Technical stream for the keyword that generated the alert.
It restricts alert access to users of that stream's organization.
examples:
- 90b18fad-b9ca-41db-bae1-b4964c1a4e84
status:
$ref: '#/components/schemas/AlertStatus'
ingestion_date:
type: string
title: Ingestion Date
description: |-
Time at which this alert was ingested and made available to our users.
It can be used to get new alerts when periodically polling the API.
Note: due to the asynchronous nature of the ingestion process and various caches, the alerts ingested in the last few minutes may not yet be returned by the API.
format: date-time
examples:
- '2024-09-01T12:36:15.456Z'
detection_date:
type: string
title: Detection Date
description: Time of the original detection of this alert when crawling the Internet.
format: date-time
examples:
- '2024-08-31T06:15:54Z'
customer:
$ref: '#/components/schemas/CustomerFields'
report:
description: Fields set when publishing a report from this alert.
anyOf:
- $ref: '#/components/schemas/Report'
ml:
$ref: '#/components/schemas/MLFields'
matches:
type: array
title: Matches
description: |-
List of keyword matches that triggered this alert.
This is not an exhaustive list of matches from the data causing the alert as we limit the number of extracts we compute.
items:
$ref: '#/components/schemas/Match'
category:
$ref: '#/components/schemas/AlertCategory'
description: 'Category of alerts, depending on its technical source. It dictates the category-specific field that may be set.'
database:
description: Set only for Database alerts.
anyOf:
- $ref: '#/components/schemas/Database'
adm:
description: Set only for ADM alerts.
anyOf:
- $ref: '#/components/schemas/ADM'
dns:
description: Set only for DNS alerts.
anyOf:
- $ref: '#/components/schemas/DNS'
fileserver:
description: Set only for Fileserver alerts.
anyOf:
- $ref: '#/components/schemas/Fileserver'
clouddrive:
description: Set only for Clouddrive alerts.
anyOf:
- $ref: '#/components/schemas/Clouddrive'
docshare:
description: Set only for Docshare alerts.
anyOf:
- $ref: '#/components/schemas/Docshare'
codeshare:
description: Set only for Codeshare alerts.
anyOf:
- $ref: '#/components/schemas/Codeshare'
board:
description: Set only for Board alerts.
anyOf:
- $ref: '#/components/schemas/Board'
leak:
description: Set only for Leak alerts
anyOf:
- $ref: '#/components/schemas/Leak'
rss:
description: Set only for RSS alerts
anyOf:
- $ref: '#/components/schemas/RSS'
paste:
description: Set only for Paste alerts
anyOf:
- $ref: '#/components/schemas/Paste'
social:
description: Set only for Social alerts
anyOf:
- $ref: '#/components/schemas/Social'
required:
- id
- stream_id
- status
- ingestion_date
- detection_date
- customer
- ml
- matches
- category
CustomerFields:
type: object
title: CustomerFields
description: Fields set by customer in the alert.
properties:
assessment:
$ref: '#/components/schemas/CustomerAssessment'
Report:
type: object
title: Report
description: Fields set when publishing an incident report from this alert.
properties:
id:
type: string
title: Id
description: Id of the incident report sent for this alert.
required:
- id
MLFields:
type: object
title: MLFields
description: Fields set by our Machine Learning tool when evaluating the alert.
properties:
score:
title: Score
description: |-
Score between 0 and 100 set by our ML-based tools when evaluating the alert.
0 is certainly a false positive and will certainly be automatically discarded, 100 is most certain a true positive and should be checked carefully.
examples:
- 84
anyOf:
- type: integer
minimum: 0
maximum: 100
Match:
type: object
title: Match
description: Match of a keyword linking this alert to the user stream.
properties:
source:
type: string
title: Source
description: Indicates the technical source of the data.
examples:
- path
keyword:
type: string
title: Keyword
description: Label of the keyword that was detected in the extract.
examples:
- security
keyword_id:
type: string
title: Keyword Id
description: ID of the keyword that was detected in the extract.
examples:
- 590a6363-9df9-4d75-8f2a-41247357a9cc
extracts:
type: array
title: Extracts
description: |-
Snippets of the content where the keyword matched.
The whole content is HTML-encoded.
The matched content is marked by `...` markup.
Note: it is empty for 'database' alerts.
examples:
- /some_folder/Secret_Library_2025_9v2/Antivirus_Security_9-x_V1R1/U_Antivirus_SECURITY_Overview.pdf
items:
type: string
required:
- source
- keyword
- keyword_id
- extracts
Database:
type: object
title: Database
description: Potential confidential data matching the keywords was found on a publicly exposed database server.
properties:
city:
title: City
description: English name of the city where the database server is located.
examples:
- Paris
anyOf:
- type: string
country:
title: Country
description: English name of the country where the database is located.
examples:
- France
anyOf:
- type: string
country_code:
title: Country Code
description: ISO 3166-1 alpha-2 code of the country where the database server is located.
examples:
- FR
anyOf:
- type: string
database:
type: string
title: Database
description: Name of the main database with matching data on the server.
examples:
- admin_cluster
databases_count:
type: integer
title: Databases Count
description: Number of database with matching data found on the server.
default: 1
ip:
title: Ip
description: |-
IP address of the publicly accessible database.
Not set when the server is a cloud provider (AWS, Azure...) and thus has no consistent ip.
examples:
- 203.0.113.73
anyOf:
- type: string
format: ipvanyaddress
port:
type: integer
title: Port
description: 'Public database server port, used to check its content.'
examples:
- 27017
protocol:
$ref: '#/components/schemas/DBProtocol'
description: Public database server protocol.
reverse_hostname:
type: string
title: Reverse Hostname
description: Publicly accessible database server reverse hostname.
examples:
- vm123465.example.fr
required:
- database
- port
- protocol
- reverse_hostname
DBProtocol:
type: string
enum:
- elasticsearch
- mongo
- sql
- pgsql
title: DBProtocol
description: Different kind of databases.
ADM:
type: object
title: ADM
description: 'Asset Discovery Monitoring (ADM): Asset with an open port exposing information that matches keywords.'
properties:
city:
title: City
description: City where the asset is located.
examples:
- Zurich
anyOf:
- type: string
country:
title: Country
description: Country where the asset is located.
examples:
- Switzerland
anyOf:
- type: string
country_code:
title: Country Code
description: Country code where the asset is located.
examples:
- CH
anyOf:
- type: string
organization:
title: Organization
description: 'Name of the organisation where the asset is located, a cloud provider for example.'
examples:
- Zweiss Inc.
anyOf:
- type: string
ip:
title: Ip
description: |-
IP address of the publicly accessible asset.
Not set when the server is a cloud provider (AWS, Azure...) and thus has no consistent ip.
examples:
- 203.0.113.73
anyOf:
- type: string
format: ipvanyaddress
hostname:
title: Hostname
description: Host name of the publicly accessible asset.
examples:
- bba.zweiss.example.ae
anyOf:
- type: string
hostnames:
type: array
title: Hostnames
description: Hostnames associated with the ip of the asset.
examples:
- - bba.zweiss.example.ae
- ssl.zweiss.example.ae
- maintenance.example.ae
items:
type: string
open_ports:
type: array
title: Open Ports
description: |-
List of the open ports detected on the same IP address.
They may be identical for alerts on the same IP but with a different port.
examples:
- - 80
- 5000
- 8000
- 8035
- 8080
items:
type: integer
open_services:
type: array
title: Open Services
description: |-
List of the services running on the open ports.
Examples: mysql, telnet, ftp
default: []
examples:
- - netbios-ssn
- vnc-http
items:
type: string
port:
type: integer
title: Port
description: Number of the port considered in this alert.
examples:
- 80
protocol:
type: string
title: Protocol
description: Name of the protocol running on this port.
examples:
- http
product:
title: Product
description: Name of the product running on this port.
examples:
- nginx
anyOf:
- type: string
max_cve_severity:
type: number
title: Max Cve Severity
description: Severity max for a detected CVE.
minimum: 0
maximum: 10
examples:
- 9.7
cves:
type: array
title: Cves
description: CVEs detected on this port.
items:
$ref: '#/components/schemas/CVE'
ssl_cert:
description: SSL certificate associated to the port.
anyOf:
- $ref: '#/components/schemas/SSLCert'
title:
title: Title
description: Title of the HTML page if the protocol is HTTP.
examples:
- Our Partnership Portal
anyOf:
- type: string
required:
- hostnames
- open_ports
- port
- protocol
- max_cve_severity
- cves
CVE:
type: object
title: CVE
description: Common Vulnerabilities and Exposures.
properties:
summary:
type: string
title: Summary
description: Description of the CVE.
examples:
- A crafted request uri-path can cause mod_proxy to forward the request to an origin server choosen by the remote user. This issue affects Apache HTTP Server 2.4.48 and earlier.
cvss:
type: number
title: Cvss
description: CVSS (Common Vulnerability Scoring System) rating of the CVE.
minimum: 0
maximum: 10
examples:
- 9
references:
type: array
title: References
description: Sources of the description and rating.
examples:
- - 'https://nvd.nist.gov/vuln/detail/CVE-2021-40438'
items:
type: string
name:
type: string
title: Name
description: Name of the CVE.
examples:
- CVE-2021-40438
required:
- summary
- cvss
- references
- name
SSLCert:
type: object
title: SSLCert
description: SSL Certificate.
properties:
expires:
title: Expires
description: Date of expiration of the certificate.
examples:
- '2024-11-30T23:59:59'
anyOf:
- type: string
format: date-time
issued:
title: Issued
description: Date of publication of the certificate.
examples:
- '2023-12-22T00:00:00'
anyOf:
- type: string
format: date-time
expired:
type: boolean
title: Expired
description: Is the certificate expired or not.
subject:
$ref: '#/components/schemas/SSLCertSubject'
description: Subject.
required:
- expired
- subject
SSLCertSubject:
type: object
title: SSLCertSubject
description: SSL Certificate Subject following the X.509 standard.
properties:
C:
type: string
title: C
description: Country name.
examples:
- US
O:
type: string
title: O
description: Organization name.
examples:
- Some American Corp Inc.
ST:
type: string
title: St
description: State or Province name.
examples:
- California
CN:
type: string
title: Cn
description: Common Name.
examples:
- ourpartnershipportal.com
required:
- C
- O
- ST
- CN
DNS:
type: object
title: DNS
description: |-
Potential domain cyber-squatting.
An alert of that category indicates we found a domain name close enough to one of our keywords that does not belong to its rightful owner.
properties:
hostname:
type: string
title: Hostname
description: Suspicious host name.
examples:
- example.mycompanyportal.com
domain:
type: string
title: Domain
description: Domain name registered for the suspicious host name.
examples:
- mycompanyportal.com
ip:
title: Ip
description: |-
IP address resolved from the suspicious host name.
Not set when the server is a cloud provider (AWS, Azure...) and thus has no consistent ip.
examples:
- 203.0.113.73
anyOf:
- type: string
format: ipvanyaddress
domain_creation_date:
title: Domain Creation Date
description: Date of creation of the domain
examples:
- '2024-06-08T07:53:58Z'
anyOf:
- type: string
format: date-time
ns_servers:
type: array
title: Ns Servers
description: 'Nameserver record, indicating which DNS server is authoritative for that domain.'
default: []
examples:
- - ns1.abovedomains.com.
- ns2.abovedomains.com.
items:
type: string
mx:
title: Mx
description: |-
A mail exchanger record (MX record) specifies the mail server responsible for accepting email messages on behalf of a domain name.
It is a resource record in the Domain Name System (DNS). It is possible to configure several MX records, typically pointing to an array of mail servers for load balancing and redundancy.
examples:
- 10 park-mx.abovedomains.com.
anyOf:
- type: string
registrant_email:
title: Registrant Email
description: |-
Email address registered with the domain.
It can be a valid email or almost any string typed by the registrant.
examples:
- Please set email
anyOf:
- type: string
country:
title: Country
description: English name of the country in which the domain name is registered.
examples:
- Australia
anyOf:
- type: string
country_code:
title: Country Code
description: ISO 3166-1 alpha-2 code of the country in which the domain name is registered.
examples:
- AU
anyOf:
- type: string
required:
- hostname
- domain
Fileserver:
type: object
title: Fileserver
description: Potential document leak on a public server.
properties:
count_matched_files:
type: integer
title: Count Matched Files
description: |-
Number of files that matched with keywords.
Note: when millions of files could match, the matches may be distributed across several alerts.
examples:
- 157
city:
title: City
description: English name of the city where the server is located.
examples:
- Koszalin
anyOf:
- type: string
country:
title: Country
description: English name of the country where the service is located.
examples:
- Poland
anyOf:
- type: string
country_code:
title: Country Code
description: ISO 3166-1 alpha-2 code of the country in which the domain name is registered.
examples:
- PL
anyOf:
- type: string
oldest_last_modified_date:
title: Oldest Last Modified Date
description: Last modification date of the oldest file matching the keywords.
examples:
- '2024-08-12T19:01:52Z'
anyOf:
- type: string
format: date-time
newest_last_modified_date:
title: Newest Last Modified Date
description: Last modification date of the most recent file matching the keywords.
examples:
- '2024-08-13T10:13:41Z'
anyOf:
- type: string
format: date-time
ip:
title: Ip
description: |-
IP address of the publicly accessible file server.
Not set when the server is a cloud provider (AWS, Azure...) and thus has no consistent ip.
examples:
- 203.0.113.254
anyOf:
- type: string
format: ipvanyaddress
hostname:
type: string
title: Hostname
description: Host name of the publicly accessible file server.
examples:
- betelgueuse.example.pl
port:
type: integer
title: Port
description: Port on which the sharing service is active.
examples:
- 2042
protocol:
type: string
title: Protocol
description: Server's sharing protocol.
examples:
- nfs
reverse_hostname:
type: string
title: Reverse Hostname
description: Reverse lookup of the file server hostname.
examples:
- 203.0.113.254.ipv4.betelgueuse.example.pl
longest_filepath:
title: Longest Filepath
description: |-
The longest among publicly accessible file paths found on this server.
Note: This field may not be available for certain types of cloud buckets (GCS, ABS, AWS S3...).
examples:
- /tmplocal/examples/05448864179524ds41bg7g4147gf4j4754sezs/accounts.xslx
anyOf:
- type: string
required:
- count_matched_files
- hostname
- port
- protocol
- reverse_hostname
Clouddrive:
type: object
title: Clouddrive
description: |-
Potential document leak on a public cloud drive, like a GCS bucket or an openly shared personal dropbox.
This alert can aggregate multiple files linked by either a common drive, a common folder or a common detection parent (post in a message board or some file on the internet linking to exposed cloud drive files).
properties:
source:
$ref: '#/components/schemas/Source'
description: 'Source of the clouddrive: onedrive, googledrive or dropbox.'
count_matched_files:
type: integer
title: Count Matched Files
description: |-
Number of files that matched with keywords.
Note: when millions of files could match, the matches may be distributed across several alerts.
examples:
- 6589
oldest_last_modified_date:
title: Oldest Last Modified Date
description: Last modification date of the oldest file matching the keywords.
examples:
- '2024-08-12T19:01:52Z'
anyOf:
- type: string
format: date-time
newest_last_modified_date:
title: Newest Last Modified Date
description: Last modification date of the most recent file matching the keywords.
examples:
- '2024-08-13T10:13:41Z'
anyOf:
- type: string
format: date-time
owner_email:
title: Owner Email
description: 'Email provided by the user who owns the cloud drive, may not be accurate.'
examples:
- jcd75069@gmail.com
anyOf:
- type: string
parent_url:
title: Parent Url
description: |-
URL of the website where we found the link to the publicly shared cloud drive.
It may no longer be valid or openly accessible.
It may not be set when coming from an external provider.
examples:
- 'https://www.scribd.com/document/769624896/Hackers_of_Poland-PDF'
anyOf:
- type: string
sample_files:
type: array
title: Sample Files
description: |-
Some examples of files that triggered this alert, matching one of the keywords defined for the stream.
For now there should be only one per alert.
items:
$ref: '#/components/schemas/File'
required:
- source
- count_matched_files
- sample_files
Source:
type: string
enum:
- onedrive
- googledrive
- dropbox
title: Source
description: Cloud drive source type.
File:
type: object
title: File
description: Publicly exposed file in a cloud drive.
properties:
path:
type: string
title: Path
description: |-
Path of the file on the cloud drive.
This is only the ending path of the file on the cloud drive as it is usually not possible to access the root of the drive as an external user.
It may contain only the file name, or some parent folder names depending on what was publicly exposed at the time it was detected.
examples:
- '/sortedMenu Tool/2-Input/DataBase/[FREE] DataBase Data.txt'
url:
type: string
title: Url
description: URL of the file on the cloud drive.
examples:
- 'https://onedrive.live.com/redir.aspx?cid=527b8139d66816e7&page=browse&resid=527B8139D56816E7!14752&parId=527B8139D56816E7!14740&authkey=!AJb3iG4G1leXO0E'
size:
type: integer
title: Size
description: 'Size of the file, in bytes.'
examples:
- 191451
required:
- path
- url
- size
Docshare:
type: object
title: Docshare
description: 'Potential document leak on a public document sharing platform like Scribd, Trello, Prezi, Slideshare...'
properties:
author:
title: Author
description: 'Some identifier of the document author on the source platform. Could be a login, an email or not provided at all.'
examples:
- ydningrm78
anyOf:
- type: string
title:
title: Title
description: 'Title of the shared document, if present in the source.'
examples:
- Company Security deep dive
anyOf:
- type: string
context:
type: string
title: Context
description: |-
First few lines of the shared document.
It is also limited to a few thousand characters from the start of the document.
examples:
- |2-
FOR INTERNAL USE ONLY!
Our company security policy
1/ Passwords
2/ BYOD
3/ Office rules
document_date:
type: string
title: Document Date
description: Date on which the document was shared on the source platform.
format: date-time
examples:
- '2024-09-16T00:00:00Z'
source:
type: string
title: Source
description: |-
Name of the platform on which the document was shared.
It can be a well-known website name like 'scribd' or 'prezi', or any domain name.
examples:
- scribd
url:
type: string
title: Url
description: URL of the shared document at the time it was detected. It may no longer be valid.
examples:
- 'https://www.scribd.com/document/4976346763/Company-Policy'
required:
- context
- document_date
- source
- url
Codeshare:
type: object
title: Codeshare
description: 'Alert triggered by code shared on a public repository, usually on a code sharing platform like GitHub.'
properties:
source:
type: string
title: Source
description: Platform on which the code was publicly shared. It is usually 'github.com'.
examples:
- github.com
title:
type: string
title: Title
description: 'Code repository title on the code sharing platform, usually following the author/repository pattern.'
examples:
- memtsuo5/gatto-blog
owner:
type: string
title: Owner
description: Username of the person or organization who owns the repository.
examples:
- memtsuo5
repository_name:
type: string
title: Repository Name
description: Identifier of the repository where files matching the keywords were edited.
examples:
- gatto-blog
context:
title: Context
description: |-
First few lines of the repository readme file.
It is also limited to a few thousand characters from the start of the document.
examples:
- |