Logo dfilitto

API de Score para Jogos

Uma API aberta e gratuita, criada com a finalidade de auxiliar a comunidade de desenvolvedores de jogos a implementar sistemas de score e leaderboards de forma simples e rápida. Além da API, possuímos um sistema de controle de scores, o Score Hub, onde você pode cadastrar seus jogos, registrar scores e acompanhar o desempenho dos jogadores.

Documentação da API ScoreHub

Referência completa para os endpoints do ecossistema ScoreHub.

Autenticação

Rotas Gerais e de Autenticação

POST/api/login

Autentica um estúdio/desenvolvedor.

Exemplo de Uso (Fetch)
fetch('https://apiscore.dfilitto.com.br/api/login', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({ email: 'dev@email.com', senha: '123' })
}).then(res => res.json()).then(console.log);
POST/api/player-login

Autentica um jogador.

Exemplo de Uso (Fetch)
fetch('https://apiscore.dfilitto.com.br/api/player-login', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({ email: 'jogador@email.com', senha: '123' })
}).then(res => res.json()).then(console.log);
POST/api/password-request

Solicita um link de redefinição de senha.

Exemplo de Uso (Fetch)
fetch('https://apiscore.dfilitto.com.br/api/password-request', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({ email: 'usuario@email.com', tipo_conta: 'estudio' }) // ou 'jogador'
}).then(res => res.json()).then(console.log);
POST/api/password-reset

Redefine a senha usando um token válido.

Exemplo de Uso (Fetch)
fetch('https://apiscore.dfilitto.com.br/api/password-reset', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({ token: 'token_recebido_no_email', senha: 'nova_senha_forte' })
}).then(res => res.json()).then(console.log);

Recurso: Estúdios (/api/estudios)

POST/api/estudios

Registra um novo estúdio ou desenvolvedor.

Exemplo de Uso (Fetch)
const devData = {
    tipo_conta: "independente",
    nome_fantasia: "Meu Estúdio",
    email: "contato@meuestudio.com",
    senha: "senhaSuperForte123"
};
fetch('https://apiscore.dfilitto.com.br/api/estudios', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify(devData)
}).then(res => res.json()).then(console.log);
GET/api/estudios/{id}Requer Token de Estúdio

Busca os dados do perfil de um estúdio.

Exemplo de Uso (Fetch)
const estudioId = 1;
const token = 'seu_token_jwt_de_estudio';
fetch(`https://apiscore.dfilitto.com.br/api/estudios/${estudioId}`, {
    headers: { 'Authorization': `Bearer ${token}` }
}).then(res => res.json()).then(console.log);
PUT/api/estudios/{id}Requer Token de Estúdio

Atualiza os dados do perfil de um estúdio.

Exemplo de Uso (Fetch)
const estudioId = 1; // Substitua pelo ID do estúdio a ser atualizado
const token = 'seu_token_jwt_de_estudio_aqui';

// Os dados que você deseja atualizar. Você não precisa enviar todos,
// apenas os que foram alterados.
const dadosAtualizados = {
    "nome_fantasia": "Meu Estúdio (Renomeado)",
    "website": "https://meunovosite.com",
    "telefone_comercial": "18987654321"
};

const url = `https://apiscore.dfilitto.com.br/api/estudios/${estudioId}`;

fetch(url, {
    method: 'PUT',
    headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(dadosAtualizados)
})
.then(response => {
    if (!response.ok) {
        throw new Error('Falha na requisição: ' + response.statusText);
    }
    return response.json();
})
.then(data => {
    console.log('Resposta da Atualização:', data); // Ex: { message: "Perfil atualizado." }
})
.catch(error => {
    console.error('Ocorreu um erro:', error);
});
PUT/api/estudios/{id}/passwordRequer Token de Estúdio

Altera a senha de um estúdio.

Exemplo de Uso (Fetch)
const estudioId = 1; // Substitua pelo ID do estúdio logado
const token = 'seu_token_jwt_de_estudio_aqui';

// O corpo da requisição precisa conter a senha atual e a nova
const passwordData = {
    "senha_atual": "senha_antiga_123",
    "nova_senha": "minha_nova_senha_super_forte"
};

const url = `https://apiscore.dfilitto.com.br/api/estudios/${estudioId}/password`;

fetch(url, {
    method: 'PUT',
    headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(passwordData)
})
.then(response => {
    // Uma resposta não-OK (como 401) pode significar 'senha atual incorreta'
    if (!response.ok) {
        throw new Error('Falha na requisição: ' + response.statusText);
    }
    return response.json();
})
.then(data => {
    console.log('Resposta:', data); // Ex: { message: "Senha alterada com sucesso." }
})
.catch(error => {
    console.error('Ocorreu um erro:', error);
});
DELETE/api/estudios/{id}Requer Token de Estúdio

