Retour d’expérience technique sur l’intégration complète de l’API Gridky pour la synchronisation automatique de programmes immobiliers neufs.

Qu’est-ce que Gridky et pourquoi l’intégrer ?

Gridky : La plateforme de référence pour l’immobilier neuf

Gridky est une plateforme SaaS spécialisée dans la gestion et la commercialisation de programmes immobiliers neufs. Elle centralise toutes les informations relatives aux projets immobiliers : programmes, lots, prix, disponibilités, documents commerciaux, et bien plus encore.

À qui s’adresse cette intégration ?

Cette solution technique s’adresse principalement aux :

  • Promoteurs immobiliers qui souhaitent automatiser la diffusion de leurs programmes
  • Agents immobiliers spécialisés dans le neuf qui veulent synchroniser leur catalogue
  • Plateformes de vente en ligne nécessitant des données immobilières à jour
  • Développeurs WordPress travaillant sur des sites immobiliers
  • Agences web créant des solutions pour le secteur immobilier

Les enjeux de la synchronisation automatique

Sans intégration API, la gestion manuelle des programmes immobiliers pose plusieurs défis :

  • Mise à jour fastidieuse : modification manuelle de centaines de programmes
  • Risque d’erreurs : informations obsolètes ou incorrectes
  • Perte de temps : ressaisie répétitive des mêmes données
  • Manque de réactivité : retard dans la publication des nouveautés

L’intégration de l’API Gridky v3 résout ces problématiques en automatisant complètement la synchronisation bidirectionnelle entre Gridky et WordPress.

Architecture technique recommandée

Stratégie de synchronisation hybride

Notre retour d’expérience sur l’intégration pour l’extension Les Programmes Neufs (LPN) nous a menés à adopter une approche hybride combinant :

1. Synchronisation complète périodique (nocturne)

  • Import/mise à jour de tous les programmes
  • Détection des suppressions
  • Réconciliation des données
  • Avantage : résilience et cohérence globale

2. Webhooks temps réel

  • Notifications instantanées des changements
  • Mise à jour immédiate des nouveautés
  • Avantage : réactivité maximale

Cette stratégie garantit une synchronisation fiable même en cas de panne temporaire des webhooks.

Gestion des types de fiscalité

Point important : L’endpoint programsPinel sera supprimé prochainement car cette fiscalité n’existe plus.

Les endpoints à utiliser sont :

  • /v3/programsPersonalResidency (Résidence Principale)
  • /v3/programsControlledPrice (Prix Maîtrisé)
  • /v3/programsReducedVAT (TVA Réduite)

Implémentation technique détaillée

Configuration de base de l’API

class GridkyAPI {
    private $base_url = 'https://api.gridky.com/v3/';
    private $token;
    
    public function __construct($bearer_token) {
        $this->token = $bearer_token;
    }
    
    private function make_request($endpoint, $params = []) {
        $url = $this->base_url . $endpoint;
        if (!empty($params)) {
            $url .= '?' . http_build_query($params);
        }
        
        $response = wp_remote_get($url, [
            'headers' => [
                'Authorization' => 'Bearer ' . $this->token,
                'Accept' => 'application/json'
            ],
            'timeout' => 30
        ]);
        
        return json_decode(wp_remote_retrieve_body($response), true);
    }
}

Récupération optimisée des programmes

Règle importante : Ne jamais inclure properties lors de la récupération en masse car cela provoque des erreurs 504 Gateway Timeout.

function sync_programs_by_fiscality($fiscality_type) {
    $gridky = new GridkyAPI(get_option('gridky_api_token'));
    $page = 1;
    $all_programs = [];
    
    do {
        // Pagination recommandée : 100 par page
        $params = [
            'include' => 'municipality,promoter', // SANS properties !
            'per_page' => 100,
            'page' => $page
        ];
        
        $response = $gridky->make_request($fiscality_type, $params);
        
        if (empty($response['data'])) break;
        
        $all_programs = array_merge($all_programs, $response['data']);
        $page++;
        
        // Respect du rate limit : 240 calls/minute
        usleep(250000); // 0.25 seconde entre chaque appel
        
    } while (!empty($response['data']));
    
    return $all_programs;
}

