PROTOTYPEClickable mockup · simulates the finished app◃ Product overview
Operator Console
ProductionOP
Developer platform
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.