Desativa a conta de um estúdio (soft delete).

Exemplo de Uso (Fetch)
const estudioId = 1; // Substitua pelo ID do estúdio a ser desativado
const token = 'seu_token_jwt_de_estudio_aqui';

const url = `https://apiscore.dfilitto.com.br/api/estudios/${estudioId}`;

fetch(url, {
    method: 'DELETE',
    headers: {
        'Authorization': `Bearer ${token}`
        // Note que requisições DELETE geralmente não precisam de 'Content-Type' nem 'body'.
    }
})
.then(response => {
    if (!response.ok) {
        throw new Error('Falha na requisição: ' + response.statusText);
    }
    return response.json();
})
.then(data => {
    console.log('Resposta:', data); // Ex: { message: "Conta desativada." }
})
.catch(error => {
    console.error('Ocorreu um erro:', error);
});

Recurso: Jogadores (/api/jogadores)

POST/api/jogadores

Registra um novo jogador.

Exemplo de Uso (Fetch)
// Os dados para o novo jogador.
// 'username', 'email' e 'senha' são obrigatórios.
const playerData = {
    "username": "novo_heroi_123",
    "email": "jogador.novo@email.com",
    "senha": "senha_do_jogador_123",
    "bio": "Apenas um jogador em busca de recordes!",
    "facebook": "https://facebook.com/novoheroi",
    "instagram": "novo_heroi"
};

const url = 'https://apiscore.dfilitto.com.br/api/jogadores';

fetch(url, {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(playerData)
})
.then(response => {
    if (!response.ok) {
        // Trata erros como email/username duplicado (status 409)
        throw new Error('Falha no requisição: ' + response.statusText);
    }
    return response.json();
})
.then(data => {
    console.log('Jogador Registrado:', data); // Exibe o objeto completo do jogador criado
})
.catch(error => {
    console.error('Ocorreu um erro:', error);
});
GET/api/jogadores/destaques

Retorna o "Hall da Fama" dos jogadores.

Exemplo de Uso (Fetch)
const url = 'https://apiscore.dfilitto.com.br/api/jogadores/destaques';

fetch(url)
    .then(response => {
        if (!response.ok) {
            throw new Error('Falha na requisição: ' + response.statusText);
        }
        return response.json();
    })
    .then(data => {
        console.log('Hall da Fama:', data); 
        // Exemplo de retorno:
        // [
        //   { "username": "jogador_pro", "total_trofeus": "3" },
        //   { "username": "aventureiro", "total_trofeus": "1" }
        // ]
    })
    .catch(error => {
        console.error('Ocorreu um erro:', error);
    });
GET/api/jogadores/{id}

Busca o perfil público de um jogador.

Exemplo de Uso (Fetch)
// Substitua pelo ID do jogador que você quer buscar
const jogadorId = 1;

// Usamos template literals (crases ``) para inserir o ID na URL
const url = `https://apiscore.dfilitto.com.br/api/jogadores/${jogadorId}`;

fetch(url)
    .then(response => {
        if (!response.ok) {
            throw new Error('Falha na requisição: ' + response.statusText);
        }
        return response.json();
    })
    .then(data => {
        console.log('Perfil do Jogador:', data); 
        // Exemplo de retorno:
        // {
        //   "id": "1",
        //   "username": "jogador_pro",
        //   "bio": "Apenas um jogador...",
        //   "facebook": "https://facebook.com/jogadorpro",
        //   "instagram": "jogadorpro"
        // }
    })
    .catch(error => {
        console.error('Ocorreu um erro:', error);
    });
GET/api/jogadores/{id}/scoresRequer Token de Jogador

Busca todos os scores do jogador logado.

Exemplo de Uso (Fetch)
// Substitua pelo ID e pelo token do jogador que fez o login
const jogadorId = 1; 
const token = 'seu_token_jwt_de_JOGADOR_aqui';

const url = `https://apiscore.dfilitto.com.br/api/jogadores/${jogadorId}/scores`;

