Skull Book — Documentação do Operador

Sportsbook completo por iframe: grade de eventos, cupom, carteira Pix e histórico — com oferta, cotação e liquidação automática do nosso lado.

Como funciona

Você embeda um iframe no seu site e assina a sessão do seu apostador no seu backend. Todo o resto — eventos ao vivo, mercados, preços, cupom, saldo, Pix e a liquidação de cada aposta — acontece do nosso lado. Três peças:

Comece aqui — da credencial à primeira aposta

  1. Receba suas credenciais

    No provisionamento você recebe: a publishable key (pk_…, pública, identifica sua casa no bootstrap), o registro da sua chave de assinatura ES256 (você gera o par; só a pública fica conosco) e uma API key para a API server-to-server (opcional). As origens (domínios) do seu site são verificadas — o widget só é servido nelas.

  2. Implemente o endpoint de handoff no seu backend

    É o único código obrigatório do seu lado. Quando o widget pede, seu backend valida a sessão first-party do apostador logado e devolve um JWT curto:

    # Python (PyJWT + cryptography) — o mesmo código do sandbox
    import time, uuid, jwt
    
    def assinar_handoff(frame_id: str, origin: str, apostador_id: str,
                        cpf: str, chave_privada_pem: str, kid: str) -> str:
        agora = int(time.time())
        return jwt.encode(
            {
                "aud": "skull-embed",
                "sub": apostador_id,        # o id DELE no SEU sistema
                "cpf": cpf,                 # obrigatório para apostar (KYC)
                "jti": uuid.uuid4().hex,
                "iat": agora,
                "exp": agora + 60,          # 60s: o handoff é de uso imediato
                "frame_id": frame_id,       # vem do widget, ligado à origem
                "origin": origin,
            },
            chave_privada_pem, algorithm="ES256", headers={"kid": kid})
    

    O frame_id nasce no nosso servidor ligado à origem observada; assinar um handoff para ele não autentica nada além daquele iframe naquela página.

  3. Cole o snippet no seu site

    <div id="skull-widget"></div>
    <script src="https://embed-sandbox.skull-api.xyz/SEU_SLUG/widget.js"></script>
    <script>
      window.SkullBook.init({
        container: 'skull-widget',
        publishableKey: 'pk_SUA_CHAVE',
        getHandoff: function (frameId, origin) {
          return fetch('/handoff', {          // o endpoint do passo 2
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ frame_id: frameId, origin: origin })
          }).then(r => r.json()).then(corpo => corpo.handoff);
        },
        onBet: function (bilhete) { /* aposta aceita */ },
        onError: function (erro) { /* mostrar/registrar */ }
      });
    </script>

    O iframe se auto-dimensiona; o container só precisa de largura. Abaixo de 780px o widget troca sozinho para o modo mobile.

  4. Teste no sandbox

    O sandbox é este ambiente: dinheiro fake, dados REAIS de eventos ao vivo. Veja funcionando em https://demo.skull-api.xyz — aquela página é exatamente o snippet acima mais um /handoff de exemplo. Depósito Pix se simula por POST https://demo.skull-api.xyz/sandbox/pix/pagar.

  5. Escolha o que ofertar

    Por padrão sua casa oferta todos os mercados integrados (tabela abaixo). Para ocultar mercados do seu iframe, a lista hidden_markets da sua conta faz as três coisas de uma vez: a grade do widget deixa de mostrá-los, a cotação recusa e o POST /bets responde 422. Uma decisão, três superfícies.

  6. (Opcional) Aposte por API server-to-server

    Se você tem front próprio, o POST https://book-sandbox.skull-api.xyz/bets com X-API-Key usa a MESMA máquina de cotação/risco/liquidação do widget. Referência completa no Swagger da API do book.

Mercados integrados (83)

Esta tabela é renderizada do mesmo artefato que os gates de oferta e de aposta consomem neste deploy — ela não tem como divergir do que a API aceita. A sintaxe é contrato: selection_key e params do seu pedido são validáveis contra ela. Mercado fora desta lista não é ofertado nem aceito.

