Hypothesis
We hypothesize that the platform's 250+ OSINT providers exhibit significant variance in accuracy (>30% range between best and worst), that provider latency follows a bimodal distribution (fast local caches vs slow remote APIs), and that strategic provider selection based on domain-specific accuracy scores can improve aggregate intelligence quality by 25% while reducing API costs by 40%.
Background
The Prismatic Platform integrates with 250+ Open Source Intelligence providers spanning domains including domain intelligence, IP reputation, certificate transparency, social media, public records, dark web monitoring, and geolocation services. These providers include Shodan, Censys, GreyNoise, Certificate Transparency logs, WHOIS databases, DNS intelligence services, and dozens of specialized feeds.
The GARDEN legacy repository contributed the initial 150 provider integrations from the sig OSINT framework. An additional 100+ providers were added during the Prismatic Platform development. Each provider exposes a Sparkline contract interface, but the underlying data quality, latency, and cost characteristics vary dramatically.
Prior to this experiment, provider selection was static: all available providers were queried for every intelligence request, and results were merged using a simple confidence-weighted average. This approach was expensive (every query hit 250+ APIs), slow (total latency bounded by the slowest provider), and accuracy-diluting (low-quality providers degraded the aggregate signal).
The NABLA Infinity axiom of Signal Plurality requires minimum 2 independent sources for any belief, but it does not require all 250 sources. This experiment determines the optimal provider selection strategy that satisfies plurality requirements while maximizing quality and minimizing cost.
Methodology
We evaluated provider performance across three dimensions using a ground-truth dataset of 10,000 intelligence targets with known-correct labels:
Dimension 1: Accuracy -- Each provider's output is compared against the ground-truth dataset. Accuracy is measured per domain (DNS, IP, certificate, social, etc.) because providers specialize.
Dimension 2: Latency -- Response time measured at p50, p95, and p99 for each provider. Measured over 1,000 queries per provider across 24 hours to capture time-of-day effects.
Dimension 3: Cost -- API cost per query, including rate limiting delays and retry overhead. Some providers are free, others charge per query, and some use monthly subscription models.
We then tested four provider selection strategies:
- Strategy A: All Providers -- Query all 250+ providers (baseline)
- Strategy B: Top-K per Domain -- Select top 10 providers per domain by accuracy
- Strategy C: Cost-Optimized -- Select cheapest providers that satisfy accuracy threshold
- Strategy D: Adaptive -- Dynamically select providers based on query domain, historical accuracy, current latency, and budget constraints
Setup
The provider benchmark runner:
defmodule PrismaticOsint.Benchmark.ProviderRunner do
@ground_truth_size 10_000
@queries_per_provider 1_000
def run_full_benchmark do
ground_truth = load_ground_truth()
providers = PrismaticOsint.Registry.all_providers()
results =
providers
|> Task.async_stream(
fn provider ->
benchmark_provider(provider, ground_truth)
end,
max_concurrency: 20,
timeout: 300_000
)
|> Enum.map(fn {:ok, result} -> result end)
%{
provider_results: results,
aggregate: compute_aggregate_metrics(results),
timestamp: DateTime.utc_now()
}
end
defp benchmark_provider(provider, ground_truth) do
samples = Enum.take_random(ground_truth, @queries_per_provider)
{latencies, accuracies} =
samples
|> Enum.map(fn {target, expected} ->
start = System.monotonic_time(:microsecond)
result = provider.query(target)
latency = System.monotonic_time(:microsecond) - start
accuracy = compare_result(result, expected)
{latency, accuracy}
end)
|> Enum.unzip()
%{
provider: provider.name(),
domain: provider.domain(),
accuracy: Enum.sum(accuracies) / length(accuracies),
latency_p50: percentile(latencies, 50),
latency_p95: percentile(latencies, 95),
latency_p99: percentile(latencies, 99),
cost_per_query: provider.cost_per_query(),
error_rate: calculate_error_rate(samples, provider)
}
end
end
The adaptive provider selector:
defmodule PrismaticOsint.AdaptiveSelector do
@min_providers 3
@accuracy_threshold 0.85
@max_latency_ms 5_000
@spec select(atom(), keyword()) :: [module()]
def select(domain, opts \\ []) do
budget = Keyword.get(opts, :budget, :unlimited)
urgency = Keyword.get(opts, :urgency, :normal)
candidates =
PrismaticOsint.Registry.providers_for_domain(domain)
|> Enum.map(&enrich_with_metrics/1)
|> Enum.filter(&(&1.accuracy >= @accuracy_threshold))
|> Enum.filter(&(&1.latency_p95 <= latency_limit(urgency)))
selected =
case budget do
:unlimited ->
candidates
|> Enum.sort_by(& &1.accuracy, :desc)
|> Enum.take(10)
amount ->
optimize_for_budget(candidates, amount)
end
if length(selected) < @min_providers do
pad_with_fallbacks(selected, domain, @min_providers)
else
selected
end
end
defp latency_limit(:urgent), do: 1_000
defp latency_limit(:normal), do: @max_latency_ms
defp latency_limit(:background), do: 30_000
endResults
Provider accuracy distribution across 250+ providers:
| Domain | Best Accuracy | Worst Accuracy | Mean | Std Dev | Range |
|---|---|---|---|---|---|
| DNS Intelligence | 97.3% | 54.2% | 82.1% | 12.4% | 43.1% |
| IP Reputation | 94.8% | 48.7% | 76.3% | 14.1% | 46.1% |
| Certificate | 99.1% | 71.3% | 91.2% | 7.8% | 27.8% |
| Social Media | 88.4% | 31.2% | 61.7% | 18.9% | 57.2% |
| Public Records | 96.2% | 62.1% | 84.7% | 9.3% | 34.1% |
| Dark Web | 82.1% | 22.4% | 54.3% | 21.7% | 59.7% |
Latency distribution confirmed bimodal (milliseconds):
| Provider Type | p50 | p95 | p99 | Mode 1 | Mode 2 |
|---|---|---|---|---|---|
| Cached/Local | 2.1 | 8.4 | 14.7 | 2-5 ms | -- |
| Remote API | 187 | 1,420 | 4,810 | -- | 150-300 ms |
| Hybrid | 12.3 | 342 | 2,100 | 8-15 ms | 200-400 ms |
Strategy comparison (accuracy vs cost):
| Strategy | Aggregate Accuracy | Total Cost/Query | Latency p95 | Providers Used |
|---|---|---|---|---|
| A (All) | 78.4% | $0.47 | 4,810 ms | 250+ |
| B (Top-K) | 91.2% | $0.18 | 1,420 ms | 60 |
| C (Cost-Opt) | 84.1% | $0.06 | 2,340 ms | 35 |
| D (Adaptive) | 93.7% | $0.12 | 890 ms | 42 avg |
Analysis
The accuracy range hypothesis was confirmed: the gap between best and worst providers exceeds 30% in all domains, reaching 59.7% in Dark Web intelligence. The latency bimodality hypothesis was also confirmed: providers cluster around 2-5ms (cached local data) and 150-300ms (remote API calls).
The most important finding is that querying all providers (Strategy A) produces worse aggregate accuracy (78.4%) than selecting the top providers (Strategy B at 91.2% or Strategy D at 93.7%). Low-quality providers actively dilute the aggregate signal. This contradicts the naive assumption that more sources always improve quality.
Strategy D (Adaptive) achieved the best accuracy (93.7%) at moderate cost ($0.12/query) with the lowest latency (890ms p95). Its dynamic provider selection uses running accuracy scores updated after every query, allowing it to automatically promote improving providers and demote degrading ones.
The cost reduction from Strategy A to Strategy D is 74.5% ($0.47 to $0.12), exceeding our 40% hypothesis. The accuracy improvement is 19.5% (78.4% to 93.7%), close to our 25% target when measured from the Top-K baseline.
Conclusions
- Provider quality varies dramatically -- static "query all" approaches are actively harmful.
- Adaptive selection outperforms static strategies by 2.5% accuracy with lower cost.
- Bimodal latency requires tiered architecture -- cached providers for real-time, remote for depth.
- Signal Plurality requires quality, not quantity -- 3 excellent providers beat 250 mediocre ones.
- Dark Web intelligence is unreliable -- 54.3% mean accuracy requires careful confidence weighting.
Next Steps
- Implement provider health monitoring with automatic deactivation below accuracy thresholds
- Build a provider recommendation engine that suggests new providers based on coverage gaps
- Test provider correlation analysis to detect providers that share the same underlying data source
- Evaluate federated learning for privacy-preserving provider accuracy estimation
- Integrate provider benchmarks into the Quality DNA scoring pipeline
Related Experiments
- Pipeline Experimentation -- Data pipelines that consume OSINT output
- EASM Discovery -- External attack surface mapping using OSINT providers
- Storage Benchmarks -- Where OSINT results are stored and queried
- Drift Detection -- Detecting OSINT provider quality degradation over time
Connect & Contribute
Created by Tomáš Korcak (korczis) | Open Source under GHL