NAV
shell C# JSON

Introduction

What is DataPulse

DataPulse improves data management in the sports betting industry by offering software that allows operators to efficiently combine and control multiple data feeds in one streamlined output, serving more than just an aggregator. Placed between a sportsbook platform and various data feeds, DataPulse handles all content data-related tasks. While some large platforms provide similar tools, building and maintaining a feed management system can be too expensive for small to medium-sized companies. DataPulse fills this need with products that help operators increase margins, boost engagement, and reduce costs.

Our product

The product is a multiple data feed manager which utilizes multiple feeds to build one high quality, best in class feed. Feed Manager is a sophisticated tool designed to streamline the integration and management of sports event data feeds into any sportsbook platform. It enables the efficient handling of data from multiple third-party service providers, ensuring accurate and timely updates to sporting event information, odds, and results within the Sportsbook ecosystem.

Each client will have one consumer where they can build their own feed templates. The consumer will use any or all the odds available for pre-match, including the ability to build templates and groups of leagues. For in-play the operator will have the option to select a straight-through feed from a high-quality feed provider, or a default feed offered by DataPulse.

Communication Channels for Support

Our team is committed to providing you with the assistance you need. We offer multiple communication channels to ensure that your queries and issues are addressed promptly. You can reach our support team through the following channels:

For further assistance, please contact us via:

Email: sales@data-pulse.co / support@data-pulse.co

Phone: +357 96235848

Telegram: Link to Telegram

WhatsApp: Link to WhatsApp

Viber: Link to Viber

Our support team is available 24/7, ensuring you receive timely assistance regardless of your time zone. Please don’t hesitate to contact us through any of these channels.

Overview

1. Integration Process: A step-by-step guide to integrating your system with DataPulse, ensuring seamless connectivity and data flow.

2. Backend Integration: How-To Guides: Detailed instructions on how to set up and configure backend systems for optimal integration with DataPulse.

3. Versioning and updates: Information on how DataPulse manages API versions, including update schedules and deprecation policies.

4. The On-Demand API: How-To Guides: Comprehensive guides on utilizing the On-Demand API to access real-time sports feed data.

5. Booking API: How to Book Sports Events (Fixtures) Phase Two How-To Guides: Instructions for booking sports events using the Booking API, including advanced features in Phase Two.

6. Sports Feed Messages: Examples and explanations of the various message types and formats used in the DataPulse sports feed.

7. Future plans for DataPulse sports feed aggregator: An outline of upcoming features and improvements planned for the DataPulse sports feed aggregator.

8. The usage of SDK: DataPulse provides tailored SDKs and dedicated support to ensure a smooth and efficient integration, whether you're working with our APIs or data feeds.

9. Glossary of Terms: Definitions and explanations of key terms and concepts used throughout the DataPulse documentation.

Integration process

Overview

DataPulse’s integration process ensures a smooth and efficient setup for our clients. We start with a non-technical business call to introduce our product and understand your needs. Next, we conduct a technical call to gather necessary information and set up your account. We then provide UAT feed information, including connection details and documentation. After evaluating production readiness, we set up your production account and deliver the final production environment.

Integration Steps

DataPulse offers two primary options for integrating your services: RabbitMQ and RESTful Webhooks. After selecting your preferred integration method, the process continues with shared steps that apply to both options, ensuring a smooth transition from testing to production.

Step 1: Choose Your Integration Method

SHELL Post example

curl -X POST 'https://keycloak.example.com/auth/realms/myrealm/protocol/openid-connect/token' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'client_id=myclient' \ -d 'username=johndoe' \ -d 'password=secretpassword' \ -d 'grant_type=password' \ -d 'client_secret=supersecret'

Option 1: Integration via RabbitMQ

C# Authentication example

using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var client = new HttpClient();
        var request = new HttpRequestMessage(HttpMethod.Post, "https://keycloak.example.com/auth/realms/myrealm/protocol/openid-connect/token");
        request.Content = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("client_id", "myclient"),
            new KeyValuePair<string, string>("username", "johndoe"),
            new KeyValuePair<string, string>("password", "secretpassword"),
            new KeyValuePair<string, string>("grant_type", "password"),
            new KeyValuePair<string, string>("client_secret", "supersecret")
        });

        var response = await client.SendAsync(request);
        var content = await response.Content.ReadAsStringAsync();

        Console.WriteLine(content);
    }
}