fetch(url, {
    method: 'GET',
    headers: {
        // Esta rota é protegida, então enviamos o token de autorização do jogador
        'Authorization': `Bearer ${token}`
    }
})
.then(response => {
    if (!response.ok) {
        throw new Error('Falha na requisição: ' + response.statusText);
    }
    return response.json();
})
.then(data => {
    console.log('Scores do Jogador:', data);
    // Exemplo de retorno:
    // [
    //   {
    //     "nome_jogo": "Celeste",
    //     "foto": "https://.../celeste-cover.jpg",
    //     "pontuacao": "125000",
    //     "data_registro": "2025-07-30 19:30:00"
    //   },
    //   {
    //     "nome_jogo": "Hollow Knight",
    //     "foto": "https://.../hollow-knight-cover.jpg",
    //     "pontuacao": "4200",
    //     "data_registro": "2025-07-29 15:10:00"
    //   }
    // ]
})
.catch(error => {
    console.error('Ocorreu um erro:', error);
});
GET/api/jogadores/{id}/trofeusRequer Token de Jogador

Lista os jogos onde o jogador logado está em 1º lugar.

Exemplo de Uso (Fetch)
// Substitua pelo ID e pelo token do jogador LOGADO
const jogadorId = 1; 
const token = 'seu_token_jwt_de_JOGADOR_aqui';

const url = `https://apiscore.dfilitto.com.br/api/jogadores/${jogadorId}/trofeus`;

fetch(url, {
    method: 'GET',
    headers: {
        'Authorization': `Bearer ${token}`
    }
})
.then(response => {
    if (!response.ok) {
        throw new Error('Falha na requisição: ' + response.statusText);
    }
    return response.json();
})
.then(data => {
    console.log('Troféus do Jogador:', data);
    // Exemplo de retorno:
    // [
    //   {
    //     "id": "3",
    //     "nome": "Stardew Valley",
    //     "foto": "url_da_foto.png",
    //     "pontuacao": "530210"
    //   },
    //   {
    //     "id": "1",
    //     "nome": "Celeste",
    //     "foto": "url_da_foto_2.png",
    //     "pontuacao": "213000"
    //   }
    // ]
})
.catch(error => {
    console.error('Ocorreu um erro:', error);
});
PUT/api/jogadores/{id}Requer Token de Jogador

Atualiza o perfil de um jogador.

Exemplo de Uso (Fetch)
// Substitua pelo ID e pelo token do jogador LOGADO
const jogadorId = 1;
const token = 'seu_token_jwt_de_JOGADOR_aqui';

// Os novos dados do perfil a serem atualizados.
// Você pode enviar apenas os campos que deseja alterar.
const profileData = {
    "bio": "Gamer competitivo e streamer nas horas vagas.",
    "facebook": "https://facebook.com/meu.novo.perfil",
    "instagram": "MeuUserGamer"
};

const url = `https://apiscore.dfilitto.com.br/api/jogadores/${jogadorId}`;

fetch(url, {
    method: 'PUT',
    headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(profileData)
})
.then(response => {
    if (!response.ok) {
        throw new Error('Falha na requisição: ' + response.statusText);
    }
    return response.json();
})
.then(data => {
    console.log('Resposta:', data); // Ex: { message: "Perfil do jogador atualizado com sucesso." }
})
.catch(error => {
    console.error('Ocorreu um erro:', error);
});
PUT/api/jogadores/{id}/passwordRequer Token de Jogador

Altera a senha de um jogador.

Exemplo de Uso (Fetch)
// Substitua pelo ID e pelo token do jogador LOGADO
const jogadorId = 1;
const token = 'seu_token_jwt_de_JOGADOR_aqui';

// O corpo da requisição precisa conter a senha atual e a nova
const passwordData = {
    "senha_atual": "senha_antiga_do_jogador",
    "nova_senha": "nova_senha_secreta_456"
};

const url = `https://apiscore.dfilitto.com.br/api/jogadores/${jogadorId}/password`;

fetch(url, {
    method: 'PUT',
    headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(passwordData)
})
.then(response => {
    if (!response.ok) {
        // Um erro 401 aqui pode significar que a senha atual está incorreta
        throw new Error('Falha na requisição: ' + response.statusText);
    }
    return response.json();
})
.then(data => {
    console.log('Resposta:', data); // Ex: { message: "Senha do jogador alterada com sucesso." }
})
.catch(error => {
    console.error('Ocorreu um erro:', error);
});
DELETE/api/jogadores/{id}Requer Token de Jogador

Desativa a conta de um jogador (soft delete).

Exemplo de Uso (Fetch)
// Substitua pelo ID e pelo token do jogador LOGADO
const jogadorId = 1;
const token = 'seu_token_jwt_de_JOGADOR_aqui';

const url = `https://apiscore.dfilitto.com.br/api/jogadores/${jogadorId}`;

