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:
- Widget (
widget.js+ iframe): o sportsbook inteiro, servido por nós, com o seu tema. - Handoff: um JWT de 60 segundos que o SEU backend assina com a SUA chave privada — é ele quem diz "este apostador é meu e está logado". Nós nunca vemos a sua chave.
- Liquidação automática: cada mercado ofertado é conferido contra o desfecho da própria fonte antes de entrar no catálogo; o settler paga sozinho e o que ele não sabe pagar vai para fila humana — nunca paga no chute.
Comece aqui — da credencial à primeira aposta
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.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_idnasce no nosso servidor ligado à origem observada; assinar um handoff para ele não autentica nada além daquele iframe naquela página.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.
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
/handoffde exemplo. Depósito Pix se simula porPOST https://demo.skull-api.xyz/sandbox/pix/pagar.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_marketsda sua conta faz as três coisas de uma vez: a grade do widget deixa de mostrá-los, a cotação recusa e oPOST /betsresponde422. Uma decisão, três superfícies.(Opcional) Aposte por API server-to-server
Se você tem front próprio, o
POST https://book-sandbox.skull-api.xyz/betscomX-API-Keyusa 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_key | seleções | params | períodos | prova |
|---|---|---|---|---|
any_team_to_win | yes | no | — | FT | 5 acordos |
both_halves_over_line | yes | no | line | FT | 20 acordos |
both_halves_under_line | yes | no | line | a regra lê o(s) período(s) na própria declaração | 20 acordos |
both_teams_to_score | yes | no | — | FT + projeção (1H/2H/REG conforme a fonte oferta) | 34 acordos |
both_teams_to_score_n | yes | no | n | FT + projeção (1H/2H/REG conforme a fonte oferta) | 8 acordos |
btts_1h_and_2h | {yes|no}_{yes|no}, ex.: yes_no | — | a regra lê o(s) período(s) na própria declaração | 4 acordos |
btts_or_total | {over|under}_{yes|no}, ex.: under_no | line | FT | 10 acordos |
comeback_win | yes | no | team | FT | 42 acordos |
corners_odd_even | odd | even | — | FT | autoridade única |
correct_score | H-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-1 | — | a regra lê o(s) período(s) na própria declaração | 92 acordos |
double_chance | 1x|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_yes | — | FT + 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ção | 8 acordos |
double_chance_and_btts_2h | {1x|12|x2}_{yes|no} | — | a regra lê o(s) período(s) na própria declaração | 8 acordos |
double_chance_and_goals_range | {1x|12|x2}_{NaM|Nplus}, ex.: 12_2a3 | — | FT | 8 acordos |
double_chance_and_total | {1x|12|x2}_{over|under}, ex.: 1x_over | line | FT + projeção (1H/2H/REG conforme a fonte oferta) | 97 acordos |
draw_no_bet | home | away | — | FT + projeção (1H/2H/REG conforme a fonte oferta) | 125 acordos |
draw_or_btts | yes | no | — | FT | 4 acordos |
exact_goals | 0..N | Nplus | — | FT + projeção (1H/2H/REG conforme a fonte oferta) | 69 acordos |
first_goal_bracket | A-B (minutos) | nenhum | — | FT | 10 acordos |
first_goal_half | first_half | second_half | none | — | a regra lê o(s) período(s) na própria declaração | 11 acordos |
goal_between_minutes | yes | no | x, y | a regra lê o(s) período(s) na própria declaração | 8 acordos |
goals_odd_even | odd | even | — | FT + projeção (1H/2H/REG conforme a fonte oferta) | 71 acordos |
goals_range | de_N_a_M | N_ou_mais | — | FT + projeção (1H/2H/REG conforme a fonte oferta) | 597 acordos |
half_time_full_time | {home|draw|away}_{home|draw|away}, ex.: home_draw | — | a regra lê o(s) período(s) na própria declaração | 36 acordos |
half_time_full_time_and_exact_goals | {ht}_{ft}_{0..4|5plus}, ex.: home_home_2 | — | a regra lê o(s) período(s) na própria declaração | 36 acordos |
half_time_full_time_and_total | {ht}_{ft}_{over|under}, ex.: home_draw_under | line | a regra lê o(s) período(s) na própria declaração | 100 acordos |
half_time_full_time_and_total_1h | {ht}_{ft}_{over|under}, ex.: draw_home_over | line | a regra lê o(s) período(s) na própria declaração | 8 acordos |
half_time_full_time_double | {ht}_{ft}_ou_{ht}_{ft}, ex.: home_draw_ou_draw_draw | — | a regra lê o(s) período(s) na própria declaração | 8 acordos |
handicap_3way | home | draw | away | handicap_home|handicap_away (placar inicial) | FT + projeção (1H/2H/REG conforme a fonte oferta) | 94 acordos |
handicap_asian | home | away | line | FT + projeção (1H/2H/REG conforme a fonte oferta) | 94 acordos |
handicap_line | home | away | line | FT + projeção (1H/2H/REG conforme a fonte oferta) | 45 acordos |
highest_scoring_half | first_half | second_half | equal | — | a regra lê o(s) período(s) na própria declaração | 18 acordos |
ht_double_chance_and_ft_double_chance | {1x|12|x2}_{1x|12|x2}, ex.: 1x_x2 | — | a regra lê o(s) período(s) na própria declaração | 18 acordos |
ht_double_chance_and_ft_result | {1x|12|x2}_{home|draw|away}, ex.: 12_draw | — | a regra lê o(s) período(s) na própria declaração | 9 acordos |
ht_result_and_ft_double_chance | {home|draw|away}_{1x|12|x2}, ex.: home_1x | — | a regra lê o(s) período(s) na própria declaração | 18 acordos |
ht_result_or_ft_result | {home|draw|away}, ex.: draw | — | a regra lê o(s) período(s) na própria declaração | 16 acordos |
last_goal | home | away | none | period (FT|1H|2H) | a regra lê o(s) período(s) na própria declaração | 56 acordos |
match_result_1x2 | home | draw | away | — | FT + projeção (1H/2H/REG conforme a fonte oferta) | 100 acordos |
multi_score | H-A_ou_H-A[...] | draw | other_home_win | other_away_win | declared_scores (das enumeradas) | FT | 22 acordos |
nth_goal | home | away | none | n, period (FT|1H|2H) | a regra lê o(s) período(s) na própria declaração | 299 acordos |
nth_goal_and_result | {home|away}_{home|draw|away} | none | n | FT | 126 acordos |
odd_even_points | odd | even | — | FT + projeção (1H/2H/REG conforme a fonte oferta) | 3 acordos |
result_and_btts | {home|draw|away}_{yes|no}, ex.: home_yes | — | FT + projeção (1H/2H/REG conforme a fonte oferta) | 37 acordos |
result_and_btts_1h | {home|draw|away}_{yes|no}, ex.: home_yes | — | a regra lê o(s) período(s) na própria declaração | 8 acordos |
result_and_btts_2h | {home|draw|away}_{yes|no}, ex.: draw_no | — | a regra lê o(s) período(s) na própria declaração | 14 acordos |
result_and_goals_range | {home|draw|away}_{NaM|Nplus}, ex.: home_2a3 | — | FT | 8 acordos |
result_and_total | {home|draw|away}_{over|under}, ex.: home_over | line | FT + projeção (1H/2H/REG conforme a fonte oferta) | 145 acordos |
result_first_x_min | home | draw | away | x | FT | 8 acordos |
result_or_total | {home|draw|away}_{over|under}, ex.: home_over | line | FT + projeção (1H/2H/REG conforme a fonte oferta) | 8 acordos |
score_at_any_time | H-A (ex.: 0-1) | — | FT | 6 acordos |
team_clean_sheet | yes | no | team | FT + projeção (1H/2H/REG conforme a fonte oferta) | 69 acordos |
team_exact_goals | 0..N | Nplus | team | FT + projeção (1H/2H/REG conforme a fonte oferta) | 99 acordos |
team_goals_odd_even | odd | even | team | FT + projeção (1H/2H/REG conforme a fonte oferta) | 27 acordos |
team_goals_range | de_N_a_M | N_ou_mais | team | FT + projeção (1H/2H/REG conforme a fonte oferta) | 756 acordos |
team_highest_scoring_half | first_half | second_half | equal | team | a regra lê o(s) período(s) na própria declaração | 14 acordos |
team_refund_bet | home | draw | away | team | FT + projeção (1H/2H/REG conforme a fonte oferta) | 32 acordos |
team_to_score | yes | no | team | FT + projeção (1H/2H/REG conforme a fonte oferta) | 59 acordos |
team_to_score_both_halves | yes | no | team | FT | 24 acordos |
team_to_win | yes | no | team | FT + projeção (1H/2H/REG conforme a fonte oferta) | 46 acordos |
team_to_win_both_halves | yes | no | team | a regra lê o(s) período(s) na própria declaração | 54 acordos |
team_to_win_either_half | yes | no | team | a regra lê o(s) período(s) na própria declaração | 24 acordos |
team_total_corners | over | under | team, line | FT | autoridade única |
team_total_goals | over | under | team, line | FT + projeção (1H/2H/REG conforme a fonte oferta) | 286 acordos |
team_total_points | over | under | team, line | FT + projeção (1H/2H/REG conforme a fonte oferta) | 143 acordos |
team_win_or_btts | yes | no | team | FT | 64 acordos |
team_win_or_clean_sheet | yes | no | team (home|away|draw) | FT | 62 acordos |
team_win_or_over | yes | no | team (home|away|draw), line | FT | 68 acordos |
team_win_or_over_or_btts | yes | no | team, line | FT | 41 acordos |
team_win_or_under | yes | no | team (home|away|draw), line | FT | 68 acordos |
total_1h_and_total_2h | {over|under}<linha>_{over|under}<linha>, ex.: under0.5_under0.5 | — | a regra lê o(s) período(s) na própria declaração | 8 acordos |
total_1h_and_total_ft | {over|under}<linha>_{over|under}<linha>, ex.: under0.5_under1.5 | — | a regra lê o(s) período(s) na própria declaração | 8 acordos |
total_1h_or_total_2h | {over|under}<linha>_{over|under}<linha>, ex.: under1.5_under1.5 | — | a regra lê o(s) período(s) na própria declaração | 8 acordos |
total_and_btts | {over|under}_{yes|no}, ex.: over_yes | line | FT | 46 acordos |
total_corners | over | under | line | FT | autoridade única |
total_first_x_min | over | under | x, line | FT | 8 acordos |
total_goals | over | under | line | FT + projeção (1H/2H/REG conforme a fonte oferta) | 420 acordos |
total_goals_asian | over | under | line | FT + projeção (1H/2H/REG conforme a fonte oferta) | autoridade única |
total_points | over | under | line | FT + projeção (1H/2H/REG conforme a fonte oferta) | autoridade única |
which_team_scores | both | only_home | only_away | none | — | FT | 7 acordos |
win_to_nil | yes | no | team | FT + projeção (1H/2H/REG conforme a fonte oferta) | 105 acordos |
winning_margin | home_N | away_N | draw | — | FT + 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
- API do book (Swagger) — embed, apostas S2S e administração. (openapi.json)
- API de dados (Swagger) — eventos, odds,
histórico e o catálogo de mercados
(
GET https://api.skull-api.xyz/api/v3/markets, requer API key). - Casa Demo — a integração de referência, viva.
Skull Book · documentação gerada do mesmo build que atende as requisições — o que está escrito aqui é o que o sistema faz.