Integrating via RabbitMQ provides fast and reliable data delivery through dedicated queues.

Unique Steps for RabbitMQ Integration:

C# Consuming messages from RabbitMQ example

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        var factory = new ConnectionFactory() 
        { 
            HostName = "localhost", 
            UserName = "guest", 
            Password = "guest" 
        };

        using var connection = factory.CreateConnection();
        using var channel = connection.CreateModel();

        // Declare a quorum queue
        channel.QueueDeclare(queue: "my_quorum_queue", 
                             durable: true, 
                             exclusive: false, 
                             autoDelete: false, 
                             arguments: new Dictionary<string, object>
                             {
                                 { "x-queue-type", "quorum" }
                             });

        var consumer = new EventingBasicConsumer(channel);
        consumer.Received += (model, ea) =>
        {
            var body = ea.Body.ToArray();
            var message = Encoding.UTF8.GetString(body);
            Console.WriteLine("Received message: {0}", message);

            try
            {
                // Process the message here

                // Send ACK to RabbitMQ to confirm message processing
                channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error processing message: {0}", ex.Message);

                // Send NACK to RabbitMQ to indicate message failure
                // and requeue the message for another attempt
                channel.BasicNack(deliveryTag: ea.DeliveryTag, multiple: false, requeue: true);
            }
        };

        channel.BasicConsume(queue: "my_quorum_queue", autoAck: false, consumer: consumer);

        Console.WriteLine("Listening for messages. Press [enter] to exit.");
        Console.ReadLine();
    }
}
  1. Pre-Integration Setup:

    • Authentication Mechanism: DataPulse will establish a secure authentication mechanism tailored to your requirements. We will provide you with the necessary credentials, access permissions, and configuration details, such as the queue name, connection string and user accounts.
  2. Service Deployment:

    • Queue Connection: Deploy a service that connects to the RabbitMQ queue using the provided credentials and configuration details.
    • Message Processing: Implement logic to listen for incoming messages, process each message, and send an ACK response to ensure message delivery confirmation.
    • Error Handling: Incorporate robust error-handling mechanisms to efficiently manage message rejections and retries.
  3. Integration Testing:

    • Performance Tuning: Optimize the service for optimal performance, considering message volume and processing speed.

Option 2: Integration via RESTful Webhook

RESTful Webhooks enable you to receive updates through HTTP POST requests, offering flexibility and simplicity in integration.

Unique Steps for RESTful Webhook Integration:

  1. Deploy a Webhook Endpoint:

    • Service Setup: Deploy a RESTful service in your test or development environment capable of receiving HTTP POST requests.
    • Endpoint Details: Provide DataPulse with the following details: URL: The endpoint URL for update messages. Documentation: Relevant documentation, WSDL, or similar resources. Authentication: Username and password if required for access control.
  2. Integration Service Testing:

    • Access Verification: DataPulse will test the webhook endpoint to ensure accessibility and proper response handling.
    • Message Types: Ensure your service can handle both ProcessMessage and Heartbeat message types.

Step 2: Shared Steps After Integration Method Selection

Regardless of the chosen integration method, the following steps will guide you through system configuration, testing, deployment, and going live.

System Configuration and Testing

  1. Environment Configuration:
    • DataPulse will configure the User Acceptance Testing (UAT) environment to ensure seamless delivery of messages and heartbeats.
  2. Testing and Verification:
    • We will verify that heartbeats and update messages can be delivered to your endpoint.
    • This phase typically lasts one to two working days to ensure all systems function as expected.
  3. Credential Provisioning:
    • DataPulse will create user accounts for relevant products and forward the credentials to your team for integration testing.

Customer Development and Testing

  1. Full Access:
    • You will receive full access to the contracted services, allowing you to complete your development and testing processes.
  2. Technical Support:
    • DataPulse will provide ongoing technical assistance and advice throughout this period to address any issues or questions.

Deployment to Production

  1. Production Environment Setup:
    • Deploy your receiver service to the production environment, ensuring all configurations are correctly applied.
  2. Receiver Details: Provide DataPulse with production receiver service details, including endpoint URL and access credentials.
  3. Account Setup:
    • DataPulse will create the necessary user accounts for your organization, requiring all users' names and email addresses who need system access.

