API Partenaires IKtracker

    Mis à jour le

    Intégrez IKtracker dans votre plateforme : calcul d'indemnités, gestion des trajets, SSO et webhooks. Gratuit, sans limite imposée.

    Authentification

    Toutes les requêtes (sauf /sso/verify) nécessitent l'en-tête x-api-key avec votre clé partenaire. Pour obtenir une clé, contactez-nous via /contact.

    curl -H "x-api-key: ikt_live_xxx..." \
      https://yarjaudctshlxkatqgeb.supabase.co/functions/v1/partner-api/health

    Modèle d'utilisateur

    Chaque utilisateur de votre plateforme est identifié par un external_user_id (stable, choisi par vous) et un external_email. Lors du premier appel impliquant cet utilisateur, IKtracker crée automatiquement un compte (ou réutilise un compte existant avec le même email). Aucune action requise de votre côté pour le provisioning.

    Endpoints

    GET/health

    Vérifie la validité de votre clé et retourne le quota restant.

    { "ok": true, "partner": "dictadevi", "quota_remaining": 99873 }
    POST/vehicle/lookup

    Recherche un véhicule par sa plaque d'immatriculation française. Retourne marque, modèle, CV fiscaux, motorisation.

    POST https://yarjaudctshlxkatqgeb.supabase.co/functions/v1/partner-api/vehicle/lookup
    x-api-key: ikt_live_xxx...
    Content-Type: application/json
    
    { "plate": "AB-123-CD" }
    {
      "success": true,
      "make": "Renault",
      "model": "Clio",
      "year": 2020,
      "fiscalPower": 5,
      "isElectric": false
    }
    POST/ik/calculate

    Calcule l'indemnité kilométrique d'un trajet selon le barème officiel français (bonus 20% véhicules 100% électriques inclus).

    POST https://yarjaudctshlxkatqgeb.supabase.co/functions/v1/partner-api/ik/calculate
    x-api-key: ikt_live_xxx...
    
    {
      "fiscal_power": 5,
      "is_electric": false,
      "annual_km": 12000,
      "trip_km": 45
    }
    {
      "success": true,
      "fiscalPower": 5,
      "bracket": "mid",
      "bracketLabel": "5 001 – 20 000 km",
      "tripIkAmount": 21.30,
      "annualIkAmount": 5679.00
    }
    POST/tripsscope: write

    Crée un trajet pour un utilisateur. L'IK est calculée automatiquement à partir de vehicle_id. Si vehicle_id n'est pas fourni, IKtracker assigne automatiquement le véhicule par défaut de l'utilisateur (le plus ancien) — garde-fou pour éviter les trajets orphelins. Recommandation : passez toujours vehicle_id explicitement pour un contrôle précis du barème. L'utilisateur est provisionné automatiquement au premier appel.

    POST https://yarjaudctshlxkatqgeb.supabase.co/functions/v1/partner-api/trips
    x-api-key: ikt_live_xxx...
    x-external-user-id: user-12345
    
    {
      "external_email": "marie@cabinet.fr",
      "date": "2026-04-23",
      "start_location": "12 rue de la Paix, 75002 Paris",
      "end_location": "Cabinet client, 92100 Boulogne",
      "distance": 12.5,
      "vehicle_id": "uuid-optionnel",
      "purpose": "RDV client",
      "round_trip": true,
      "calendar_event_id": "dictadevi-evt-99"
    }
    {
      "success": true,
      "trip_id": "uuid",
      "ik_amount": 7.95,
      "iktracker_user_id": "uuid"
    }
    GET/stats

    Retourne les totaux de l'année en cours pour un utilisateur (km, IK, nombre de trajets, palier fiscal en cours).

    GET https://yarjaudctshlxkatqgeb.supabase.co/functions/v1/partner-api/stats
    x-api-key: ikt_live_xxx...
    x-external-user-id: user-12345
    {
      "success": true,
      "year": 2026,
      "total_km": 4521.3,
      "total_ik": 2876.45,
      "trips_count": 87,
      "current_bracket": "low",
      "bracket_label": "≤ 5 000 km"
    }
    GET/preferencesscope: preferences:read

    Retourne les préférences d'import calendrier de l'utilisateur lié. calendar_import_mode vaut individual (chaque événement = un aller-retour depuis la Maison) ou tour(tous les rendez-vous d'une même journée sont regroupés en une tournée Maison → étapes → Maison).

    GET https://yarjaudctshlxkatqgeb.supabase.co/functions/v1/partner-api/preferences
    x-api-key: ikt_live_xxx...
    x-external-user-id: user-12345
    {
      "calendar_import_mode": "tour",
      "has_home_address": true,
      "note": null
    }

    note: "home_address_missing" signale que le mode tour est actif mais qu'aucune adresse « Maison » n'est définie côté IKtracker : les imports retombent alors en trajets individuels tant que la Maison n'est pas renseignée.

    PUT/preferencesscope: preferences:write

    Met à jour le mode d'import calendrier de l'utilisateur lié. Renvoie 409 home_address_requiredsi l'utilisateur active tour sans avoir défini d'adresse Maison.

    PUT https://yarjaudctshlxkatqgeb.supabase.co/functions/v1/partner-api/preferences
    x-api-key: ikt_live_xxx...
    x-external-user-id: user-12345
    Content-Type: application/json
    
    { "calendar_import_mode": "tour" }
    {
      "calendar_import_mode": "tour",
      "has_home_address": true,
      "updated_at": "2026-07-22T09:12:00Z"
    }

    Déclenche le webhook preferences.updated si votre plateforme y est abonnée.

    GET/vehiclesscope: read

    Liste les véhicules de l'utilisateur lié.

    GET https://yarjaudctshlxkatqgeb.supabase.co/functions/v1/partner-api/vehicles
    x-api-key: ikt_live_xxx...
    x-external-user-id: user-12345
    PATCH/vehicles/:idscope: vehicles:write

    Met à jour un véhicule. Le paramètre update_past_trips (booléen, défaut false) contrôle la rétroactivité : si true et que fiscal_power ou is_electric change, toutes les indemnités des trajets passés liés à ce véhicule sont immédiatement recalculées avec le nouveau barème. Si false, seuls les trajets créés après la modification en bénéficient.

    PATCH https://yarjaudctshlxkatqgeb.supabase.co/functions/v1/partner-api/vehicles/{vehicle_id}
    x-api-key: ikt_live_xxx...
    x-external-user-id: user-12345
    Content-Type: application/json
    
    {
      "fiscal_power": 6,
      "is_electric": true,
      "update_past_trips": true
    }
    {
      "success": true,
      "vehicle_id": "uuid",
      "changed": ["fiscal_power", "is_electric"],
      "update_past_trips": true,
      "recalculated_trips": 127
    }

    Déclenche le webhook vehicle.updated avec le champ recalculated_trips.

    POST/sso/magic-linkscope: sso

    Génère une URL de connexion à usage unique (5 min) pour rediriger l'utilisateur vers son espace IKtracker, déjà authentifié.

    POST https://yarjaudctshlxkatqgeb.supabase.co/functions/v1/partner-api/sso/magic-link
    x-api-key: ikt_live_xxx...
    
    {
      "external_user_id": "user-12345",
      "external_email": "marie@cabinet.fr",
      "redirect_to": "/app/mestrajets"
    }
    {
      "success": true,
      "sso_url": "https://iktracker.fr/sso?token=...&partner=dictadevi&redirect=/app/mestrajets",
      "expires_in": 300,
      "iktracker_user_id": "uuid"
    }

    Côté votre plateforme : un simple window.location.href = sso_url suffit.

    Webhooks

    IKtracker peut notifier votre plateforme en temps réel lors d'événements (trip.created, trip.updated, vehicle.updated, user.linked, preferences.updated, monthly_report.sent). Configurez votre URL de réception et un secret HMAC depuis votre dashboard partenaire.

    Relevés mensuels automatiques : tout utilisateur provisionné via l'API reçoit par défaut le relevé mensuel + cumul annuel par email le 15 de chaque mois (préférence user_monthly_report_enabled = true, modifiable via l'espace utilisateur). Le webhook monthly_report.sent est émis à chaque envoi avec month_url et ytd_url (liens sécurisés valides 7 jours), external_user_id, mois concerné et volumes (km, IK, nb trajets).

    Chaque requête contient les en-têtes X-IKtracker-Event et X-IKtracker-Signature: sha256=<hmac> pour vérifier l'authenticité.

    POST https://your-platform.com/webhooks/iktracker
    X-IKtracker-Event: trip.created
    X-IKtracker-Signature: sha256=abc123...
    Content-Type: application/json
    
    {
      "event": "trip.created",
      "timestamp": "2026-04-23T10:00:00Z",
      "payload": {
        "trip_id": "uuid",
        "external_user_id": "user-12345",
        "distance": 12.5,
        "ik_amount": 7.95
      }
    }

    Exemple concret de payload monthly_report.sent (émis le 15 de chaque mois après envoi email) :

    POST https://your-platform.com/webhooks/iktracker
    X-IKtracker-Event: monthly_report.sent
    X-IKtracker-Signature: sha256=9f4c1a2b8e...
    Content-Type: application/json
    
    {
      "event": "monthly_report.sent",
      "timestamp": "2026-05-15T07:02:14Z",
      "payload": {
        "iktracker_user_id": "b3d1e8a4-7c92-4f0a-9e11-2a5c6f8b0d31",
        "external_user_id": "user-12345",
        "email": "marie@cabinet.fr",
        "period": {
          "month": "2026-04",
          "start_date": "2026-04-01",
          "end_date": "2026-04-30"
        },
        "totals": {
          "trips_count": 42,
          "distance_km": 1287.4,
          "ik_amount_eur": 823.15
        },
        "ytd": {
          "distance_km": 5124.9,
          "ik_amount_eur": 3287.42
        },
        "month_url": "https://iktracker.fr/temporaryreport/8f2a...e4b1",
        "ytd_url": "https://iktracker.fr/temporaryreport/1c9d...af07",
        "expires_at": "2026-05-22T07:02:14Z"
      }
    }

    Les URLs month_url et ytd_url exposent le PDF via ?format=pdf — idéal pour un pull côté partenaire (archivage GED, transmission comptable).

    Codes d'erreur

    • 401 — clé API manquante ou invalide
    • 403 — clé révoquée ou scope insuffisant
    • 404 — utilisateur non lié ou ressource introuvable
    • 429 — quota mensuel dépassé (contactez-nous pour augmentation gratuite)
    • 500 — erreur interne (signalez-la à /contact)

    RGPD & responsabilité

    En envoyant des données utilisateur à IKtracker, votre plateforme s'engage à avoir recueilli le consentement explicite de l'utilisateur final pour le partage de ces informations. IKtracker traite ces données conformément à sa politique de confidentialité.