Skip to content

API Reference ​

SPYDER exposes a REST API on the metrics port (default :9090) for runtime control, monitoring, and querying discovered data.

Interactive Reference ​

REST API for controlling and inspecting a running SPYDER DNS reconnaissance probe.
The API runs on the same port as the Prometheus metrics endpoint (default :9090).

All endpoints require a Bearer token in the Authorization header. Tokens are
scoped to one of three permission levels: read, write, or admin.
Admin scope is a superset of write, which is a superset of read.

Servers​

http://localhost:9090Default local instance

Control​


Submit a single domain for crawling​

POST
/api/v1/domains

Enqueues a single domain hostname into the crawl task channel. The domain will be picked up by the next available worker. Returns 503 if the task channel is full.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Request Body​

application/json
JSON
{
  
"host": "example.com"
}

Responses​

Domain accepted

application/json
JSON
{
  
"accepted": true,
  
"host": "example.com"
}

Playground​

Authorization
Body

Samples​


Submit multiple domains for crawling​

POST
/api/v1/domains/bulk

Enqueues multiple domains at once. Accepts JSON array or newline-delimited text/plain. Domains that cannot be enqueued (channel full) are counted as rejected.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Request Body​

JSON
[
  
[
  
  
"example.com",
  
  
"acme.org"
  
]
]

Responses​

Bulk submission result

application/json
JSON
{
  
"accepted": 2,
  
"rejected": 0,
  
"total": 2
}

Playground​

Authorization
Body

Samples​


Pause all crawl workers​

POST
/api/v1/control/pause

Pauses all workers in the pool. Workers finish their current task but do not pick up new ones until resumed.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Workers paused

application/json
JSON
{
  
"status": "paused"
}

Playground​

Authorization

Samples​


Resume paused crawl workers​

POST
/api/v1/control/resume

Resumes all paused workers so they begin pulling tasks from the queue again.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Workers resumed

application/json
JSON
{
  
"status": "resumed"
}

Playground​

Authorization

Samples​


Gracefully stop the probe process​

POST
/api/v1/control/stop

Initiates a graceful shutdown of the entire SPYDER process by cancelling the root context. The response is sent before shutdown begins.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Stop initiated

application/json
JSON
{
  
"status": "stopping"
}

Playground​

Authorization

Samples​


Config​

Read and hot-patch runtime configuration


Get the current runtime configuration snapshot​

GET
/api/v1/config

Returns the full current runtime configuration as a JSON object, including all nested sections (crawling, batch, output, etc.).

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Current configuration

application/json
JSON
{
  
"domains": "string",
  
"probe": "local-1",
  
"run": "run-1741824000",
  
"ua": "string",
  
"exclude_tlds": [
  
  
"string"
  
],
  
"crawling": {
  
  
"continuous": true,
  
  
"max_domains": 0,
  
  
"concurrency": 256,
  
  
"rate_per_host": 1,
  
  
"rate_burst": 1,
  
  
"http_timeout": "15s",
  
  
"tls_timeout": "8s",
  
  
"body_max_bytes": 524288
  
},
  
"batch": {
  
  
"max_edges": 10000,
  
  
"flush_interval": "2s",
  
  
"node_threshold_ratio": 0.5,
  
  
"channel_buffer": 1024
  
},
  
"output": {
  
  
"format": "json",
  
  
"ingest": "",
  
  
"spool_dir": "spool"
  
},
  
"circuit_breaker": {
  
  
"max_requests": 3,
  
  
"interval": "60s",
  
  
"timeout": "30s",
  
  
"threshold": 5,
  
  
"failure_ratio": 0.6
  
},
  
"http_client": {
  
  
"timeout": "15s",
  
  
"response_header_timeout": "10s",
  
  
"idle_conn_timeout": "30s",
  
  
"max_idle_conns": 1024,
  
  
"max_conns_per_host": 128
  
},
  
"robots": {
  
  
"cache_size": 4096,
  
  
"cache_ttl": "24h0m0s"
  
},
  
"dedup": {
  
  
"ttl": "24h0m0s"
  
},
  
"redis": {
  
  
"addr": "localhost:6379",
  
  
"queue_addr": "string",
  
  
"queue_key": "spyder:queue",
  
  
"queue_lease_ttl": "2m0s"
  
},
  
"mongodb": {
  
  
"uri": "mongodb://localhost:27017",
  
  
"database": "spyder"
  
},
  
"telemetry": {
  
  
"metrics_addr": ":9090",
  
  
"otel_endpoint": "string",
  
  
"otel_insecure": true,
  
  
"otel_service": "spyder-probe"
  
},
  
"logging": {
  
  
"level": "info",
  
  
"quiet": true,
  
  
"verbose": true,
  
  
"progress": true
  
},
  
"api": {
  
  
"rate_limit": 100,
  
  
"rate_burst": 20,
  
  
"keys": [
  
  
  
{
  
  
  
  
"key": "spyder_a1b2c3...",
  
  
  
  
"name": "ci-pipeline",
  
  
  
  
"scope": "write"
  
  
  
}
  
  
]
  
}
}