Go-Live and Monitoring

  1. Final Checks:
    • After confirming that all configurations and connections are correctly set up, the service will be deployed to production.
  2. Launch Support:
    • Our team will assist you in launching the service to your customers, ensuring a smooth transition and monitoring performance.
  3. Monitoring and Support:
    • Implement monitoring tools to track message flow and performance. DataPulse support is available 24/7 to assist with any issues.

Backend Integration: How-To Guides

Prerequisites

Before commencing the integration process, please ensure the following prerequisites are fulfilled:

  1. Client IP Whitelisting:

    • Configure your network infrastructure to permit both inbound and outbound connections with DataPulse services. Whitelist the designated IP addresses to guarantee seamless connectivity.
  2. Service Account Setup:

    • Establish a service account within your organization dedicated to managing the integration. This account should be granted the necessary permissions to access DataPulse services and manage the data flow effectively.
  3. Endpoint Configuration:

    • RabbitMQ Endpoint: If integrating via RabbitMQ, DataPulse will provide the required endpoint URL, queue names, and access credentials for message connection and consumption.
    • Webhook Endpoint: For RESTful integration, provide DataPulse with the URL of your webhook, which will be used to receive JSON HTTP POST messages.

RabbitMQ Integration

C# RabbitMQ Integration

using System;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;

class RabbitMQListener
{
    private static readonly string QueueName = "your_queue_name"; // Replace with your actual queue name
    private static readonly string HostName = "your_rabbitmq_host"; // Replace with your RabbitMQ host
    private static readonly string UserName = "your_username"; // Replace with your RabbitMQ username
    private static readonly string Password = "your_password"; // Replace with your RabbitMQ password

    public static void Main()
    {
        var factory = new ConnectionFactory()
        {
            HostName = HostName,
            UserName = UserName,
            Password = Password,
            DispatchConsumersAsync = true
        };

        using var connection = factory.CreateConnection();
        using var channel = connection.CreateModel();

        // Declare a quorum queue
        channel.QueueDeclare(queue: QueueName,
                             durable: true,
                             exclusive: false,
                             autoDelete: false,
                             arguments: new Dictionary<string, object>
                             {
                                 { "x-queue-type", "quorum" }
                             });

        var consumer = new AsyncEventingBasicConsumer(channel);
        consumer.Received += async (model, ea) =>
        {
            var body = ea.Body.ToArray();
            var message = Encoding.UTF8.GetString(body);
            Console.WriteLine("Received message: {0}", message);

            // Process the message here

            // Acknowledge the message
            channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
        };

        // Start consuming messages
        channel.BasicConsume(queue: QueueName,
                             autoAck: false,
                             consumer: consumer);

        Console.WriteLine("Listening for messages. Press [enter] to exit.");
        Console.ReadLine();
    }
}

Connecting to RabbitMQ with Quorum Queues

The following C# code sample demonstrates how to connect to a RabbitMQ queue with quorum queues and listen for incoming messages:

Explanation:

RESTful Integration

C# RESTful Integration


using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;

namespace DataPulseIntegration.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class DataPulseController : ControllerBase
    {
        [HttpPost("heartbeat")]
        public IActionResult Heartbeat([FromBody] JObject payload)
        {
            // Process Heartbeat message
            Console.WriteLine("Received Heartbeat: {0}", payload.ToString());

            // Handle the heartbeat logic here

            return Ok("Heartbeat received");
        }

        [HttpPost("process")]
        public IActionResult ProcessMessage([FromBody] JObject payload)
        {
            // Process ProcessMessage
            Console.WriteLine("Received ProcessMessage: {0}", payload.ToString());

            // Handle the process message logic here

            return Ok("ProcessMessage received");
        }
    }
}

Listening for Heartbeat and ProcessMessage

Below is a sample C# ASP.NET Core controller that listens for HTTP POST requests containing Heartbeat and ProcessMessage payloads in JSON format.

Explanation:

Steps for Deployment:

  1. Configure Your API:

    • Ensure your ASP.NET Core application is set up and running in your desired environment (development, test, or production).
  2. Expose the Endpoints:

    • Make sure your API endpoints are publicly accessible and properly secured with authentication if necessary.
  3. Notify DataPulse:

    • Provide DataPulse with the URLs of your API endpoints so that we can begin sending data to your system.

The On-Demand API: How-To Guides

This section provides detailed instructions for using our On-Demand API to request specific details from the sports feed via HTTP. This API is designed to allow clients to retrieve data on demand, especially if their system missed an update or requires specific information from any feed type.

Booking API: How to Book Sports Events (Fixtures) Phase Two How-To Guides

