NV Gaming API

API Documentation

Explore the full API reference below. Subscribe to get your API key and start pulling data.

Ready to integrate?

Subscribe to Premium to create your API key and start making requests.

Get Started

API Documentation

Everything you need to pull Nevada gaming revenue data into your database or pipeline.

Base URL

All API requests use this single endpoint.

https://www.nvgamingapi.com/api/v1/gaming
Authentication

Include your API key in the x-api-key header with every request.

x-api-key: nvg_your_api_key_here
Quick Start
Get up and running in under a minute. Select your language below.
curl -H "x-api-key: YOUR_API_KEY" \
  "https://www.nvgamingapi.com/api/v1/gaming?month=2024-01&region=clark&game=baccarat"
Endpoint Reference
GET/api/v1/gaming

Retrieve Nevada gaming revenue data. Returns monthly records filtered by the query parameters you provide. All monetary values are in thousands of dollars.

Query Parameters

ParameterTypeRequiredDescriptionExample
monthstringOptionalFilter by month in YYYY-MM format. Omit to return all available months.2024-01
regionstringOptionalFilter by geographic region. Partial match supported (e.g., "clark" matches "Clark County").clark
gamestringOptionalFilter by game name. Partial match supported (e.g., "slot" matches "Slot Machines").slots

All parameters support case-insensitive partial matching. Combine multiple parameters to narrow your results.

Response Format

{
  "data": [
    {
      "year": 2024,
      "month": "January",
      "month_num": 1,
      "tier": "free",
      "records": [
        {
          "game_name": "Slot Machines",
          "category": "Slots",
          "region": "Clark County",
          "location_type": "All Locations",
          "current_month": {
            "win_amount": 734521.3,
            "num_units": 58432,
            "num_locations": 198,
            "pct_change": 0.0312,
            "win_percent": 0.0742
          },
          "three_months": { ... },
          "twelve_months": { ... }
        }
      ]
    }
  ],
  "meta": {
    "total_months": 1,
    "tier": "premium"
  }
}

Record Fields

FieldTypeDescription
game_namestringName of the game or game category
categorystringGame category (e.g., "Slots", "Table Games", "Sports")
regionstringGeographic region in Nevada
location_typestringType of gaming location
win_amountnumberRevenue in thousands of dollars (e.g., 734521.3 = $734,521,300)
num_unitsnumberNumber of active gaming units/machines
num_locationsnumberNumber of gaming locations reporting
pct_changenumberYear-over-year percentage change as a decimal (0.0312 = 3.12%)
win_percentnumberWin percentage as a decimal (0.0742 = 7.42%)

Each record contains three time periods: current_month, three_months, and twelve_months, all with the same fields above. Values may be null if data is unavailable.

Bulk Fetch — Load All Data
Omit the month parameter to retrieve every available month in a single request. Ideal for initial database loads.
import requests
import pandas as pd

API_KEY = "YOUR_API_KEY"
BASE_URL = "https://www.nvgamingapi.com/api/v1/gaming"

# Fetch all available data (omit month param for all months)
response = requests.get(
    BASE_URL,
    headers={"x-api-key": API_KEY}
)

data = response.json()
print(f"Total months: {data['meta']['total_months']}")

# Flatten all months into a single DataFrame
rows = []
for month in data["data"]:
    for record in month["records"]:
        for period in ["current_month", "three_months", "twelve_months"]:
            row = {
                "year": month["year"],
                "month": month["month"],
                "month_num": month["month_num"],
                "game_name": record["game_name"],
                "category": record["category"],
                "region": record["region"],
                "location_type": record["location_type"],
                "period": period,
                **record[period],
            }
            rows.append(row)

df = pd.DataFrame(rows)
print(f"Total rows: {len(df)}")
print(df.dtypes)