fetch(url, {
    method: 'DELETE',
    headers: {
        'Authorization': `Bearer ${token}`
        // Requisições DELETE geralmente não enviam corpo (body)
    }
})
.then(response => {
    if (!response.ok) {
        throw new Error('Falha na requisição: ' + response.statusText);
    }
    return response.json();
})
.then(data => {
    console.log('Resposta:', data); // Ex: { message: "Conta de jogador desativada." }
})
.catch(error => {
    console.error('Ocorreu um erro:', error);
});

Recurso: Jogos (/api/jogos)

GET/api/jogosRequer Token de Estúdio

Lista todos os jogos do estúdio logado.

Exemplo de Uso (Fetch)
// O token JWT do estúdio/desenvolvedor LOGADO
const token = 'seu_token_jwt_de_ESTUDIO_aqui';

const url = 'https://apiscore.dfilitto.com.br/api/jogos';

fetch(url, {
    method: 'GET',
    headers: {
        'Authorization': `Bearer ${token}`
    }
})
.then(response => {
    if (!response.ok) {
        throw new Error('Falha na requisição: ' + response.statusText);
    }
    return response.json();
})
.then(data => {
    console.log('Lista de Jogos:', data);
    // Exemplo de retorno:
    // [
    //   {
    //     "id": "1",
    //     "nome": "Celeste",
    //     "foto": "https://...",
    //     "linkitchio": null,
    //     "linkios": null,
    //     "linkgoogleplay": null,
    //     "linkoutros": "https://www.celestegame.com/",
    //     "api_key": "a1b2c3d4..."
    //   },
    //   {
    //     "id": "2",
    //     "nome": "Hollow Knight",
    //     "foto": "https://...",
    //     // ... outros campos
    //     "api_key": "e5f6g7h8..."
    //   }
    // ]
})
.catch(error => {
    console.error('Ocorreu um erro:', error);
});
GET/api/jogos/destaques

Retorna os jogos com mais scores registrados.

Exemplo de Uso (Fetch)
const url = 'https://apiscore.dfilitto.com.br/api/jogos/destaques';

fetch(url)
    .then(response => {
        if (!response.ok) {
            throw new Error('Falha na requisição: ' + response.statusText);
        }
        return response.json();
    })
    .then(data => {
        console.log('Jogos em Destaque:', data);
        // Exemplo de retorno:
        // [
        //   {
        //     "id": "1",
        //     "nome": "Celeste",
        //     "foto": "https://...",
        //     "linkoutros": "https://www.celestegame.com/",
        //     "total_scores": "3"
        //   },
        //   {
        //     "id": "2",
        //     "nome": "Hollow Knight",
        //     "foto": "https://...",
        //     "linkoutros": "https://www.hollowknight.com/",
        //     "total_scores": "2"
        //   }
        // ]
    })
    .catch(error => {
        console.error('Ocorreu um erro:', error);
    });
GET/api/jogos/{id}/scores

Retorna o ranking público (leaderboard) para um jogo.

Exemplo de Uso (Fetch)
// Substitua pelo ID do jogo cujo ranking você quer ver
const jogoId = 1;

const url = `https://apiscore.dfilitto.com.br/api/jogos/${jogoId}/scores`;

fetch(url)
    .then(response => {
        if (!response.ok) {
            throw new Error('Falha na requisição: ' + response.statusText);
        }
        return response.json();
    })
    .then(data => {
        console.log('Ranking do Jogo:', data); 
        // Exemplo de retorno:
        // [
        //   {
        //     "username": "jogador_pro",
        //     "pontuacao": 50000,
        //     "data_registro": "2025-07-30 20:15:00"
        //   },
        //   {
        //     "username": "aventureiro",
        //     "pontuacao": 15000,
        //     "data_registro": "2025-07-30 19:45:00"
        //   }
        // ]
    })
    .catch(error => {
        console.error('Ocorreu um erro:', error);
    });
POST/api/jogosRequer Token de Estúdio

Cadastra um novo jogo.

Exemplo de Uso (Fetch)
// O token JWT do estúdio/desenvolvedor LOGADO
const token = 'seu_token_jwt_de_ESTUDIO_aqui';

// Os dados do novo jogo a ser criado
const gameData = {
    "nome": "A Lenda do Herói Perdido",
    "foto": "https://exemplo.com/capa_do_jogo.png",
    "linkoutros": "https://meujogo.com"
};

const url = 'https://apiscore.dfilitto.com.br/api/jogos';