Récupération des propriétés par programme

Pour éviter les timeouts, récupérez les propriétés séparément pour chaque programme :

function get_program_properties($program_uuid, $fiscality_type) {
    $gridky = new GridkyAPI(get_option('gridky_api_token'));
    
    // Mapping des types de fiscalité vers les endpoints propriétés
    $property_endpoints = [
        'programsPersonalResidency' => 'propertiesPersonalResidency',
        'programsControlledPrice' => 'propertiesControlledPrice',
        'programsReducedVAT' => 'propertiesReducedVAT'
    ];
    
    $endpoint = $property_endpoints[$fiscality_type];
    
    $params = [
        'filter[programs][0]' => $program_uuid,
        'include' => 'images,program.municipality',
        'per_page' => 100
    ];
    
    return $gridky->make_request($endpoint, $params);
}

Fonction de synchronisation complète

function wp_lpn_sync_complete() {
    $fiscality_types = [
        'programsPersonalResidency',
        'programsControlledPrice', 
        'programsReducedVAT'
    ];
    
    foreach ($fiscality_types as $type) {
        echo "Synchronisation de $type...\n";
        
        // 1. Récupération de tous les programmes
        $api_programs = sync_programs_by_fiscality($type);
        
        // 2. Comparaison avec WordPress
        $wp_programs = get_wordpress_programs($type);
        
        // 3. Import des nouveaux programmes
        $new_programs = array_diff_key($api_programs, $wp_programs);
        foreach ($new_programs as $program) {
            import_new_program($program, $type);
        }
        
        // 4. Mise à jour des programmes existants
        $existing_programs = array_intersect_key($api_programs, $wp_programs);
        foreach ($existing_programs as $program) {
            update_existing_program($program, $type);
        }
        
        // 5. Suppression des programmes obsolètes
        $obsolete_programs = array_diff_key($wp_programs, $api_programs);
        foreach ($obsolete_programs as $program) {
            delete_obsolete_program($program['uuid']);
        }
    }
    
    echo "Synchronisation terminée.\n";
}

Configuration des Webhooks temps réel

Sécurisation de l’endpoint webhook

Gridky utilise une signature HMAC SHA256 pour sécuriser les appels webhook :

// Endpoint : /wp-json/lpn/v1/webhook/gridky
function handle_gridky_webhook() {
    $body = file_get_contents('php://input');
    $signature = $_SERVER['HTTP_SIGNATURE'] ?? '';
    $secret = get_option('gridky_webhook_secret');
    
    // Vérification de la signature
    $expected_signature = hash_hmac('sha256', $body, $secret);
    
    if (!hash_equals($signature, $expected_signature)) {
        http_response_code(401);
        exit('Unauthorized');
    }
    
    $data = json_decode($body, true);
    process_webhook_event($data);
    
    http_response_code(200);
    echo json_encode(['success' => true]);
}

Traitement des événements webhook

function process_webhook_event($data) {
    $event_type = $data['type'] ?? '';
    $payload = $data['payload'] ?? [];
    
    switch ($event_type) {
        case 'program.created':
        case 'program.updated':
            sync_single_program($payload['identifier']);
            break;
            
        case 'program.deleted':
            delete_program_by_uuid($payload['identifier']);
            break;
            
        case 'property.created':
        case 'property.updated':
            sync_single_property($payload['identifier']);
            break;
            
        case 'property.deleted':
            delete_property_by_uuid($payload['identifier']);
            break;
    }
}

Optimisations et bonnes pratiques

Respect des limites de l’API

Rate limiting Gridky : 240 appels par minute maximum

class GridkyRateLimiter {
    private $calls_made = 0;
    private $minute_start;
    
    public function __construct() {
        $this->minute_start = time();
    }
    