Playground​

Authorization

Samples​


Hot-patch runtime configuration​

PATCH
/api/v1/config

Applies a partial configuration update. Tier 1 fields are applied immediately, Tier 2 fields produce warnings, and Tier 3 fields (e.g. Redis, mTLS) are rejected as they require a restart.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Request Body​

application/json
JSON
{
  
"ua": "string",
  
"exclude_tlds": [
  
  
"string"
  
],
  
"crawling": {
  
  
"concurrency": 0,
  
  
"rate_per_host": 0,
  
  
"rate_burst": 0,
  
  
"max_domains": 0,
  
  
"continuous": true,
  
  
"http_timeout": "string",
  
  
"tls_timeout": "string",
  
  
"body_max_bytes": 0
  
},
  
"batch": {
  
  
"max_edges": 0,
  
  
"flush_interval": "string",
  
  
"node_threshold_ratio": 0
  
},
  
"output": {
  
  
"format": "string",
  
  
"ingest": "string",
  
  
"spool_dir": "string"
  
},
  
"api": {
  
  
"rate_limit": 0,
  
  
"rate_burst": 0
  
},
  
"logging": {
  
  
"level": "string"
  
},
  
"redis": {
  
  
"addr": "string",
  
  
"queue_addr": "string"
  
},
  
"mtls": {
  
  
"cert": "string",
  
  
"key": "string",
  
  
"ca": "string"
  
},
  
"mongodb": {
  
  
"uri": "string",
  
  
"database": "string"
  
},
  
"telemetry": {
  
  
"metrics_addr": "string"
  
}
}

Responses​

Updated configuration and any warnings

application/json
JSON
{
  
"config": {
  
  
"domains": "string",
  
  
"probe": "local-1",
  
  
"run": "run-1741824000",
  
  
"ua": "string",
  
  
"exclude_tlds": [
  
  
  
"string"
  
  
],
  
  
"crawling": {
  
  
  
"continuous": true,
  
  
  
"max_domains": 0,
  
  
  
"concurrency": 256,
  
  
  
"rate_per_host": 1,
  
  
  
"rate_burst": 1,
  
  
  
"http_timeout": "15s",
  
  
  
"tls_timeout": "8s",
  
  
  
"body_max_bytes": 524288
  
  
},
  
  
"batch": {
  
  
  
"max_edges": 10000,
  
  
  
"flush_interval": "2s",
  
  
  
"node_threshold_ratio": 0.5,
  
  
  
"channel_buffer": 1024
  
  
},
  
  
"output": {
  
  
  
"format": "json",
  
  
  
"ingest": "",
  
  
  
"spool_dir": "spool"
  
  
},
  
  
"circuit_breaker": {
  
  
  
"max_requests": 3,
  
  
  
"interval": "60s",
  
  
  
"timeout": "30s",
  
  
  
"threshold": 5,
  
  
  
"failure_ratio": 0.6
  
  
},
  
  
"http_client": {
  
  
  
"timeout": "15s",
  
  
  
"response_header_timeout": "10s",
  
  
  
"idle_conn_timeout": "30s",
  
  
  
"max_idle_conns": 1024,
  
  
  
"max_conns_per_host": 128
  
  
},
  
  
"robots": {
  
  
  
"cache_size": 4096,
  
  
  
"cache_ttl": "24h0m0s"
  
  
},
  
  
"dedup": {
  
  
  
"ttl": "24h0m0s"
  
  
},
  
  
"redis": {
  
  
  
"addr": "localhost:6379",
  
  
  
"queue_addr": "string",
  
  
  
"queue_key": "spyder:queue",
  
  
  
"queue_lease_ttl": "2m0s"
  
  
},
  
  
"mongodb": {
  
  
  
"uri": "mongodb://localhost:27017",
  
  
  
"database": "spyder"
  
  
},
  
  
"telemetry": {
  
  
  
"metrics_addr": ":9090",
  
  
  
"otel_endpoint": "string",
  
  
  
"otel_insecure": true,
  
  
  
"otel_service": "spyder-probe"
  
  
},
  
  
"logging": {
  
  
  
"level": "info",
  
  
  
"quiet": true,
  
  
  
"verbose": true,
  
  
  
"progress": true
  
  
},
  
  
"api": {
  
  
  
"rate_limit": 100,
  
  
  
"rate_burst": 20,
  
  
  
"keys": [
  
  
  
  
{
  
  
  
  
  
"key": "spyder_a1b2c3...",
  
  
  
  
  
"name": "ci-pipeline",
  
  
  
  
  
"scope": "write"
  
  
  
  
}
  
  
  
]
  
  
}
  
},
  
"warnings": [
  
  
[
  
  
]
  
]
}

