API Partenaire — Accès restreint

PTM Partner API

API REST exposée par Padel Tournoi Manager pour les partenaires intégrés. Authentification par clé API. Tous les endpoints retournent du JSON.

Base URL https://[project-ref].supabase.co/functions/v1
Format JSON
·
Auth x-api-key header
·
Version v1
·
Mis à jour Juin 2026
01

Authentification

Header requis

Toutes les requêtes doivent inclure la clé API dans le header x-api-key. La clé est fournie par PTM lors de l'onboarding partenaire.

Exemple de requête authentifiée
HTTP
GET /api-tournaments-list x-api-key: ptm_live_xxxxxxxxxxxxxxxxxxxx Content-Type: application/json
⚠ Sécurité

Ne jamais exposer la clé API côté client. Tous les appels doivent transiter par votre backend.

02

Codes d'erreur

CodeSignificationDescription
200OKSuccès — y compris les cas métier (not_found, multiple…)
201CreatedInscription créée avec succès
400Bad RequestParamètre requis manquant
401UnauthorizedClé API absente, invalide ou désactivée
404Not FoundRessource inexistante ou non publiée sur Pista
409ConflictDoublon d'inscription ou liste d'attente pleine
500Server ErrorErreur interne PTM
Convention

Les cas métier de /players/verify (joueur introuvable, homonymie…) retournent toujours HTTP 200 avec un champ status dans le body. Seules les erreurs d'infrastructure utilisent les codes 4xx/5xx.

03

Liste des tournois

GET /api-tournaments-list Tournois ouverts aux inscriptions

Retourne la liste des tournois publiés sur Pista avec les inscriptions ouvertes (registration_open = true).

Requête
HTTP
GET /api-tournaments-list x-api-key: votre_clé_api
Réponse 200 — Succès
JSON
{ "tournaments": [ { "id": "uuid", "name": "Tournoi P25 ON Padel", "date": "2026-06-20", "level": "P25", "format": "TMC", "club_name": "ON Padel Escalquens", "city": "Escalquens", "total_pairs": 16, "registered_pairs": 4, "available_spots": 12, "registration_open": true } ] }
Note

available_spots peut être null si le tournoi n'a pas de limite de paires définie.

04

Détail d'un tournoi

GET /api-tournaments-detail?id={uuid} Détail complet
Paramètres
ParamètreTypeRequisDescription
iduuidrequisIdentifiant du tournoi
Requête
HTTP
GET /api-tournaments-detail?id=550e8400-e29b-41d4-a716-446655440000 x-api-key: votre_clé_api
Réponse 200 — Succès
JSON
{ "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Tournoi P25 ON Padel", "date": "2026-06-20", "level": "P25", "format": "TMC", "club_name": "ON Padel Escalquens", "city": "Escalquens", "address": "12 Rue du Padel, 31750 Escalquens", "total_pairs": 16, "registered_pairs": 4, "available_spots": 12, "registration_open": true, "entry_fee": 30 }
Réponse 400 — Paramètre manquant
JSON
{ "error": "id is required" }
Réponse 404 — Tournoi introuvable
JSON
{ "error": "Tournament not found" }
05

Vérification de licence

Comportement

Un seul appel au clic bouton — PTM interroge l'API officielle FFT (TenUp) et retourne une réponse normalisée. Tous les cas métier retournent HTTP 200 avec un champ status.

GET /api-players-verify Vérification FFT via TenUp
Paramètres
ParamètreTypeRequisDescription
first_namestringrequisPrénom du joueur
last_namestringrequisNom du joueur
licencestringoptionnelNuméro de licence FFT. Si fourni, affine la recherche et détecte les incohérences.
Requête — Recherche par nom
HTTP
GET /api-players-verify?first_name=Jean&last_name=Dupont x-api-key: votre_clé_api
Requête — Recherche avec licence
HTTP
GET /api-players-verify?first_name=Jean&last_name=Dupont&licence=1234567 x-api-key: votre_clé_api
Cas de réponse (tous HTTP 200)
status: found — Joueur trouvé (résultat unique)
{ "status": "found", "player": { "licence_number": "1234567", "first_name": "Jean", "last_name": "Dupont", "ranking": "9783", "club": "ON Padel Escalquens" } }
status: multiple — Plusieurs joueurs (homonymie)
{ "status": "multiple", "players": [ { "licence_number": "1234567", "first_name": "Jean", "last_name": "Dupont", "ranking": "9783", "club": "ON Padel Escalquens" }, { "licence_number": "7654321", "first_name": "Jean", "last_name": "Dupont", "ranking": "8234", "club": "Padel Club Toulouse" } ] } // → Afficher la liste, le joueur sélectionne, renvoyer un second appel avec licence.
status: not_found — Introuvable dans FFT
{ "status": "not_found" }
status: licence_mismatch — Licence ≠ Nom
{ "status": "licence_mismatch" } // → La licence existe dans FFT mais ne correspond pas au nom fourni.
status: error — Service FFT indisponible
{ "status": "error", "message": "Player verification service unavailable" }
Réponse 400 — Paramètre manquant
JSON
{ "error": "first_name and last_name are required" }
06

Inscription d'une paire

Logique automatique

Si des places sont disponibles → status: confirmed, la paire est ajoutée au tableau. Si le tournoi est complet → status: waitlist avec position en liste d'attente. Aucune validation manuelle requise.

POST /api-register Inscription paire au tournoi
Body (JSON)
JSON
{ "tournament_id": "550e8400-e29b-41d4-a716-446655440000", "player1": { "licence_number": "1234567", "first_name": "Jean", "last_name": "Dupont", "phone": "0612345678", "email": "jean.dupont@email.com" }, "player2": { "licence_number": "7654321", "first_name": "Marie", "last_name": "Martin", "phone": "0687654321", "email": "marie.martin@email.com" } }
Champs requis
ChampTypeDescription
tournament_iduuidID du tournoi cible
player1.licence_numberstringLicence FFT joueur 1
player1.first_namestringPrénom joueur 1
player1.last_namestringNom joueur 1
player1.phonestringTéléphone joueur 1
player1.emailstringEmail joueur 1
player2.*Idem pour le joueur 2
Réponse 201 — Confirmé
JSON
{ "registration_id": "uuid", "status": "confirmed", "message": "Registration confirmed" }
Réponse 201 — Liste d'attente
JSON
{ "registration_id": "uuid", "status": "waitlist", "waitlist_position": 2, "message": "Tournament is full, you have been added to the waitlist" }
Réponse 400 — Champ manquant
JSON
{ "error": "Missing required fields" }
Réponse 404 — Tournoi non disponible
JSON
{ "error": "Tournament not found or not open for registration" }
Réponse 409 — Paire déjà inscrite
JSON
{ "error": "This pair is already registered" }