AutomationFlowsWeb Scraping › Bâti Pro - Analyse Plu/rnu (web)

Bâti Pro - Analyse Plu/rnu (web)

Bâti Pro - Analyse PLU/RNU (Web). Uses httpRequest, perplexity. Webhook trigger; 10 nodes.

Webhook trigger★★★★☆ complexity10 nodesHTTP RequestPerplexity
Web Scraping Trigger: Webhook Nodes: 10 Complexity: ★★★★☆ Added:

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "B\u00e2ti Pro - Analyse PLU/RNU (Web)",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "batipro-analyse-plu",
        "responseMode": "responseNode",
        "options": {
          "allowedOrigins": "*"
        }
      },
      "id": "webhook-web",
      "name": "Webhook Web",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        400,
        300
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "lat",
              "name": "latitude",
              "value": "={{ $json.body.latitude }}",
              "type": "string"
            },
            {
              "id": "long",
              "name": "longitude",
              "value": "={{ $json.body.longitude }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "extract-coords",
      "name": "Extract Coordinates",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        620,
        300
      ]
    },
    {
      "parameters": {
        "url": "https://apicarto.ign.fr/api/cadastre/parcelle",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "geom",
              "value": "={{ `{\"type\":\"Point\",\"coordinates\":[${$json.longitude}, ${$json.latitude}]}` }}"
            }
          ]
        },
        "options": {}
      },
      "id": "ign-parcelle",
      "name": "IGN Parcelle",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.1,
      "position": [
        840,
        300
      ]
    },
    {
      "parameters": {
        "url": "https://apicarto.ign.fr/api/gpu/zone-urba",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "geom",
              "value": "={{ `{\"type\":\"Point\",\"coordinates\":[${$('Extract Coordinates').item.json.longitude}, ${$('Extract Coordinates').item.json.latitude}]}` }}"
            }
          ]
        },
        "options": {}
      },
      "id": "ign-zone-urba",
      "name": "IGN Zone Urba",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.1,
      "position": [
        1060,
        300
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "url-parcelle",
              "name": "url_parcelle",
              "value": "={{ \"https://www.geoportail-urbanisme.gouv.fr/map/parcel-info/\" + [$('IGN Parcelle').item.json.features[0].properties.code_dep, $('IGN Parcelle').item.json.features[0].properties.code_com, $('IGN Parcelle').item.json.features[0].properties.com_abs, $('IGN Parcelle').item.json.features[0].properties.code_arr, $('IGN Parcelle').item.json.features[0].properties.section, $('IGN Parcelle').item.json.features[0].properties.numero].join('_') + \"/\" }}",
              "type": "string"
            },
            {
              "id": "commune",
              "name": "commune",
              "value": "={{ $('IGN Parcelle').item.json.features[0].properties.nom_com }}",
              "type": "string"
            },
            {
              "id": "section",
              "name": "section",
              "value": "={{ $('IGN Parcelle').item.json.features[0].properties.section }}",
              "type": "string"
            },
            {
              "id": "numero",
              "name": "numero",
              "value": "={{ $('IGN Parcelle').item.json.features[0].properties.numero }}",
              "type": "string"
            },
            {
              "id": "surface",
              "name": "surface",
              "value": "={{ $('IGN Parcelle').item.json.features[0].properties.contenance }}",
              "type": "number"
            }
          ]
        },
        "options": {}
      },
      "id": "build-parcel-info",
      "name": "Build Parcel Info",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1280,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 1
          },
          "conditions": [
            {
              "id": "check-rnu",
              "leftValue": "={{ $('IGN Zone Urba').item.json.totalFeatures }}",
              "rightValue": 0,
              "operator": {
                "type": "number",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "is-rnu",
      "name": "Est-ce RNU ?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        1500,
        300
      ]
    },
    {
      "parameters": {
        "messages": {
          "message": [
            {
              "content": "=Tu es un expert en urbanisme. Je souhaite analyser la faisabilit\u00e9 d'un projet sur une parcelle situ\u00e9e dans une commune qui ne dispose PAS de PLU (Plan Local d'Urbanisme), ni de carte communale.\n\nElle est donc soumise au RNU (R\u00e8glement National d'Urbanisme).\n\nVoici sa fiche de parcelle: {{ $('Build Parcel Info').item.json.url_parcelle }}\n\n\ud83d\udccd Informations localisation :\nCommune : {{ $('Build Parcel Info').item.json.commune }}\nParcelle : Section {{ $('Build Parcel Info').item.json.section }} Num\u00e9ro {{ $('Build Parcel Info').item.json.numero }}\nSurface : {{ $('Build Parcel Info').item.json.surface }} m\u00b2\n\nTon objectif : Appliquer les r\u00e8gles du Code de l'Urbanisme (Articles R.111-1 et suivants) \u00e0 ce contexte pr\u00e9cis.\n\nFournis une synth\u00e8se op\u00e9rationnelle stricte selon le mod\u00e8le ci-dessous :\n\n0. En ent\u00eate\nIndique clairement : \"\u26a0\ufe0f Zone sous RNU (R\u00e8glement National d'Urbanisme)\"\n\n1. Usages autoris\u00e9s / interdits (R\u00e8gle de la constructibilit\u00e9 limit\u00e9e)\n\ud83d\uded1 C'est le point le plus critique.\n- Rappelle la r\u00e8gle de l'article L.111-3 : La construction n'est autoris\u00e9e que dans les \"Parties Actuellement Urbanis\u00e9es\" (PAU) de la commune.\n- D'apr\u00e8s ta connaissance de la commune et les coordonn\u00e9es GPS fournies, estime si la parcelle semble situ\u00e9e dans le bourg/hameau densifi\u00e9 (constructible) ou en zone diffuse/agricole (inconstructible sauf exceptions).\n- Liste les exceptions majeures (int\u00e9r\u00eat public, agricole, extension mesur\u00e9e).\n\n2. Implantation & distances (R\u00e8gles suppl\u00e9tives du code)\nDonne les r\u00e8gles par d\u00e9faut du Code de l'Urbanisme :\n- Limites s\u00e9paratives : Citer l'article R.111-18 (g\u00e9n\u00e9ralement 3 m\u00e8tres min. ou la moiti\u00e9 de la hauteur).\n- Retrait voirie : R\u00e8gles g\u00e9n\u00e9rales d'alignement (R.111-17).\n- Entre deux b\u00e2timents : R\u00e8gle de non-contigu\u00eft\u00e9.\n\n3. Hauteurs & volumes\n- Mentionne l'article R.111-27 : Le projet ne doit pas porter atteinte au caract\u00e8re ou \u00e0 l'int\u00e9r\u00eat des lieux avoisinants.\n- Y a-t-il des monuments historiques proches qui imposeraient une hauteur sp\u00e9cifique ?\n\n4. Emprise au sol & densit\u00e9\n- Pr\u00e9cise qu'il n'y a pas de CES (Coefficient d'Emprise au Sol) fixe au niveau national, mais que l'insertion paysag\u00e8re prime.\n- R\u00e8gles sur la perm\u00e9abilit\u00e9 des sols.\n\n5. Stationnement & Acc\u00e8s\n- S\u00e9curit\u00e9 des acc\u00e8s (Article R.111-2).\n- Gestion des eaux pluviales et r\u00e9seaux.\n\n6. Points de vigilance RNU\n- Risque majeur : Le refus de permis si la parcelle est consid\u00e9r\u00e9e \"hors partie urbanis\u00e9e\" (L.111-3).\n- Desserte par les r\u00e9seaux (Eau/\u00c9lectricit\u00e9) : Si le terrain n'est pas desservi, le permis peut \u00eatre refus\u00e9 (L.111-11).\n- Avis conforme du Pr\u00e9fet souvent requis dans les zones RNU.\n\nFORME ATTENDUE :\nMaximum 10 \u00e0 15 lignes\nFormat bullet points avec icones pour bien identifier\nPas de reformulation inutile\nPas de r\u00e9sum\u00e9 global, seulement les points qui impactent un projet\nLimite de caract\u00e8res : 4000\n\nSi tu as un doute sur la localisation (dedans/dehors du bourg), pr\u00e9cise : \"\u26a0\ufe0f \u00c0 v\u00e9rifier : La localisation dans la partie urbanis\u00e9e (PAU) est la condition sine qua non.\""
            }
          ]
        },
        "options": {},
        "requestOptions": {}
      },
      "type": "n8n-nodes-base.perplexity",
      "typeVersion": 1,
      "position": [
        1720,
        200
      ],
      "id": "perplexity-rnu",
      "name": "Perplexity RNU",
      "credentials": {
        "perplexityApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "messages": {
          "message": [
            {
              "content": "=Voici un PLU\nVoici les informations sur la parcelle concern\u00e9e ainsi que son zonage :\nCommune : {{ $('Build Parcel Info').item.json.commune }}\nZonage PLU : {{ $('IGN Zone Urba').item.json.features[0].properties.libelle }}\nURL PLU : https://data.geopf.fr/annexes/gpu/documents/{{ $('IGN Zone Urba').item.json.features[0].properties.partition }}/{{ $('IGN Zone Urba').item.json.features[0].properties.gpu_doc_id }}/{{ $('IGN Zone Urba').item.json.features[0].properties.nomfic }}\n\nTu es un expert en urbanisme je veux que tu analyse ce PLU\n\nTon objectif : identifier uniquement les r\u00e8gles qui impactent un projet.\n\nDans ta r\u00e9ponse, fournis une synth\u00e8se claire, concise, et exploitable en s\u00e9parant les \u00e9l\u00e9ments essentiels :\n\n0. En ent\u00eate le zonage\n\n1. Usages autoris\u00e9s / interdits\nCe qui est autoris\u00e9, interdit, soumis \u00e0 conditions, uniquement si indiqu\u00e9 dans le texte.\nMentionne clairement ce qui peut bloquer un projet (incompatibilit\u00e9s d'usage).\n\n2. Implantation & distances obligatoires\nDonne les distances chiffr\u00e9es pr\u00e9sentes dans le r\u00e8glement :\nretraits aux limites s\u00e9paratives\nretraits aux voies\nmarges de recul\nemprises obligatoires ou zones \u00e0 pr\u00e9server\nprescriptions particuli\u00e8res si mentionn\u00e9es\n(Si aucune distance n'est donn\u00e9e dans la zone \u2192 le pr\u00e9ciser clairement.)\n\n3. Hauteurs & volumes\nhauteur max\nnombre d'\u00e9tages ou \u00e9quivalents si pr\u00e9cis\u00e9\ncontraintes de gabarit, toitures, pente, alignement\n\n4. Emprise au sol & densit\u00e9\nemprise maximale\nsurface minimale de terrain si indiqu\u00e9e\nr\u00e8gles sur les espaces verts, plantations, traitement des sols\n\n5. Stationnement\nnombre de places par type de b\u00e2timent\nobligations sp\u00e9cifiques (PMR, v\u00e9los, etc.)\n\n6. Points de vigilance\nListe seulement les \u00e9l\u00e9ments qui peuvent bloquer ou restreindre un permis :\nservitudes\nprotections (risques, ABF, zones sensibles)\nprescriptions architecturales contraignantes\nmentions du r\u00e8glement qui indiquent \u00ab interdit \u00bb, \u00ab doit \u00bb, \u00ab obligatoire \u00bb, \u00ab ne peut pas \u00bb\n\nFORME ATTENDUE :\nMaximum 10 \u00e0 15 lignes\nLimite de caract\u00e8res : 4000\nFormat bullet points avec icones pour bien identifier\nPas de reformulation inutile\nPas de r\u00e9sum\u00e9 global, seulement les points qui impactent un projet\n\nSi une information n'appara\u00eet pas dans le texte :\nTu \u00e9cris clairement : \u00ab Aucune indication donn\u00e9e dans le r\u00e8glement. \u00bb\n\nNE FAIS PAS :\npas de description du PLU\npas de blabla narratif\npas de phrases longues\npas de contenu invent\u00e9\npas de supposition"
            }
          ]
        },
        "options": {},
        "requestOptions": {}
      },
      "type": "n8n-nodes-base.perplexity",
      "typeVersion": 1,
      "position": [
        1720,
        400
      ],
      "id": "perplexity-plu",
      "name": "Perplexity PLU",
      "credentials": {
        "perplexityApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// R\u00e9cup\u00e9rer les donn\u00e9es\nconst parcelInfo = $('Build Parcel Info').first().json;\nconst ignZoneUrba = $('IGN Zone Urba').first().json;\nconst perplexityResponse = $input.first().json;\n\n// D\u00e9terminer le type (RNU ou PLU)\nconst isRNU = ignZoneUrba.totalFeatures === 0;\nconst zonage = isRNU ? 'RNU' : (ignZoneUrba.features[0]?.properties?.libelle || 'Inconnu');\n\n// Construire la r\u00e9ponse structur\u00e9e\nconst response = {\n  success: true,\n  data: {\n    parcelle: {\n      commune: parcelInfo.commune,\n      section: parcelInfo.section,\n      numero: parcelInfo.numero,\n      surface: parcelInfo.surface,\n      url_geoportail: parcelInfo.url_parcelle\n    },\n    zonage: {\n      type: isRNU ? 'RNU' : 'PLU',\n      libelle: zonage,\n      url_document: isRNU ? null : `https://data.geopf.fr/annexes/gpu/documents/${ignZoneUrba.features[0].properties.partition}/${ignZoneUrba.features[0].properties.gpu_doc_id}/${ignZoneUrba.features[0].properties.nomfic}`\n    },\n    analyse: {\n      texte: perplexityResponse.choices[0].message.content,\n      source: 'Perplexity AI'\n    },\n    timestamp: new Date().toISOString()\n  }\n};\n\nreturn response;"
      },
      "id": "format-response",
      "name": "Format Response JSON",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1940,
        300
      ]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ $json }}",
        "options": {
          "responseHeaders": {
            "entries": [
              {
                "name": "Access-Control-Allow-Origin",
                "value": "*"
              },
              {
                "name": "Access-Control-Allow-Methods",
                "value": "POST, OPTIONS"
              },
              {
                "name": "Content-Type",
                "value": "application/json"
              }
            ]
          }
        }
      },
      "id": "respond-webhook",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        2160,
        300
      ]
    }
  ],
  "connections": {
    "Webhook Web": {
      "main": [
        [
          {
            "node": "Extract Coordinates",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Coordinates": {
      "main": [
        [
          {
            "node": "IGN Parcelle",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IGN Parcelle": {
      "main": [
        [
          {
            "node": "IGN Zone Urba",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IGN Zone Urba": {
      "main": [
        [
          {
            "node": "Build Parcel Info",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Parcel Info": {
      "main": [
        [
          {
            "node": "Est-ce RNU ?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Est-ce RNU ?": {
      "main": [
        [
          {
            "node": "Perplexity RNU",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Perplexity PLU",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Perplexity RNU": {
      "main": [
        [
          {
            "node": "Format Response JSON",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Perplexity PLU": {
      "main": [
        [
          {
            "node": "Format Response JSON",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Response JSON": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Bâti Pro - Analyse PLU/RNU (Web). Uses httpRequest, perplexity. Webhook trigger; 10 nodes.

Source: https://github.com/Tarxangel/batipro-web/blob/bbaf59d6ff0c920b35addd55ce568b6748a0a976/n8n-workflow-web.json — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Web Scraping

This n8n template provides enterprise-level version control for your workflows using GitHub integration. Stop losing hours to broken workflows and manual exports – get proper commit history, visual di

n8n, Execute Workflow Trigger, HTTP Request +1
Web Scraping

This flow creates dummy files for every item added in your *Arrs (Radarr/Sonarr) with the tag .

HTTP Request, Ssh
Web Scraping

This workflow acts as a central API gateway for all technical indicator agents in the Binance Spot Market Quant AI system. It listens for incoming webhook requests and dynamically routes them to the c

HTTP Request
Web Scraping

Sign PDF documents with legally-compliant digital signatures using X.509 certificates. Supports multiple PAdES signature levels (B, T, LT, LTA) with optional visible stamps.

Execute Command, HTTP Request, Read Write File +1
Web Scraping

📡 This workflow serves as the central Alpha Vantage API fetcher for Tesla trading indicators, delivering cleaned 20-point JSON outputs for three timeframes: , , and . It is required by the following a

HTTP Request