GitHunt
GI

gianpierreba/api-client-insee

A comprehensive INSEE API Python Client for accessing French company data (SIREN/SIRET) from INSEE

INSEE API Client

A comprehensive INSEE API Python Client for accessing French data from INSEE
(Institut national de la statistique et des Γ©tudes Γ©conomiques).

Python 3.8+
License: MIT

πŸ“‹ Table of Contents

✨ Features

  • πŸ”’ Secure: Environment variable configuration
  • πŸ—οΈ Clean Architecture: Modular, maintainable and well-documented code
  • πŸ›‘οΈ Robust: Comprehensive error handling and input validation
  • πŸ“ Type Safe: Full type hints throughout the codebase
  • πŸ”„ Context Managers: Automatic resource cleanup
  • πŸ§ͺ Testable: Demonstration module included
  • πŸ“ˆ Scalable: Structured to easily add new INSEE API services

Current Implementation Status:
βœ… API Sirene is fully implemented (SIREN/SIRET company data)
⚠️ Other INSEE APIs have placeholder structure for future development:

  • DonnΓ©es Locales
  • Melodi
  • Metadata API
  • SΓ©ries Chronologiques

🌐 Data Sources

This client accesses data from INSEE - Institut national de la statistique et des Γ©tudes Γ©conomiques

βœ… Currently Implemented: API Sirene

The API Sirene module provides access to:

  • Legal unit data (unitΓ©s lΓ©gales) via SIREN codes
  • Establishment data (Γ©tablissements) via SIRET codes
  • NAF codes, legal categories, creation dates
  • Company administrative status and employee counts

⚠️ Future Development: Other INSEE APIs

The project has placeholder structure for these additional INSEE services:

  • DonnΓ©es Locales - Local statistical data
  • Melodi - Economic indicators
  • Metadata API - Geographic metadata
  • SΓ©ries Chronologiques - Time series data

Contributions to implement these services are welcome!

πŸ“š API Documentation

πŸ“¦ Installation

Requirements

  • Python 3.8 or higher
  • Valid INSEE API token

Install Dependencies

pip install -r requirements.txt

requirements.txt:

requests>=2.31.0
python-dotenv>=1.0.0

Setup Credentials

  1. Copy the example environment file:
cp .env.EXAMPLE .env
  1. Edit .env with your credentials:
# .env
INSEE_API_TOKEN=your_insee_token
  1. Get your API credentials:

πŸš€ Quick Start

Two Ways to Use This API Client

Option 1: Using the Demonstration Module (Batch Processing)

The included main.py module processes multiple companies from a text file:

# 1. Create a text file with SIREN/SIRET codes (one per line)
echo "552032534" > sirens.txt
echo "542051180" >> sirens.txt

# 2. Run the demonstration module
python main.py

Workflow:

  1. Place SIREN/SIRET codes in a text file (e.g., sirens.txt)
  2. The module reads codes line by line
  3. For each code, it fetches:
    • INSEE legal unit data (creation date, NAF code, VAT)
    • INSEE establishment data (address, region)
  4. Results are displayed with formatted output and status indicators
  5. Summary statistics are shown at the end

You can call the API clients directly without using main.py:

from dotenv import load_dotenv
import os
load_dotenv()

from insee import UniteLegaleClient, EtablissementsClient
from config import Config

# INSEE: Get legal unit data
with UniteLegaleClient(siren="552032534") as client:
    print(f"Created: {client.date_creation()}")
    print(f"NAF: {client.code_naf()}")
    print(f"TVA: {client.tva_intracommunautaire()}")

# INSEE: Get establishment data
with EtablissementsClient(siret="55203253400054") as client:
    print(f"City: {client.ville_etablissement()}")
    print(f"Region: {client.region_etablissement()}")

Key Points:

  • main.py is a demonstration tool for batch processing
  • For production integration, import and use the clients directly in your code
  • Both approaches use the same underlying API clients
  • Direct usage gives you more control and flexibility

βš™οΈ Configuration

Environment Variables

Variable Required Description
INSEE_API_TOKEN Yes Your INSEE API access token

Validation

Check your configuration:

from api_client_insee import Config

# Validate configuration
status = Config.validate_configuration()
print(status)

# Get credentials
token = Config.get_insee_token()

πŸ“– Usage Examples

from api_client_insee import UniteLegaleClient

with UniteLegaleClient(siren="552032534") as client:
    # Basic information
    nom = client.nom_societe()
    date_creation = client.date_creation()
    naf = client.code_naf()
    categorie = client.categorie_juridique()

    # Tax information
    tva = client.tva_intracommunautaire()
    siret_siege = client.siret_siege()

    # Status
    etat = client.etat_administratif_unite_legale()  # A=Active, C=Ceased
    tranche_effectifs = client.tranche_effectifs()

Establishment Data (SIRET)

from api_client_insee import EtablissementsClient

with EtablissementsClient(siret="55203253400054") as client:
    # Address
    adresse = client.numero_voie_etablissement()
    code_postal = client.code_postal_etablissement()
    ville = client.ville_etablissement()

    # Geographic info
    departement = client.departement_etablissement()
    region = client.region_etablissement()

    # Establishment counts
    siren = client.siret[:9]
    total = client.nombre_etablissements()
    actifs = client.nombre_etablissements_actifs()
    fermes = client.nombre_etablissements_fermes()