Playground​

Authorization
Body

Samples​


Stats​

Aggregate statistics and history from the hub


Get aggregate crawl statistics​

GET
/api/v1/stats

Returns aggregate hub statistics including total batches processed, edges, domains, IPs, and certificates seen.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Current stats snapshot from the hub

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Authorization

Samples​


Get batch event history​

GET
/api/v1/stats/history

Returns the recent batch history ring buffer from the hub, ordered newest first.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Array of recent batch events

application/json
JSON
[
  
{
  
  
"additionalProperties": "string"
  
}
]

Playground​

Authorization

Samples​


Get high-level probe status​

GET
/api/v1/status

Returns a combined status snapshot including uptime, worker pool state, pending emitter counts, and discovery progress.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Probe status overview

application/json
JSON
{
  
"uptime_seconds": 3600.5,
  
"workers": {
  
  
"active": 128,
  
  
"idle": 128,
  
  
"total": 256,
  
  
"paused": false
  
},
  
"pending_edges": 42,
  
"pending_nodes": 17,
  
"discovered": 1500
}

Playground​

Authorization

Samples​


Workers​

Worker pool inspection and scaling


Get worker pool statistics​

GET
/api/v1/workers

Returns the current worker pool statistics: target count, active count, and paused state.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Worker pool stats

application/json
JSON
{
  
"active": 128,
  
"idle": 128,
  
"total": 256,
  
"paused": false
}

Playground​

Authorization

Samples​


Scale the worker pool to a target count​

POST
/api/v1/workers/scale

Dynamically scales the worker pool to the specified count. Workers are added or drained gracefully.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Request Body​

application/json
JSON
{
  
"count": 128
}

Responses​

Scaling result

application/json
JSON
{
  
"scaled_to": 128,
  
"workers": {
  
  
"active": 128,
  
  
"idle": 128,
  
  
"total": 256,
  
  
"paused": false
  
}
}

Playground​

Authorization
Body

Samples​


Breakers​


List all circuit breaker states​

GET
/api/v1/breakers

Returns circuit breaker state for all known hosts, including current state (closed/open/half-open) and failure counts.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Map of host to circuit breaker state

application/json
JSON
{
  
"additionalProperties": {
  
  
"state": "closed",
  
  
"failures": 0,
  
  
"successes": 42,
  
  
"requests": 42
  
}
}

Playground​

Authorization

Samples​


Reset all circuit breakers​

POST
/api/v1/breakers/reset

Resets all circuit breakers to the closed state, allowing requests to resume to previously-failing hosts.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

All breakers reset

application/json
JSON
{
  
"reset": "all",
  
"count": 5
}

Playground​

Authorization

Samples​


Reset a single circuit breaker by host​

POST
/api/v1/breakers/{host}/reset

Resets the circuit breaker for a specific host back to the closed state.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Parameters​

Path Parameters

