Skip to main content

Bifrost Integration Chat — 2026-03-06 (Friday)

Channel: #forsyt-bm-integration (Suntech Innovation Slack)


Bhargav — 12:08 AM

Hi @Michael Cheremuhin, we've deployed fixes for issues 1, 2, 5, and 6. Here's what changed and a few questions: Issue 1 — NO bets failing: Fixed. Our isHarjeetOdds() function wasn't recognizing 'INDIAN' as an odds type — it only matched 'HARJEET'/'HARJEETS'. This meant markets with oddsType: 'INDIAN' had their prices treated as decimal instead of harjeet format, causing valid harjeet prices (especially 0) to be rejected as "No price available" during bet validation. Now fixed — 'INDIAN', 'HARJEET', and 'HARJEETS' are all handled identically. Issue 2 — Max button: Fixed. The Max button was only considering the user's balance and market-level volume, but not the per-outcome maximum at the best price level. Now it takes min(per-outcome max, market volume, balance). Issue 3 — Betslip price sync: Our betslip follows a price-improvement-only sync: we only update the betslip price when the new price is BETTER for the customer (higher for back, lower for lay). If the price worsens, the customer keeps their original price. This is standard betting UX to protect customers from being silently disadvantaged. We are not requesting a new price from the API — we receive price updates via the market book stream and apply them to open betslips only when favorable. Would you prefer all price changes (including worse prices) to sync instead? Issue 4 — Super Over: We've added diagnostic logging (oddsType now appears in our catalogue logs). In the last 48h we only received 9.x fancy market types — no 14.x sportsbook markets and no SUPER_OVER type in our logs. A few questions to help us fix this: What marketType does Bifrost send for Super Over? (e.g., SUPER_OVER, MATCH_ODDS_SB, something else?) What name string comes with it? • Is it a 14.x or 9.x market ID? Once we know the exact type, we can add proper mapping so it displays as "Super Over" instead of falling back to "Match Odds (Bookmaker)". Issue 5 — Lay odds not showing for match odds: Fixed. We were forcing all Bifrost markets into a back-only grid. Now, any Bifrost multi-outcome market that has lay data will display with both back and lay columns (same grid we use for Betfair exchange markets). Issue 6 — Fractional harjeet prices showing as "2": Fixed. Two bugs — same root cause as Issue 1 ('INDIAN' not recognized), plus our display function was using Math.round() on Indian rates. A harjeet rate of 1.5 was displayed as Math.round(1.5) = 2. Now we properly convert: harjeet 1.5 → decimal 1.015 in our backend, then convert back to Indian rate 1.5 for display. Questions for you: Can you confirm what oddsType values you send in market catalogues? We now handle 'INDIAN', 'HARJEET', 'HARJEETS', and 'DECIMAL' — all the Indian variants are treated as the same paise format. Is there any difference between 'INDIAN' and 'HARJEET' in your system?

  1. For the Super Over issue — what marketType and name does Bifrost send? We need this to add proper display mapping.
  2. On price sync (Issue 3) — should we keep price-improvement-only, or do you want real-time sync in both directions?

Thread (41 replies):

Michael Cheremuhin — 12:21 AM pretty strange about ‘indian’ odds type, will check where it might come from. will also check the rest. the main things is NO bets are fixed, let me give a nudge to conformance team

Bhargav — 12:29 AM Thanks. Please let us know your comments on the above questions.

Also, Currently Bifrost sends empty minStakeCurrencies and no minStake, so we're using a flat fallback (1 HKD = 10 FP). At low rates like 10, that means almost zero effective risk per bet.

Two questions:

  1. Can you populate minStakeCurrencies or minStake per market/runner on your side? The proto fields are already there.
  2. If not, do you have a recommended minimum liability threshold we should enforce? We're thinking of switching from "min stake" to "min liability" so the effective risk is meaningful regardless of odds.

Badal Agrawal — 11:41 AM min(per-outcome max, market volume, balance). Why is market volume required in this equation? @Bhargav

Michael Cheremuhin — 1:21 PM hi gents. would you mind sharing sample messages from us with oddsType 'INDIAN' and 'HARJEETS' ? i'd expect it to be DECIMAL and HAAR_JEET

Michael Cheremuhin — 1:23 PM for SuperOver we are using same market type MATCH_ODDS_SB with "name": "Super Over (Bookmaker)"

Michael Cheremuhin — 1:24 PM as for prices sync - let's keep applying only when it becomes better

Michael Cheremuhin — 1:26 PM regarding minStake - overall we don't provide this field, though it's reserved. something like 10HKD might be a good value for either min stake or liability

Michael Cheremuhin — 2:57 PM @Bhargav what happened with the odds?

Michael Cheremuhin — 2:57 PM 📎 image.png

Michael Cheremuhin — 2:57 PM 📎 image.png

Michael Cheremuhin — 2:59 PM if you want to give them in decimal, the formula is: decimal_price = (haarjeet_price / 100) + 1 you will need to convert the bet odds back into haarjeet