    public function wait_if_needed() {
        $elapsed = time() - $this->minute_start;
        
        if ($elapsed >= 60) {
            $this->calls_made = 0;
            $this->minute_start = time();
        }
        
        if ($this->calls_made >= 240) {
            sleep(60 - $elapsed);
            $this->calls_made = 0;
            $this->minute_start = time();
        }
        
        $this->calls_made++;
    }
}

Gestion des erreurs et retry

function safe_api_call($callback, $max_retries = 3) {
    $attempt = 0;
    
    while ($attempt < $max_retries) {
        try {
            return $callback();
        } catch (Exception $e) {
            $attempt++;
            
            if ($attempt >= $max_retries) {
                error_log("API call failed after $max_retries attempts: " . $e->getMessage());
                throw $e;
            }
            
            // Attente progressive : 1s, 2s, 4s...
            sleep(pow(2, $attempt - 1));
        }
    }
}

Optimisation des performances WordPress

function batch_update_programs($programs, $batch_size = 50) {
    $batches = array_chunk($programs, $batch_size);
    
    foreach ($batches as $batch) {
        // Désactiver temporairement les hooks pour améliorer les performances
        wp_defer_term_counting(true);
        wp_defer_comment_counting(true);
        
        foreach ($batch as $program) {
            update_wordpress_program($program);
        }
        
        // Réactiver les hooks
        wp_defer_term_counting(false);
        wp_defer_comment_counting(false);
        
        // Pause entre les batches
        usleep(100000); // 0.1 seconde
    }
}

Surveillance et monitoring

Logs détaillés

function log_sync_activity($message, $level = 'info') {
    $timestamp = date('Y-m-d H:i:s');
    $log_entry = "[$timestamp] [$level] $message" . PHP_EOL;
    
    file_put_contents(
        WP_CONTENT_DIR . '/gridky-sync.log', 
        $log_entry, 
        FILE_APPEND | LOCK_EX
    );
}

Dashboard de synchronisation

Créez une page d’administration WordPress pour :

  • Lancer la synchronisation manuelle
  • Consulter les logs d’activité
  • Afficher les statistiques (programmes synchronisés, erreurs, etc.)
  • Configurer les paramètres API

Résultats et métriques

Performance de synchronisation

D’après notre expérience sur l’extension LPN :

  • 2 410 programmes Personal Residency synchronisés
  • 265 programmes Reduced VAT traités
  • Temps de synchronisation : ~30 minutes pour l’import complet
  • Taux de succès : 99.8% après optimisations

Problèmes courants et solutions

Timeouts lors de l’import

  • Cause : inclusion de properties dans les requêtes de masse
  • Solution : récupération séparée des propriétés

Écarts de nombres entre API et WordPress

  • Cause : programmes changeant de type de fiscalité
  • Solution : vérification des UIDs dans tous les types

Programmes sans propriétés

  • Cause : décalage temporel entre création programme et propriétés
  • Solution : re-synchronisation différée

Conclusion

L’intégration de l’API Gridky v3 dans WordPress représente un gain de temps considérable pour les professionnels de l’immobilier neuf. La stratégie hybride (synchronisation nocturne + webhooks) assure une fiabilité maximale tout en conservant la réactivité temps réel.

Points clés à retenir :

  • Pagination à 100 pour optimiser les performances
  • Respect du rate limit (240 calls/minute)
  • Récupération séparée des programmes et propriétés
  • Webhooks sécurisés avec signature HMAC
  • Gestion d’erreurs robuste avec retry automatique

Cette approche technique éprouvée vous permettra de créer une synchronisation automatique fiable entre Gridky et WordPress, libérant vos équipes des tâches répétitives pour se concentrer sur la commercialisation.


Besoin d’aide pour votre intégration Gridky ?

Chez Pixfeed, nous accompagnons régulièrement nos clients dans l’intégration d’APIs complexes comme Gridky. Si vous rencontrez des difficultés techniques ou souhaitez déléguer cette intégration, nous serions ravis d’échanger sur votre projet.

Privacy Preference Center