host*
Type
string
Required
Example"example.com"

Responses​

Breaker reset

application/json
JSON
{
  
"reset": "example.com"
}

Playground​

Authorization
Variables
Key
Value

Samples​


RateLimits​

Per-host rate limit inspection and adjustment


Get per-host rate limit configuration and active hosts​

GET
/api/v1/ratelimits

Returns the global per-host rate limit configuration and per-host limiter statistics.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Current rate limit settings and per-host stats

application/json
JSON
{
  
"per_host_rate": 1,
  
"per_host_burst": 5,
  
"hosts": {
  
  
"additionalProperties": {
  
  
}
  
}
}

Playground​

Authorization

Samples​


Update global per-host rate limit settings​

PUT
/api/v1/ratelimits

Updates the global per-host rate limit and burst values. Also patches the runtime config to persist the change.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Request Body​

application/json
JSON
{
  
"rate_per_host": 2,
  
"rate_burst": 10
}

Responses​

Updated rate limit settings

application/json
JSON
{
  
"rate_per_host": 0,
  
"rate_burst": 0
}

Playground​

Authorization
Body

Samples​


Notify that a per-host rate limiter will expire via TTL​

POST
/api/v1/ratelimits/{host}/reset

Per-host rate limiter entries expire automatically via TTL and cannot be individually reset.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Parameters​

Path Parameters

host*
Type
string
Required
Example"example.com"

Responses​

Informational response

application/json
JSON
{
  
"message": "string",
  
"host": "string"
}

Playground​

Authorization
Variables
Key
Value

Samples​


Dedup​

Deduplication cache inspection and management


Check whether a dedup key has been seen​

GET
/api/v1/dedup/{key}

Checks whether a given deduplication key has been seen. The call itself marks the key as seen (side effect of the Seen() method).

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Parameters​

Path Parameters

key*
Type
string
Required
Example"domain|example.com"

Responses​

Dedup check result

application/json
JSON
{
  
"key": "string",
  
"seen": true
}

Playground​

Authorization
Variables
Key
Value

Samples​


Delete a specific dedup key​

DELETE
/api/v1/dedup/{key}

Removes a single key from the dedup store. Only supported by backends that implement the Delete interface.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Parameters​

Path Parameters

key*
Type
string
Required

Responses​

Key deleted

application/json
JSON
{
  
"deleted": "string"
}

Playground​

Authorization
Variables
Key
Value

Samples​


Clear all dedup entries (admin only)​

DELETE
/api/v1/dedup

Clears the entire dedup store. Only supported by backends that implement the Clear interface. Admin scope required.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Dedup store cleared

application/json
JSON
{
  
"cleared": true
}

Playground​

Authorization

Samples​


Robots​

robots.txt cache status


Get robots.txt cache status​

GET
/api/v1/robots

Returns the status of the robots.txt LRU cache. Individual entries cannot be listed.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Cache status message

application/json
JSON
{
  
"message": "string",
  
"status": "active"
}

Playground​

Authorization

Samples​


Attempt to clear the robots.txt cache (TTL-based; informational)​

DELETE
/api/v1/robots

Robots cache entries expire via TTL; explicit clear is not currently supported.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Informational response

application/json
JSON
{
  
"message": "string"
}

Playground​

Authorization

Samples​


Spool​

Spool directory inspection and management


List spooled batch files​

GET
/api/v1/spool

Lists all files in the spool directory (failed batch deliveries awaiting retry), with file names, sizes, and timestamps.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Spool directory listing

application/json
JSON
{
  
"spool_dir": "spool",
  
"count": 3,
  
"files": [
  
  
{
  
  
  
"name": "string",
  
  
  
"size": 0,
  
  
  
"modified": "string"
  
  
}
  
]
}

Playground​

Authorization

Samples​


Delete all spooled batch files​

DELETE
/api/v1/spool

Deletes all files in the spool directory.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Number of files deleted

application/json
JSON
{
  
"cleared": 0
}

Playground​

Authorization

Samples​


Retry delivery of spooled batches​

POST
/api/v1/spool/retry

Triggers a retry of all spooled batches by calling the emitter's Drain method.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Retry initiated

application/json
JSON
{
  
"message": "spool retry initiated"
}

Playground​