Michael Cheremuhin — 2:59 PM if you want to keep haarjeet, you don't need to modify the odds

Michael Cheremuhin — 3:01 PM pt6 was about rounding that you were doing, not about changing the way how your treat the odds in general. we were almost perfect there, can you please revert that back

Bhargav — 4:17 PM @Michael Cheremuhin We don't have any messages with INDIAN or HARJEETS — those values never appeared in your data. Here are actual samples from the last 24h:

oddsType=ODDS:

catalogue: 9.1958068 type=MATCH_ODDS_SB oddsType=ODDS "Match Odds (Bookmaker)" runners=2 catalogue: 9.1975923 type=NEXT_BALL_MULTI oddsType=ODDS "Ball 0.5 Runs Tas Tigers" runners=7

oddsType=LINE:

catalogue: 9.2103554 type=SESSION_RUNS oddsType=LINE "1 Over Runs Arunachal Pradesh" runners=1

catalogue: 9.2103557 type=SESSION_RUNS oddsType=LINE "2 Over Runs Balochistan" runners=1

The only two values we've ever received are LINE and ODDS. The INDIAN/HARJEETS in our code were assumptions we wrote — not from your messages.

We've now updated to properly recognize LINE and ODDS, and also added HAAR_JEET/DECIMAL per your expected values.

Bhargav — 5:30 PM Can you tell me which markets and for which match should I test these Harjeet oddsType?

Bhargav — 6:48 PM @Michael Cheremuhin Let's connect on this finish this ASAP today. We can connect on a call to make this faster. Today is friday and we are looking to close and get prod APIs today. We want to test for the Final match on Sunday.

Michael Cheremuhin — 7:08 PM @Bhargav seems like i've found the issue. please check if you are using this proto for market book:

  string marketId = 1;