Sports Feed Messages

Fixture message

JSON Fixture Message

{
  "Header": {
    "Retry": 0,
    "MessageGuid": "00000000-0000-0000-0000-000000000000",
    "TimeStampUtc": "2024-08-01T00:00:00.000000Z"
  },
  "Fixture": {
    "Id": "FI00000",
    "Name": "Team A v Team B",
    "Round": {
      "Id": "RD00000",
      "Name": "Month"
    },
    "Sport": {
      "Id": "ST00000",
      "Name": "Sport Name"
    },
    "Season": {
      "Id": "SN00000",
      "Name": "Season Name"
    },
    "Status": "Scheduled",
    "Competition": {
      "Id": "CN00000",
      "Name": "Competition Name",
      "Region": {
        "Id": 0,
        "Name": "Region Name"
      }
    },
    "Competitors": [
      {
        "Id": "CR00010",
        "Name": "Team A",
        "Gender": "Gender",
        "HomeAway": "Home",
        "Competitors": [
          {
            "Id": "CR00011",
            "Name": "Player A1",
            "Gender": "Gender",
            "HomeAway": "Home",
            "LastName": "LastNameA1",
            "FirstName": "FirstNameA1",
            "SquadNumber": "0",
            "CompetitorType": "Person"
          },
          {
            "Id": "CR00012",
            "Name": "Player A2",
            "Gender": "Gender",
            "HomeAway": "Home",
            "LastName": "LastNameA2",
            "FirstName": "FirstNameA2",
            "SquadNumber": "0",
            "CompetitorType": "Person"
          },
          {
            "Id": "CR00013",
            "Name": "Player A3",
            "Gender": "Gender",
            "HomeAway": "Home",
            "LastName": "LastNameA3",
            "FirstName": "FirstNameA3",
            "SquadNumber": "0",
            "CompetitorType": "Person"
          }
        ],
        "CompetitorType": "Team"
      },
      {
        "Id": "CR00020",
        "Name": "Team B",
        "Gender": "Gender",
        "HomeAway": "Away",
        "Competitors": [
          {
            "Id": "CR00021",
            "Name": "Player B1",
            "Gender": "Gender",
            "HomeAway": "Away",
            "LastName": "LastNameB1",
            "FirstName": "FirstNameB1",
            "SquadNumber": "0",
            "CompetitorType": "Person"
          },
          {
            "Id": "CR00022",
            "Name": "Player B2",
            "Gender": "Gender",
            "HomeAway": "Away",
            "LastName": "LastNameB2",
            "FirstName": "FirstNameB2",
            "SquadNumber": "0",
            "CompetitorType": "Person"
          },
          {
            "Id": "CR00023",
            "Name": "Player B3",
            "Gender": "Gender",
            "HomeAway": "Away",
            "LastName": "LastNameB3",
            "FirstName": "FirstNameB3",
            "SquadNumber": "0",
            "CompetitorType": "Person"
          }
        ],
        "CompetitorType": "Team"
      }
    ],
    "FixtureType": "Match",
    "StartTimeUtc": "2024-08-02T00:00:00Z"
  }
}

This dataset provides information about a scheduled fixture. It includes details such as the fixture's unique identifier, names of the competing teams, the round and season of the competition, and the competition's region. Additionally, it lists the players involved in each team, their roles, and the scheduled start time of the fixture.

Explanation:

Header

Fixture

MarketSet message

JSON MarketSet Message