Input Validation

from api_client_insee import SirenSiretValidator, InvalidSirenError

try:
    # Validate SIREN
    siren = SirenSiretValidator.validate_siren("552032534")

    # Validate SIRET
    siret = SirenSiretValidator.validate_siret("55203253400054")

    # Extract SIREN from SIRET
    siren_from_siret = SirenSiretValidator.extract_siren_from_siret(siret)

    # Check without raising exception
    is_valid = SirenSiretValidator.is_valid_siren("552032534")

except InvalidSirenError as e:
    print(f"Invalid format: {e}")

πŸ“š API Reference

INSEE Clients

UniteLegaleClient

  • Legal unit data (SIREN level)
  • Methods: nom_societe(), date_creation(), code_naf(), tva_intracommunautaire(), etc.

EtablissementsClient

  • Establishment data (SIRET level)
  • Methods: ville_etablissement(), departement_etablissement(), region_etablissement(), etc.

Utilities

Config

  • Configuration management
  • Methods: get_insee_token(), validate_configuration()

SirenSiretValidator

  • Input validation
  • Methods: validate_siren(), validate_siret(), extract_siren_from_siret(), is_valid_siren(), is_valid_siret()

Exceptions

  • ApiClientError - Base exception
  • AuthenticationError - Authentication failures
  • ApiRequestError - API request failures
  • ValidationError - Input validation errors
  • InvalidSirenError - Invalid SIREN format
  • InvalidSiretError - Invalid SIRET format
  • DataNotFoundError - Data not found in API response

πŸ—οΈ Project Structure

api-client-insee/
β”œβ”€β”€ __init__.py                  # Main package entry point
β”œβ”€β”€ __version__.py              # Version information
β”œβ”€β”€ config.py                    # Configuration management
β”œβ”€β”€ exceptions.py                # Custom exception classes
β”œβ”€β”€ main.py                      # Demonstration module
β”œβ”€β”€ sirens.txt                   # Sample SIREN/SIRET codes (auto-generated)
β”œβ”€β”€ requirements.txt             # Python dependencies
β”‚
β”œβ”€β”€ base/                        # Base classes
β”‚   β”œβ”€β”€ __init__.py
β”‚   β”œβ”€β”€ http_client.py          # Base HTTP client with error handling
β”‚   └── authenticator.py        # Base authenticator (for future use)
β”‚
β”œβ”€β”€ utils/                       # Utilities
β”‚   β”œβ”€β”€ __init__.py
β”‚   └── validators.py           # SIREN/SIRET validation
β”‚
└── insee/                       # INSEE API modules
    β”œβ”€β”€ api_sirene/             # βœ“ API Sirene (implemented)
    β”‚   β”œβ”€β”€ __init__.py
    β”‚   β”œβ”€β”€ client.py          # UniteLegale & Etablissements clients
    β”‚   └── builders.py        # URL builders for Sirene API
    β”‚
    β”œβ”€β”€ donnees_locales/        # ⚠️ Placeholder for future implementation
    β”‚   └── __init__.py
    β”‚
    β”œβ”€β”€ melodi/                 # ⚠️ Placeholder for future implementation
    β”‚   └── __init__.py
    β”‚
    β”œβ”€β”€ metadata_api/           # ⚠️ Placeholder for future implementation
    β”‚   └── __init__.py
    β”‚
    └── series_chronologiques/  # ⚠️ Placeholder for future implementation
        └── __init__.py

Documentation:
β”œβ”€β”€ README.md                    # This file
β”œβ”€β”€ LICENSE                      # MIT License
β”œβ”€β”€ CONTRIBUTING.md              # Development setup guide
β”œβ”€β”€ .env.EXAMPLE                 # Environment variables template
β”œβ”€β”€ .gitignore                   # Git ignore rules
└── .pre-commit-config.yaml      # Pre-commit hooks configuration

🀝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Development Setup

  1. Clone the repository
  2. Create a virtual environment:
    python -m venv venv
    source venv/bin/activate  # On Windows: venv\Scripts\activate
  3. Install dependencies:
    pip install -r requirements.txt
  4. Set up your .env file with test credentials
  5. Run the demonstration module to verify setup

Code Style

  • Follow PEP 8 guidelines
  • Use type hints
  • Document all public methods with docstrings
  • Handle errors gracefully

πŸ“„ License

MIT License - see the LICENSE file for details.

πŸ“ž Support

For questions, bug reports, or feature requests, please use the
GitHub Issues page.

⚠️ When reporting an issue, please include:

  • Your Python version and environment
  • Steps to reproduce the problem
  • Any error messages or stack traces

πŸ“Š Version History

Version 2.0.0 (2025-10-27)

  • Complete architecture refactoring
  • Added environment variable configuration
  • Comprehensive error handling
  • Full type hints
  • Modular, maintainable codebase

Version 1.0.0 (2023-06-13)

  • Initial release with basic functionality
  • Intended for internal use by professionals in the M&A sector in France