string marketStatus = 2;
double maxMarket = 3;
map<string, double> maxMarketCurrencies = 4;
repeated Runner runner = 5;
map<string, string> variables = 6;
int64 version = 7;
string sportId = 8;
optional double minStake = 9;
map<string, double> minStakeCurrencies = 10;
string tradingMarketType = 11;
string oddsType = 12;
}```

**Michael Cheremuhin** — 7:09 PM
oddsType might be one of the following:
• HAAR_JEET
• DECIMAL

**Michael Cheremuhin** — 7:12 PM
as for prod env access, i'm afraid it's beyond my power. I've escalated your request to conformance team who makes the decision

**Bhargav** — 7:50 PM
We didn't find this oddsType in the docs you shared with me.
But anyways we fixed it now.
Do you have the latest docs covering everything that you support today?

**Michael Cheremuhin** — 7:53 PM
sure @Bhargav. looks like that update somehow wasn't reflected in pdf export

**Michael Cheremuhin** — 7:53 PM
📎 BFST-Bifrost API Public Documentation-060326-142139.pdf

**Bhargav** — 8:06 PM
What providerId do we have to use when sending PlaceBet?

**Bhargav** — 8:16 PM
@Michael Cheremuhin
Can you confirm cancel bets confirmations come via bets.cancel.queue or bets.snapshot.queue?

**Bhargav** — 8:29 PM
@Michael Cheremuhin Given that the MarketBook now has oddsType, Should we prefer MarketBook's oddsType over MarketCatalogue's, or use catalogue as primary and marketbook as fallback?

**Badal Agrawal** — 11:16 AM
@Michael Cheremuhin Anything on this?

**Michael Cheremuhin** — 1:40 PM
hi gents. for bets we have the following queues only:
1. bets.snapshot.queue - anything that updates bets entities, including their status in case of voiding, comes here
2. bets.outcomes.queue - holding bets outcomes, anything that is updating bets settlement information comes here
we don't have any other bets queues

**Michael Cheremuhin** — 1:41 PM
market catalogue holds definition about the market if it's line or odds type. market book holds information about odds type if it's harjeet or decimal

**Michael Cheremuhin** — 1:42 PM
> What providerId do we have to use when sending PlaceBet?
which field is referenced here? i assume bet placement was already working

**Bhargav** — 2:12 PM
> market catalogue holds definition about the market if it's line or odds type. market book holds information about odds type if it's harjeet or decimal
Do you mean to say, the oddsType in Market Catalogue is actually Market Type and oddsType in MarketBook is pricing type?

If yes, I think the "oddsType" field name is confusing for representing HAAR_JEET and DECIMAL.

Correct me if my understanding is wrong.

**Michael Cheremuhin** — 2:15 PM
if your system relies on market type string, you need only odds type from market book

**Bhargav** — 2:24 PM
MarketBook:
marketId": "9.2274644
```{
"maxMarketCurrencies": {
"hkd": 50000,
"aed": 23695,
"eur": 5825,
"bdt": 781250,
"gbp": 4970,
"rmb": 45870,
"usd": 6410,
"inr": 555555
},
"runner": [
{
"id": 3701713,
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"maxStakeCurrencies": {
"hkd": 5000,
"aed": 2365,
"eur": 580,
"bdt": 78125,
"gbp": 495,
"rmb": 4585,
"usd": 640,
"inr": 55555
},
"price": 90,
"line": 79,
"maxStake": 5000
}
],
"availableToLay": [
{
"maxStakeCurrencies": {
"hkd": 4545.45,
"aed": 2150,
"eur": 525,
"bdt": 71020,
"gbp": 450,
"rmb": 4170,
"usd": 580,
"inr": 50505
},
"price": 110,
"line": 79,
"maxStake": 4545.45
}
]
},
"version": 1773043516881
}
],
"variables": {
"USE_CUSTOM_NAME": "true",
"WICKET_NUMBER": "3",
"TEAM_NAME": "Karachi Region Whites",
"MARKET_TYPE": "FallOfWicket",
"SERIES_TYPE": "T20",
"TEAM_SHORT_NAME": "Karachi Region Whites",
"INNING_NUMBER": "1",
"SUB_MARKET_TYPE": "FallOfWicket"
},
"minStakeCurrencies": {},
"marketId": "9.2274644",
"marketStatus": "OPEN",
"maxMarket": 50000,
"version": 1773043516962,
"sportId": "2",
"oddsType": "HAAR_JEET"
}```


**Bhargav** — 2:24 PM
MarketCatalogue:
```Fall of 3rd Wicket Karachi Region Whites```
```{
"runner": [
{
"metadata": {},
"id": 3701713,
"name": "Fall of 3rd Wicket Karachi Region Whites",
"sortPriority": 1
}
],
"id": "9.2274644",
"eventId": "22.154532",
"marketType": "FALL_OF_WICKET",
"name": "Fall of 3rd Wicket Karachi Region Whites",
"startTime": "2026-03-09T11:15:00.000Z",
"oddsType": "LINE",
"sortOrder": 500474644,
"metadata": {
"competitor": []
},
"version": 1773043516881,
"sportId": "2"
}```

**Bhargav** — 2:39 PM
Do you want us to map the MarketCatalogue with MarketBook?
If that's the case,
Then
• First identify the market from `name` field in `MarketBook` model.
• Map `MarketBook` and `MarketCatalogue` with `marketType` ?
I see we have most if not all the data in `MarketBook` already. What should we use `MarketCatalogue` for?
What's the ideal way of integrating info from both the queues? Why do they co-exist?

**Michael Cheremuhin** — 2:50 PM
both MB and MC are connected with MC.id <> MB.marketId, that's the only source to map them.
the main purpose of MC is to hold meta information that doesn't usually change during market life cycle like market type, start time.
opposite to that, MB holds dynamic data like odds and limits.

we recommend to store both entities and consider market to be correct and available for betting if both parts are present on your side

**Bhargav** — 2:53 PM
> What providerId do we have to use when sending PlaceBet?
Can you confirm this one as well please?

**Michael Cheremuhin** — 2:55 PM
according to docs, place bet request is defined as follows:

**Michael Cheremuhin** — 2:55 PM
📎 image.png

**Michael Cheremuhin** — 2:56 PM
i don't think we claim providerId field during bet placement, where it comes from?

**Bhargav** — 3:03 PM
It was there in the old doc.

**Bhargav** — 3:03 PM
Will refer to the new one

Michael Cheremuhin — 7:37 PM

seems like MatchOdds markets don't go to SUSPENDED now (regression)

Thread (1 replies):

Michael Cheremuhin — 7:37 PM sample message:

  "marketId": "9.2267633",
"marketStatus": "SUSPENDED",
"maxMarket": 7500,
"maxMarketCurrencies": {
"hkd": 7500,
"aed": 3550,
"eur": 870,
"bdt": 117185,
"gbp": 745,
"rmb": 6880,
"usd": 960,
"inr": 83330
},
"runner": [
{
"id": "3684430",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 106,
"maxStake": 471.69,
"maxStakeCurrencies": {
"hkd": 471.69,
"aed": 220,
"eur": 50,
"bdt": 7370,
"gbp": 45,
"rmb": 430,
"usd": 60,
"inr": 5240
}
}
],
"availableToLay": [
{
"price": 113,
"maxStake": 442.47,
"maxStakeCurrencies": {
"hkd": 442.47,
"aed": 205,
"eur": 50,
"bdt": 6910,
"gbp": 40,
"rmb": 405,
"usd": 55,
"inr": 4915
}
}
]
},
"version": "1772806011031"
},
{
"id": "3684431",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 89,
"maxStake": 500,
"maxStakeCurrencies": {
"hkd": 500,
"aed": 235,
"eur": 55,
"bdt": 7810,
"gbp": 45,
"rmb": 455,
"usd": 60,
"inr": 5555
}
}
],
"availableToLay": [
{
"price": 94,
"maxStake": 500,
"maxStakeCurrencies": {
"hkd": 500,
"aed": 235,
"eur": 55,
"bdt": 7810,
"gbp": 45,
"rmb": 455,
"usd": 60,
"inr": 5555
}
}
]
},
"version": "1772806011031"
}
],
"version": "1772806011107",
"sportId": "2",
"oddsType": "HAAR_JEET"
}```