market_keyseleçõesparams períodosprova
any_team_to_winyes | noFT5 acordos
both_halves_over_lineyes | nolineFT20 acordos
both_halves_under_lineyes | nolinea regra lê o(s) período(s) na própria declaração20 acordos
both_teams_to_scoreyes | noFT + projeção (1H/2H/REG conforme a fonte oferta)34 acordos
both_teams_to_score_nyes | nonFT + projeção (1H/2H/REG conforme a fonte oferta)8 acordos
btts_1h_and_2h{yes|no}_{yes|no}, ex.: yes_noa regra lê o(s) período(s) na própria declaração4 acordos
btts_or_total{over|under}_{yes|no}, ex.: under_nolineFT10 acordos
comeback_winyes | noteamFT42 acordos
corners_odd_evenodd | evenFTautoridade única
correct_scoreH-A (ex.: 2-1)FT + projeção (1H/2H/REG conforme a fonte oferta)500 acordos
correct_score_ht_ft{ht}_{ft}, cada perna N-M ou 4plus, ex.: 0-0_2-1a regra lê o(s) período(s) na própria declaração92 acordos
double_chance1x|12|x2 (ou home_draw|home_away|draw_away)FT + projeção (1H/2H/REG conforme a fonte oferta)68 acordos
double_chance_and_btts{1x|12|x2}_{yes|no}, ex.: x2_yesFT + projeção (1H/2H/REG conforme a fonte oferta)33 acordos
double_chance_and_btts_1h{1x|12|x2}_{yes|no}a regra lê o(s) período(s) na própria declaração8 acordos
double_chance_and_btts_2h{1x|12|x2}_{yes|no}a regra lê o(s) período(s) na própria declaração8 acordos
double_chance_and_goals_range{1x|12|x2}_{NaM|Nplus}, ex.: 12_2a3FT8 acordos
double_chance_and_total{1x|12|x2}_{over|under}, ex.: 1x_overlineFT + projeção (1H/2H/REG conforme a fonte oferta)97 acordos
draw_no_bethome | awayFT + projeção (1H/2H/REG conforme a fonte oferta)125 acordos
draw_or_bttsyes | noFT4 acordos
exact_goals0..N | NplusFT + projeção (1H/2H/REG conforme a fonte oferta)69 acordos
first_goal_bracketA-B (minutos) | nenhumFT10 acordos
first_goal_halffirst_half | second_half | nonea regra lê o(s) período(s) na própria declaração11 acordos
goal_between_minutesyes | nox, ya regra lê o(s) período(s) na própria declaração8 acordos
goals_odd_evenodd | evenFT + projeção (1H/2H/REG conforme a fonte oferta)71 acordos
goals_rangede_N_a_M | N_ou_maisFT + projeção (1H/2H/REG conforme a fonte oferta)597 acordos
half_time_full_time{home|draw|away}_{home|draw|away}, ex.: home_drawa regra lê o(s) período(s) na própria declaração36 acordos
half_time_full_time_and_exact_goals{ht}_{ft}_{0..4|5plus}, ex.: home_home_2a regra lê o(s) período(s) na própria declaração36 acordos
half_time_full_time_and_total{ht}_{ft}_{over|under}, ex.: home_draw_underlinea regra lê o(s) período(s) na própria declaração100 acordos
half_time_full_time_and_total_1h{ht}_{ft}_{over|under}, ex.: draw_home_overlinea regra lê o(s) período(s) na própria declaração8 acordos
half_time_full_time_double{ht}_{ft}_ou_{ht}_{ft}, ex.: home_draw_ou_draw_drawa regra lê o(s) período(s) na própria declaração8 acordos
handicap_3wayhome | draw | awayhandicap_home|handicap_away (placar inicial)FT + projeção (1H/2H/REG conforme a fonte oferta)94 acordos
handicap_asianhome | awaylineFT + projeção (1H/2H/REG conforme a fonte oferta)94 acordos
handicap_linehome | awaylineFT + projeção (1H/2H/REG conforme a fonte oferta)45 acordos
highest_scoring_halffirst_half | second_half | equala regra lê o(s) período(s) na própria declaração18 acordos
ht_double_chance_and_ft_double_chance{1x|12|x2}_{1x|12|x2}, ex.: 1x_x2a regra lê o(s) período(s) na própria declaração18 acordos
ht_double_chance_and_ft_result{1x|12|x2}_{home|draw|away}, ex.: 12_drawa regra lê o(s) período(s) na própria declaração9 acordos
ht_result_and_ft_double_chance{home|draw|away}_{1x|12|x2}, ex.: home_1xa regra lê o(s) período(s) na própria declaração18 acordos
ht_result_or_ft_result{home|draw|away}, ex.: drawa regra lê o(s) período(s) na própria declaração16 acordos
last_goalhome | away | noneperiod (FT|1H|2H)a regra lê o(s) período(s) na própria declaração56 acordos
match_result_1x2home | draw | awayFT + projeção (1H/2H/REG conforme a fonte oferta)100 acordos
multi_scoreH-A_ou_H-A[...] | draw | other_home_win | other_away_windeclared_scores (das enumeradas)FT22 acordos
nth_goalhome | away | nonen, period (FT|1H|2H)a regra lê o(s) período(s) na própria declaração299 acordos
nth_goal_and_result{home|away}_{home|draw|away} | nonenFT126 acordos
odd_even_pointsodd | evenFT + projeção (1H/2H/REG conforme a fonte oferta)3 acordos
result_and_btts{home|draw|away}_{yes|no}, ex.: home_yesFT + projeção (1H/2H/REG conforme a fonte oferta)37 acordos
result_and_btts_1h{home|draw|away}_{yes|no}, ex.: home_yesa regra lê o(s) período(s) na própria declaração8 acordos
result_and_btts_2h{home|draw|away}_{yes|no}, ex.: draw_noa regra lê o(s) período(s) na própria declaração14 acordos
result_and_goals_range{home|draw|away}_{NaM|Nplus}, ex.: home_2a3FT8 acordos
result_and_total{home|draw|away}_{over|under}, ex.: home_overlineFT + projeção (1H/2H/REG conforme a fonte oferta)145 acordos
result_first_x_minhome | draw | awayxFT8 acordos
result_or_total{home|draw|away}_{over|under}, ex.: home_overlineFT + projeção (1H/2H/REG conforme a fonte oferta)8 acordos
score_at_any_timeH-A (ex.: 0-1)FT6 acordos
team_clean_sheetyes | noteamFT + projeção (1H/2H/REG conforme a fonte oferta)69 acordos
team_exact_goals0..N | NplusteamFT + projeção (1H/2H/REG conforme a fonte oferta)99 acordos
team_goals_odd_evenodd | eventeamFT + projeção (1H/2H/REG conforme a fonte oferta)27 acordos
team_goals_rangede_N_a_M | N_ou_maisteamFT + projeção (1H/2H/REG conforme a fonte oferta)756 acordos
team_highest_scoring_halffirst_half | second_half | equalteama regra lê o(s) período(s) na própria declaração14 acordos
team_refund_bethome | draw | awayteamFT + projeção (1H/2H/REG conforme a fonte oferta)32 acordos
team_to_scoreyes | noteamFT + projeção (1H/2H/REG conforme a fonte oferta)59 acordos
team_to_score_both_halvesyes | noteamFT24 acordos
team_to_winyes | noteamFT + projeção (1H/2H/REG conforme a fonte oferta)46 acordos
team_to_win_both_halvesyes | noteama regra lê o(s) período(s) na própria declaração54 acordos
team_to_win_either_halfyes | noteama regra lê o(s) período(s) na própria declaração24 acordos
team_total_cornersover | underteam, lineFTautoridade única
team_total_goalsover | underteam, lineFT + projeção (1H/2H/REG conforme a fonte oferta)286 acordos
team_total_pointsover | underteam, lineFT + projeção (1H/2H/REG conforme a fonte oferta)143 acordos
team_win_or_bttsyes | noteamFT64 acordos
team_win_or_clean_sheetyes | noteam (home|away|draw)FT62 acordos
team_win_or_overyes | noteam (home|away|draw), lineFT68 acordos
team_win_or_over_or_bttsyes | noteam, lineFT41 acordos
team_win_or_underyes | noteam (home|away|draw), lineFT68 acordos
total_1h_and_total_2h{over|under}<linha>_{over|under}<linha>, ex.: under0.5_under0.5a regra lê o(s) período(s) na própria declaração8 acordos
total_1h_and_total_ft{over|under}<linha>_{over|under}<linha>, ex.: under0.5_under1.5a regra lê o(s) período(s) na própria declaração8 acordos
total_1h_or_total_2h{over|under}<linha>_{over|under}<linha>, ex.: under1.5_under1.5a regra lê o(s) período(s) na própria declaração8 acordos
total_and_btts{over|under}_{yes|no}, ex.: over_yeslineFT46 acordos
total_cornersover | underlineFTautoridade única
total_first_x_minover | underx, lineFT8 acordos
total_goalsover | underlineFT + projeção (1H/2H/REG conforme a fonte oferta)420 acordos
total_goals_asianover | underlineFT + projeção (1H/2H/REG conforme a fonte oferta)autoridade única
total_pointsover | underlineFT + projeção (1H/2H/REG conforme a fonte oferta)autoridade única
which_team_scoresboth | only_home | only_away | noneFT7 acordos
win_to_nilyes | noteamFT + projeção (1H/2H/REG conforme a fonte oferta)105 acordos
winning_marginhome_N | away_N | drawFT + projeção (1H/2H/REG conforme a fonte oferta)10 acordos

"Prova": N acordos = liquidação conferida contra o desfecho publicado pela própria fonte, com N confirmações e zero divergências; autoridade única = mercado cuja fonte é a única testemunha do dado (decisão explícita de produto).

Liquidação e conciliação

A liquidação é automática: o settler consome o desfecho oficial da fonte e paga pelo fator de retorno de cada mercado (ganho, perda, devolução, meio-ganho/meia-perda). O que a regra não sabe decidir não é pago — vai para revisão humana com trilha de auditoria.

Para conciliar do seu lado: o extrato do apostador está em GET /embed/v1/statement (dentro do widget, aba Conta) e a visão da casa — apostas, depósitos, saques, exposição por evento — na API administrativa (/admin/v1/operators/…, ver Swagger). Cada aposta carrega as odds aplicadas e o instante da cotação.

Referências

Skull Book · documentação gerada do mesmo build que atende as requisições — o que está escrito aqui é o que o sistema faz.