BetBalancer Betting Platform API v2.4

Il documento contiene le specifiche tecniche d’integrazione delle api betting in modalità iframe del software di gioco di BetBalancer.

Il sistema si basa su una serie di chiamate HTTP che forniscono un output formattato in JSON.

Ogni richiesta viene autenticata in modo stateless mediante un hash di sicurezza che viene inviato con la stessa usando un sistema di chiave pubblica e privata.

Struttura di una richiesta

Ogni richiesta http viene strutturata con due set di dati:

  • Dati GET (via URL): riguardano le informazioni necessarie alla validazione della richiesta.
  • Dati POST (form urlencoded): dati specifici per il metodo invocato.

Endpoint

https://..betbalancer-service-host../api/webservice/

Parametri GET spetiti via URL

parametro

descrizione

public

la chiave pubblica assegnata che va inviata in chiaro con la richiesta

time

il timestamp attuale al momento della richiesta

op

il nome del metodo della webservice che si intende invocare

hmac

l’hash di sicurezza inviato per la validazione della richiesta

es.: /api/webservice/?public=test&op=users.auth&time=1537871253&hmac=af091…

Calcolo dell’hash hmac

Per la generazione dell’hash è necessario disporre della chiave privata fornita in coppia quella pubblica. Tale informazione è quello che garantisce la sicurezza della richiesta e deve pertanto essere archiviata in modo sicuro.

L’hash hmac viene calcolato con l’algoritmo sha256 a cui vanno forniti in ingresso i parametri op, time e il payload POST della richiesta e utilizzando come chiave quella fornita.

Queste informazioni vanno concatenate tra loro come stringa senza alcun carattere separatore. Lo pseudocodice rappresentativo della codifica è il seguente:

hmac = HMAC.SHA256

     op + time + postdata, 

      privatekey 

)

Importante: l’hash deve essere fornito come rappresentazione esadecimale lowercase.

Struttura di una risposta

Tutte le risposte del servizio arrivano in forma di stringa JSON contenente i parametri:

parametro

descrizione

status

l’esito della richiesta, puo’ essere uno tra i seguenti:

success

l’operazione è andata totalmente a buon fine

warning

i dati di risposta arrivano in modo corretto ma qualcosa potrebbe non aver funzionato come previsto. Nel qual caso in msg viene fornita una spiegazione.

error

la richiesta è fallita, msg contiene i dettagli dell’errore

method

indica il metodo della webservice invocato

msg

in caso di “warning” ed “error” fornisce ulteriori dettagli sulle problematiche

data

