Skip to content

gianpierreba/api-client-insee

Repository files navigation

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

Option 2: Direct API Usage in Your Code (Recommended for Integration)

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

Legal Unit Data (SIREN)

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

About

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

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages