Fixture & Bot Customer Queries API

This document describes how to call the fixture and bot endpoints used for customer queries. All endpoints require authentication.

For access provisioning (M2M client creation), see API Authentication and Access.

Response samples below were captured from production on 2026-10-19 for bot 61906, Genius venue 13658 (Sportzcast venue 4320), and Genius fixture 14566239.


1. Authentication

Requests must use JWT (Bearer) authentication. Obtain a token from Auth0 using the Client Credentials grant (Machine-to-Machine), then send it in the Authorization header.

Do not use password grant or authorization-code grant for programmatic access — those are for interactive login and will fail with access_denied / Unauthorized when used from scripts.

Get an access token

Field Production value
Token URL https://sportzcast.eu.auth0.com/oauth/token
Audience https://servicehub.sportzcast.net/ (trailing slash required)
Grant type client_credentials

Token request

POST https://sportzcast.eu.auth0.com/oauth/token
Content-Type: application/json

{
  "client_id": "<your_client_id>",
  "client_secret": "<your_client_secret>",
  "audience": "https://servicehub.sportzcast.net/",
  "grant_type": "client_credentials"
}

Use the client ID and client secret from your M2M Auth0 application. The app must be authorized for the Auth0 API whose Identifier is https://servicehub.sportzcast.net/.

Token response

{
  "access_token": "eyJ...",
  "expires_in": 86400,
  "token_type": "Bearer"
}

Sending authenticated requests

For every API request, include:

Header Required Description
Authorization Yes Bearer <access_token> from Auth0
X-Username Yes Sportzcast user email (same account used to log in)
X-Token Yes Sportzcast user access token from Account / UserInfo

Authenticated request example

GET https://servicehub.sportzcast.net/external/fixture/by-bot/61906
Authorization: Bearer <access_token>
X-Username: <sportzcast_user_email>
X-Token: <sportzcast_user_token>

curl (quick test)

TOKEN=$(curl -s -X POST 'https://sportzcast.eu.auth0.com/oauth/token' \
  -H 'Content-Type: application/json' \
  -d '{
    "client_id": "<your_client_id>",
    "client_secret": "<your_client_secret>",
    "audience": "https://servicehub.sportzcast.net/",
    "grant_type": "client_credentials"
  }' | jq -r .access_token)

curl -s "https://servicehub.sportzcast.net/external/fixture/by-genius-venue/<geniusVenueId>" \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Username: <sportzcast_user_email>" \
  -H "X-Token: <sportzcast_user_token>"

2. Base URL

Production API host:

https://servicehub.sportzcast.net

All path examples below use this host.


3. Endpoints

3.1 Get fixtures by bot ID

Returns fixtures for a given bot. Only fixtures with start time on or after the given date (or today if omitted) are returned, ordered by start time.

GET https://servicehub.sportzcast.net/external/fixture/by-bot/{botId}

Path parameters (by bot)

Parameter Type Description
botId integer Bot ID

Query parameters (by bot)

Parameter Type Required Description
fixtureStartDate date (ISO 8601) No Only fixtures with FixtureStartTime >= this date. Default: current UTC date. Example: 2025-01-01

Example (by bot)

GET https://servicehub.sportzcast.net/external/fixture/by-bot/61906
Authorization: Bearer <access_token>
X-Username: <sportzcast_user_email>
X-Token: <sportzcast_user_token>

Response: 200 OK — JSON array of fixture objects.

Each fixture includes id, geniusFixtureId, name, sport, competition, eventStatusType, start/end times, and a nested venue (id, geniusId, name). updatedDate and fixtureStatus may be null. Bot 62247 returned the same four fixtures as bot 61906.

[
  {
    "id": 86310,
    "geniusFixtureId": 14566239,
    "name": "BC Sabah v NTD Baku",
    "sportId": 4,
    "sportName": "Basketball",
    "competitionId": 12982,
    "competitionName": "Azerbaijan Superleague",
    "eventStatusType": "Finished",
    "createdDate": "2026-10-11T08:19:23.6169114",
    "updatedDate": "2026-10-19T19:00:24.9923678",
    "fixtureStartTime": "2026-10-19T15:00:00",
    "fixtureEndTime": "2026-10-19T19:00:24.9880971",
    "fixtureStatus": null,
    "venue": {
      "id": 4320,
      "geniusId": 13658,
      "name": "Baku Sports Palace"
    },
    "isContentGraph": false
  },
  {
    "id": 87041,
    "geniusFixtureId": 14596096,
    "name": "BC Sabah v Nakhchivan BK",
    "sportId": 4,
    "sportName": "Basketball",
    "competitionId": 12982,
    "competitionName": "Azerbaijan Superleague",
    "eventStatusType": "Notstarted",
    "createdDate": "2026-10-19T15:18:53.3513002",
    "updatedDate": null,
    "fixtureStartTime": "2026-10-23T15:00:00",
    "fixtureEndTime": "2026-10-23T19:00:00",
    "fixtureStatus": null,
    "venue": {
      "id": 4320,
      "geniusId": 13658,
      "name": "Baku Sports Palace"
    },
    "isContentGraph": false
  }
]

The live response also included two later fixtures (BC Sabah v Nanterre 92, BC Sabah v Trabzonspor BK) with the same object shape.


3.2 Get fixtures by venue ID

Returns fixtures for a given venue. Only fixtures with start time on or after the given date (or today if omitted) are returned, ordered by start time.

GET https://servicehub.sportzcast.net/external/fixture/by-venue/{venueId}

Path parameters (by venue)

Parameter Type Description
venueId integer Internal Sportzcast venue ID (venue.id in the fixture payload, not the Genius venue id)

Query parameters (by venue)

Parameter Type Required Description
fixtureStartDate date (ISO 8601) No Only fixtures with FixtureStartTime >= this date. Default: current UTC date. Example: 2025-01-01

Example (by venue)

GET https://servicehub.sportzcast.net/external/fixture/by-venue/4320
Authorization: Bearer <access_token>
X-Username: <sportzcast_user_email>
X-Token: <sportzcast_user_token>

Response: 200 OK — same fixture object shape as §3.1. For Baku Sports Palace (venue.id 4320) the array matches the bot example above.


3.3 Get fixtures by Genius Sports venue ID

Same behaviour as §3.2, but the venue is identified by Genius venue ID (Venue.GeniusId) instead of the internal Sportzcast venue ID. Use this when your integration only knows the Genius Sports venue identifier.

GET https://servicehub.sportzcast.net/external/fixture/by-genius-venue/{geniusVenueId}

Path parameters (by genius venue)

Parameter Type Description
geniusVenueId integer Genius Sports venue ID (stored as GeniusId on the venue)

Query parameters (by genius venue)

Same as §3.2 (fixtureStartDate, optional; default: current UTC date).

Example (by genius venue)

GET https://servicehub.sportzcast.net/external/fixture/by-genius-venue/13658
Authorization: Bearer <access_token>
X-Username: <sportzcast_user_email>
X-Token: <sportzcast_user_token>

Response: 200 OK — same fixture array as §3.1. A production call for Genius venue 13658 returned the same four BC Sabah fixtures (first object shown below).

[
  {
    "id": 86310,
    "geniusFixtureId": 14566239,
    "name": "BC Sabah v NTD Baku",
    "sportId": 4,
    "sportName": "Basketball",
    "competitionId": 12982,
    "competitionName": "Azerbaijan Superleague",
    "eventStatusType": "Finished",
    "createdDate": "2026-10-11T08:19:23.6169114",
    "updatedDate": "2026-10-19T19:00:24.9923678",
    "fixtureStartTime": "2026-10-19T15:00:00",
    "fixtureEndTime": "2026-10-19T19:00:24.9880971",
    "fixtureStatus": null,
    "venue": {
      "id": 4320,
      "geniusId": 13658,
      "name": "Baku Sports Palace"
    },
    "isContentGraph": false
  }
]

If no venue exists for the given Genius venue ID, the response is 200 OK with an empty JSON array ([]).


3.4 Get bots by Genius fixture ID

Returns the list of bots associated with a fixture identified by its Genius fixture ID. Each bot includes venue, configurations, and current status when available.

GET https://servicehub.sportzcast.net/external/bot/by-genius-fixture/{geniusFixtureId}

Path parameters (by genius fixture)

Parameter Type Description
geniusFixtureId integer Genius fixture ID

Example (by genius fixture)

GET https://servicehub.sportzcast.net/external/bot/by-genius-fixture/14566239
Authorization: Bearer <access_token>
X-Username: <sportzcast_user_email>
X-Token: <sportzcast_user_token>

Response: 200 OK — JSON array of bot objects. botStatuses may be null. Nested configuration fields (homeTeam, awayTeam, vendorSportId) may also be null.

Production response for Genius fixture 14566239 (BC Sabah v NTD Baku):

[
  {
    "id": 61906,
    "venue": {
      "id": 4320,
      "name": "Baku Sports Palace",
      "geniusId": 13658
    },
    "botConfigurations": [
      {
        "id": null,
        "homeTeam": null,
        "awayTeam": null,
        "vendorSportId": null,
        "vendorSport": {
          "id": 15,
          "name": "Bicen",
          "vendorPacketCode": null,
          "eventType": {
            "id": 3,
            "name": "Basketball"
          }
        },
        "recordingConfigurationTypeId": 2
      }
    ],
    "botStatuses": null
  },
  {
    "id": 62247,
    "venue": {
      "id": 4320,
      "name": "Baku Sports Palace",
      "geniusId": 13658
    },
    "botConfigurations": [
      {
        "id": null,
        "homeTeam": null,
        "awayTeam": null,
        "vendorSportId": null,
        "vendorSport": {
          "id": 15,
          "name": "Bicen",
          "vendorPacketCode": null,
          "eventType": {
            "id": 3,
            "name": "Basketball"
          }
        },
        "recordingConfigurationTypeId": 2
      }
    ],
    "botStatuses": [
      {
        "botId": 62247,
        "botStatusType": {
          "id": 3,
          "statusType": "Disconnected"
        },
        "lastSeenDate": "2026-10-10T09:06:57.7611899Z",
        "updatedDate": "2026-10-10T16:07:06.3418608Z"
      }
    ]
  }
]

4. Error handling

Status Meaning
401 Unauthorized Missing or invalid Authorization header (expired/invalid JWT), or Auth0 token request failed
403 Forbidden Authenticated, but the Sportzcast user (X-Username / X-Token) is not allowed to access the resource
500 Internal Server Error Server error; response body may contain problem details

Token request failures (Auth0):

Symptom Likely cause
access_denied / Unauthorized M2M app not authorized for audience https://servicehub.sportzcast.net/, or wrong audience string
unauthorized_client Application is not Machine-to-Machine
invalid_client Wrong client id/secret, or wrong Auth0 tenant

On API error, ensure the JWT is valid and not expired, and that X-Username and X-Token match a valid Sportzcast user.