{
  "Header": {
    "Retry": 0,
    "MessageGuid": "00000000-0000-0000-0000-000000000000",
    "TimeStampUtc": "2024-08-09T00:00:00.000000Z"
  },
  "MarketSet": {
    "Markets": [
      {
        "Id": 000000000,
        "Name": "Market Name 1",
        "InPlay": false,
        "ExpiryUtc": "2024-08-11T00:00:00Z",
        "MarketType": {
          "Id": 00000,
          "Name": "Market Type Name 1",
          "IsHandicap": false
        },
        "Selections": [
          {
            "Id": 000000000,
            "Name": "Selection 1",
            "Range": {
              "Low": 0.0,
              "High": 0.0
            },
            "Decimal": 1.0,
            "Numerator": 1,
            "Denominator": 1,
            "TradingStatus": "Trading"
          },
          {
            "Id": 000000001,
            "Name": "Selection 2",
            "Range": {
              "Low": 1.0,
              "High": 1.0
            },
            "Decimal": 2.0,
            "Numerator": 2,
            "Denominator": 1,
            "TradingStatus": "Trading"
          }
        ],
        "TradingStatus": "Open"
      },
      {
        "Id": 000000001,
        "Name": "Market Name 2",
        "InPlay": false,
        "ExpiryUtc": "2024-08-11T00:00:00Z",
        "MarketType": {
          "Id": 00000,
          "Name": "Market Type Name 2",
          "IsHandicap": false
        },
        "Selections": [
          {
            "Id": 000000002,
            "Name": "Selection 1",
            "Decimal": 1.0,
            "Numerator": 1,
            "Denominator": 1,
            "CompetitorId": "CR00010",
            "TradingStatus": "Suspended"
          },
          {
            "Id": 000000003,
            "Name": "Selection 2",
            "Decimal": 2.0,
            "Numerator": 2,
            "Denominator": 1,
            "CompetitorId": "CR00020",
            "TradingStatus": "Trading"
          }
        ],
        "TradingStatus": "Open"
      },
      {
        "Id": 000000002,
        "Name": "Market Name 3",
        "InPlay": false,
        "ExpiryUtc": "2024-08-11T00:00:00Z",
        "MarketType": {
          "Id": 00000,
          "Name": "Market Type Name 3",
          "IsHandicap": false
        },
        "Selections": [
          {
            "Id": 000000004,
            "Name": "Selection 1",
            "Decimal": 1.0,
            "Numerator": 1,
            "Denominator": 1,
            "CompetitorId": "CR00010",
            "TradingStatus": "Suspended"
          },
          {
            "Id": 000000005,
            "Name": "Selection 2",
            "Decimal": 2.0,
            "Numerator": 2,
            "Denominator": 1,
            "CompetitorId": "CR00020",
            "TradingStatus": "Trading"
          }
        ],
        "TradingStatus": "Open"
      }
    ],
    "FixtureId": "FI0000"
  }
}

This dataset provides information on a set of markets associated with a specific fixture. It includes details such as the market identifiers, names, types, and expiry times. Each market contains a list of selections with their respective identifiers, names, decimal values, and trading statuses. The dataset also specifies whether each market is currently open or in play.

Explanation:

Header

MarketSet

ResultSet message

JSON ResultSet Message

{
  "Header": {
    "Retry": 0,
    "MessageGuid": "00000000-0000-0000-0000-000000000000",
    "TimeStampUtc": "2024-08-09T00:00:00.0000000Z"
  },
  "ResultSet": {
    "Results": [
      {
        "Results": [
          {
            "SelectionId": 000000000,
            "ResultStatus": "Loser"
          },
          {
            "SelectionId": 000000001,
            "ResultStatus": "Winner"
          },
          {
            "SelectionId": 000000002,
            "ResultStatus": "Loser"
          },
          {
            "SelectionId": 000000003,
            "ResultStatus": "Loser"
          },
          {
            "SelectionId": 000000004,
            "ResultStatus": "Loser"
          },
          {
            "SelectionId": 000000005,
            "ResultStatus": "Loser"
          },
          {
            "SelectionId": 000000006,
            "ResultStatus": "Loser"
          }
        ],
        "MarketId": 000000000
      }
    ],
    "FixtureId": "FI0000"
  }
}

This dataset contains results for a specific fixture, detailing the outcomes for various selections within a market. It includes identifiers for each selection, along with their result status (e.g., "Winner" or "Loser"). The data is organized by market and associated with the fixture identifier.

Explanation:

Header

ResultSet

Coverage message

JSON Coverage Message

{
  "Header": {
    "Retry": 0,
    "MessageGuid": "00000000-0000-0000-0000-000000000000",
    "TimeStampUtc": "2024-08-08T00:00:00.0000000Z"
  },
  "Coverage": {
    "IsBooked": false,
    "FixtureId": "FI0000",
    "AvailableFeeds": [
      {
        "Type": "FeedType1",
        "IsLicensed": true
      },
      {
        "Type": "FeedType2",
        "IsLicensed": true
      }
    ]
  }
}

This dataset provides information about the coverage status of a specific fixture. It includes whether the fixture is booked and details on available data feeds. Each feed is listed with its type and licensing status, indicating whether it is licensed for use.

Explanation:

Header

Coverage

Match Details message

JSON Match Details Message

