PermisAPI
03 · PropTech

Integrez les permis de construire France dans votre produit en < 1 jour

Ne perdez pas 2 semaines a coder l'ingestion CSV Sitadel, le parsing des 4 schemas, le geocoding batch BAN, le pipeline SIRENE. On l'a fait pour vous, avec SDK Python, OpenAPI spec, Postman collection et webhooks HMAC.

Ce qui coince aujourd'hui

Sources publiques techniquement fragiles

Sitadel = 4 CSVs mensuels avec conventions differentes (35 colonnes, varchars tronques, dates multi-format). BAN = limite 50 req/s sans auth. SIRENE = 7 req/s, JSON nested, NAF format a points. Maintenance = > 2j-dev / mois.

Time-to-market contraint

Votre investisseur attend des resultats dans 3 mois. Passer 3 semaines sur l'ingestion de data publique est un non-starter. Vous avez besoin d'un 'data layer as a service'.

Volume de requêtes variable (demand spike au launch)

Vous ne savez pas a priori si votre produit va faire 500 ou 50k req/jour. Lock-in un contrat enterprise avant validation = risque. Vous voulez du PAYG ou un pricing qui scale.

Ce que PermisAPI apporte

SDK Python officiel (typed, async-ready)

`pip install permisapi-client`. Client sync + async, pagination iter_all(), exceptions typees (PermisAPIRateLimited, PermisAPIQuotaExceeded). Couvert par 15 tests unit via respx.

from permisapi_client import PermisAPI

client = PermisAPI(api_key="pk_live_...")
for p in client.permits.iter_all(dep_code="75"):
    print(p["num_pa"], p["adr_localite_ter"])

Webhook HMAC pour alertes temps reel

POST signes HMAC-SHA256 avec replay protection (idempotent sur alert_id + permit_id). Compatible Next.js API route, Vercel Edge Functions, Cloudflare Workers.

// Next.js API route
export async function POST(req) {
  const body = await req.text();
  const sig = req.headers.get("x-permisapi-signature");
  const expected = crypto.createHmac("sha256",
    process.env.WEBHOOK_SECRET).update(body).digest("hex");
  if (sig !== expected) return new Response("401", {status:401});
  // processer le payload ...
}

Free tier genereux pour POC

500 req/mois gratuit, pas de carte bleue. Suffisant pour prototyper + intégration test. Quand le volume decolle, upgrade self-serve via Stripe Checkout (4 plans visibles, pas de 'contact sales' wall).

DVF cross-ref pour enrichir votre data layer

Pour chaque permis ingere dans votre produit, un appel REST retourne les top 5 transactions immobilieres voisines avec valeur fonciere, surface bati, type. 5 ms de latence (B-tree lookup), pas un proxy sur Etalab. Vous evitez de coder votre propre pipeline DVF (~5j-dev) et vous heritez du recalcul mensuel automatise.

from permisapi_client import PermisAPI

client = PermisAPI(api_key="pk_live_...")
matches = client.permits.dvf("PC07404021K1", limit=5)
for m in matches["matches"]:
    print(m["valeur_fonciere"], m["surface_reelle_bati"])

Cross-ref PLU pour scoring constructibilité

Pour chaque permis, l'endpoint /plu retourne le zonage urbanisme officiel (UA/UB urbain, AU à urbaniser, A agricole, N naturelle) avec verdict booléen constructible et raison juridique. Source live Géoportail de l'Urbanisme. Idéal pour enrichir ton produit avec un signal de constructibilité fiable, sans avoir à scraper 36 000 PLU communaux. Plan Pro et plus.

plu = client.permits.plu("PC07404021K1")
if plu["has_plu"]:
    z = plu["zonage"]
    if z["constructible"]:
        score += 50  # zone constructible
    else:
        score -= 30  # zone protégée

Cross-ref Géorisques pour scoring risques

Pour chaque permis, l'endpoint /risks retourne les risques naturels et technologiques connus sur la commune (inondation, séisme, argile, ICPE) avec un score agrégé 0-100. Idéal pour enrichir un scoring de pré-faisabilité dans ton produit. Source live API Géorisques (BRGM + Ministère), gratuit et officiel. Plan Pro et plus.

risks = client.permits.risks("PC07404021K1")
risk_score = risks["risk_score"]
if risk_score > 60:
    flag_high_risk(permit_id)
for r in risks["risks"]:
    if r["has_ppr"]:
        store_ppr(permit_id, r["ppr_type"])

MCP server pour intégrations LLM (Claude / ChatGPT / Cursor)

Notre serveur MCP officiel (permisapi-mcp sur PyPI) permet à n'importe quel client Model Context Protocol-compatible d'appeler les 6 endpoints clés en langage naturel. Vos users qui utilisent Claude Desktop ou Cursor peuvent enrichir leurs prompts avec PermisAPI sans coder. Gratuit pour tous les plans (limité uniquement par le quota du plan).

# Côté user final - 1 commande
pip install permisapi-mcp

# Puis dans Claude / Cursor / Windsurf :
"Liste les permis que mon scoring algorithme va
analyser cette semaine, dans le 33, score > 70"

OpenAPI 3.0 spec exportable

https://api.permisapi.fr/openapi.json. Genere votre propre SDK via openapi-generator si Python / TS ne vous conviennent pas. PHP, Ruby, Java, Go tous generables.

docker run --rm -v "${PWD}:/local" \
  openapitools/openapi-generator-cli generate \
  -i /local/openapi.json \
  -g php -o /local/sdk-php

Plan recommande pour ce profil

Plan Explorer -> Pro
49 -> 199 € / mois

Demarrez en Explorer pour le POC (5 000 req/mois, 10 alertes, historique 6 mois). Passez en Pro quand vos vrais users arrivent (50 000 req/mois, enrichment SIRENE complet, 50 alertes).

ROI attendu : Eviter 3 semaines-dev d'ingestion = 15-25k EUR d'equivalent freelance.

Voir tous les plans

Si vous etes dans ce cas, ce n'est probablement pas pour vous

  • Startup pre-product sans users (focalisez sur le core, revenez quand vous avez 50+ users)
  • Produit 100% B2C grand public (permis = data B2B)
  • Exigence latence < 50 ms p95 sur endpoint API (on est a 3-5s p95 avec cold start Railway)
Tutoriel complet

Startup PropTech : intégrer PermisAPI dans un pipeline Next.js + Postgres (cache TTL + webhook receiver)

Lire le tutoriel step-by-step avec code copiable →