TISC API
The TISC API provides endpoints to add and retrieve threat intelligence data in the Threat Intelligence Security Center (TISC) application.
Data retrieved by this API can be used by other security tools such as Security Information Event Management (SIEM) systems. SIEM systems can integrate with TISC using this API to retrieve observables related to threats in TISC and automatically detect and monitor these threats within an organization’s network. This API enables bidirectional sharing of observables from security tools. SIEM systems observe anomalous activity in the environment and can provide a list of observables associated with the anomalous activity to TISC.
This API can also be used to enrich SIEM alerts with threat intelligence context. For example, if a SIEM alert is generated based on unusually high traffic from an IP address, TISC can provide additional information such as whether the IP address or domain involved is linked to known malicious activities. This enrichment data enables security analysts to triage the alerts and use the contextual information for efficient remediation.
This API requires the Threat Intelligence Security Center application, which is available on the ServiceNow Store.
For additional information about TISC, see Threat Intelligence Security Center.
This API runs in the sn_sec_tisc namespace.
The current version of this API is v1.
For information about API authentication, see the REST API security section in REST APIs.
TISC API - POST /sn_sec_tisc/threat_intel_data/add_observables
Adds observable source records to the Threat Intelligence Security Center (TISC) application.
The observable source records are created in the Observable Source [sn_sec_tisc_observable_source] table and are processed through de-duplication and aggregation in the TISC data flow.
To access this endpoint, the caller must have the sn_sec_tisc.api_obs_write_access role, which by default is included in the Threat Intelligence administrator role (sn_sec_tisc.admin).
URL format
Versioned URL: /api/sn_sec_tisc/{api_version}/threat_intel_data/add_observables
Default URL: /api/sn_sec_tisc/threat_intel_data/add_observables
Supported request parameters
| Name | Description |
|---|---|
| api_version | Optional. Version of the endpoint to access. For example, v1 or v2. Only specify this value to use an endpoint version other than the
latest.
Data type: String |
| Name | Description |
|---|---|
| None |
| Name | Description |
|---|---|
| observables | Required. List of observable objects to add to TISC. For each observable object, an observable source record is created if all validations are passed, with the source as defined by the source
parameter in the request body. Data type: Array of Objects |
| observables.attributes | Field-value pairs containing attribute data about the observable. Attributes are specific to an observable type, such as the AS number for an IP address or the socket type for a network. All attributes for all observable types are supported. For a complete list of valid attributes, see the Observable attributes section below. Data type: Object |
| observables.<field> | Name-value pairs containing general data about the observable. The fields that can be provided in this parameter are common to all observable types. The type and value fields are required for all observables. Remarque : Follow these guidelines for providing values:
Valid fields:
Data type: String Table: Observable Source [sn_sec_tisc_observable_source] |
| source | Required. Source that originally detected the observables, such as a SIEM system. The source is used for all observables listed in the API request. Data type: String Stored in: Sources provided in the request body are added to the API Integration [sn_sec_tisc_api_integration] table. |
Headers
The following request and response headers apply to this HTTP action only, or apply to this action in a distinct way. For a list of general headers used in the REST API, see Supported REST API headers.
| Header | Description |
|---|---|
| Accept | Data format of the response body. Only supports application/json. |
| Content-Type | Data format of the request body. Only supports application/json. |
| Header | Description |
|---|---|
| None |
Status codes
The following status codes apply to this HTTP action. For a list of possible status codes used in the REST API, see REST API HTTP response codes.
| Status code | Description |
|---|---|
| 200 | Successful. The request was successfully processed. |
| 400 | Bad request. The request parameters are invalid or the request body JSON has a syntactical error. To view details about the error, see the error parameter in the response body. |
| 401 | Unauthorized. The user authentication is invalid. Check the user name and password or OAuth token. |
| 403 | Forbidden. The calling user is missing a required role. The sn_sec_tisc.api_obs_write_access role is required to access this endpoint. |
| 429 | Too many requests. The number of API requests exceeds the rate limit for the API. By default, the limit is 100 requests per hour. |
| 500 | Internal server error. Check application logs in the Log [syslog] table for more information about the error. |
Response body parameters (JSON)
| Name | Description |
|---|---|
| error | Error information. This parameter is only returned if the request failed. Data type: Object |
| error.message | Error message containing the reason the request failed. Data type: String |
| error.detail | Additional details about why the request failed. Data type: String |
| error_records | Details about the observables included in the request that couldn't be added to TISC. Data type: Array of Objects |
| error_records.error_message | Error message that explains why a record couldn't be created for the observable. Data type: String |
| error_records.type | Type of observable. For a complete list of valid observable types, see the Value field in the Observable Type [sn_sec_tisc_observable_type] table, or the Observable attributes section below. Data type: String |
| error_records.value | Value associated with the observable, such as an IP address or URL. Data type: String |
| metadata | Metadata about the number of records created by the API request. Data type: Object |
| metadata.error_records | Number of observables included in the request that couldn't be added to TISC. Data type: Number |
| metadata.success_records | Number of observable records that were successfully created in TISC. Data type: Number |
| metadata.total_records | Total number of observables included in the request. Data type: Number |
| status | Status of the API request. Possible values:
Data type: String |
| success_records | Details about the observable records that were successfully created. Data type: Array of Objects |
| success_records.sys_id | Sys_id of the observable record. Data type: String |
| success_records.type | Type of observable. For a complete list of valid observable types, see the Value field in the Observable Type [sn_sec_tisc_observable_type] table, or the Observable attributes section below. Data type: String |
| success_records.value | Value associated with the observable, such as an IP address or URL. Data type: String |
Observable attributes
| Observable type | Attributes | Data type |
|---|---|---|
| artifact | decryption_key | String |
| encryption_algorithm | String | |
| md5_hash | String | |
| mime_type | String | |
| sha1_hash | String | |
| sha256_hash | String | |
| sha512_hash | String | |
| url | String | |
| autonomous_system_number | name | String |
| rir | String | |
| directory | directory_creation_time | Date |
| directory_last_accessed_time | Date | |
| directory_last_modified_time | Date | |
| encoded_path | String | |
| domain_name | is_fqdn (Fully qualified domain name) |
Boolean |
| resolves_to | String | |
| email_address | display_name | String |
| email_message | email_body | String |
| email_recipients_bcc | String | |
| email_recipients_cc | String | |
| email_recipients_to | String | |
| email_sender | String | |
| email_subject | String | |
| sent_date | Date | |
| email_subject | None | |
| file | encoded_file_name | String |
| file_created_time | Date | |
| file_last_accessed_time | Date | |
| file_last_modified_time | Date | |
| file_name | String | |
| magic_number | String | |
| md5_hash | String | |
| mime_type | String | |
| sha1_hash | String | |
| sha256_hash | String | |
| sha512_hash | String | |
| ip_v4_address | as_number | String |
| mac_address | String | |
| ip_v4_cidr | as_number | String |
| mac_address | String | |
| ip_v6_address | as_number | String |
| mac_address | String | |
| ip_v6_cidr | as_number | String |
| mac_address | String | |
| mac_address | None | |
| md5_hash | None | |
| mutex_name | None | |
| network | destination_bytes_count | Integer |
| destination_packets_count | Integer | |
| destination_port | ||
| end_time | Date | |
| http_message_body_length | Integer | |
| http_request_header | String | |
| http_request_method | String | |
| http_request_value | String | |
| http_request_version | String | |
| network_source | String | |
| network_destination | String | |
| icmp_code_byte | String | |
| icmp_type_byte | String | |
| is_network_active | Boolean | |
| is_socket_blocking | Boolean | |
| is_socket_listening | Boolean | |
| network_protocols | String | |
| socket_address_family | String Possible values:
|
|
| socket_descriptor | Integer | |
| socket_handle | Integer | |
| socket_options | String | |
| socket_type | String Possible values:
|
|
| source_bytes_count | Integer | |
| source_packets_count | Integer | |
| source_port | String | |
| start_time | Date | |
| tcp_destination_flags | String | |
| tcp_source_flags | String | |
| other | None | |
| process | aslr_enabled | Boolean |
| command_line | String | |
| cwd (Current Working Directory) |
String | |
| dep_enabled | Boolean | |
| environment_variables | String | |
| is_hidden | Boolean | |
| owner_sid | String | |
| pid (Process ID) |
String | |
| priority | String | |
| process_created_time | Date | |
| service_descriptions | String | |
| service_display_name | String | |
| service_group_name | String | |
| service_name | String | |
| service_start_type | String Possible values:
|
|
| service_status | String Possible values:
|
|
| service_type | String Possible values:
|
|
| startup_info | String | |
| windows_integrity_level | String Possible values:
|
|
| window_title | String | |
| sha1_hash | None | |
| sha256_hash | None | |
| sha512_hash | None | |
| software | cpe (Common Platform Enumeration) |
String |
| supported_languages | String | |
| swid (Software Identification) |
String | |
| vendor | String | |
| version | String | |
| url | None | |
| user_account | account_created_time | Date |
| account_expiry_time | Date | |
| account_type | String | |
| can_escalate_privileges | Boolean | |
| credentials_last_changed_time | Date | |
| display_name | String | |
| first_login_time | Date | |
| is_account_disabled | Boolean | |
| is_privileged | Boolean | |
| is_service_account | Boolean | |
| last_login_time | Date | |
| account_login | String | |
| user_id | String | |
| windows_registry_key | key_modified_time | Date |
| registry_value | String | |
| subkeys_count | Integer | |
| x509_certificate | authority_key_identifier | String |
| basic_constraints | String | |
| certificate_policies | String | |
| crl_distribution_points | String | |
| extended_key_usage | String | |
| inhibit_any_policy | String | |
| issuer | String | |
| issuer_alternative_name | String | |
| is_self_signed | Boolean | |
| key_usage | String | |
| name_constraints | String | |
| policy_constraints | String | |
| policy_mappings | String | |
| private_key_usage_valid_from | Date | |
| private_key_usage_valid_until | Date | |
| signature_algorithm | String | |
| subject | String | |
| subject_alternative_name | String | |
| subject_directory_attributes | String | |
| subject_key_identifier | String | |
| subject_public_key_algorithm | String | |
| subject_public_key_exponent | Integer | |
| subject_public_key_modulus | String | |
| valid_from | Date | |
| valid_until | Date | |
| version | String |
cURL request
This example request contains three observables to create records for in TISC.
curl 'http://instance.servicenow.com/api/sn_sec_tisc/v1/threat_intel_data/add_observables' \
--request POST \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic YWRtaW46YWRtaW4=' \
--data '{
"source": "Sentinel",
"observables": [
{
"value": "1.2.1.45",
"type": "ip_v4_address",
"reputation": "malicious",
"confidence": "90",
"tags": "critical,important",
"taxonomies": "MITRE: T121",
"attack_phases": "Lockheed Martin: Reconnaissance",
"usage_categories": "Infected Bot",
"first_seen": "2023-10-14T18:01:34.000Z",
"attributes": {
"as_number": "14280"
}
},
{
"value": "https://example.com",
"type": "url",
"tags": "important",
"confidence": "50",
"reputation": "malicious"
},
{
"value": "1.1.1.1",
"type": "ip_add",
"confidence": "50",
"reputation": "malicious"
}
]
}'
Two of the three observables were successfully added to TISC. One record wasn't created because the observable type is invalid.
{
"status": "partial_success",
"metadata": {
"total_records": 3,
"success_records": 2,
"error_records": 1
},
"success_records": [
{
"value": "1.2.1.45",
"type": "ip_v4_address",
"sys_id": "e519392643e642102164e0ea78b8f29d"
},
{
"value": "https://example.com",
"type": "url",
"sys_id": "ad1979ae43ea42102164e0ea78b8f241"
}
],
"error_records": [
{
"value": "1.1.1.1",
"type": "ip_va",
"error_message": "The 'type' field value is invalid"
}
]
}
TISC API - POST /sn_sec_tisc/threat_intel_data/observables
Retrieves observables data, including relationships between observables and other threat intelligence data such as Structured Threat Information Expression (STIX) objects.
Observables returned in the response are sorted by sys_id in ascending order.
For more information about observables and STIX objects, see IoC Repository.
To access this endpoint, the caller must have the sn_sec_tisc.api_obs_read_access role, which by default is included in the Threat Intelligence administrator role (sn_sec_tisc.admin).
URL format
Versioned URL: /api/sn_sec_tisc/{api_version}/threat_intel_data/observables
Default URL: /api/sn_sec_tisc/threat_intel_data/observables
Supported request parameters
| Name | Description |
|---|---|
| api_version | Optional. Version of the endpoint to access. For example, v1 or v2. Only specify this value to use an endpoint version other than the
latest.
Data type: String |
| Name | Description |
|---|---|
| None |
| Name | Description |
|---|---|
| included_fields | Fields to return for observables, observable references, and STIX objects in the response. Different fields can be returned for observables, references, and each type of STIX object. ServiceNow system fields, except for sys_created_on, sys_updated_on, and sys_id, aren't returned in the response. Data type: Object |
| included_fields.observable | Fields to return for observables. Data type: Object Default: Returns the fields syd_id, type, and value for all observable types. |
| included_fields.observable.attributes | Fields to return for specified observable types. Data type: Object Default: No fields specific to an observable type are returned. Only the fields syd_id, type, and value are returned. |
| included_fields.observable.attributes.<observable_type> | Fields to return for an observable type. Data type: Object Replace |
| included_fields.observable.attributes.<observable_type>.include_all_fields | Flag that indicates whether to return all available fields for the observable type. Valid values:
Data type: Boolean |
| included_fields.observable.attributes.<observable_type>.values | List of fields to return for the observable type. Only use this parameter if the value of include_all_fields is false. Data type: Array of Strings The fields provided must be column_names from the table for the observable type. The following tables are used for observable types.
|
| included_fields.observable.common_fields | Fields to return for all observable types. The fields must be from the Observable [sn_sec_tisc_observable] table because they must be common to all observable types. Data type: Object Default: Returns the fields syd_id, type, and value for all observable types. |
| included_fields.observable.common_fields.include_all_fields | Flag that indicates whether to return all fields from the Observable [sn_sec_tisc_observable] table for all observable types. Valid values:
Data type: Boolean |
| included_fields.observable.common_fields.values | List of fields to return for all observable types. Only use this parameter if the value of common_fields.include_all_fields is false. Data type: Array of Strings The fields provided must be column names from the Observable [sn_sec_tisc_observable] table. |
| included_fields.reference | Fields to return for observable references. Observable references are external references used to describe pointers to information represented outside of STIX. Data type: Object Default: Returns the fields reference_source, sys_id, and url. |
| included_fields.reference.include_all_fields | Flag that indicates whether to return all available fields for observable references. Valid values:
Data type: Boolean |
| included_fields.reference.values | List of fields to return for observable references. Only use this parameter if the value of reference.include_all_fields is false. Data type: Array of Strings The fields provided must be column names from the Observable Reference [sn_sec_tisc_observable_reference] table. |
| included_fields.<stix_object> | Object containing fields to return for a STIX object type. Data type: Object Replace Valid STIX object types:
Default: Returns the fields id, name, and sys_id. |
| included_fields.<stix_object>.include_all_fields | Flag that indicates whether to return all available fields for the STIX object type. Valid values:
Data type: Boolean |
| included_fields.<stix_object>.values | List of fields to return for the STIX object type. Only use this parameter if the value of include_all_fields is false. Data type: Array of Strings The fields provided must be column_names from the table for the STIX object type. The following tables are used for STIX objects.
|
| observable_filters | Filters to apply to the observables. Only observables that match the filter criteria are returned in the response. Data type: Object Default: Empty object (no filters applied) |
| observable_filters.boolean_operator | Boolean operator to use for the filter conditions. Valid values:
Data type: String |
| observable_filters.filters | Filters to apply to the observables. Each filter object can be simple or complex.
Data type: Array of Objects |
| observable_filters.filters.field_name | Name of the field to use to filter the observables. Valid values:
Data type: String |
| observable_filters.filters.operator | Operator to use for the filter. For more information about operators, see Operators available for filters and queries. The data type of the filter field determines the valid operators. The following operators are valid for each data type.
Data type: String |
| observable_filters.filters.field_value | Value of the field. For choice fields, the value must be the internal value, not the display value. For date-time fields, the value must be in ISO format in the UTC timezone. Remarque : This parameter isn’t required
when using the ISEMPTY or ISNOTEMPTY operators. Data type: String |
| page_size | Limits the number of observables that are returned in the API response. Used for pagination. Data type: String Default: 100 Maximum value: 1000 |
| page_token | Used to get observables data for the current page. To get the first page, this parameter can be omitted or the value for this parameter must be an empty string. To get the next page in the following request, use the next_page_token value from the response body as the value for this parameter. Data type: String Default: Empty string |
| relationships | Relationship types to return for each observable in the response. The relationships can be with another observable, an observable reference, or a Structured Threat Information Expression (STIX) object. Valid values:
For example, passing the array Data type: Array Default: Empty array (no relationships returned) |
Headers
The following request and response headers apply to this HTTP action only, or apply to this action in a distinct way. For a list of general headers used in the REST API, see Supported REST API headers.
| Header | Description |
|---|---|
| Accept | Data format of the response body. Only supports application/json. |
| Content-Type | Data format of the request body. Only supports application/json. |
| Header | Description |
|---|---|
| None |
Status codes
The following status codes apply to this HTTP action. For a list of possible status codes used in the REST API, see REST API HTTP response codes.
| Status code | Description |
|---|---|
| 200 | Successful. The request was successfully processed. |
| 400 | Bad request. The request parameters are invalid or the request body JSON has a syntactical error. To view details about the error, see the error parameter in the response body. |
| 401 | Unauthorized. The user authentication is invalid. Check the user name and password or OAuth token. |
| 403 | Forbidden. The calling user is missing a required role. The sn_sec_tisc.api_obs_read_access role is required to access this endpoint. |
| 429 | Too many requests. The number of API requests exceeds the rate limit for the API. By default, the limit is 500 requests per hour. |
| 500 | Internal server error. Check application logs in the Log [syslog] table for more information about the error. |
Response body parameters (JSON)
| Name | Description |
|---|---|
| error | Error information. This parameter is only returned if the request failed. Data type: Object |
| error.message | Error message containing the reason the request failed. Data type: String |
| error.detail | Additional details about why the request failed. Data type: String |
| is_last_page | Flag that indicates whether this is the last page of observables data. Valid values:
Data type: Boolean |
| next_page_token | Use this value in the next API request to get the next page of observables data. Provide this value in the page_token parameter in the request body. Data type: String |
| observables | Observables objects. Data type: Array of Objects Each observables object also includes the fields specified by the included_fields.observable.common_fields parameter in the request body. |
| observables.attributes | Name-value pairs for the fields specified by the included_fields.observable.attributes.<observable_type> parameter in the request body. Data type: Object |
| observables.relationships | Relationships for the observable. The types of relationships returned are specified by the relationships parameter in the request body, and the fields returned for each relationship are specified by
the included_fields parameter in the request body. This example shows the basic structure of this parameter. However, the relationship types and fields returned vary based on the request body parameters. Data type: Object |
| observables.sys_id | Sys_id of the observable. Data type: String Table: Observable [sn_sec_tisc_observable] |
| observables.type | Type of observable. For a complete list of valid observable types, see the Value field in the Observable Type [sn_sec_tisc_observable_type] table. Data type: String |
| observables.value | Value associated with the observable, such as an IP address or URL. Data type: String |
| origin | Origin application of the response, which is Threat Intelligence Security Center (TISC). The value of this parameter is sn_sec_tisc.This value can optionally be used by SIEMs consuming the API response to trace whether the intelligence from TISC resulted in the creation of security incidents. Data type: String |
| page_size | Maximum number of observables returned in the response. Used for pagination. Data type: String |
| status | Status of the API request. Possible values:
If the request failed, see the error parameter in the response body for more information about the error. Data type: String |
cURL request
This example returns the first page of observables data. The observable_filters parameter specifies to return only observables that match the condition status = active AND [threat_score >= 70 OR
confidence >= 50].
curl 'http://instance.servicenow.com/api/sn_sec_tisc/v1/threat_intel_data/observables' \
--request POST \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic YWRtaW46YWRtaW4=' \
--data '{
"page_size": "100",
"page_token": "",
"relationships": [
"observable",
"threat_actor",
"indicator",
"reference",
"attack_pattern"
],
"included_fields": {
"observable": {
"common_fields": {
"include_all_fields": false,
"values": [
"value",
"reputation",
"confidence"
]
},
"attributes": {
"ip_v4_address": {
"include_all_fields": false,
"values": [
"as_number"
]
},
"artifact": {
"include_all_fields": false,
"values": [
"mime_type",
"encryption_algorithm"
]
}
}
},
"threat_actor": {
"include_all_fields": false,
"values": [
"name",
"aliases",
"description",
"threat_actor_roles"
]
},
"attack_pattern": {
"include_all_fields": true
},
"indicator": {
"include_all_fields": false,
"values": [
"name",
"pattern",
"pattern_type",
"indicator_types"
]
},
"reference": {
"include_all_fields": true,
"values": [
"description"
]
}
},
"observable_filters": {
"boolean_operator": "AND",
"filters": [
{
"field_name": "status",
"operator": "=",
"field_value": "active"
},
{
"boolean_operator": "OR",
"filters": [
{
"field_name": "threat_score",
"operator": ">=",
"field_value": "70"
},
{
"field_name": "confidence",
"operator": ">=",
"field_value": "50"
}
]
}
]
}
}'
Response body.
{
"status": "success",
"observables": [
{
"sys_id": "792e3d1543a0421060eee0ea78b8f227",
"type": "url",
"value": "https://www.example.com",
"confidence": "60",
"reputation": "",
"relationships": {
"observable": [
{
"sys_id": "ccadb19143a0421060eee0ea78b8f25a",
"type": "ip_v4_address",
"value": "1.1.1.1",
"confidence": "20",
"reputation": "malicious"
}
],
"indicator": [
{
"id": "indicator--294d97754364c21060eee0ea78b8f2ae",
"indicator_types": "",
"name": "Poison Ivy",
"pattern": "",
"pattern_type": "sigma",
"sys_id": "a54d97754364c21060eee0ea78b8f2ae",
"type": "indicator"
}
],
"attack_pattern": [
{
"name": "Phishing",
"sys_id": "010d5bf14364c21060eee0ea78b8f2ac",
"id": "attack-pattern--810d5bf14364c21060eee0ea78b8f2ac",
"type": "attack-pattern"
}
],
"reference": [
{
"description": "phishing",
"reference_source": "CAPEC-98",
"sys_created_on": "2024-02-25T03:34:45.000Z",
"sys_id": "a42d97354364c21060eee0ea78b8f28c",
"sys_updated_on": "2024-02-25T03:34:45.000Z",
"url": " https://capec.mitre.org/data/98.html "
}
]
},
"attributes": {
"encryption_algorithm": "mime-type-indicated",
"mime_type": "application/zip"
}
},
{
"sys_id": "ccadb19143a0421060eee0ea78b8f2242",
"type": "ip_v4_address",
"value": "1.2.2.1",
"confidence": "70",
"reputation": "",
"relationships": {}
},
{
"sys_id": "7ccd359143a0421060eee0ea78b8f264",
"type": "artifact",
"value": "pom.xml",
"confidence": "",
"reputation": "",
"relationships": {}
}
],
"page_size": "100",
"next_page_token": "drejvfgbresg|7ccd359143a0421060eee0ea78b8f264",
"is_last_page": true,
"origin": "sn_sec_tisc"
}