OpenAI is showing Kalshi’s World Cup odds inside ChatGPT, its first prediction market deal
Back to Tutorials
techTutorialintermediate

OpenAI is showing Kalshi’s World Cup odds inside ChatGPT, its first prediction market deal

July 15, 20265 views5 min read

Learn to build a prediction market interface similar to OpenAI's integration with Kalshi, displaying real-time World Cup odds in a clean, user-friendly web application.

Introduction

In this tutorial, we'll explore how to build a prediction market integration similar to the one OpenAI has created with Kalshi for ChatGPT. Prediction markets are platforms where users can trade contracts based on the likelihood of future events occurring. We'll focus on creating a simple web interface that fetches and displays real-time odds for World Cup matches, using a mock API to simulate the functionality. This tutorial will teach you how to integrate real-time data fetching, display structured information, and handle API responses in a clean, user-friendly way.

Prerequisites

  • Basic understanding of HTML, CSS, and JavaScript
  • Familiarity with asynchronous programming (Promises, async/await)
  • Access to a code editor (like VS Code)
  • Basic knowledge of API consumption and JSON handling

Step-by-Step Instructions

Step 1: Set Up the HTML Structure

We'll begin by creating a basic HTML page that will display the World Cup prediction market data. This structure will include a header, a container for the odds, and a footer to indicate the data source.

Why this step?

This sets up the foundation of our application. A clean HTML structure allows us to easily add and style content later.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>World Cup Prediction Market</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <header>
        <h1>World Cup 2026 Prediction Market</h1>
        <p>Real-time odds from Kalshi</p>
    </header>
    <main>
        <div id="odds-container" class="odds-container"></div>
    </main>
    <footer>
        <p>Source: Kalshi</p>
    </footer>
    <script src="script.js"></script>
</body>
</html>

Step 2: Create the CSS Styling

Next, we'll create a simple CSS file to make our prediction market data visually appealing and easy to read.

Why this step?

Good styling ensures that the data is presented in a professional and readable format, which is essential for user engagement.

body {
    font-family: Arial, sans-serif;
    margin: 0;
    padding: 0;
    background-color: #f4f4f4;
}

header {
    background-color: #007bff;
    color: white;
    padding: 20px;
    text-align: center;
}

.odds-container {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    padding: 20px;
}

.match-card {
    background-color: white;
    margin: 10px;
    padding: 15px;
    border-radius: 8px;
    box-shadow: 0 2px 4px rgba(0,0,0,0.1);
    width: 250px;
}

.match-card h3 {
    margin-top: 0;
    color: #333;
}

.match-card p {
    margin: 5px 0;
}

footer {
    text-align: center;
    padding: 10px;
    background-color: #eee;
    font-size: 0.9em;
}

Step 3: Simulate the API Response

Since we're simulating the Kalshi integration, we'll create a mock API function that returns sample data for World Cup matches. This will help us test our application logic without needing an actual API key.

Why this step?

Simulating API responses allows us to develop and test our application logic without relying on external services. This is a common practice in development and testing.

function fetchMockOdds() {
    return new Promise((resolve) => {
        setTimeout(() => {
            const mockData = [
                {
                    id: 1,
                    team1: "Brazil",
                    team2: "Argentina",
                    odds1: 1.85,
                    odds2: 2.10,
                    draw: 3.40
                },
                {
                    id: 2,
                    team1: "France",
                    team2: "Germany",
                    odds1: 2.00,
                    odds2: 2.30,
                    draw: 3.20
                },
                {
                    id: 3,
                    team1: "USA",
                    team2: "Mexico",
                    odds1: 1.90,
                    odds2: 2.20,
                    draw: 3.30
                }
            ];
            resolve(mockData);
        }, 1000);
    });
}

Step 4: Fetch and Display Odds

We'll now write the JavaScript code to fetch the mock data and display it in our HTML structure. This involves calling the API function and dynamically creating HTML elements to show the odds.

Why this step?

This step connects our frontend with the data logic. It demonstrates how to fetch data asynchronously and update the DOM dynamically, which is a core concept in modern web development.

async function displayOdds() {
    const container = document.getElementById('odds-container');
    try {
        const oddsData = await fetchMockOdds();
        container.innerHTML = '';
        oddsData.forEach(match => {
            const matchCard = document.createElement('div');
            matchCard.className = 'match-card';
            matchCard.innerHTML = `
                

${match.team1} vs ${match.team2}

Team 1 Odds: ${match.odds1}

Team 2 Odds: ${match.odds2}

Draw Odds: ${match.draw}

`; container.appendChild(matchCard); }); } catch (error) { console.error('Error fetching odds:', error); container.innerHTML = '

Error loading odds. Please try again later.

'; } } // Load the odds when the page loads window.onload = displayOdds;

Step 5: Add Error Handling and Loading States

Enhancing our application with error handling and loading states improves the user experience. We'll add a loading indicator and improve error messages.

Why this step?

Robust error handling and loading states make your application more professional and user-friendly. Users should always know what's happening, especially when data is being fetched.

async function displayOdds() {
    const container = document.getElementById('odds-container');
    container.innerHTML = '

Loading odds...

'; try { const oddsData = await fetchMockOdds(); container.innerHTML = ''; oddsData.forEach(match => { const matchCard = document.createElement('div'); matchCard.className = 'match-card'; matchCard.innerHTML = `

${match.team1} vs ${match.team2}

Team 1 Odds: ${match.odds1}

Team 2 Odds: ${match.odds2}

Draw Odds: ${match.draw}

`; container.appendChild(matchCard); }); } catch (error) { console.error('Error fetching odds:', error); container.innerHTML = '

Error loading odds. Please try again later.

'; } }

Step 6: Deploy and Test

Finally, we'll test our application by opening the HTML file in a browser. We'll verify that the data loads correctly and that the UI displays as expected.

Why this step?

Testing is crucial to ensure our application works as intended. It's the final check before considering the project complete.

Save all your files (index.html, styles.css, and script.js) in the same folder. Open index.html in your browser to see the prediction market display in action.

Summary

In this tutorial, we've built a basic prediction market interface that simulates the functionality of OpenAI's integration with Kalshi. We've covered HTML structure, CSS styling, JavaScript data fetching, and error handling. This project demonstrates how to integrate real-time data into a web application, a skill that's increasingly valuable in the age of AI and data-driven platforms.

While this example uses mock data, the principles can be applied to real-world scenarios by replacing the mock API with actual Kalshi or similar prediction market APIs. The core concepts of data fetching, DOM manipulation, and responsive UI design remain the same.

Source: TNW Neural

Related Articles