Maverick is an app that can place bets automatically on Bet365 leveraging your existing web browser. It runs on Windows and macOS (Linux coming soon) and simulates human behaviour to avoid being detected. Bets are placed in an average of 5 seconds, making it ideal for live matches and real-time betting.
Maverick itself is just your executor arm for unattended betting. You can think of it as an API for Bet365. Maverick does not include a betting strategy nor will perform any bets by itself. It's up to the user to send instructions to Maverick for them to be executed.
Instructions are sent via Websockets. The user is responsible for spinning up a Websocket server, through which it can send and receive commands from Maverick. An example server that is commonly used to start off can be found here. You can connect as many Maverick clients to your server as you want.
Basic programming knowledge is strongly recommended. This is not a plug-and-play solution.
Maverick is available upon request:
- Email: abel
(at)
jupiter(dash)
labs(dot)
tech - Telegram:
(at)
abel(underscore)
maverick.
You should be up and running in around 2-3 days since your first contact.
I need more markets, would you add them?
Yes, no problem, should be quick.What about other betting platforms?
We can add other betting platforms for those willing to sponsor their development.Can it place bets on multiple platforms at the same time?
Yes indeed.Can it use a Telegram group as feed for its tips?
Absolutely. There's an open source extension for Maverick available which you can customize for your particular needs and includes Telegram.Can I run it in my own computer at home or do I need a server?
You can use both, but at home is always easier.I need XYZ, can you do it for me?
Maybe, shoot me an email, let's chat!Is the full source code available for sale?
Sure, everyone has a price.- Single bets
- Multi-legged bets (a.k.a. "parlay" or "accumulator")
- Result
- Double chance
- Draw no bet
- Goal line
- Goals
- Asian handicap
- Score
-
Hands-free bet placement on live matches
- Error detection on match, market, and bet levels
- Auto-retry capabilities:
- Participant suspended
- Accept odds changed
- Input quantity failure
- Click or selection failure
- Authentication QR code detection
- Authentication QR code solving
-
Hands-free bet closing for active bets
- Auto-retry on close suspended
- Minimum cash out threshold
- Return tracking
-
Auto-login (and re-login) with error detection
-
Request lifetime history tracking
-
Detailed error reporting
-
Bet queuing
-
Settings accessible through TOML file
Maverick expects to find a Config.toml
file in the same directory as the executable. The file is pretty self-explanatory, but here's what to expect from every category:
Category | Description |
---|---|
Server | Connection URL to the WebSocket (RF6455) server that will send the commands to Maverick |
Browser | Canonical path to the Chrome browser executable |
Platforms | Betting platform credentials (in plain text) and additional features to be enabled |
X | Developer credentials to post your bets on 𝕏 |
This is how the server settings should look:
[server]
addr = "ws://SERVER_HOST:PORT"
max_retries = 10
Property | Description |
---|---|
addr | The Websocket server address (incl. port) |
max_retries | Max. nº of reconnection attempts before abort. |
This is how the browser settings should look:
[browser]
bin_path = "/absolute/path/to/chrome"
window_size = [1500, 900]
Property | Description |
---|---|
bin_path | The absolute path of the Chrome binary. |
window_size* | An array specifying window width and height. |
window_pos* | (Optional) Window left and top offset coordinates. |
*Window size and position settings may not as expected work on macOS.
This is how a platform configuration should look:
[platforms.bet365]
host = "www.bet365.com"
username = "theBetGod"
password = "iLoveMe$$i!"
language = "en"
features = []
Property | Description |
---|---|
host | The root domain/host for the platform |
username | The username of the account used to bet |
password | The account password (in plain text) |
language | The language of the account used to bet |
features | Additional features to be enabled |
Maverick is contained in a single binary and can be excuted using the command line.
Note: It is strongly recommended to run Maverick using a proper terminal/command line interface. Especially on Windows, the default console is known to cause issues when dealing with certain characters and colors.
$ ./maverick
maverick.exe
On startup, Maverick will automatically connect to the WebSocket server defined in the configuration file. On any disconnect, it will attempt to reconnect max_retries
times. If a connection can't be established, Maverick will gracefully shut down.
💡 We strongly encourage all new users to play around with the
betreq
CLI utility included in your Maverick bundle in order for you to understand how to specify your bets and get familiar with the API syntax.On Windows:
betreq.exe
On macOS/Linux:
./betreq
Maverick supports 3 commands from the upstream:
Command | Description |
---|---|
session_start |
Starts a new session. |
place_bet |
Attempts to place a bet |
close_bet |
Attempts to close an open/active bet |
session_start
will effectively start a new session. This means:
- Dump full bet history for current session into a session log file.
- Clear bet history and start a new, fresh betting session.
- Reset equity for this session with current account balance.
"session_start"
place_bet
will attempt to place a bet in the given match. place_bet
contains a BetRequest
object,
for which the main parameters are:
id
: A UUID that will uniquely identify this bet request on your system.host
: The root domain for the betting platform (platformhost
value fromConfig.toml
)bet
: The bet(s) to be placed, which contains:match
: The details to identify the live match (see below for more details).market
: The actual market and participant we're betting on (see below for more details).odds
: The odds we are looking for (see below for more details).tf
: The time frame for the bet (e.g.FirstHalf
,SecondHalf
,FullTime
).stake
: The amount of capital we want to deploy (between 0 and 1).
There's currently two ways of specifying a match:
"match": "https://www.bet365.com/#/IP/EV00000012345678"
"match": ["Roma", "Lazio"]
Note: Combined bets only support url-identified matches.
Some examples of actual bets:
"bet": {
"market": {
"result": "Ajax FC" // Uses name to specify participant
},
"match": "https://www.bet365.com/#/IP/EV00000012345678",
"odds": {
"base": 3.2
},
"tf": "FullTime"
}
"bet": {
"market": {
"double_chance": 1 // Uses index to specify participant
},
"match": "https://www.bet365.com/#/IP/EV00000012345678",
"odds": {
"base": 2.1
},
"tf": "FullTime"
}
"bet": {
"market": {
"draw_no_bet": "Sevilla"
},
"match": "https://www.bet365.com/#/IP/EV00000012345678",
"odds": {
"base": 1.8
},
"tf": "FullTime"
}
"bet": {
"market": {
"goal_line": {
"over": [3.0],
"score": [1, 2]
}
},
"match": "https://www.bet365.com/#/IP/EV00000012345678",
"odds": {
"base": 3.45
},
"tf": "FirstHalf"
}
"bet": {
"market": {
"goal_line": {
"score": [0,1],
"under": [2.0, 2.5]
}
},
"match": "https://www.bet365.com/#/IP/EV00000012345678",
"odds": {
"base": 2.5
},
"tf": "FullTime"
}
"bet": {
"market": {
"goals": {
"over": 4.0
}
},
"match": "https://www.bet365.com/#/IP/EV00000012345678",
"odds": {
"base": 2.83
},
"tf": "FirstHalf"
}
"bet": {
"market": {
"asian_hcp": {
"line": [1.5],
"score": [0, 2],
"team": "Manchester City"
}
},
"match": "https://www.bet365.com/#/IP/EV00000012345678",
"odds": {
"base": 4.15
},
"tf": "FullTime"
}
"bet": {
"market": {
"asian_hcp": {
"line": [-0.5, -1],
"score": [0, 0],
"team": "Udinese FC"
}
},
"match": "https://www.bet365.com/#/IP/EV00000012345678",
"odds": {
"base": 2.5
},
"tf": "FullTime"
}
You can specify a tolerance factor for fast-changing handicaps. In the following example, all line values have a ±0.25 tolerance factor, which you can adapt to your needs.
"line":[[3.5],0.25]
"line":[[0.0, 0.5],0.25]
Score is always a 2-element array, where the first element is the home team score and the second is the away team score.
"bet": {
"market": {
"score": [3, 4]
},
"match": "https://www.bet365.com/#/IP/EV00000012345678",
"odds": {
"base": 11.5
},
"tf": "FirstHalf"
}
{
"place_bet": {
"bet": [
{
"market": {
"result": "Leicester City"
},
"match": "https://www.bet365.com/#/IP/EV00000012345678",
"odds": {
"base": 15.3,
"tolerance": 0.1
},
"tf": "FullTime"
},
{
"market": {
"goals": {
"over": 3.0
}
},
"match": "https://www.bet365.com/#/IP/EV00000012345678",
"odds": {
"base": 4.1,
"tolerance": 0.1
},
"tf": "FirstHalf"
},
{
"market": {
"score": [2, 1]
},
"match": "https://www.bet365.com/#/IP/EV00000012345678",
"odds": {
"base": 3.85
},
"tf": "FullTime"
}
],
"host": "www.bet365.com",
"id": "7e81d4da-3440-44d8-ad29-edc84fb73157",
"stake": 0.05
}
}
The odds have a default threshold of ±10% from the base
value. Optionally, this threshold can be adjusted by adding the tolerance
parameter as shown below:
{
"base": 1.4,
"tolerance": 0.25
}
The tolerance
value is normalized, so only values in the range 0..1
should be used. In the example, 0.25
would allow for a 25% deviation to either side from the base 1.4
value, so effectively the bet would be placed if the actual value offered by the platform is within the range 1.05..1.75
.
The nominal cash amount of the bet is effectively derived from the stake
value, which again should always be in the range 0..1
.
Assuming B
is the session starting balance, the bet amount will be calculated as follows:
Bet Amount = B × stake
So, as an example, if the session starting balance B
is 100€ and the stake
for a given bet request is 0.05
, Maverick will attempt to place the bet using 5€ of capital.
CloseBet will attempt to close an open/active bet. The request is pretty straightfoward:
bet_req_id
corresponds to the original bet request id used inPlaceBet
when the bet was placed.min_cashout
is the minimum percent cashout value relative to the wager placed for Maverick to close the bet.
{
"close_bet": {
"bet_req_id": "7e81d4da-3440-44d8-ad29-edc84fb73157",
"min_cashout": 1.6
}
}
Occasionally, Maverick will send data back to the Websocket server. These are the messages that can be expected.
Every time a new platform is logged in, a SessionData
message will be sent back to the server containing:
- Starting time of the current session
- Starting balance of all currently logged in platforms
Here's an example:
{
"date":1702985129669,
"start_balance":{
"bet365.com": 995.24,
"bwin.es": 52.98
}
}
When either a PlaceBet
or CloseBet
is completed, Maverick will always send a full BetRequest
object back to the server with all the details and history of everything that happened during that request, including (if applies) the close.
Here's a complete example of what it might look like:
{
"id":"0dd700b3-0a9c-452e-b3f6-c0228f9492aa",
"host":"www.bet365.com",
"bet":[
{
"match":{
"Url":"https://www.bet365.com/#/AC/B1/C1/D8/E161801311/F3/"
},
"market":{
"Goals":{
"Over":2.5
}
},
"odds":{
"base":1.66,
"tolerance":0.1
},
"tf":"FullTime"
},
{
"match":{
"Url":"https://www.bet365.com/#/AC/B1/C1/D8/E161190320/F3/"
},
"market":{
"Score":[1, 2]
},
"odds":{
"base":23.0,
"tolerance":0.1
},
"tf":"FullTime"
},
{
"match":{
"Url":"https://www.bet365.com/#/AC/B1/C1/D8/E161190309/F3/I1/"
},
"market":{
"Score":[3, 2]
},
"odds":{
"base":34.0,
"tolerance":0.1
},
"tf":"FullTime"
},
{
"match":{
"Url":"https://www.bet365.com/#/AC/B1/C1/D8/E161190315/F3/"
},
"market":{
"Score":[2, 2]
},
"odds":{
"base":40.0,
"tolerance":0.1
},
"tf":"FirstHalf"
},
{
"match":{
"Url":"https://www.bet365.com/#/AC/B1/C1/D8/E161190989/F3/"
},
"market":{
"Score":[0, 0]
},
"odds":{
"base":2.6,
"tolerance":0.1
},
"tf":"FirstHalf"
}
],
"stake":0.05,
"amt":4.78,
"hist":[
{
"timestamp":1727283011713,
"status":"Received"
},
{
"timestamp":1727283012883,
"status":"Ready"
},
{
"timestamp":1727283016891,
"status":{
"Loaded":"https://www.bet365.com/#/AC/B1/C1/D8/E161801311/F3/"
}
},
{
"timestamp":1727283023366,
"status":{
"Loaded":"https://www.bet365.com/#/AC/B1/C1/D8/E161190320/F3/"
}
},
{
"timestamp":1727283030439,
"status":{
"Loaded":"https://www.bet365.com/#/AC/B1/C1/D8/E161190309/F3/I1/"
}
},
{
"timestamp":1727283031093,
"status":{
"Error":{
"OddsChanged":41.0
}
}
}
]
}
When the bet is actually placed, the last status update will look like this:
{
"timestamp":1727176294823,
"status":{
"Placed":{
"ref":"BF7709201861A",
"amt":4.94,
"odds":123.45,
"acct_balance":94.30
}
}
}
The following is a comprehensive list of all errors that can occur while executing a BetRequest
.
Error code | Description |
---|---|
MarketSuspended | Market was suspended at the time of attempting the bet |
OddsChanged(f32) | Odds changed and are out of the specified tolerance factor |
NotLoggedIn | User is not logged in |
MatchNotFound | Match not found (probably finished) |
MatchSuspended | Match was suspended at the time of attempting the bet |
MarketNotSupported | Market is not supported |
MarketNotAvailable | Market was not available at the time of attempting the bet |
ParticipantNotFound | Participant was not found |
NoOpenBets | No bets are open for the specified match |
BetNotFound | The requested bet (to close) was not found |
CloseSuspended | Closing was suspended when attempting to close this bet |
CloseNotAvailable | Closing is not available for the requested bet |
BelowMinCashout(f32) | Bet return is below min cashout % threshold |
Timeout(String) | Took to long to perform a task |
BetMalformed(String) | An error in the bet request's betting amount |
AuthQRCodeRequested(String) | Platform requested QR authentication by a user |
QRSolverService(String) | Errors originated from the QR Solver service |
PlatformErrorMsg(String) | Platform error message appeared when placing a bet |
License(String) | License error (includes details as a String) |
Other(String) | Other errors (includes details as a String) |
Unknown | Unknown error |
Maverick is expected to run on a dedicated environment. It's not meant to be used in hostile environments nor anywhere where a human is interfering with its operation.
- Chrome needs to be in the main display of the computer running Maverick.
- Chrome must remain in foreground at all times.
- Chrome must be exclusively used by Maverick.
- Betting platforms have been manually granted all the permissions they require.
- Betting accounts used have been manually authorized by a human.