# Migrate from SportsGameOdds to TheRundown: field and usage maps

> Switch a SportsGameOdds integration to TheRundown with event, participant, line and book mappings, availability checks, and an objects-to-points example.

Published 2026-10-13. Updated 2026-10-13. Canonical: https://therundown.io/blog/migrate-from-sportsgameodds

Choose TheRundown when shared odds-and-score event IDs, explicit source-level price rows and publicly priced WebSocket access fit your application. SportsGameOdds has its own broad catalog and event-object model. Migrate by market semantics and actual coverage, rather than assuming matching field names mean interchangeable data.

This TheRundown-authored guide checks primary documentation and pricing on October 13, 2026. It covers a bounded integration, not a compatibility layer.

## Map event identity before prices

Use league, participant identities and kickoff to propose a match, then verify the event and store both provider IDs. Reschedules, doubleheaders and similarly named participants need explicit handling. Keep your crosswalk separate from the API payload.

| SportsGameOdds model               | TheRundown model                        | Check                                                 |
| ---------------------------------- | --------------------------------------- | ----------------------------------------------------- |
| `eventID`                          | `event_id`                              | Different provider identifiers                        |
| League-specific request            | Numeric `sport_id` plus date            | NFL regular season 2; NBA 4; MLB 3; variants separate |
| Event's `odds.<oddID>`             | Market with participants and line rungs | Match statistic, period, bet type and side            |
| `byBookmaker.<bookmakerID>`        | `prices.<affiliate_id>`                 | Translate bookmaker names to current numeric IDs      |
| Book `odds`, `spread`, `overUnder` | Quote `price` and line `value`          | Preserve odds format and side-specific line           |
| Book `available`                   | Quote `closed_at`                       | Apply explicit availability; do not infer from age    |

SportsGameOdds documents an `oddID` composed of statistic, entity, period, bet type and side. Use the structured fields; a string split is not a complete entity mapper. Its consensus `bookOdds` is not an individual bookmaker quote. TheRundown returns per-source price objects; do not substitute a consensus value for a missing source.

## Read a narrow TheRundown main-line snapshot

Start with the [quickstart](/docs/quickstart), then request a selected date using `market_ids=1,2,3`, `affiliate_ids=19,22,23` and `main_line=true`. These are NFL/NBA/MLB two-sided full-game main-line mappings, not a rule for every sport or period. Use `X-TheRundown-Key` on the server. Free permits these three books for five-minute-delayed pre-match main lines; paid entitlements are needed for props, broader sources and in-play odds.

The following function normalizes a documented TheRundown event into **your application's own rows**. It does not recreate SportsGameOdds's response, calculate consensus odds or issue an API request. Pass it an event from the V2 response's `events` array.

```python
def open_rows(event):
    for market in event.get("markets", []):
        for participant in market.get("participants", []):
            for line in participant.get("lines", []):
                for affiliate, quote in line.get("prices", {}).items():
                    if quote.get("closed_at"):
                        continue
                    if float(quote["price"]) == 0.0001:
                        continue
                    yield {
                        "event": event["event_id"],
                        "market": market["market_id"],
                        "participant_type": participant["type"],
                        "participant": participant["id"],
                        "line_id": line["id"],
                        "line": line["value"],
                        "book": int(affiliate),
                        "american_odds": quote["price"],
                        "updated_at": quote.get("updated_at"),
                    }
```

This parser keeps signed line values, participant types and per-book identity. Do not join a +3.5 rung to a −3.5 rung or merge over/under participants. Apply a later `closed_at: ""` reopen to the same exact quote. Finished events can retain closing prices; stored prices alone do not establish live availability. Read the [data model](https://docs.therundown.io/reference/data-model) for the complete response.

## Objects and data points: calculate your actual workload

One event containing multiple book quotes is not one TheRundown data point. Suppose one selected game returns three two-sided main markets at three books, plus its event and score, with no `live_game_state`. The illustrative count is **2 + (3 × 2 × 3) = 20 points**. One hundred such events returned once would use 2,000 points. A repeated snapshot bills those returned records again; missing rows lower the result.

Compare that measured workload with the object usage reported by your existing account. There is no universal objects-to-points multiplier, because nested market/source breadth changes the row count. Read the actual `X-Datapoints` header, confirm rate limits, and test a busy slate. Scope requests to what the application consumes.

TheRundown paid plans charge a fixed subscription fee with included volume. Using fewer points conserves the allowance but does not reduce the base fee. Monthly/annual plans stop at the cap by default; optional overage and weekly plans have separate rules. See [metering](https://docs.therundown.io/rate-limits).

## Pricing and transport during migration

SportsGameOdds publishes Rookie at $149/month and Pro at $499/month; annual equivalents are $99 and $299. Its AllStar streaming package uses custom pricing. TheRundown lists Starter $49/month with a 60-second delay and internal-use rights, Pro $149 with a 30-second delay and commercial display, and Ultra $399 with real-time REST/WebSocket. Free odds have a five-minute delay. These are different coverage, delivery and usage packages, so compare the required workload rather than headline units.

Ultra includes one connection with three multiplexed subscriptions. Keep a REST baseline and design reconnect/catch-up behavior from the [WebSocket specification](https://docs.therundown.io/api-reference/v2/websocket). A streaming endpoint is not a substitute for event/entity mapping or a guarantee that every source carries every market.

## Validate the consumer before cutover

Test a moneyline, both signed spread sides, both total participants, a closure and reopen, a withdrawn alternate and a missing source. Check market period and prop participant identities separately. Verify whether your app consumes consensus or fair-odds calculations, SDK helpers and bookmaker links; those features need their own implementation or a confirmed corresponding field.

Run old and new reads side by side at comparable effective freshness. Confirm display rights and every required source/market on actual events. See the [SportsGameOdds comparison](/compare/sportsgameodds), [alternative guide](/blog/sportsgameodds-alternative) and [sports odds API guide](/sports-odds-api) for the integration/pricing context.

## Sources checked October 13, 2026

- [SportsGameOdds oddID and bookmaker fields](https://sportsgameodds.com/docs/data-types/odds)
- [SportsGameOdds pricing](https://sportsgameodds.com/pricing/)
- [SportsGameOdds streaming](https://sportsgameodds.com/docs/guides/realtime-streaming-api)
- [TheRundown sport catalog](https://docs.therundown.io/reference/sports)
- [TheRundown source catalog](https://docs.therundown.io/reference/sportsbooks)
- [TheRundown pricing and rights](/pricing/api)

## Questions

### Can I reuse SportsGameOdds eventID values in TheRundown?

No. Map provider event IDs using league, participants and scheduled kickoff, then keep an explicit crosswalk. Team and player identifiers also need mapping; matching a display name alone is insufficient.

### Does one SportsGameOdds event object equal one TheRundown data point?

No. An event object can contain many odds. TheRundown meters returned price rows plus event/score records. Three fully priced two-sided markets at three books use 20 data points for one event with a score and without live_game_state.

### Can I move streaming to a standard TheRundown plan?

TheRundown Ultra and above include WebSocket; Ultra is $399 monthly with one connection and three multiplexed subscriptions. SportsGameOdds documents streaming on custom AllStar. Confirm the exact source and market requirements before changing packages.

### Does a stored price mean the market is open?

No. Preserve the old feed’s explicit availability state during migration. On TheRundown, apply closed_at for the exact participant, signed line and book; a later empty closed_at reopens it. Price age alone is not the closure signal.
