The unified sports data layer

Integrate any sports data
provider in days, not months.

One API. One schema. Every provider. Stop building plumbing — start building product.

Now accepting launch partners.

Works with feeds from

Opta
Sportradar
Genius Sports
IMG Arenasoon
LSportssoon

The problem

The sports dataintegration tax.

Every team building on sports data pays it. Few talk about it.

Greenfield per provider

Opta delivers XML over SFTP. SportRadar uses JSON push. Genius Sports has a proprietary WebSocket protocol. Different schemas, different entity models, different delivery mechanisms.

Zero redundancy

When your single provider goes down during a Premier League matchday, your platform goes dark. Building a redundant integration means doubling your data layer complexity.

150K+ entity mappings

The same player has a different ID in every system. Your team maintains a mapping table across 30+ sports. Every transfer window, it breaks.

The solution

One integration.Every provider.

Connect once. We handle the rest.

Your Data Providers
Opta
SportRadar
Genius Sports
IMG Arenasoon
LSportssoon
FanScore
Relay
Unified SchemaEntity ResolutionReal-time Delivery
<10ms p95 latency
Your Platform
GraphQL API
Real-time Subs
Typed SDKs
Webhooks
Kafka Connect
soon

Features

Everything you need to buildon sports data.

Enterprise capabilities. Zero infrastructure burden.

Automatic Failover

Configure failover per sport: when your primary drops, the secondary takes over. Your app never knows.

Opta7ms
Active
failover
SportRadar
Standby

Entity Resolution

One canonical ID for every player, team, and competition — regardless of source.

Opta
p-28472
SportRadar
sr:player:39271
Genius
GS-PLY-9384
Canonical
player_
7hG2kMsL

Real-time & Streaming

Every entity is subscribable. GraphQL subscriptions, Kafka Connect, or webhooks — pick your delivery method.

Event stream
<10ms p95
72:14goal
7ms
71:02card.yellow
4ms
69:00substitution
8ms
68:33shot.ontarget
5ms
67:45corner
3ms
GraphQL2.4k
Kafka890
Webhooks1.1k

Developer Experience

Power users query GraphQL directly. Everyone else uses auto-generated typed clients. Full autocomplete, subscription lifecycle handled.

query GetMatch($id: ID!) {
  match(id: $id) {
    status
    homeClub { name score }
    awayClub { name score }
    events(last: 5) {
      type
      minute
      player { name }
      confidence
    }
    activeFeed { provider status }
  }
}

Provider Marketplace

Browse, enable, and swap providers per sport. Add cricket coverage in 5 minutes, not 5 months.

OptaFootball
SportRadarBasketball
GeniusTennis
IMG ArenaCricket
LSportsEsports

Data Quality Scoring

Cross-provider comparison on every data point. Confidence scores. Alerts when providers disagree.

EventOptaSRGeniusScore
Goal 72'100%
xG 0.8267%
Offside 68'67%
Card 65'100%
<10ms
Added latency at p95
Measured end-to-end
100+
Normalized entity types
Across all sports
99.99%
Uptime SLA
Multi-region failover
Days
Time to first integration
Not months

How it works

Live in productionin an afternoon.

Not months of integration work. Connect, validate, deploy.

10 min

Connect and configure

Add your provider credentials. Relay detects the feed format, resolves entities, and starts ingesting.

$ relay provider add opta --credentials $OPTA_KEY
 Feed detected: Opta F9 (XML/SFTP)
 Ingesting: 14,847 entities resolved
 Failover: SportRadar set as secondary

$ relay provider status
  opta        active    8,291 players  1,204 teams
  sportradar  standby   failover ready
30 min

Validate data quality

Review entity mappings, check cross-provider confidence scores, and verify data before going live.

$ relay entities validate --sport football
┌─────────────┬──────────┬────────────┐
│ Entity      │ Mapped   │ Confidence │
├─────────────┼──────────┼────────────┤
│ Players     │ 8,291    │ 99.2%      │
│ Teams       │ 1,204    │ 99.8%      │
│ Competitions│ 312      │ 98.4%      │
└─────────────┴──────────┴────────────┘
12 entities flagged for manual review
Deploy

Go live with failover

Configure failover thresholds, subscribe to real-time events, and deploy. Relay switches providers automatically.

const relay = new Relay({
  apiKey: process.env.RELAY_KEY,
  failover: { threshold: "5s", alert: true },
});

relay.match.subscribe("epl-gw38", {
  onEvent: (e) => broadcast(e),
  onFailover: (from, to) =>
    log("switched " + from + " -> " + to),
});

Infrastructure

Enterprise-gradefrom day one.

Built for the teams that need to bring this to a security review.

Multi-region
EU (Zurich) primary, configurable data residency. US regions on Enterprise.
SOC 2 Type II
Audit in progress. Expected Q4 2026. Report available under NDA.
Provider failover
Primary and secondary providers per sport. Automatic switching with configurable thresholds.
GDPR compliant
EU data processing. DPA available. No personal data stored beyond provider feeds.
Provenance trails
Every data point traced to source provider and timestamp. Queryable via API.
Stateless edge
Horizontally scalable query layer. Provider connections managed independently.
Event sourced
Every state change stored as an immutable event. Full replay for debugging and audits.
Encryption
TLS 1.3 in transit. AES-256 at rest. Per-tenant key encryption for credentials.
4 of 4 spots remaining

Stop rebuilding sportsdata pipelines.

We're selecting 4 launch partners. You bring your provider feeds and honest feedback — we build the adapters to your spec and give you a direct line to engineering.

Priority accessCustom adaptersDiscounted pricingRoadmap input
Request Access

Tell us what providers you use, what sports you cover, and what you're building.

Running a league? Looking for fan engagement?

Explore FanScore Platform— fan engagement for leagues