The public API as a product: docs & discovery, version lifecycle, developer keys and sandbox tenants,
OAuth scopes, per-tier rate limits & usage, data-product subscription review, integrity/research endpoints
and platform service accounts. Third-party developers self-serve in the public developer portal β this is the operator side.
842
public endpoints (v1)
/docs Β· /redoc
Swagger UI + ReDoc
GET /api/info
discovery endpoint
/v1/openapi.json
public spec (canonical tags only)
Version lifecycle β experimental β stable β deprecated β sunset
Version
Status
Released
Sunset
Notes
v1
stable
2026-01-15
β
Current default Β· X-API-Version header on all responses
v2-preview
experimental
2026-06-01
β
Opt-in via /v2 prefix Β· breaking changes allowed
v0 (legacy)
deprecated
2025-03-01
2027-03-01 (Sunset header)
12-month deprecation window enforced
Mismatched versions get X-API-Version-Deprecated; deprecated versions send a Sunset header.
Force-sunset requires typed confirmation and a minimum 12-month deprecation window. Explicit /v1/β¦ routes pass through unaliased.
ERD drill-down explorer (/erd)
Three-tier viewer: super-domain β sub-domain β entity, with breadcrumb, URL state, fuzzy search,
heatmap and BFS radius 1β2. Cross-domain-bridge toggle; F01βF20 mapping is project-configurable.
Documented mappings for SBF Β· NBoF Β· FFPJP Β· FBP Β· FIB Β· FEP plus FIPJP/CEP. Per-field translations live in
tenant.field_mapping_overrides β no code change needed.
State β spec build failing
β
v2-preview OpenAPI generation failed β duplicate operationId in /competitions
Docs for v2-preview are frozen at the last good build (2026-06-30). v1 is unaffected.
Developer keys (self-service via portal Β· 256-bit, SHA-256-hashed)
Developer
Tier
Key
Scopes
Status
Usage 30 d
Nordic Boule Media
partner
dk_7f2β¦a1
api:read, results:read
active
260 882 calls
BetLine Odds Feed
enterprise
dk_9c4β¦b8
api:read, integrity:read
active
1.24 M calls
Klubbappen (community)
free
dk_2e8β¦c3
api:read
active
512 calls
Stale importer
standard
dk_5a1β¦d9
api:read, webhooks:write
revoked
0 calls
OAuth 2.0 client-credentials grant at POST /v1/oauth/token β scope-based authorization
(api:read, webhooks:write, data:integrity, β¦), 3600 s opaque tokens,
key-id blacklist on revoke. First key bootstraps via the X-Developer-Id header.
Sandbox tenants (30-day auto-expiry)
Developer
Template
Database
Expires
Boost
Klubbappen (community)
club
pg-sbx-114
in 22 days
10Γ rate limit
Nordic Boule Media
competition_in_progress
pg-sbx-118
in 6 days
10Γ rate limit
Seed templates: minimal Β· national_federation Β· club Β· competition_in_progress. Each sandbox gets its own PostgreSQL database and 10Γ rate limits. Sandbox webhooks may only target webhook.site or the developer's own registered URL.
Provision sandbox (operator override)
State β empty
π§ͺ
No active sandboxes
Developers provision their own from the portal; operators can pre-provision above.
Usage per tier (stacked area Β· drilldown per developer)
π Stacked area chart β calls/day by tier (free / standard / partner / enterprise), 30 days
Tier
Clients
Calls 30 d
p50 latency
Rate-limit hits
free
48
312 400
96 ms
1 204
standard
17
1.8 M
88 ms
310
partner
9
4.1 M
81 ms
42
enterprise
3
9.6 M
74 ms
0
Sliding-window limiter: Redis sorted set per (client_id, bucket); per-endpoint buckets
(default, webhook_management, data_product_query, oauth_token);
fail-open on Redis outage. Responses carry X-RateLimit-Limit / -Remaining / -Reset. Hourly
ApiUsageRecord buckets power summary / by-token / timeseries views with per-endpoint latency.
Per-record provenance metadata
Every data-product response carries _meta.dataset_version, _meta.provenance_uri and
field_provenance so consumers can trace source dataset and version per field.
4 data products Γ 4 tiers (free / standard / partner / enterprise). Approve injects scopes_granted into the
developer key's allowed scopes; reject/revoke are audit-trailed, revoke may carry a future effective_at
for a compliance grace period. Auto-expiry at valid_through. Internal notes are admin-only.
New self-service applications land here as pending_review.
GraphQL analytics endpoint
POST /v1/analytics/graphql β query-only, complexity-limited, field-level scope gating.
Research cohort queries
POST /v1/research/cohorts/{id}/query β pseudonymized with k=5 anonymity, consent version
per record, ethics-committee approval flow before activation.
Integrity event stream (SSE)
GET /v1/integrity/events/{event_id}/stream β Server-Sent Events with
Last-Event-ID reconnect, p50 latency SLA 250 ms, 15 s heartbeat.
β 2 live subscribersp50 118 msuptime 99.99%
Sanctions list for betting operators
GET /v1/integrity/sanctions β since/jurisdiction filters,
player_pseudo_id (never real identity), ed25519-signed _meta envelope.
State β SSE consumer lagging
β
BetLine consumer reconnecting frequently (14Γ in 1 h)
Replays served from Last-Event-ID. No events lost; consider contacting the partner if it persists.
Platform service accounts (M2M tokens with admin scopes)