contiene i dati di output del metodo. Nella documentazione dei metodi della webservice si da` per scontato che i dati forniti siano racchiusi in questo nodo.

Metodi Webservice

POST users.auth

INPUT

Questo metodo si occupa della creazione di una sessione utente sul servizio. Se l’utente non esiste sarà creato automaticamente. Se la struttura a cui appartiene l’utente non esiste sarà creata automaticamente.

NB: Una volta creato un utente e uno shop, i loro dati non potranno essere modificati. In assenza di shopid e shopname, l’utente sarà creato sotto lo shop di default e non sarà possibile spostarlo al di sotto di un altro shop.

I dati POST accettati dalla richiesta sono i seguenti:

parametro

descrizione

username

Lo username che l’utente utilizzerà per il login.

(pattern: ^[a-zA-Z0-9_-]{3,50}$)

clientip

L’ip di collegamento attuale dell’utente. Se non viene fornito l’ip corretto la sessione utente non potrà essere creata.

userid

Facoltativo. [intero positivo, 10 cifre max] ID esterno che identifica la user in maniera univoca. Se fornita viene ritornata nei report delle api del wadmin.

currency

Facoltativo. La valuta dell’utente in formato ISO 4217. Se non fornita viene utilizzata la valuta di default configurata per il partner che integra il servizio.

Nota: una volta iscritto un utente con una valuta non è ammesso cambiarla e non è possibile iscrivere utenti con una valuta diversa da quella della struttura di appartenenza

cashier

Facoltativo. Se valorizzato come “1” indica che la user deve disporre delle funzionalità di cassa, altrimenti è un utente normale. Valore di default: “0”

shopid

Facoltativo. [alfanumerico, 10 caratteri max] Un id univoco della struttura sotto cui si trova la user. Se non fornito la user verrà iscritta sotto la struttura di default.

Se valorizzata, deve essere fornita in coppia col parametro “shopname” altrimenti il metodo ritornerà errore

shopname

Facoltativo. Il nominativo univoco di riferimento della struttura sotto cui iscrivere la user. Se non fornito la user verrà iscritta sotto la struttura di default.

Se valorizzata, deve essere fornita in coppia col parametro “shopid” altrimenti il metodo ritornerà errore

OUTPUT

I dati forniti in risposta da questo metodo sono i seguenti:

parametro

descrizione

id

l’id interno univoco del servizio generato per l’utente

token

il token di sessione

POST users.logout

INPUT

Questo metodo si occupa di invalidare uno specifico token, forzando in questo modo il logout dell’utente a cui è associato.

I dati POST della richiesta sono tutti obbligatori e sono i seguenti:

parametro

descrizione

token

il token di sessione associato all’utente fornito dal metodo users.auth

OUTPUT

Il nodo “data” di questo metodo sarà sempre null. Per verificarne l’esito si deve fare unicamente riferimento al valore del parametro status

POST shop.create

INPUT

Permette di creare una struttura Shop sotto cui poter iscrivere gli utenti.

I dati POST accettati dalla richiesta sono i seguenti:

parametro

descrizione

shopid

Un id numerico univoco che identifichi la struttura.

shopname

Il nominativo univoco di riferimento della struttura.

currency

Facoltativo. La valuta della struttura in formato ISO 4217. Se non fornita viene utilizzata la valuta di default configurata per il partner che integra il servizio.

Nota: una volta creata la struttura con una valuta non è ammesso cambiarla.

Nota: per poter avere utenti di valuta differente sul servizio bisogna creare degli shop appositi con quella precisa valuta sotto cui iscrivere gli utenti.

OUTPUT

Il nodo “data” di questo metodo sarà sempre null. Per verificarne l’esito si deve fare unicamente riferimento al valore del parametro status

POST ticket.cancel

INPUT

Permette di annullare un ticket entro 3 minuti dal suo piazzamento.

I dati POST accettati dalla richiesta sono i seguenti:

parametro

descrizione

ticketid

L’id numerico univoco fornito in fase di piazzamento che identifichi il ticket da annullare

OUTPUT

Il nodo “data” di questo metodo sarà sempre null. Per verificarne l’esito si deve fare unicamente riferimento al valore del parametro status

POST ticket.place

INPUT

Permette di verificare se il ticket non supera i limiti configurati e può essere giocato regolarmente.

I dati POST accettati dalla richiesta sono i seguenti:

parametro

descrizione

username

lo username univoco dell’utente che ha giocato il ticket

clientip

L’ip di collegamento attuale dell’utente. Se non viene fornito l’ip corretto la sessione utente non potrà essere creata.

ticketcode

Codice identificativo del ticket

ticketbody

il dettaglio del ticket in formato json

ticketcurrency

codice ISO-4217 che rappresenta la valuta del ticket

ticketbet

valore decimale della scommessa del ticket (es: 5.00)

ticketwin

valore decimale della vincita. In caso di sistema rappresenta la possibile vincita max.

ticketbonus

valore decimale del bonus applicato al ticket. È già sommato alla vincita.

ticketodds

quota totale del ticket

tickettype

indica la tipologia di ticket giocato

ticketsystem

stringa JSON col dettaglio di gioco di un sistema. Non usato per altri tipi di ticket.

Struttura di esempio di ticketbody

  { 

     “id”:”12345678-123-1″, 

     “event”: { 

        “name”:”Roma – Lazio”, 

        “date”:”2020-03-05T19:00:00.000Z”, 

        “sport”:”Calcio”, 

        “category”:”Italia”, 

        “tournament”:”Serie A”, 

        “eventid”:12345678

        “sportid”:123

        “categoryid”:123

        “tournamentid”:123 

  }, 

 “outcome”: { 

    “name”:”1″, 

    “market”:”1X2″, 

    “result”:”Match”, 

    “odd”:”4.37″, 

    “rule”:”1-20″, 

    “type”:”P”, 

    “fixed”:false

    “marketid”:123

    “outcomeid”:1

    “gamephase”: “1st Half”, 

    “gametimer”: “65”, 

    “gamescore”: “1-1” 

  } 

}, //… 

]

Struttura di esempio di ticketsystem

   “combinations”:[ 

      { 

         “type”:1

         “count”:3

         “import”:3

         “fullOdd”:13.32

         “bonus”:false

          “max_win”:”39.96″ 

}, { 

         “type”:2

         “count”:3

         “import”:3

         “fullOdd”:43.2564

         “bonus”:false

         “max_win”:”129.77″ 

 }, { 

        “type”:3

        “count”:1

        “import”:3

        “fullOdd”:40.323008

        “bonus”:false

        “Max_win”:”120.97″

      }, //… 

   ] 

}

Codici Rappresentanti la tipologia di ticket (tickettype)

tickettype

descrizione

P

Scommessa Prematch

L

Scommessa Live

S

Sistema di scommesse

M

Mista Live/Prematch

OUTPUT

I dati forniti in risposta da questo metodo sono i seguenti:

parametro

descrizione

code

codice di stato dell’operazione

message

messaggio interno descrittivo dell’esito dell’operazione

details

dettaglio relativo ai limiti violati dal ticket se presenti

Codici di esito dell’operazione

tickettype

descrizione

error

Limiti superati, il ticket non può essere piazzato

awaiting-approval

Il ticket è in attesa di convalida manuale

success

Il Ticket rispetta tutti i limiti e può essere piazzato regolarmente

Caricamento Interfaccia e Autenticazione Utente

Endpoint

https://..betbalancer-service-host../api/auth/{token}/{lang}/{page}?public={publickey}

Descrizione

Il caricamento dell’interfaccia e l’autenticazione dell’utente al servizio avvengono tramite una url che va fatta aprire via IFRAME all’interno del sito del partner.

Bisogna passsare alla url il token di sessione ricevuto dalla chiamata al metodo users.auth e il codice a due lettere della lingua scelta per la visualizzazione (es: it, en, fr etc..)

parametro

descrizione

token

il token di autenticazione fornito dalla chiamata api users.auth

lang

codice lingua a due lettere in formato ISO 639-1

publickey

la Public Key fornita da BetBalancer

page

Facoltativo. Se omesso o valorizzato come “0” porta alla pagina prematch, “1” porta al livebetting

Callback URL: Piazzamento Ticket

Il partner dovrà fornire una URL di Callback su cui riceverà in tempo reale i ticket giocati dagli utenti e dovrà fornire una risposta nel body che servirà a stabilire il rifiuto o l’accettazione del ticket. L’output di risposta deve essere formattato in JSON.

La sicurezza del messaggio viene garantita tramite la firma con hash hmac inviato seguendo le stesse modalità descritte nei capitoli 1-2 e 1-3, con op valorizzato sempre come “cbplace”. E’ onere del partner assicurarsi della validità della firma digitale prima di eseguire l’operazione di piazzamento.

I seguenti parametri saranno passati alla url di callback col metodo HTTPS POST come dati form/urlencoded:

parametro

descrizione

token

il token di sessione dell’utente che ha giocato il ticket

username

lo username dell’utente che ha giocato il ticket

fromcashier

se valorizzato come “1” significa che questa è una giocata assistita (ovvero, è lo shop che materialmente ha inviato la scommessa per conto del giocatore)

ticketid

l’id numerico univoco del ticket

ticketcode

codice alfanumerico univoco del ticket a 20 cifre da usare per le funzioni di stampa

ticketbody

il dettaglio del ticket in formato json

ticketcurrency

codice ISO-4217 che rappresenta la valuta del ticket

ticketbet

valore decimale della scommessa del ticket (es: 5.00)

ticketwin

valore decimale della vincita. In caso di sistema rappresenta la possibile vincita max.

ticketbonus

valore decimale del bonus applicato al ticket. È già sommato alla vincita.

ticketodds

quota totale del ticket

tickettype

indica la tipologia di ticket giocato

ticketsystem

stringa JSON col dettaglio di gioco di un sistema. Non usato per altri tipi di ticket.

ticketrejected

se valorizzato come “1” significa che il ticket è stato rifiutato dall’accettazione, altrimenti la scommessa è valida (default: “0”). In caso il ticket sia stato rifiutato, ci si aspetta che la risposta del partner risulti obbligatoriamente in status = C

Struttura di esempio di ticketbody

 { 

     “id”:”12345678-123-1″, 

     “event”: { 

         “name”:”Roma – Lazio”, 

         “date”:”2020-03-05T19:00:00.000Z”, 

         “sport”:”Calcio”, 

         “category”:”Italia”, 

         “tournament”:”Serie A”, 

         “qbetcode”:”1544″, 

         “eventid”:12345678

         “sportid”:123

         “categoryid”:123

         “tournamentid”:123 

    }, 

      “outcome”: { 

          “name”:”1″, 

          “market”:”1X2″, 

          “result”:”Match”, 

          “odd”:”4.37″, 

          “rule”:”1-20″, 

          “type”:”P”, 

          “fixed”:false

          “spread”:null

          “marketid”:123

          “outcomeid”:1 

     } 

  }, //… 

]

Struttura di esempio di ticketsystem

    “combinations”:[ 

       { 

          “type”:1

          “count”:3

          “import”:3

          “fullOdd”:13.32

          “bonus”:false

          “max_win”:”39.96″ 

       }, {  

          “type”:2

          “count”:3

          “import”:3

          “fullOdd”:43.2564

          “bonus”:false

          “max_win”:”129.77″ 

       }, { 

          “type”:3

          “count”:1

          “import”:3

          “fullOdd”:40.323008

          “bonus”:false

          “max_win”:”120.97″ 

       }, //… 

    ] 

}

  • type rappresenta la tipologia di combinazione:
    • 1 → Singole
    • 2 → Doppie
    • 3 → Triple etc..
  • count rappresenta il numero di sviluppi per la data combinazione
  • import rappresenta l’importo giocato per singolo sviluppo della combinazione
  • fullOdd rappresenta la quota della combinazione dal valore più alto

Struttura di risposta

La risposta della callback URL deve essere formattata in json ed è composta da:

parametro

descrizione

status

Il codice d’errore dell’operazione

method

valore fisso, sarà sempre “cbplace”

msg

Facoltativo. Una descrizione leggibile da recapitare all’utente

esempio:

{“status”:”A”, “method”:”cbplace”, “msg”:”Scommessa Accettata”}

Codici Rappresentanti la tipologia di ticket (tickettype)

tickettype

descrizione

P

Scommessa Prematch

L

Scommessa Live

S

Sistema di scommesse

M

Mista Live/Prematch

Codici Status di risposta

status

descrizione

A

Scommessa Accettata

C

Scommessa Rifiutata

M

Rifiutata per mancanza di fondi utente

V

Rifiutata. Utente non connesso

Callback URL: Refertazione Ticket

Ad intervalli regolari il servizio contatterà un endpoint fornita dal partner a cui saranno inviati i referti dei ticket giocati.

La sicurezza del messaggio viene garantita tramite la firma con hash hmac inviato seguendo le stesse modalità descritte nei capitoli 1-2 e 1-3, con op valorizzato sempre come “cbdefine”.

E’ onere del partner assicurarsi della validità della firma digitale prima di eseguire l’operazione di definizione dei tickets.

N.B. Nel messaggio di comunicazione dei referti dei ticket, si potrà ricevere il referto di più giocate contemporaneamente fino ad un massimo di 200 giocate per messaggio .

I seguenti parametri saranno passati alla url di callback col metodo HTTPS POST come dati form/urlencoded:

parametro

descrizione

ticketstatus

il referto dei ticket in formato json

Struttura di risposta

Non è prevista nessuna risposta formattata per questa chiamata: se la richiesta termina con codice di stato http 200 viene considerata riuscita, altrimenti viene tentato il reinvio dell’ultimo pacchetto di refertazione fino alla sua riuscita.

Struttura di esempio di ticketstatus

     { 

        “username”:”johnsmith”, 

        “ticketId”:1234

        “ticketCurrency”:”USD”, 

        “ticketBet”:10.00

        “ticketWin”:43.70

        “ticketOdd”:4.37

        “cashoutTime”:false

        “status”:”W”, 

        “outcomes”: [ 

           { 

               “id”:”1234-123-1″, 

               “status”:”W”, 

               “odds”:2.18

               “cashout”:false

               “results”: { 

                    “HT”:”1:0″, 

                    “FT”:”2:0″ 

               } 

           }, //… 

        ] 

     }, //… 

]

Codici Status di un ticket

status

descrizione

N

None

L

Loser

V

Voided

W

Winner

C

Cancelled

Codici Status di un outcome

status

descrizione

L

Loser

V

Voided

Z

Half-Lose

H

Half-Win

W

Winner

Results di un outcome

Il nodo “results” di ogni outcomes contiene il risultato dell’evento di riferimento. Il suo invio non viene garantito in quanto subordinato alle informazioni fornite dal provider e nel caso verrà inviato come valore NULL nel momento in cui il dato non sia disponibile.

Qualora disponibile il dato sarà spedito come nell’esempio in precedenza.

Nota: TUTTI i parametri che possono apparire nel nodo results sono facoltativi, pertanto prima di utilizzare un dato valore bisogna sempre accertarsi che sia presente. Al momento vengono serviti solo il Calcio e il Tennis.

Tipo di Risultato

Descrizione

HT

Primo Tempo

FT

Finale

OT

Tempi Supplementari

AP

Rigori

S1

Set 1

S2

Set 2

S3

Set 3

S4

Set 4

S5

Set 5

Callback URL: Fondi Utente

Metodo Facoltativo. Se implementato permette di stabilire al momento del piazzamento di un ticket se la user dispone del credito necessario per l’operazione velocizzando alcuni controlli e impedendo sul nascere ritardi al rifiuto di ticket dovuti all’insufficienza di fondi utente.

La sicurezza del messaggio viene garantita tramite la firma con hash hmac inviato seguendo le stesse modalità descritte nei capitoli 1-2 e 1-3, con op valorizzato sempre come “cbfunds”. E’ onere del partner assicurarsi della validità della firma digitale prima di eseguire l’operazione di piazzamento.

I seguenti parametri saranno passati alla url di callback col metodo HTTPS POST come dati form/urlencoded:

parametro

descrizione

token

il token di sessione dell’utente che ha giocato il ticket

username

lo username dell’utente che ha giocato il ticket

currency

codice ISO-4217 che rappresenta la valuta del ticket

amount

valore decimale della scommessa del ticket (es: 5.00)

fromcashier

se valorizzato come “1” significa che i fondi sono richiesti per una giocata assistita (ovvero: lo shop che materialmente fa la giocata per conto del giocatore)

Struttura di risposta

La risposta della callback URL deve essere formattata in json ed è composta da:

parametro

descrizione

status

Il codice d’errore dell’operazione

method

valore fisso, sarà sempre “cbfunds”

msg

Facoltativo. Una descrizione leggibile da recapitare all’utente

esempio:

{“status”:”M”, “method”:”cbfunds”, “msg”:null}

Codici Status di risposta

status

descrizione

A

Scommessa Accettata

M

Rifiutata per mancanza di fondi utente

C

Rifiuto arbitrario della scommessa, è consigliabile, non obbligatoriamente, in questo caso fornire una descrizione del motivo nel nodo “msg” della risposta da recapitare alla end user

Table of Contents