{
  "Header": {
    "Retry": 0,
    "MessageGuid": "00000000-0000-0000-0000-000000000000",
    "TimeStampUtc": "2024-08-09T00:00:00.0000000Z"
  },
  "FootballMatchDetails": {
    "AwayTeam": {
      "Id": "CR00010",
      "Name": "Team A",
      "Strip": {
        "Color1": {
          "B": 0,
          "G": 128,
          "R": 0
        },
        "Color2": {
          "B": 0,
          "G": 128,
          "R": 0
        },
        "PantsColor": null,
        "SocksColor": null,
        "JerseyDesign": "Unknown"
      }
    },
    "HomeTeam": {
      "Id": "CR0020",
      "Name": "Team B",
      "Strip": {
        "Color1": {
          "B": 255,
          "G": 255,
          "R": 255
        },
        "Color2": {
          "B": 0,
          "G": 0,
          "R": 0
        },
        "PantsColor": null,
        "SocksColor": null,
        "JerseyDesign": "Unknown"
      }
    },
    "FixtureId": "FI0000",
    "VarReason": "NotSet",
    "VarOutcome": "NotSet",
    "BetAcceptOk": null,
    "IsSecondLeg": false,
    "VarReasonV2": null,
    "MatchActions": {
      "Fouls": {
        "Fouls": [
          {
            "Phase": "FirstHalf",
            "FoulingTeam": "Away",
            "IsConfirmed": true,
            "TimestampUtc": "2024-08-09T00:00:00.000Z",
            "TimeElapsedInPhase": "00:03:57"
          },
          {
            "Phase": "FirstHalf",
            "FoulingTeam": "Home",
            "IsConfirmed": true,
            "TimestampUtc": "2024-08-09T00:00:00.000Z",
            "TimeElapsedInPhase": "00:05:03"
          }
        ],
        "IsReliable": true,
        "IsCollected": true
      },
      "Goals": {
        "Goals": [],
        "IsReliable": true,
        "IsCollected": true
      },
      "Corners": {
        "IsReliable": true,
        "IsCollected": true,
        "MatchActions": [
          {
            "Team": "Away",
            "Phase": "FirstHalf",
            "PlayerId": null,
            "IsConfirmed": true,
            "TimestampUtc": "2024-08-09T00:00:00.000Z",
            "TimeElapsedInPhase": "00:06:33",
            "AwardedTimeElapsedInPhase": "00:05:48"
          }
        ]
      },
      "KickOffs": {
        "IsReliable": true,
        "IsCollected": true,
        "MatchActions": [
          {
            "Team": "Away",
            "Phase": "FirstHalf",
            "PlayerId": null,
            "IsConfirmed": true,
            "TimestampUtc": "2024-08-09T00:00:00.000Z",
            "TimeElapsedInPhase": "00:00:00",
            "AwardedTimeElapsedInPhase": null
          }
        ]
      },
      "Offsides": {
        "IsReliable": true,
        "IsCollected": true,
        "MatchActions": [
          {
            "Team": "Home",
            "Phase": "FirstHalf",
            "PlayerId": null,
            "IsConfirmed": true,
            "TimestampUtc": "2024-08-09T00:00:00.000Z",
            "TimeElapsedInPhase": "00:08:11",
            "AwardedTimeElapsedInPhase": null
          }
        ]
      },
      "ThrowIns": {
        "IsReliable": true,
        "IsCollected": true,
        "MatchActions": [
          {
            "Team": "Home",
            "Phase": "FirstHalf",
            "PlayerId": null,
            "IsConfirmed": true,
            "TimestampUtc": "2024-08-09T00:00:00.000Z",
            "TimeElapsedInPhase": "00:02:33",
            "AwardedTimeElapsedInPhase": null
          }
        ]
      },
      "GoalKicks": {
        "IsReliable": true,
        "IsCollected": true,
        "MatchActions": [
          {
            "Team": "Home",
            "Phase": "FirstHalf",
            "PlayerId": null,
            "IsConfirmed": true,
            "TimestampUtc": "2024-08-09T00:00:00.000Z",
            "TimeElapsedInPhase": "00:05:44",
            "AwardedTimeElapsedInPhase": null
          }
        ]
      },
      "Penalties": {
        "Penalties": [],
        "IsReliable": false,
        "IsCollected": true
      },
      "YellowCards": {
        "IsReliable": true,
        "IsCollected": true,
        "MatchActions": []
      },
      "BlockedShots": {
        "IsReliable": true,
        "IsCollected": true,
        "MatchActions": []
      },
      "ClockActions": {
        "IsReliable": true,
        "IsCollected": true,
        "ClockActions": [
          {
            "Phase": "FirstHalf",
            "IsConfirmed": true,
            "ActivityType": "Start",
            "TimestampUtc": "2024-08-09T00:00:00.000Z",
            "IsClockRunning": true,
            "TimeElapsedInPhase": "00:00:00"
          }
        ]
      },
      "PhaseChanges": {
        "IsReliable": true,
        "IsCollected": true,
        "PhaseChanges": [
          {
            "Message": null,
            "MessageId": null,
            "IsConfirmed": true,
            "CurrentPhase": "FirstHalf",
            "TimestampUtc": "2024-08-09T00:00:00.000Z",
            "PreviousPhase": "PreMatch",
            "CurrentPhaseStartTime": "2024-08-09T00:00:00.000Z"
          }
        ]
      },
      "LineupUpdates": {
        "Updates": [],
        "IsReliable": true,
        "IsCollected": true
      },
      "ShotsOnTarget": {
        "IsReliable": true,
        "IsCollected": true,
        "MatchActions": [
          {
            "Team": "Away",
            "Phase": "FirstHalf",
            "PlayerId": null,
            "IsConfirmed": true,
            "TimestampUtc": "2024-08-09T00:00:00.000Z",
            "TimeElapsedInPhase": "00:12:18",
            "AwardedTimeElapsedInPhase": null
          }
        ]
      },
      "Substitutions": {
        "IsReliable": true,
        "IsCollected": true,
        "Substitutions": []
      },
      "ShotsOffTarget": {
        "IsReliable": true,
        "IsCollected": true,
        "MatchActions": []
      },
      "SystemMessages": {
        "IsReliable": true,
        "IsCollected": true,
        "SystemMessages": [
          {
            "Phase": "PreMatch",
            "Message": "Weather: sun",
            "MessageId": 0,
            "Timestamp": "2024-08-09T00:00:00.000Z",
            "SequenceId": 1,
            "TimeElapsedInPhase": "00:00:00"
          }
        ]
      },
      "MissedPenalties": {
        "IsReliable": true,
        "IsCollected": true,
        "MatchActions": []
      },
      "VarStateChanges": {
        "IsReliable": false,
        "IsCollected": true,
        "VarStateChanges": []
      },
      "PenaltiesAwarded": {
        "IsReliable": true,
        "IsCollected": true,
        "MatchActions": []
      },
      "ShotsOffWoodwork": {
        "IsReliable": true,
        "IsCollected": true,
        "ShotsOffWoodwork": []
      },
      "StraightRedCards": {
        "IsReliable": true,
        "IsCollected": true,
        "MatchActions": []
      },
      "SecondYellowCards": {
        "IsReliable": true,
        "IsCollected": true,
        "MatchActions": []
      },
      "DangerStateChanges": {
        "IsReliable": true,
        "IsCollected": true,
        "DangerStateChanges": [
          {
            "Phase": "FirstHalf",
            "DangerState": "Safe",
            "IsConfirmed": true,
            "TimestampUtc": "2024-08-09T00:00:00.000Z",
            "TimeElapsedInPhase": "00:00:00"
          }
        ]
      },
      "BookingStateChanges": {
        "IsReliable": true,
        "IsCollected": true,
        "BookingStateChanges": []
      },
      "PenaltyRiskStateChanges": {
        "IsReliable": false,}}
  }}

