System
6 endpoints from the published OpenAPI import.
Health Check
Health check endpoint for monitoring
Checks:
- API server status
- PostgreSQL connection
- Redis connection
- RabbitMQ connection
Returns: Service status information
Try it
Examples
cURL
curl -X GET 'https://spideriq.ai/api/v1/system/health' \
-H 'Authorization: Bearer <token>'Python
import httpx
resp = httpx.get(
"https://spideriq.ai/api/v1/system/health",
headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/system/health", {
method: "GET",
headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/system/health", nil)
req.Header.Set("Authorization", "Bearer <token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |
Readiness Check
Engine-honest readiness probe — the blue-green / Traefik health gate.
Unlike /health and /api/gate/v1/models (which return 200 before the litellm Router is built — LEARNINGS #37), this returns 503 until the SpiderGate engine has fully initialized AND a Router was built with at least one deployment AND Postgres answers a live query. Traefik adds a new (green) container to the pool ONLY when this is 200, so the ~27 s engine boot happens on a slot no user is hitting yet — eliminating the deploy 502 window (see docs/services/Infrastructure/blue-green-traefik-proxy.md §6.3).
NOTE: this is the api-gateway readiness gate. content-api shares this image but runs a minimal lifespan that does NOT build the Router, so it would report not_ready here — its blue-green gate (phase 3) needs a content probe.
Returns 200 {"status": "ready", ...} when serveable; 503 {"status": "not_ready", ...} (Retry-After: 5) while booting.
Try it
Examples
cURL
curl -X GET 'https://spideriq.ai/api/v1/system/ready' \
-H 'Authorization: Bearer <token>'Python
import httpx
resp = httpx.get(
"https://spideriq.ai/api/v1/system/ready",
headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/system/ready", {
method: "GET",
headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/system/ready", nil)
req.Header.Set("Authorization", "Bearer <token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |
Get Queue Stats
Get queue statistics
Returns: Current queue depths for all job types
Try it
Examples
cURL
curl -X GET 'https://spideriq.ai/api/v1/system/queue-stats' \
-H 'Authorization: Bearer <token>'Python
import httpx
resp = httpx.get(
"https://spideriq.ai/api/v1/system/queue-stats",
headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/system/queue-stats", {
method: "GET",
headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/system/queue-stats", nil)
req.Header.Set("Authorization", "Bearer <token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |
Credential Health
Active clients whose server-side Bearer forge is broken — in BOTH ways.
A tenant has two credential representations and they must agree:
api_key_hash / api_secret_hash ← what middleware/auth.py VERIFIES an inbound Bearer against encrypted_api_key / _api_secret ← what tenant_bearer.forge_… decrypts to MINT a Bearer for WindMill dispatch
missing_encrypted_credentials counts the pair being ABSENT. Necessary, but it was also the ONLY check anywhere — here, in stalled_campaign_monitor, and in backfill_missing_encrypted_credentials, all three testing IS NULL.
desynced_credentials counts the pair being PRESENT AND WRONG: it decrypts cleanly but no longer matches the hash, so the forge mints a superseded triplet and every downstream flow 401s while the client's own token keeps working perfectly. Invisible to a NULL check, silent in every log, and it cost 18 consecutive bulk runs and 221 flow failures before anyone looked (card 46c537cc — root cause was a rotation path that wrote only the hashes, fixed in dashboard.py).
BOTH must stay at 0. Remediation differs:
- missing →
python -m scripts.backfill_missing_encrypted_credentials - desynced → the plaintext is unrecoverable from a bcrypt hash, so the only repair is a fresh rotation through a path that writes all four columns (dashboard "Regenerate credentials", or the admin brands rotate endpoint). This issues the tenant a NEW token.
Try it
Examples
cURL
curl -X GET 'https://spideriq.ai/api/v1/system/credential-health' \
-H 'Authorization: Bearer <token>'Python
import httpx
resp = httpx.get(
"https://spideriq.ai/api/v1/system/credential-health",
headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/system/credential-health", {
method: "GET",
headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/system/credential-health", nil)
req.Header.Set("Authorization", "Bearer <token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |
Cal Health
Probe the self-hosted Cal.com stack (SpiderBook P1.3).
Cal.com v6.2.0 does not ship a public /api/health endpoint — that lives on the separate NestJS v2 API image. We mirror the upstream container healthcheck and probe the Next.js root, following the normal redirect chain until we hit a 2xx. Same logic as scripts/cal_health_check.sh.
Returns {"status": "healthy"} on success. Raises 503 with a Retry-After: 30 header if Cal.com is unreachable or returns an error — callers should back off at least 30s before retrying.
Try it
Examples
cURL
curl -X GET 'https://spideriq.ai/api/v1/system/cal-health' \
-H 'Authorization: Bearer <token>'Python
import httpx
resp = httpx.get(
"https://spideriq.ai/api/v1/system/cal-health",
headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/system/cal-health", {
method: "GET",
headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/system/cal-health", nil)
req.Header.Set("Authorization", "Bearer <token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |
Get System Info
Get system information
Returns: API configuration and version information
Try it
Examples
cURL
curl -X GET 'https://spideriq.ai/api/v1/system/info' \
-H 'Authorization: Bearer <token>'Python
import httpx
resp = httpx.get(
"https://spideriq.ai/api/v1/system/info",
headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/system/info", {
method: "GET",
headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/system/info", nil)
req.Header.Set("Authorization", "Bearer <token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |