Une foule de coureurs vue de dos passe sous une arche de brique

Développeurs et chronométreurs

La liste de départ se lit par l'API, dans le format de votre logiciel, et chaque changement vous arrive signé dans la minute. Documentée, testable, décrite en OpenAPI.

L'API

Une clé par course et par destinataire, dans l'en-tête Authorization. Lecture seule.

curl -H "Authorization: Bearer wr_xxxxxxxx_…" \
  https://register.wetiming.fr/api/v1/courses/<course>/inscrits

# seulement ce qui a changé, annulations comprises
curl -H "Authorization: Bearer wr_xxxxxxxx_…" \
  "https://register.wetiming.fr/api/v1/courses/<course>/inscrits?depuis=2026-10-17T18:00:00Z"

# un fichier prêt à importer
curl -H "Authorization: Bearer wr_xxxxxxxx_…" \
  "https://register.wetiming.fr/api/v1/courses/<course>/inscrits?format=raceresult"

Les formats

Le paramètre format rend un fichier prêt à importer. Chaque ligne porte l'identifiant d'inscription, la catégorie FFA, la vague et son heure, la puce, l'équipe et le relais.

  1. 01

    Standard, colonnes en français · format=standard

    Wiclax, GmCAP, Chronelec, Logica, tableur. Point-virgule, UTF-8. Une valeur par colonne : ces logiciels font correspondre les colonnes à l'import.

  2. 02

    RaceResult · format=raceresult

    race result 12 et 14. En-têtes aux noms de champs RaceResult, un seul champ d'âge (la date de naissance). Séparateur et format de date À VÉRIFIER sur le premier import.

  3. 03

    Webscorer · format=webscorer

    Webscorer. Texte tabulé en Unicode, comme le recommande Webscorer pour les accents.

  4. 04

    IPICO, ACTIVE Timing · format=ipico

    IPICO. Les dix colonnes exigées, date au format MM/DD/YYYY. Les puces se chargent à part, avec le fichier dossard et puce.

  5. 05

    MYLAPS · format=mylaps

    EventApp, Sporthive. L'identifiant d'inscription reste le même d'un export à l'autre. Noms de colonnes À VÉRIFIER sur le premier import.

  6. 06

    Dossard et puce · format=puces

    IPICO, tout logiciel à puces réutilisables. Deux colonnes sans en-tête : dossard, puce. Seuls les coureurs qui ont une puce.

Les webhooks

Un POST en JSON à votre adresse, à chaque inscription confirmée, modifiée ou annulée.

  1. 01

    entry.confirmed

    Une inscription reçoit son dossard : règlement confirmé, inscription gratuite, reprise d'un dossard.

  2. 02

    entry.updated

    Un champ lu par le chronométreur change : nom, date de naissance, épreuve, vague, dossard, puce, équipe, club, licence.

  3. 03

    entry.cancelled

    Une inscription est annulée. Le dossard revient à la course quand l'épreuve n'est pas partie.

{
  "id": "5b0c9d0e-…",
  "type": "entry.confirmed",
  "created_at": "2026-10-17T18:04:11.201Z",
  "course": { "slug": "trail-relais", "name": "TRAIL RELAIS" },
  "data": {
    "registration_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
    "status": "confirmed",
    "bib": 42,
    "last_name": "Martin",
    "first_name": "Léa",
    "gender": "F",
    "birth_date": "1990-04-02",
    "category": "M0",
    "category_sex": "M0F",
    "race_name": "10km",
    "wave_name": "SAS 1",
    "start_at": "2026-10-18T08:00:00.000Z",
    "chip": "ABC123",
    "team_name": null,
    "leg": null
  }
}
import { createHmac, timingSafeEqual } from "node:crypto";

// En-tête X-WeRegister-Signature : t=<secondes>,v1=<hmac>
export function verifier(secret, corpsBrut, entete) {
  const { t, v1 } = Object.fromEntries(entete.split(",").map((p) => p.split("=")));
  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
  const attendu = createHmac("sha256", secret).update(`${t}.${corpsBrut}`).digest("hex");
  return timingSafeEqual(Buffer.from(attendu), Buffer.from(v1));
}

Les garanties

  1. 01

    Signé

    Chaque envoi porte un HMAC-SHA256 de son heure et de son corps, par le secret du webhook. Une signature de plus de 5 minutes se refuse.

  2. 02

    Repris

    Une réponse hors 2xx, ou aucune réponse en 8 secondes, et l'envoi repart : 1min, 5min, 15min, 1h, 3h, 6h, 12h.

  3. 03

    Dédoublonnable

    L'identifiant de livraison reste le même d'une tentative à l'autre. L'identifiant d'inscription reste le même pour toute la vie de l'inscription.

  4. 04

    Complet

    Les envois naissent en base, à chaque écriture qui compte : formulaire, organisateur, transfert ou import, rien ne s'échappe.

  5. 05

    Testable

    Un bouton envoie un message de test signé et affiche la réponse de votre serveur. Chaque envoi se relit, et un échec se renvoie d'un clic.

  6. 06

    Décrit

    La description OpenAPI 3.1 de l'API et des webhooks se télécharge, pour générer un client dans le langage de votre choix.

Questions de chronométreur

Qui crée les clés et les webhooks ?

L'organisateur, dans l'onglet Chronométreur de sa course. Une clé par destinataire, qui lit cette course seulement et se révoque d'un clic.

Nos coureurs changent de dossard la veille : comment le savoir ?

Par le webhook entry.updated, dans la minute. Ou par l'API avec le paramètre depuis, qui ne rend que les changements depuis votre dernier appel.

Notre logiciel attend son propre format.

Le paramètre format rend la liste de départ prête à importer : RaceResult, Webscorer, IPICO, MYLAPS, un fichier dossard et puce, ou le format standard que Wiclax, GmCAP et Chronelec font correspondre à l'import.

Les coureurs d'un club rassemblés devant un café avant le départ

Trois champs : votre course, sa date, votre adresse. Nous ouvrons votre espace et vous répondons par email.