Pronostics sportifs
Endpoints de gestion des pronostics IA. Les analyses sont effectuées par Gemini en arrière-plan.
Tous les endpoints de cette section nécessitent Authorization: Bearer {token}.
Cycle de vie d'un pronostic
create → processing → success (résultat disponible)
→ cancelled (remboursement crédits)
GET /api/user/pronostic/types
Retourne la liste des types de pronostics disponibles et actifs, triés par difficulté.
Réponse 200
{
"user": null,
"message": "Liste des types de pronostics disponibles.",
"data": {
"types": [
{
"id": 1,
"name": "Simple",
"slug": "simple",
"description": "Pronostic basique sur le résultat du match.",
"difficulty": 1,
"active": true
},
{
"id": 2,
"name": "Avancé",
"slug": "advanced",
"description": "Analyse approfondie avec historique des équipes.",
"difficulty": 3,
"active": true
}
]
},
"errors": []
}
difficulty correspond au coût en crédits requis pour créer un pronostic de ce type.
POST /api/user/pronostic/create
Crée un nouveau pronostic. Déduit les crédits et lance l'analyse IA en arrière-plan.
Paramètres (body JSON)
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
type_id | integer | Oui | ID du type de pronostic (voir /pronostic/types) |
teams_details | object | Oui | Données du match à analyser |
Exemple
{
"type_id": 2,
"teams_details": {
"home": "PSG",
"away": "Marseille",
"league": "Ligue 1",
"date": "2026-03-10"
}
}
Réponses
201 — Pronostic créé :
{
"user": { "id": 1, "credits_balance": 12 },
"message": "Analyse lancée, l'IA va générer le meilleur pronostic pour vous.",
"data": {
"pronostic": {
"id": 15,
"type_id": 2,
"status": "processing",
"credits_cost": 3,
"teams_details": { "home": "PSG", "away": "Marseille" },
"result": null,
"created_at": "2026-03-07T08:30:00.000000Z"
}
},
"errors": []
}
402 — Crédits insuffisants :
{
"user": { "id": 1, "credits_balance": 1 },
"message": "Crédits insuffisants.",
"data": {
"credits_balance": 1,
"required": 3
},
"errors": []
}
422 — Paramètres invalides :
{
"user": null,
"message": "Données invalides.",
"errors": {
"type_id": ["The selected type id is invalid."]
}
}
GET /api/user/pronostics
Retourne la liste paginée des pronostics de l'utilisateur avec filtres.
Paramètres (query string)
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
status | string | Non | Filtre : processing, success, cancelled |
search | string | Non | Recherche dans les équipes et le résultat |
per_page | integer | Non | Résultats par page (défaut : 10, max : 50) |
page | integer | Non | Numéro de la page (défaut : 1) |
Exemple
GET /api/user/pronostics?status=success&search=PSG&per_page=5&page=1
Réponse 200
{
"user": { "id": 1, "phone": "+221700000000" },
"message": "Liste de vos pronostics.",
"data": {
"pronostics": [
{
"id": 12,
"type_id": 2,
"status": "success",
"credits_cost": 3,
"teams_details": {},
"result": {},
"ai_model": "gemini-2.5-flash",
"created_at": "2026-03-06T10:00:00.000000Z"
}
],
"meta": {
"current_page": 1,
"last_page": 4,
"per_page": 5,
"total": 18,
"has_more": true
}
},
"errors": []
}
GET /api/user/pronostic/{id}
Retourne le détail d'un pronostic par son identifiant.
Paramètre d'URL
| Champ | Type | Description |
|---|---|---|
id | integer | Identifiant du pronostic |
Réponses
200 :
{
"user": { "id": 1 },
"message": "Détails du pronostic.",
"data": {
"pronostic": {
"id": 12,
"type_id": 2,
"type": {
"id": 2,
"name": "Avancé",
"slug": "advanced",
"difficulty": 3
},
"status": "success",
"credits_cost": 3,
"teams_details": {},
"result": {},
"ai_model": "gemini-2.5-flash",
"created_at": "2026-03-06T10:00:00.000000Z"
}
},
"errors": []
}
403 — Pronostic appartenant à un autre utilisateur :
{
"user": {},
"message": "Accès refusé.",
"data": [],
"errors": []
}
404 — Pronostic introuvable :
{
"user": {},
"message": "Pronostic introuvable.",
"data": [],
"errors": []
}
DELETE /api/user/pronostic/{id}
Supprime (soft delete) un pronostic de l'utilisateur.
Réponses
200 :
{
"user": {},
"message": "Pronostic supprimé avec succès.",
"data": [],
"errors": []
}
403 / 404 : Mêmes structures que GET /api/user/pronostic/{id}.