Authorization

Samples​


Emitter​

Emitter (batch output) status and flush


Get emitter status and pending batch counts​

GET
/api/v1/emitter

Returns the emitter's current state including pending edge and node counts, ingest URL, and spool directory path.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Emitter status

application/json
JSON
{
  
"pending_edges": 0,
  
"pending_nodes": 0,
  
"ingest": "http://ingest.example.com/batch",
  
"spool_dir": "spool"
}

Playground​

Authorization

Samples​


Force-flush the current in-memory batch​

POST
/api/v1/emitter/flush

Forces the emitter to immediately flush any buffered edges and nodes to the ingest endpoint.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Flush triggered

application/json
JSON
{
  
"flushed": true
}

Playground​

Authorization

Samples​


Excludes​


Get the current TLD exclusion list​

GET
/api/v1/excludes

Returns the list of TLDs currently excluded from crawling.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Current exclusion list

application/json
JSON
{
  
"exclude_tlds": [
  
  
[
  
  
  
"gov",
  
  
  
"mil",
  
  
  
"int"
  
  
]
  
]
}

Playground​

Authorization

Samples​


Replace the entire TLD exclusion list​

PUT
/api/v1/excludes

Replaces the entire TLD exclusion list with the provided array.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Request Body​

application/json
JSON
{
  
"exclude_tlds": [
  
  
[
  
  
  
"gov",
  
  
  
"mil"
  
  
]
  
]
}

Responses​

Updated exclusion list

application/json
JSON
{
  
"exclude_tlds": [
  
  
"string"
  
]
}

Playground​

Authorization
Body

Samples​


Add a single TLD to the exclusion list​

POST
/api/v1/excludes

Adds a single TLD to the exclusion list if not already present.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Request Body​

application/json
JSON
{
  
"tld": "edu"
}

Responses​

Updated exclusion list

application/json
JSON
{
  
"exclude_tlds": [
  
  
"string"
  
],
  
"message": "string"
}

Playground​

Authorization
Body

Samples​


Remove a TLD from the exclusion list​

DELETE
/api/v1/excludes/{tld}

Removes a single TLD from the exclusion list.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Parameters​

Path Parameters

tld*
Type
string
Required
Example"edu"

Responses​

Updated exclusion list

application/json
JSON
{
  
"exclude_tlds": [
  
  
"string"
  
]
}

Playground​

Authorization
Variables
Key
Value

Samples​


Discovery​

Discovery limit and continuity settings


Get discovery limits and counters​

GET
/api/v1/discovery

Returns the current discovery state: number of domains discovered, max domain limit, and whether continuous mode is enabled.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Discovery settings

application/json
JSON
{
  
"discovered": 2500,
  
"max_domains": 0,
  
"continuous": false
}

Playground​

Authorization

Samples​


Update discovery limits​

PATCH
/api/v1/discovery

