Security Practices

Kronos is designed with defense-in-depth. No API keys to leak, no credentials to steal — payments are on-chain and trustless.

How does authentication work without API keys?

Kronos uses x402 micropayments instead of API keys. The payment itself is the authentication — if you can pay, you can access. No keys to leak, rotate, or revoke. Free endpoints need no payment at all.

What are the API rate limits?

Rate limiting is applied per IP and, where applicable, per payer wallet. GPU-intensive and abuse-sensitive endpoints have additional wallet-level controls. Free endpoints (e.g. /decision/:id, /risk, /catalog) are rate-limited per IP only.

EndpointLimitScope
Predict (cached)10/minPer IP + 20/min per wallet
Predict (?refresh=true)2/minPer IP (refresh) + 20/min per wallet
Forecast distribution10/minPer IP + 20/min per wallet
Playground3/5minPer IP + 3/5min per wallet
Market brief / Digest10/min per wallet (GPU-intensive)
Paid endpoints (default)30–60/min per wallet (varies per endpoint)
On-demand discovery10/hourNew symbols per IP
Decision by ID (free)30/5minPer IP only (no wallet)
Free endpoints (risk, catalog, previews)30/minPer IP only (no wallet)

How is input validation handled?

How does error handling prevent information leakage?

Error responses never expose internal details:

CORS and security headers

HeaderValue
Content-Security-Policydefault-src 'self'; inline styles + Google Fonts allowed; frame-ancestors 'none'
X-Frame-OptionsDENY — no clickjacking
X-Content-Type-Optionsnosniff
X-XSS-Protection0 — disabled (modern browsers use CSP instead)
Strict-Transport-Securitymax-age=31536000; includeSubDomains; preload
Permissions-PolicyCamera, microphone, geolocation disabled; payment=(self "https://kronos.seshat.markets")
Referrer-Policystrict-origin-when-cross-origin

CORS policy

SSRF protection

Outbound HTTP calls (to data providers, agent endpoints, webhooks) are protected against SSRF:

API inventory

Every endpoint is explicitly classified as PUBLIC (free, no auth), PUBLIC + PAID (x402 micropayment), or AUTH (requires writeKey).

Responsible disclosure

Found a vulnerability? Email admin@seshat.markets. We respond within 48 hours.

Frequently asked questions

Is the Kronos crypto API secure without API keys?
Yes. Kronos uses x402 micropayments instead of API keys — there are no keys to leak, rotate, or accidentally commit to git. Each request is paid per-call with USDC on Solana or Base. The payment is the authentication.
How does the crypto API prevent SQL injection?
All database queries use parameterized queries ($1, $2, ...) — user input is never concatenated into SQL strings. Additionally, all query parameters are validated against endpoint-specific bounds (e.g. /decisions limits limit to 100, /similar-markets limits text to 2000 chars, /playground limits sample_count to 1–100).
What security headers does the Kronos API use?
Content-Security-Policy with default-src 'self', X-Frame-Options DENY, Strict-Transport-Security with preload, X-Content-Type-Options nosniff, and Permissions-Policy disabling camera, microphone, and geolocation. See the security page for the full list.
Does the crypto API leak error details?
No. Error responses never expose stack traces, file paths, SQL queries, or internal hostnames. Errors return a generic code like {"error":"internal_error"}. Full error details go to server logs only.
How is SSRF prevented in the crypto API?
Outbound HTTP calls are protected against SSRF: DNS resolution is checked against blocked IP ranges (RFC 1918, loopback, cloud metadata), redirects are set to manual, and DNS is re-resolved at fetch time to close the DNS-rebinding gap.

Related endpoints