Aller au contenu principal

Pronostics sportifs

Endpoints de gestion des pronostics IA. Les analyses sont effectuées par Gemini en arrière-plan.

Authentification requise

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": []
}
remarque

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)

ChampTypeObligatoireDescription
type_idintegerOuiID du type de pronostic (voir /pronostic/types)
teams_detailsobjectOuiDonné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)

ChampTypeObligatoireDescription
statusstringNonFiltre : processing, success, cancelled
searchstringNonRecherche dans les équipes et le résultat
per_pageintegerNonRésultats par page (défaut : 10, max : 50)
pageintegerNonNumé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

ChampTypeDescription
idintegerIdentifiant 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}.