Developers

A REST API built for multi-tenant venue data

Twenty-three versioned endpoints under /api/v1. Bearer auth, scoped abilities, per-token rate limits and an audit log on every call.

Authentication
# Generate a token in Dashboard → Integrations.
# The secret is shown once and stored as a SHA-256 hash.

curl https://kourtiva.com/api/v1/me \
  -H "Authorization: Bearer $KOURTIVA_TOKEN"

# 401 on an invalid, expired or revoked token.
# 403 when the token lacks the required ability.
# 429 once the rate limit is exceeded.

Security that is not optional

  • Secrets stored hashed — a database leak yields no usable token
  • HTTPS enforced; plain HTTP is rejected rather than redirected
  • Abilities per token, so a reporting integration cannot write
  • Optional expiry dates, and revocation that takes effect immediately
  • Tenant resolved server-side — no venue ID is ever accepted from a client
  • Method, path, status, duration and token recorded for every request
Resources

What you can read and write

Bookings

List, inspect and filter reservations across your courts, including check-in state.

Courts & slots

Court definitions and their bookable slots, with availability by date.

Sports & facilities

The sports you offer and the facilities attached to each venue.

Members

The players registered at your venue, with their booking history.

Invoices & payments

Financial records tied to the bookings that produced them.

Tournaments

Competitions, registered teams and fixtures.

Visitors

Footfall counts and summaries for occupancy reporting.

Facility profile

Your own venue record — the tenant the token resolves to.

Versioned, so upgrades are yours to schedule

Everything lives under /api/v1. Breaking changes ship as a new version rather than arriving unannounced in the one you already integrated against.

Request API access
Court availability
GET /api/v1/courts/12/slots?date=2026-08-09

{
  "data": [
    { "starts_at": "08:00", "available": true  },
    { "starts_at": "09:00", "available": false },
    { "starts_at": "10:00", "available": true  }
  ]
}

Need an endpoint we do not have?

Tell us what you are integrating with and we will look at it.