# Write to CSV or load directly into your database
df.to_csv("nv_gaming_full.csv", index=False)
Suggested Database Schema
A recommended table structure for storing the flattened API data. Designed as a single fact table for easy querying.
CREATE TABLE gaming_revenue (
    id              SERIAL PRIMARY KEY,
    year            INTEGER NOT NULL,
    month           VARCHAR(20) NOT NULL,
    month_num       INTEGER NOT NULL,
    game_name       VARCHAR(100) NOT NULL,
    category        VARCHAR(100),
    region          VARCHAR(200) NOT NULL,
    location_type   VARCHAR(200),
    period          VARCHAR(20) NOT NULL,   -- current_month, three_months, twelve_months
    win_amount      DECIMAL(14, 2),         -- in thousands of dollars
    num_units       INTEGER,
    num_locations   INTEGER,
    pct_change      DECIMAL(10, 4),         -- YoY change as decimal (0.0312 = 3.12%)
    win_percent     DECIMAL(10, 4),         -- win percentage as decimal
    created_at      TIMESTAMP DEFAULT NOW(),

    UNIQUE (year, month_num, game_name, region, location_type, period)
);

-- Recommended indexes for common queries
CREATE INDEX idx_revenue_month ON gaming_revenue (year, month_num);
CREATE INDEX idx_revenue_region ON gaming_revenue (region);
CREATE INDEX idx_revenue_game ON gaming_revenue (game_name);

The UNIQUE constraint lets you use INSERT ... ON CONFLICT (Postgres) or REPLACE INTO (MySQL) for idempotent upserts when re-fetching data.

Handling Nulls & Empty Objects

Some records contain incomplete data. Your ingestion pipeline should handle two cases:

ScenarioWhat You'll SeeRecommended Handling
Missing numeric value"pct_change": nullStore as NULL in your database
No data for a period"current_month": {}Skip the row or insert with all numeric fields as NULL
# Python: safely handle empty period objects
for period in ["current_month", "three_months", "twelve_months"]:
    period_data = record.get(period, {})
    if not period_data:
        continue  # skip empty periods
    row = {
        "win_amount": period_data.get("win_amount"),
        "num_units": period_data.get("num_units"),
        "pct_change": period_data.get("pct_change"),
        # ... other fields
    }
Data Access Tiers

API access requires an active Premium subscription. Each month in the response includes a tier field indicating the data classification:

Tier LabelDescription
freeHistorical data older than 12 months. Available on the website without a subscription, and included in all API responses.
premiumRecent data from the last 12 months. Only available to Professional and Business subscribers via the API and dashboard.

As a Premium subscriber, your API responses include both free and premium tier data. The tier field is informational only — it indicates the age of the data, not your access level.

Response Codes
CodeStatusDescription
200OKRequest succeeded. Response body contains the requested data.
400Bad RequestInvalid query parameters. Check that month is in YYYY-MM format.
401UnauthorizedMissing or invalid API key. Ensure you're sending the x-api-key header.
403ForbiddenAPI key is valid but revoked or lacks permission for the requested resource.
429Too Many RequestsRate limit exceeded. Back off and retry after a short delay.
500Server ErrorAn unexpected error occurred. If this persists, contact support.

Error Response Format

{
  "error": "Invalid API key"
}
Rate Limiting & Best Practices

Rate Limits

All accounts are limited to 1,000 requests per day for abuse prevention. Since gaming data updates once per month, this is more than sufficient for any typical use case. We also recommend keeping requests under 60 per minute for reliable performance.

Best Practices

  • Do an initial bulk fetch (no month param) to load all historical data, then fetch only new months going forward.
  • Gaming data is published monthly by the Nevada Gaming Control Board — schedule your pipeline accordingly (once per month).
  • Use the UNIQUE constraint in your schema for idempotent upserts so re-fetching the same month is safe.
  • Handle empty period objects ({}) and null values — see the Null Handling section above.
  • Store your API key in environment variables or a secrets manager — never commit it to source control.