This dataset contains detailed information about a football match, including team details, fixture information, and various match actions. It covers elements such as team strips, fouls, goals, corners, kick-offs, offsides, throw-ins, and other match events. The data also includes system messages and state changes, providing a comprehensive view of the match's progress and significant occurrences.

Explanation:

Header

FootballMatchDetails

MatchSummary message

JSON MatchSummary Message

{
  "Header": {
    "Retry": 0,
    "MessageGuid": "00000000-0000-0000-0000-000000000000",
    "TimeStampUtc": "2024-08-09T00:00:00.0000000Z"
  },
  "FootballMatchSummary": {
    "Clock": {
      "TimestampUtc": "2024-08-09T00:00:00.000Z",
      "IsClockRunning": true,
      "TimeElapsedInPhase": "00:00:00"
    },
    "Fouls": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "Goals": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "Corners": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "KickOffs": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "Offsides": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "ThrowIns": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "FixtureId": "FI0000",
    "GoalKicks": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "VarReason": "NotSet",
    "StartTimes": {
      "FirstHalf": "2024-08-09T00:00:00.000Z",
      "Penalties": null,
      "SecondHalf": null,
      "ExtraTimeFirstHalf": null,
      "ExtraTimeSecondHalf": null
    },
    "VarOutcome": "NotSet",
    "BetAcceptOk": null,
    "IsSecondLeg": false,
    "VarReasonV2": null,
    "YellowCards": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "BlockedShots": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "CurrentPhase": "FirstHalf",
    "VarOutcomeV2": null,
    "FirstLegScore": null,
    "ShotsOnTarget": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "StoppageTimes": {
      "FirstHalf": null,
      "SecondHalf": null,
      "ExtraTimeFirstHalf": null,
      "ExtraTimeSecondHalf": null
    },
    "Substitutions": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "SavedPenalties": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": false,
      "IsCollected": false
    },
    "ShotsOffTarget": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "CurrentVarState": "Safe",
    "MissedPenalties": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "CanGoToExtraTime": false,
    "CanGoToPenalties": false,
    "PenaltiesAwarded": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "ShotsOffWoodwork": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "StraightRedCards": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "SecondYellowCards": {
      "Score": {
        "Away": 0,
        "Home": 0
      },
      "IsReliable": true,
      "IsCollected": true
    },
    "CurrentDangerState": "Safe",
    "CurrentBookingState": "Safe",
    "MessageTimestampUtc": "2024-08-09T00:00:00.000Z",
    "ExtraTimeHalfDuration": "00:15:00",
    "NormalTimeHalfDuration": "00:45:00",
    "CurrentPenaltyRiskState": "Safe",
    "CanGoStraightToPenaltiesAfterNormalTime": false
  }
}

