User Guide
Synapse-SpyCloud User Guide
Synapse-Spycloud adds additional Storm commands for querying the Spycloud API using your existing API key to retrieve breach records and compromised accounts. For more information on how SpyCloud models breach data see SpyCloud Data Schema.
Getting Started
Check with your Global Admin to enable permissions and find out if you need a personal API key.
Examples
Adding your personal configuration
API keys are stored in configurations. SpyCloud is three separately licensed products,
so a configuration is created for one product at a time: consumer,
investigative, or enterprise.
To add a personal configuration for the Investigations API:
> spycloud.config.add investigative mine myapikey --scope self
Synapse-SpyCloud investigative config "mine" added
The configurations you can access are listed with:
> spycloud.config.list
type | name | scope | owner
=================|===========================|============|==========================================
investigative | mine | user | root
Each command uses the configuration for its own product, so no configuration needs to
be selected when only one exists. Where several do, --config selects one by name:
inet:user=cb2d@la | spycloud.investigations --config mine --yield
Enrich an inet:user to discover compromised credentials
> inet:user=cb2d@la | spycloud.investigations --yield
it:account=2d4e339ad0a3cd39a9c317a687279968
.created = 2026/10/15 19:23:40.757
.seen = ('2021/03/25 00:00:00.000', '2021/03/25 00:00:00.001')
:contact = 7eefea44247c7174d1b49d7ba42a701e
:user = cb2d@la
You may also use the yielded it:account nodes in subsequent storm operations. For example, you
may pivot directly to the compromised credentials for the yielded results:
> inet:user=cb2d@la | spycloud.investigations --yield | -> auth:creds
WARNING: https://api.spycloud.io/investigations-v2/breach/data/usernames/cb2d@la/ HTTP: 403 Forbidden.
Once the command has completed, the results from the SpyCloud Investigations API have been fused with the
rest of your existing knowledge about the inet:user. Subsequent queries will allow you to explore that
knowledge holistically, for example:
> inet:user=cb2d@la -> it:account -> auth:creds
auth:creds=540c68c88c2323b0bfd0fd6b7a3eb595
.created = 2026/10/15 19:23:40.757
.seen = ('2021/03/25 00:00:00.000', '2021/03/25 00:00:00.001')
:account = 2d4e339ad0a3cd39a9c317a687279968
:passwd = a937
:user = cb2d@la
The spycloud.investigations command may add additional nodes such as it:host and it:fs:file when
context is available, all of which are automatically linked to the it:account node.
Additional input forms
In addition to the forms shown above, spycloud.investigations accepts the following input forms:
econ:bank:account, econ:pay:pan, gov:us:ssn, hash:sha256, it:host,
ou:id:number, and transport:land:license.
For forms that use a secondary property as the lookup value, the property is extracted automatically. Three forms apply preprocessing before querying:
Credit card PANs are SHA1-hashed before the API call:
econ:pay:pan=4111111111111111 | spycloud.investigations --yield
SSNs are zero-padded to nine digits and SHA1-hashed before the API call:
gov:us:ssn=123456789 | spycloud.investigations --yield
For ou:id:number, the endpoint (National ID or Passport) is determined by the
ou:id:type:name property of the associated type node. Pivot from the type node
by name to enrich all IDs of that type:
ou:id:type +:name=passport -> ou:id:number | spycloud.investigations --yield
ou:id:type +:name="national-id" -> ou:id:number | spycloud.investigations --yield
The it:host form queries by infected machine ID using the :ext:id property:
it:host:ext:id=<machine-id> | spycloud.investigations --yield
Ingest breach records for your watchlist
The spycloud.enterprise.watchlist command retrieves breach records for the
domains, subdomains, email addresses, and IP addresses on your organization’s
SpyCloud watchlist. Unlike the other commands it takes no inbound nodes, and by
default retrieves records published in the last day.
This command uses an enterprise configuration:
> spycloud.config.add enterprise mine myapikey --scope self
Synapse-SpyCloud enterprise config "mine" added
> spycloud.enterprise.watchlist --since 2026-08-19 --yield
it:account=5f581aac3306e099ff8fd1a4d437cad0
.created = 2026/10/15 19:23:41.073
.seen = ('2026/08/19 14:12:58.000', '2026/08/19 14:12:58.001')
:contact = 17966a950ff112051df61e4d60a6c685
:user = fwong
it:account=969eb404ea0d13105d3cf525d3202141
.created = 2026/10/15 19:23:41.105
.seen = ('2026/08/19 09:41:02.000', '2026/08/19 09:41:02.001')
:contact = 23646e1945cbc81f9b66d42a3f2a06dc
The records are ingested exactly as they are for spycloud.investigations, so the
yielded it:account nodes may be used in subsequent Storm operations, and the rest
of the record is reachable from them afterwards:
> meta:feed -(found)> it:account -> auth:creds
auth:creds=2f4a6114fe8b88449d0ac2bf3ce4ba38
.created = 2026/10/15 19:23:41.072
.seen = ('2026/08/19 14:12:58.000', '2026/08/19 14:12:58.001')
:account = 5f581aac3306e099ff8fd1a4d437cad0
:passwd = kn0ttyPine!42
:user = fwong
auth:creds=7f19cc28b4704300eeb23171e1aad3a4
.created = 2026/10/15 19:23:41.105
.seen = ('2026/08/19 09:41:02.000', '2026/08/19 09:41:02.001')
:account = 969eb404ea0d13105d3cf525d3202141
:passwd = correcthorse
Results may be narrowed to a type of record, a type of watchlist entry, a severity, or a breach source:
spycloud.enterprise.watchlist --type infected --severity 25
spycloud.enterprise.watchlist --watchlist-type domain
The command creates a single meta:feed node representing the feed and links each
result to it with a -(found)> light edge. Repeated runs with the same filters reuse
that node.
Running the watchlist as a feed
The --since-last option retrieves only the records published since the previous
run, using the :latest property of the meta:feed node. It is only advanced when
every page of results was retrieved, so a failed request does not skip records.
The first run defines its starting point with --since, and subsequent runs resume
from :latest:
spycloud.enterprise.watchlist --since -30days --since-last
spycloud.enterprise.watchlist --since-last
To run the watchlist on a regular schedule, set up a cron job in Storm:
cron.add --name "SpyCloud Watchlist" --hour 3 { spycloud.enterprise.watchlist --since-last }
Only a single cron job using --since-last should be created per view for a given
set of filters, to avoid duplicate ingests.
The high-water mark may be inspected, or reset to re-ingest from a chosen point, on the feed node itself:
meta:feed:url="https://api.spycloud.io/enterprise-v2/breach/data/watchlist"
Use of meta:source nodes
Synapse-Spycloud uses a meta:source node and -(seen)> light
edges to track nodes observed from the SpyCloud API.
> meta:source=bcc6912a4688db874a0eaf78cfee212c
meta:source=bcc6912a4688db874a0eaf78cfee212c
.created = 2026/10/15 19:23:40.642
:name = spycloud api
Storm can be used to filter nodes to include/exclude nodes which have been observed by Synapse-SpyCloud. The following example shows how to filter the results of a query to include only results observed by Synapse-SpyCloud:
> inet:user=cb2d@la -> it:account +{ <(seen)- meta:source=bcc6912a4688db874a0eaf78cfee212c }
it:account=2d4e339ad0a3cd39a9c317a687279968
.created = 2026/10/15 19:23:40.757
.seen = ('2021/03/25 00:00:00.000', '2021/03/25 00:00:00.001')
:contact = 7eefea44247c7174d1b49d7ba42a701e
:user = cb2d@la