Updates discovery settings. Can change max_domains (also updates the sink's atomic limit) and continuous mode.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Request Body​

application/json
JSON
{
  
"max_domains": 50000,
  
"continuous": true
}

Responses​

Updated discovery settings

application/json
JSON
{
  
"discovered": 0,
  
"max_domains": 0,
  
"continuous": true
}

Playground​

Authorization
Body

Samples​


Queue​

Work queue inspection (not yet implemented)


Inspect the work queue (not implemented)​

GET
/api/v1/queue

Queue introspection is not yet implemented.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Endpoint not yet implemented

application/json
JSON
{
  
"code": "NOT_FOUND",
  
"error": "domain not found"
}

Playground​

Authorization

Samples​


Clear the work queue (not implemented)​

DELETE
/api/v1/queue

Queue clear is not yet implemented.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Endpoint not yet implemented

application/json
JSON
{
  
"code": "NOT_FOUND",
  
"error": "domain not found"
}

Playground​

Authorization

Samples​


Remove a host from the queue (not implemented)​

DELETE
/api/v1/queue/{host}

Queue item removal is not yet implemented.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Parameters​

Path Parameters

host*
Type
string
Required
Example"example.com"

Responses​

Endpoint not yet implemented

application/json
JSON
{
  
"code": "NOT_FOUND",
  
"error": "domain not found"
}

Playground​

Authorization
Variables
Key
Value

Samples​


Stream log output (not yet implemented)​

GET
/api/v1/logs/stream

Server-Sent Events log stream. Not yet implemented.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Endpoint not yet implemented

application/json
JSON
{
  
"code": "NOT_FOUND",
  
"error": "domain not found"
}

Playground​

Authorization

Samples​


Change the log verbosity level at runtime​

PUT
/api/v1/logs/level

Changes the runtime log level by patching the logging config.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Request Body​

application/json
JSON
{
  
"level": "debug"
}

Responses​

Level applied

application/json
JSON
{
  
"level": "string"
}

Playground​

Authorization
Body

Samples​


Get metrics endpoint reference (use /metrics for Prometheus format)​

GET
/api/v1/metrics

Returns a pointer to the Prometheus /metrics endpoint. Use that endpoint directly for scraping.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Metrics endpoint info

application/json
JSON
{
  
"message": "string",
  
"metrics_endpoint": ":9090/metrics"
}

Playground​

Authorization

Samples​


Reset Prometheus counters (not supported; requires restart)​

POST
/api/v1/metrics/reset

Prometheus counters cannot be reset at runtime; a process restart is required.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Informational response

application/json
JSON
{
  
"message": "string"
}

Playground​

Authorization

Samples​


Get current telemetry configuration​

GET
/api/v1/telemetry

Returns the current OpenTelemetry configuration (endpoint, service name, insecure flag).

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Telemetry config

application/json
JSON
{
  
"metrics_addr": ":9090",
  
"otel_endpoint": "string",
  
"otel_insecure": true,
  
"otel_service": "spyder-probe"
}

Playground​

Authorization

Samples​


Update telemetry settings (informational; requires restart to take effect)​

PATCH
/api/v1/telemetry

Telemetry configuration changes require a restart to take effect. Changes are stored but not applied.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Request Body​

application/json
JSON
{
  
"otel_endpoint": "string",
  
"otel_insecure": true,
  
"otel_service": "string"
}

Responses​

Informational response with current telemetry config

application/json
JSON
{
  
"message": "string",
  
"telemetry": {
  
  
"metrics_addr": ":9090",
  
  
"otel_endpoint": "string",
  
  
"otel_insecure": true,
  
  
"otel_service": "spyder-probe"
  
}
}

Playground​

Authorization
Body

Samples​


Get health checker registration status​

GET
/api/v1/health/checkers

Health checkers are registered programmatically. Use GET /health for current status.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Checker info

application/json
JSON
{
  
"message": "string"
}

Playground​

Authorization

Samples​


Register a health checker (not supported)​

POST
/api/v1/health/checkers

Dynamic checker registration via API is not supported.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Request Body​

application/json
JSON
{
}

Responses​

Endpoint not yet implemented

application/json
JSON
{
  
"code": "NOT_FOUND",
  
"error": "domain not found"
}

Playground​

Authorization
Body

Samples​


Remove a health checker (not supported)​

DELETE
/api/v1/health/checkers/{name}

Dynamic checker removal via API is not supported.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Parameters​

Path Parameters

name*
Type
string
Required

Responses​

Endpoint not yet implemented

application/json
JSON
{
  
"code": "NOT_FOUND",
  
"error": "domain not found"
}

Playground​

Authorization
Variables
Key
Value

Samples​


Get current output configuration​

GET
/api/v1/output

Returns the current output configuration (format, ingest URL, spool directory).

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

Output config

application/json
JSON
{
  
"format": "json",
  
"ingest": "",
  
"spool_dir": "spool"
}

Playground​

Authorization

Samples​


Update output configuration (Tier 2 — applied with warnings)​

PATCH
/api/v1/output

Updates output configuration fields. Subject to tier-based validation.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Request Body​

application/json
JSON
{
  
"format": "string",
  
"ingest": "string",
  
"spool_dir": "string"
}

Responses​

Updated output config and warnings

application/json
JSON
{
  
"output": {
  
  
"format": "json",
  
  
"ingest": "",
  
  
"spool_dir": "spool"
  
},
  
"warnings": [
  
  
"string"
  
]
}

Playground​

Authorization
Body

Samples​


Diagnostics​

On-demand DNS resolution, TLS certificate fetch, HTTP client config


Perform a live DNS lookup for a host​

GET
/api/v1/dns/{host}

Performs a live DNS resolution for the given host, returning A/AAAA, NS, CNAME, MX, and TXT records.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Parameters​

Path Parameters

host*
Type
string
Required
Example"example.com"

Responses​

DNS resolution results

application/json
JSON
{
  
"host": "string",
  
"ips": [
  
  
[
  
  
  
"93.184.216.34"
  
  
]
  
],
  
"ns": [
  
  
"string"
  
],
  
"cname": "string",
  
"mx": [
  
  
"string"
  
],
  
"txt": [
  
  
"string"
  
]
}

Playground​

Authorization
Variables
Key
Value

Samples​


Fetch the TLS certificate for a host​

GET
/api/v1/tls/{host}

Fetches the TLS certificate from the given host on port 443 and returns parsed certificate metadata.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Parameters​

Path Parameters

host*
Type
string
Required
Example"example.com"

Responses​

TLS certificate details

application/json
JSON
{
  
"spki_sha256": "abc123...",
  
"subject_cn": "example.com",
  
"issuer_cn": "Let's Encrypt Authority X3",
  
"not_before": "string",
  
"not_after": "string"
}

Playground​

Authorization
Variables
Key
Value

Samples​


Get HTTP client configuration​

GET
/api/v1/httpclient

Returns the current HTTP client configuration (timeouts, connection pool settings).

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

HTTP client config

application/json
JSON
{
  
"timeout": "15s",
  
"response_header_timeout": "10s",
  
"idle_conn_timeout": "30s",
  
"max_idle_conns": 1024,
  
"max_conns_per_host": 128
}

Playground​

Authorization

Samples​


Update HTTP client configuration (requires restart)​

PATCH
/api/v1/httpclient

HTTP client configuration changes require a restart.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Request Body​

application/json
JSON
{
}

Responses​

Endpoint not yet implemented

application/json
JSON
{
  
"code": "NOT_FOUND",
  
"error": "domain not found"
}

Playground​

Authorization
Body

Samples​


Keys​

API key management (admin only)


List all API keys (admin only)​

GET
/api/v1/keys

Lists all configured API keys with their names and scopes. Admin scope required.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Responses​

All registered API keys

application/json
JSON
{
  
"keys": [
  
  
{
  
  
  
"key": "spyder_a1b2c3...",
  
  
  
"name": "ci-pipeline",
  
  
  
"scope": "write"
  
  
}
  
]
}

Playground​

Authorization

Samples​


Create a new API key (admin only)​

POST
/api/v1/keys

Creates a new API key with a randomly generated token. Returns the key value (only shown once). Admin scope required.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Request Body​

application/json
JSON
{
  
"name": "ci-pipeline",
  
"scope": "write"
}

Responses​

Created API key (key value shown only on creation)

application/json
JSON
{
  
"key": "spyder_a1b2c3d4e5f6...",
  
"name": "string",
  
"scope": "string"
}

Playground​

Authorization
Body

Samples​


Delete an API key (admin only)​

DELETE
/api/v1/keys/{key}

Revokes and deletes an API key. Admin scope required.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Parameters​

Path Parameters

key*

The API key token to delete

Type
string
Required

Responses​

Key deleted

application/json
JSON
{
  
"deleted": true
}

Playground​

Authorization
Variables
Key
Value

Samples​


Query​


List discovered domain nodes​

GET
/api/v1/query/domains

Lists discovered domains with optional filtering by apex domain or search string. Supports cursor-based pagination.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Parameters​

Query Parameters

cursor

Opaque pagination cursor from next_cursor in the previous response

Type
string
limit

Maximum items to return per page

Type
integer
Minimum
1
Maximum
1000
Default
50
apex

Filter by apex domain

Type
string
Example"example.com"
search

Substring search on hostname

Type
string

Responses​

Paginated domain list

application/json
JSON
{
  
"items": [
  
  
{
  
  
  
"host": "www.example.com",
  
  
  
"apex": "example.com",
  
  
  
"first_seen": "string",
  
  
  
"last_seen": "string"
  
  
}
  
],
  
"next_cursor": "string",
  
"total": 0,
  
"store": "string"
}

Playground​

Authorization
Variables
Key
Value

Samples​


Get a single domain with its edges​

GET
/api/v1/query/domains/{host}

Returns details for a specific domain including all related edges (inbound and outbound).

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Parameters​

Path Parameters

host*
Type
string
Required
Example"example.com"

Responses​

Domain detail with edges

application/json
JSON
{
  
"host": "www.example.com",
  
"apex": "example.com",
  
"first_seen": "string",
  
"last_seen": "string",
  
"edges": [
  
  
{
  
  
  
"type": "RESOLVES_TO",
  
  
  
"source": "www.example.com",
  
  
  
"target": "93.184.216.34",
  
  
  
"observed_at": "string",
  
  
  
"probe_id": "local-1",
  
  
  
"run_id": "run-1741824000"
  
  
}
  
]
}

Playground​

Authorization
Variables
Key
Value

Samples​


List discovered edges​

GET
/api/v1/query/edges

Lists discovered edges with optional filtering by type, source, or target. Supports cursor-based pagination.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Parameters​

Query Parameters

cursor

Opaque pagination cursor from next_cursor in the previous response

Type
string
limit

Maximum items to return per page

Type
integer
Minimum
1
Maximum
1000
Default
50
type

Filter by edge type

Type
string
Valid values
"RESOLVES_TO""USES_NS""ALIAS_OF""USES_MX""LINKS_TO""USES_CERT"
source

Filter by source node

Type
string
target

Filter by target node

Type
string

Responses​

Paginated edge list

application/json
JSON
{
  
"items": [
  
  
{
  
  
  
"type": "RESOLVES_TO",
  
  
  
"source": "www.example.com",
  
  
  
"target": "93.184.216.34",
  
  
  
"observed_at": "string",
  
  
  
"probe_id": "local-1",
  
  
  
"run_id": "run-1741824000"
  
  
}
  
],
  
"next_cursor": "string",
  
"total": 0,
  
"store": "string"
}

Playground​

Authorization
Variables
Key
Value

Samples​


List discovered IP nodes​

GET
/api/v1/query/ips

Lists discovered IP addresses with optional search filtering. Supports cursor-based pagination.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Parameters​

Query Parameters

cursor

Opaque pagination cursor from next_cursor in the previous response

Type
string
limit

Maximum items to return per page

Type
integer
Minimum
1
Maximum
1000
Default
50
search

Substring or CIDR search on IP address

Type
string

Responses​

Paginated IP list

application/json
JSON
{
  
"items": [
  
  
{
  
  
  
"ip": "93.184.216.34",
  
  
  
"first_seen": "string",
  
  
  
"last_seen": "string"
  
  
}
  
],
  
"next_cursor": "string",
  
"total": 0,
  
"store": "string"
}

Playground​

Authorization
Variables
Key
Value

Samples​


List discovered TLS certificate nodes​

GET
/api/v1/query/certs

Lists discovered TLS certificates with optional search filtering by subject or issuer CN. Supports cursor-based pagination.

Authorizations​

bearerAuth

API key issued by POST /api/v1/keys. Pass as Authorization: Bearer <key>.
Keys prefixed with spyder_ followed by 64 hex characters.

Type
HTTP (bearer)

Parameters​

Query Parameters

cursor

Opaque pagination cursor from next_cursor in the previous response

Type
string
limit

Maximum items to return per page

Type
integer
Minimum
1
Maximum
1000
Default
50
search

Substring search on subject CN or issuer CN

Type
string

Responses​

Paginated certificate list

application/json
JSON
{
  
"items": [
  
  
{
  
  
  
"spki_sha256": "abc123...",
  
  
  
"subject_cn": "example.com",
  
  
  
"issuer_cn": "Let's Encrypt Authority X3",
  
  
  
"not_before": "string",
  
  
  
"not_after": "string"
  
  
}
  
],
  
"next_cursor": "string",
  
"total": 0,
  
"store": "string"
}

Playground​

Authorization
Variables
Key
Value

Samples​


Authentication ​

All endpoints require an API key passed via the Authorization header:

http
Authorization: Bearer <api-key>

Keys have one of three scopes: read, write, or admin. See Authentication for details.

Base URL ​

http://localhost:9090/api/v1/