Connected Signature Exchange Spec
Status: Draft
Owner: Core Platform
Scope: Stylobot.net-hosted shared signature feed for connected instances
Purpose
Define a production-ready spec for:
- Current detection endpoints exposed by Stylobot.net
- New connected-instance exchange endpoints
- Delta synchronization (
last accessed/ cursor) behavior - Merge reputation logic that can promote signatures into a local list
- Privacy and security controls that keep the system zero-PII
Current endpoint baseline (Stylobot.net)
These are available in the website host today (subject to environment/config):
GET /bot-detection/checkGET /bot-detection/statsGET /bot-detection/healthPOST /bot-detection/feedbackPOST /bot-detection/fingerprintGET /_stylobotGET /_stylobot/api/summaryGET /_stylobot/api/detectionsGET /_stylobot/api/signaturesGET /_stylobot/api/timeseriesGET /_stylobot/api/countriesGET /_stylobot/api/clustersGET /_stylobot/api/topbotsGET /_stylobot/api/useragentsGET /_stylobot/api/exportGET /_stylobot/api/me
Notes:
/bot-detection/*diagnostics are controlled byStyloBot:ExposeDiagnostics.- Dashboard data endpoints are protected by dashboard authorization and bot blocking logic.
Current endpoint contracts (vCurrent)
GET /bot-detection/check
Purpose:
- Per-request detection verdict and explainability payload
Core fields:
isBot,isHumanbotProbability,humanProbability,confidenceriskBand,recommendedActiondetectorsRan,contributions,signals(PII-filtered)processingTimeMs
GET /bot-detection/stats
Purpose:
- Aggregate counters and latency summary
Core fields:
totalRequests,botsDetected,botPercentageverifiedBots,maliciousBotsaverageProcessingTimeMsbotTypeBreakdown
GET /bot-detection/health
Purpose:
- Service health and basic throughput signal
Core fields:
statusservicetotalRequestsaverageResponseMs
POST /bot-detection/feedback
Purpose:
- Operator feedback loop for false-positive / false-negative review
Request:
outcome:HumanorBotrequestId(optional)notes(optional, max length constrained)
POST /bot-detection/fingerprint
Purpose:
- Receives client-side fingerprint telemetry for correlation
Requirements:
- Header
X-ML-BotD-Token - JSON body matching browser fingerprint schema
Response:
receivedid
GET /_stylobot/api/*
Purpose:
- Dashboard and analytics feeds (
summary,detections,signatures,timeseries,countries,clusters,topbots,useragents,export)
Rules:
- Authorization required by dashboard policy
- Confirmed bots are denied for high-value data feeds
- Output is operational telemetry, not raw request PII
New capability: connected signature exchange
Connected instances can pull shared signature intelligence from Stylobot.net and merge it into local detection state.
Goals:
- Faster detection on new deployments with shallow local history
- Shared protection against repeat bot campaigns
- Zero-PII exchange payloads
- Local policy remains authoritative
Non-goals:
- No sharing raw IP, raw User-Agent, cookies, or session IDs
- No forced blocking based only on remote data
- No unlimited historical replay
Proposed exchange API surface (v1)
All routes below are under /exchange/v1.
1) GET /exchange/v1/health
Lightweight availability check for connected clients.
2) GET /exchange/v1/capabilities
Returns:
- Supported schema versions
- Max page size
- Cursor retention window
- Signature algorithms
- Recommended polling interval
3) `GET /exchange/v1/signatures?cursor=
Primary delta feed endpoint.
Behavior:
- Returns only records after
cursor - Sorted by server sequence (
exchangeOffset) - Includes
nextCursorandhasMore - Returns
410 Goneif cursor is outside retention window
4) `GET /exchange/v1/signatures?sinceUtc=
Fallback delta mode when cursor is unavailable.
Behavior:
- Returns records with
updatedAtUtc > sinceUtc - Lower fidelity than cursor mode for high-volume streams
- Intended only for recovery/bootstrap paths
5) POST /exchange/v1/ack
Optional checkpoint endpoint for observability.
Request fields:
nodeIdcursorreceivedAtUtcacceptedCountrejectedCount
Purpose:
- Lets Stylobot.net show per-peer lag and feed health
- Supports operator troubleshooting
Exchange record contract (PII-safe)
{
"version": "1.0",
"recordId": "f9d4a4cb-9d66-49d1-8f13-50a7f2de6022",
"exchangeOffset": 1844221,
"publishedAtUtc": "2026-02-20T10:20:11Z",
"updatedAtUtc": "2026-02-20T10:20:11Z",
"sourceNodeId": "stylobot-net",
"exchangeSignature": "exsig_6f4d5d...d20a",
"schemaVersion": "sbx.v1",
"classification": {
"botProbability": 0.93,
"confidence": 0.87,
"riskBand": "High",
"recommendedActionHint": "Challenge"
},
"summary": {
"reasonCodes": ["UA_AUTOMATION_STACK", "BEHAVIORAL_BURST", "HEADER_INCONSISTENT"],
"detectors": ["UserAgent", "Behavioral", "Header"],
"requestCount": 49
},
"reputation": {
"sourceTrustHint": 0.92,
"evidenceCount": 49
},
"ttlSeconds": 1209600,
"signatureEnvelope": {
"alg": "Ed25519",
"kid": "exchange-key-2026-01",
"sig": "base64..."
}
}
Never included:
- Raw IP address
- Raw User-Agent
- Cookie values
- Session IDs
- Query strings or body payload fragments
Delta sync model (last accessed)
Each connected node stores:
lastCursorlastSuccessfulSyncUtclastAttemptUtclastAckedOffset
Recommended client loop:
- Call
GET /exchange/v1/signatures?cursor=... - Validate signature envelope and schema
- Upsert locally by
recordId(idempotent) - Commit
lastCursor = nextCursoronly after durable write - Optionally
POST /exchange/v1/ack
If 410 Gone is returned:
- Fall back to
sinceUtc=lastSuccessfulSyncUtc - If still out of range, run bounded bootstrap pull
Merge reputation system (local promotion model)
Imported signatures should not instantly become local enforced signatures.
Use a staged merge model:
Imported: accepted but zero policy influenceCandidate: soft influence only (challenge/throttle hints)PromotedLocal: merged into local signature listQuarantined: invalid/conflicting/noisy source data
Per-signature local state:
localEvidenceScore(0..1)externalConsensusScore(0..1)trustedSourceCountmaxSourceTrustconflictScore(0..1, local-human contradictions)mergedReputation(0..1)lastMergedUtc
Suggested scoring:
mergedReputation = clamp(0, 1, 0.60*localEvidenceScore + 0.30*externalConsensusScore + 0.10*maxSourceTrust - 0.35*conflictScore)
Guardrails:
- External influence cap: max
0.35contribution when no local evidence exists - Promotion to
PromotedLocalrequiresmergedReputation >= 0.82 - Promotion to
PromotedLocalrequiresconfidence >= 0.75 - Promotion to
PromotedLocalrequirestrustedSourceCount >= 2(or>=1withmaxSourceTrust >= 0.95plus at least one local hit) - Promotion to
PromotedLocalrequires no strong local-human contradiction in the last 14 days - Auto-demotion if merged score decays below
0.65
Result:
- Multiple trusted sources corroborating the same signature increases local reputation
- High enough merged reputation can promote into your local list
- Local evidence still outranks remote evidence
PII and security controls
Data minimization:
- Exchange payload carries only derived, non-reversible signatures and summary signals
- Path-like values are generalized (token/ID stripping) before hashing
- Strict allowlist schema (reject unknown sensitive fields)
Transport and auth:
- TLS required
- API key or mTLS per peer
- Payload signing (
Ed25519) with key rotation (kid) - Replay protection (
recordId,publishedAtUtc, skew window)
Governance:
- Per-peer trust profiles and rate limits
- Full audit log: imported record to influenced decision
- Retention TTL + expiry sweeps
- Peer quarantine on invalid-signature or anomaly thresholds
Useful enhancements for v1.1+
- Signed peer quality score endpoint (
precision,conflict rate,false positive drift) - Topic feeds (
ai-scrapers,credential-stuffing,scanner) - Region/industry partitions for relevance
- Optional push channel (
SSE/WebSocket) in addition to pull - Provenance graph in dashboard: why a signature got promoted
Rollout plan
- Phase 0: schema + docs + synthetic replay tests
- Phase 1: read-only pull + no policy influence
- Phase 2: candidate influence with strict cap
- Phase 3: controlled local promotion (
PromotedLocal) with rollback toggles
Acceptance criteria
- No PII fields accepted or emitted by exchange endpoints
- Delta sync resumes from cursor without duplication
- Merge promotion is deterministic and auditable
- Local policy can disable or cap external influence instantly
- Dashboard shows peer lag, import counts, rejects, promotions, quarantines