SecurityScout APIs
We have designed our APIs to give you access to all of the normalized IdP and MDM data that we have collected from your integrations.
These APIs are available under the Trial, ProBono, or Enterprise subscriptions.
A field can be given as a string to just search for the one value or an array to serach for any of the values in the array. e.g. {"source": ["Google Workspace", "Okta"]} will return all Google Workspace and Okta accounts.
1. Authentication
We use an X-API-KEY header to authenticate all requests API requests. This header is a combination of your tenant ID and your API key in the form of TENANT_ID:API_KEY
You can find this under Settings -> API on your tenant
It will look like: a12abcd1-1234-a3f1-a1a3-123456abc123:AKDJRISKD831K63K5K6L2KDKSL
This is to ensure you not only know which tenant you are making the API call to but that you have an API key that is valid for the tenant.
2. IdP Accounts
Normalized IdP Accounts
Get all of your accounts, normalized across your IdPs.
- integration (e.g. "okta", "google_workspace")
- source (e.g. "Okta", "Google Workspace")
- user_email (e.g. "user@company.com")
- status (e.g. "Active", "Disabled", "Suspended")
- mfa_enabled (true, false, or Unknown)
r=requests.get('https://app.securityscout.io/api/idp_accounts', headers={'X-API-KEY': 'TENANT_ID:API_KEY', 'Content-Type': 'application/json'}, json={'integration': ['okta', 'google_workspace'], 'user_email': 'someone@company.com'})
print(r.json())
"idp_accounts": [
"user_id": "19123912592295",
"user_link": "https://link.to.account/id",
"user_email": "person@company.com",
"aliases": ["person@company.tech"],
"title": "Content Marketing Manager",
"department": "Marketing",
"manager": "manager.person@company.com",
"user_name": "First Last",
"status": "ACTIVE",
"created": "2023-03-23T08:18:12",
"last_login": "2024-01-03T03:01:42",
"mfa_enabled": "true",
"mfa_options": "totp",
"roles": ["Administrator", "Reader"]
...
...
3. Devices
Normalized Devices
Get all of your devices, normalized across your MDMs.
- integration (e.g. "jamf")
- source (e.g. "Jamf")
- name (e.g. "matt-mbp2")
- serial_number (e.g. "N4K23KA9")
- user_email (e.g. "person@company.com")
- last_ip (e.g. "1.2.3.4")
r=requests.get('https://app.securityscout.io/api/devices', headers={'X-API-KEY':'TENANT_ID:API_KEY', 'Content-Type': 'application/json'}, json={'source': 'Jamf'})
print(r.json())
"devices": [
"mdm": "Jamf",
"device_id": "123",
"device_link": "https://mdm.source.com/{id}",
"name": "matt-123-macbook",
"serial_number": "KWEK12122K21L",
"user_email": "person@company.com",
"make": "Apple",
"model": "Macbook Pro",
"operating_system": "macOS",
"operating_system_version": "12.0.5",
"last_enrolled": "2023-01-11T04:03:31",
"last_contact": "2024-01-21T03:01:32",
"last_sync": "2024-01-21T03:01:32",
"last_ip": "1.2.3.4",
"last_ip_epp": "1.2.3.4"
...
...
4. Unmanaged Devices
Unmanaged Devices
Get all of your unmanaged devices and their details.
- serial_number (e.g. "N4K23KA9")
- current_owner (e.g. "person@company.com")
- make (e.g. "Apple", "Dell")
- model (e.g. "MacBook Pro", "Latitude 5420")
- last_owner (e.g. "person@company.com")
- last_hostname (e.g. "matt-mbp2")
- date_unmanaged (e.g. "2024-01-01")
- notes (e.g. "Device was replaced with newer model")
- last_updated (e.g. "2024-01-01T00:00:00")
- updated_by (e.g. "admin@company.io")
- current_status (e.g. "Decommissioned", "Sold")
- current_location (e.g. "Warehouse", "Sold")
r=requests.get('https://app.securityscout.io/api/devices_unmanaged', headers={'X-API-KEY':'TENANT_ID:API_KEY', 'Content-Type': 'application/json'}, json={'make': 'Apple', 'model': 'MacBook Pro'})
print(r.json())
"devices_unmanaged": [
"device_type": "Laptop",
"serial_number": "N4K23KA9",
"current_owner": "person@company.com",
"current_status": "Decommissioned",
"current_location": "Warehouse",
"make": "Apple",
"model": "MacBook Pro",
"last_owner": "person@company.com",
"last_hostname": "matt-mbp2",
"date_unmanaged": "2024-01-01",
"last_updated": "2024-01-01T00:00:00",
"updated_by": "admin@company.io",
"notes": "Device was replaced with newer model"
...
...
4. Endpoint Protection
Normalized Endpoint Protection
Get all of your endpoint protection data, normalized across your providers.
- source (e.g. "CrowdStrike")
- hostname (e.g. "LAPTOP-ABC123")
- serial_number (e.g. "ABC123XYZ")
- last_ip (e.g. "192.168.1.100")
- mdm_user_email (e.g. "bob@company.com")
r=requests.get('https://app.securityscout.io/api/endpoint_protection', headers={'X-API-KEY':'TENANT_ID:API_KEY', 'Content-Type': 'application/json'}, json={'source': 'CrowdStrike', 'hostname': 'LAPTOP-ABC123'})
print(r.json())
"endpoint_protection": [
"device_id": "abc123def456",
"device_link": "https://falcon.crowdstrike.com/hosts/details/abc123def456",
"hostname": "LAPTOP-ABC123",
"serial_number": "ABC123XYZ",
"last_user": "bob@company.com",
"mdm_user_email": "bob@company.com",
"first_seen": "2023-01-01T12:00:00",
"last_seen": "2023-06-15T15:30:00",
"last_ip": "10.0.0.123",
"product_type": "Workstation",
"chassis_type": "laptop",
"make": "Dell",
"model": "Latitude 5420"
...
...
5. Cloud IAM
Normalized Cloud IAM
Get all of your cloud IAM permissions, normalized across your cloud providers.
- source (e.g. "AWS Identity Center", "Google Cloud", "Microsoft Azure")
- environment_name (e.g. "my-project")
- environment_id (e.g. "my-project")
- environment_type (e.g. "Project", "Management Group", "Subscription")
- member_or_principal (e.g. "person@company.com")
- role_or_permission_set (e.g. "roles/cloudsql.client")
- user (e.g. "bob@company.com")
r=requests.get('https://app.securityscout.io/api/cloud_iam', headers={'X-API-KEY':'TENANT_ID:API_KEY', 'Content-Type': 'application/json'}, json={'source': 'Google Cloud'})
print(r.json())
"cloud_iam": [
"integration": "Google Cloud Platform",
"environment_name": "my-project",
"environment_id": "my-project",
"environment_type": "Project",
"member_or_principal_type": "USER",
"member_or_principal": "person@company.com",
"role_or_permission_set": "roles/cloudsql.client",
"inherited_from": "company.com",
"user": "bob@company.com",
"user_is_active": "true",
"iam_link": "https://console.cloud.google.com/iam-admin/iam?project=my-project",
"member_link": "",
"resource": "specific-instance",
"resource_link": "https://portal.azure.com/#@tenant.onmicrosoft.com/resource/subscriptions/ffffffff-ffff-ffff-ffff-ffffffffffff/resourceGroups/specific-instance"
...
...
6. Alerts
Current Alerts
Get all of your current alerts and details.
- severity (e.g. "critical", "high", "medium", "low")
- issue (e.g. "Device assigned to unknown user")
- include_ignored_alerts (defaulted to "false" so that ignored alerts are not included)
r=requests.get('https://app.securityscout.io/api/alerts', headers={'X-API-KEY':'TENANT_ID:API_KEY', 'Content-Type': 'application/json'}, json={'severity': 'high'})
print(r.json())
"alerts": [
"issue": "Azure device is not managed",
"summary_text": "user-pc (ID: 1234) is in Azure but is not managed",
"summary_html": "user-pc (ID: 1234) is in Azure but is not managed",
"summary_slack": "
"context_text": "The Dell Precision 5530 was registered 2021-06-11, last contacted the MDM 2023-11-12, and is assigned to user@company.com",
"context_html": "The Dell IPrecision 5530 was registered 2021-06-11, last contacted the MDM 2023-11-12, and is assigned to user@company.com",
"context_slack": "The Dell Precision 5530 was registered 2021-06-11, last contacted the MDM 2023-11-12, and is assigned to user@company.com"
...
...