fetch(url, {
    method: 'POST',
    headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(gameData)
})
.then(response => {
    if (!response.ok) {
        throw new Error('Falha na requisição: ' + response.statusText);
    }
    return response.json();
})
.then(data => {
    console.log('Jogo Criado:', data);
    // Exemplo de retorno:
    // {
    //   "id": "7",
    //   "nome": "A Lenda do Herói Perdido",
    //   "foto": "https://exemplo.com/capa_do_jogo.png",
    //   "linkoutros": "https://meujogo.com",
    //   "api_key": "ch4v3_n0v4_g3r4d4...",
    //   "api_secret": "s3gr3d0_n0v0_g3r4d0..."
    // }
})
.catch(error => {
    console.error('Ocorreu um erro:', error);
});
PUT/api/jogos/{id}Requer Token de Estúdio

Atualiza um jogo existente.

Exemplo de Uso (Fetch)
// O token JWT do estúdio/desenvolvedor LOGADO
const token = 'seu_token_jwt_de_ESTUDIO_aqui';

// O ID do jogo que você deseja atualizar
const jogoId = 1;

// Os dados a serem atualizados. Você só precisa enviar os campos que mudaram.
const gameUpdateData = {
    "nome": "A Lenda do Herói Perdido - Edição Definitiva",
    "foto": "https://exemplo.com/nova_capa.png",
    "linkoutros": "https://meujogo.com/edicao-definitiva"
};

const url = `https://apiscore.dfilitto.com.br/api/jogos/${jogoId}`;

fetch(url, {
    method: 'PUT',
    headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(gameUpdateData)
})
.then(response => {
    if (!response.ok) {
        throw new Error('Falha na requisição: ' + response.statusText);
    }
    return response.json();
})
.then(data => {
    console.log('Resposta da Atualização:', data);
    // Exemplo de retorno:
    // { "message": "Jogo atualizado." }
})
.catch(error => {
    console.error('Ocorreu um erro:', error);
});
PUT/api/jogos/{id}/regenerate-secretRequer Token de Estúdio

Gera uma nova API Secret para um jogo.

Exemplo de Uso (Fetch)
// O token JWT do estúdio/desenvolvedor LOGADO
const token = 'seu_token_jwt_de_ESTUDIO_aqui';

// O ID do jogo para o qual você quer gerar um novo segredo
const jogoId = 1;

const url = `https://apiscore.dfilitto.com.br/api/jogos/${jogoId}/regenerate-secret`;

fetch(url, {
    method: 'PUT',
    headers: {
        'Authorization': `Bearer ${token}`
    }
    // Note que não há 'body' nesta requisição
})
.then(response => {
    if (!response.ok) {
        throw new Error('Falha na requisição: ' + response.statusText);
    }
    return response.json();
})
.then(data => {
    console.log('Resposta:', data);
    // Exemplo de retorno:
    // {
    //   "message": "Nova chave secreta gerada com sucesso.",
    //   "api_secret": "a_nova_chave_secreta_gerada_aqui"
    // }
})
.catch(error => {
    console.error('Ocorreu um erro:', error);
});
DELETE/api/jogos/{id}Requer Token de Estúdio

Apaga um jogo existente (hard delete).

Exemplo de Uso (Fetch)
// O token JWT do estúdio/desenvolvedor LOGADO
const token = 'seu_token_jwt_de_ESTUDIO_aqui';

// O ID do jogo que você deseja apagar
const jogoId = 1;

const url = `https://apiscore.dfilitto.com.br/api/jogos/${jogoId}`;

fetch(url, {
    method: 'DELETE',
    headers: {
        'Authorization': `Bearer ${token}`
    }
})
.then(response => {
    if (!response.ok) {
        throw new Error('Falha na requisição: ' + response.statusText);
    }
    return response.json();
})
.then(data => {
    console.log('Resposta:', data); // Ex: { message: "Jogo apagado." }
})
.catch(error => {
    console.error('Ocorreu um erro:', error);
});

Recurso: Scores (/api/scores)

POST/api/scoresRequer Api-Key de Jogo

Submete um novo score para um jogo.

Exemplo de Uso (Fetch)
const url = 'https://apiscore.dfilitto.com.br/api/scores';
const apiKey = 'sua_api_key_aqui';
const apiSecret = 'seu_api_secret_aqui';
const scoreData = {
    username: 'nome_do_jogador',
    pontuacao: 50000
};

fetch(url, {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'X-Api-Key': apiKey,
        'X-Api-Secret': apiSecret
    },
    body: JSON.stringify(scoreData)
}).then(res => res.json()).then(console.log);