This dataset provides a comprehensive summary of a football match, including current scores and statistics for various match actions such as goals, fouls, corners, and more. It also includes information about the match clock, fixture details, and current phases. The summary covers reliability and collection status for each statistic, and it indicates whether extra time or penalties can be applied. Key match elements, like start times and stoppage times, are also documented.

Explanation:

Header

FootballMatchSummary

Versioning and Updates

Overview

Versioning Scheme

DataPulse uses a structured versioning scheme to ensure clarity and consistency when introducing changes to our API. Our versioning system follows the Semantic Versioning model, which comprises three components: MAJOR.MINOR.PATCH.

Versioning Example For an API version v2.1.3: - MAJOR Version (2): Indicates significant updates or breaking changes. - MINOR Version (1): Represents new features and backward-compatible additions. - PATCH Version (3): Reflects incremental bug fixes and minor improvements.

The usage of SDK

Overview

At DataPulse, we are committed to ensuring a seamless integration experience for our clients. To facilitate the integration process, our technical team provides on-demand Software Development Kits (SDKs) and comprehensive support to your technical team. Whether you are integrating our APIs or utilizing our data feeds.

Comprehensive Support from DataPulse

SDK Provisioning

DataPulse offers on-request SDKs in various programming languages. These SDKs are designed to simplify the integration process by providing pre-built libraries and tools that handle common tasks such as authentication, data parsing, and error handling.

Key Features of Our SDKs

How to Access Our Support

To access our SDKs and technical support services, please reach out to your designated DataPulse account manager or contact our support team directly. We will work closely with your technical team to ensure a smooth integration process and address any questions or concerns.

Glossary of Terms

Foundation-level integration is the minimum necessary level of feed integration that an integrator must reach to be able to provide services from Genius Sports through their sportsbook for the following products:

Fixture: describes the fixture and includes the information (name, date, sport, competition, competitors etc.) required to allow you to create the fixture in your trading platform.

MarketSet: a collection of one or more Market elements ontaining market information (name, type, selections, prices, trading status etc.) to allow you to create markets in your trading platform and associate them with a particular event.

ResultSet: when the outcome of a market is known, for example because the event has finished, a separate Result updategram will be sent for each market. This message will contain all the information you need to result the market and settle bets on your side.

Coverage: once a fixture has met the requirements necessary to be created, the Coverage command will be sent to update changes in the availability of match state feeds or the trading state feed or to confirm that the booking state has changed.

Fixture

MarketSet

ResultSet

Coverage

FootballMatchDetails

FootballMatchSummary