Api documentation

Api Catalog


The Api Catalog is designed to provide the entire catalog available on Cegos.fr in an automated way. You can access information on all available training courses. You'll find schedules, prices, training locations, etc.

The data is segmented Into four parts:

  • Catalogs
    Provides a list of available catalogs.
  • Catalog topics
    Provide the complete catalog tree for the current year and the following year if published by default.
  • Products
    A product designates a training course. This section includes all training data (title, description, etc.)
  • Sessions
    A session represents the completion of a training course at a given time in a given location. This regroups all session data for each course. Including schedule, location and prices.

Access to this API is restricted to authorized users by the default scope "api-cegos". If you haven't already done so, we suggest you follow the registration steps explained in the "Register your application" section.

For developers and other engineering teams, an Open API documentation generated by Swagger is available at this URL:
https://catalog.api.cegos.fr/swagger

Notice Data Flow

How notice content flows from NextPage CMS to the API response

NextPage SSIS P_SSIS_NEXTPAGE_CONTENU_NOTICES T_NOTICE (Offre_Marketing) API Catalog Site Web cegos.fr
GET /v1/Products • GET /v1/Products/{yearlyProductCode}
Product Data Flow

How product information flows from ROMEO to the API response

ROMEO BZ P_API_GET_PRODUCTS T_PRODUIT (Offre_marketing) API Catalog Site Web cegos.fr
GET /v1/Products • GET /v1/Products/{yearlyProductCode}
Session Data Flow

How session data flows from the Programmation system to the API response

Programmation BZ SessionService T_SESSION (Offre_Vente) API Catalog Site Web cegos.fr
└─ Api Document (Worker - Mise en cache)
GET /v1/Sessions • GET /v1/Sessions/{yearlySessionCode}
Center Data Flow

How center information flows from Safir to the API response

Safir Direct Integration T_CENTRE (Habilitations) CenterService API Catalog Site Web cegos.fr
GET /v1/Referentials/centers

Catalogs

GET /v1/Catalogs

Purpose: Retrieves the list of all available catalogs in the system.
GET /v1/Catalogs
Parameters:
No parameters required
Content-Type: application/json

Purpose: Retrieves the list of all available catalogs in the system.
Database Implementation
Database
Offre_marketing
Stored Procedure
P_API_GET_CATALOG
Tables Used
T_CATALOGUE, T_PAYS, T_TYPE_CATALOGUE, T_CATALOGUE_PUBLIQUE
Business Logic: Returns active catalogs within publication dates (DATE_DEBUT_CATA_EDI ≤ current date ≤ DATE_FIN_CATA_EDI), complex joins ensure catalog validity and public access, includes country information for international filtering

Purpose: Simple catalog information with identifier and name for dropdown lists and filtering.
Response Fields
Field Type Description Database Source
id Int Catalog identifier T_CATALOGUE.ID_CANAL_MVS
label String Catalog display name T_CATALOGUE.LIB_CATALOGUE
countryId String Associated country identifier T_CATALOGUE.ID_PAYS
countryLabel String Country display name T_PAYS.LIB_PAYS
startDate DateTime Catalog publication start date T_CATALOGUE.DATE_DEBUT_CATA_EDI
endDate DateTime Catalog publication end date T_CATALOGUE.DATE_FIN_CATA_EDI
Data Source: Direct mapping from T_CATALOGUE table with active status filtering
Usage: Commonly used in dropdown filters for Products and Sessions endpoints
Example Response

{
    "data": [
        {
            "id": 92446,
            "label": "Site Web 2025",
            "countryId": "1",
            "countryLabel": "France",
            "startDate": "2024-09-01T00:00:00",
            "endDate": "2025-12-31T00:00:00"
        },
        {
            "id": 27724,
            "label": "Site e-learning_MOD_FR",
            "countryId": "1",
            "countryLabel": "France",
            "startDate": "2009-01-01T00:00:00",
            "endDate": "2100-12-31T00:00:00"
        },
        {
            "id": 27863,
            "label": "Site e-learning_MOD_EN",
            "countryId": "2",
            "countryLabel": "Royaume-Uni",
            "startDate": "2009-01-01T00:00:00",
            "endDate": "2100-12-31T00:00:00"
        }
    ]
}

CatalogTopics

GET /v1/CatalogTopics

Purpose: Retrieves the hierarchical structure of catalog topics for filtering and navigation.
GET /v1/CatalogTopics
Parameters:
CatalogId (optional)
Content-Type: application/json

Purpose: Retrieves the hierarchical structure of catalog topics for filtering and navigation.
Database Implementation
Database
Offre_marketing
Stored Procedure
P_API_GET_CATALOG_TOPICS
Tables Used
T_THEME, T_THEME_TITRE, T_THEME_PERE
Business Logic: Recursive CTE for hierarchical topic structure with complex joins, theme type filter (id_type_theme_pere = 5), only active themes (date_sup is null), current catalog dates (DATE_DEBUT_CATA_EDI ≤ current date ≤ DATE_FIN_CATA_EDI), parent-child relationships via T_THEME_PERE, ordering by display order field, complex joins between T_THEME, T_THEME_PERE, T_THEME_TITRE for complete topic information

Purpose: Hierarchical topic structure with parent-child relationships for catalog filtering and navigation.
Response Fields
Field Type Description Database Source
catalogId Int Catalog identifier T_CATALOGUE.ID_CANAL_MVS
year Int Catalog year YEAR(T_CATALOGUE.date_fin_cata_edi)
topics Array[CatalogTopicsResponse] Hierarchical array of topics CTE Recursive Results
Complex Objects & Sub-Objects
Field Type Description Database Source
id Int Topic identifier T_THEME.id_theme_mvs
label String Topic display name T_THEME_TITRE.lib_theme
order Int Display order T_THEME_PERE.ordre
subTopics Array[CatalogTopicsResponse] Recursive array of child topics CTE Recursive Structure
Data Source: Direct mapping from database with recursive CTE for topic hierarchy
Usage: Used to display hierarchical topic structure in catalog views
Example Response

{
    "data": {
        "catalogId": 92446,
        "year": 2025,
        "topics": [
            {
                "id": 924470,
                "label": "Achats",
                "order": 1,
                "subTopics": [
                    {
                        "id": 925040,
                        "label": "Management et métiers des achats",
                        "order": 1,
                        "subTopics": [
                            {
                                "id": 925050,
                                "label": "Management des achats",
                                "order": 1,
                                "subTopics": null
                            }
                        ]
                    }
                ]
            }
        ]
    }
}

Products

GET /v1/Products

Purpose: Retrieves product details with comprehensive information for catalog display and filtering. Supports pagination and optional catalog filtering.
GET /v1/Products
Parameters:
page (Int, optional, default: 1), hydrate (Boolean, optional, default: true), catalogsId (Array[Int], optional)
Content-Type: application/json

Purpose: Products endpoint aggregates data from multiple stored procedures for comprehensive product information.
Database Implementation
Database
Catalog Database
Stored Procedure
P_API_GET_PRODUCTS (main), P_API_GET_FORMULA (formulas/modules), P_API_GET_RELATED_PRODUCTS (related products), P_API_GET_TITLES (titles)
Tables Used
T_PRODUIT, T_OFFRE, T_TITRE, T_NIVEAU, T_GAMME, T_PARTENAIRE, T_PRIX, T_CERTIFICATION, T_DISPOSITIF_FORMATION, T_MODE_DELIVRANCE, T_CERTIFICATEUR, T_TYPE_EVOLUTION, T_FAMILLE_OFFRE, T_NOTICE, T_CHAINAGE_PRODUIT, T_CHAINAGE, T_MODULE, T_MODULE_GENERIQUE, T_TYPE_MODULE, T_PRESTATION_COMPLEMENTAIRE, T_TYPE_PRESTATION_COMPLEMENTAIRE, T_PRODUIT_THEME, T_THEME, T_CATALOGUE
Business Logic: Complex product aggregation with recursive CTE for catalog topics, conditional logic for formulas (TOP_PRODUIT flag), pricing subqueries, and related products filtering by commercialization status and catalog validity.

Purpose: Detailed product information with all metadata needed for catalog display, filtering, and purchasing decisions.
Notice Content Data Flow
How notice content flows from NextPage CMS to the API response
NextPage CMS XML Export SSIS Package P_SSIS_NEXTPAGE_CONTENU_NOTICES T_NOTICE Products API
Response Fields
Field Type Description Database Source
data Array[ProductDetailsResponse] Array of product details SessionService aggregation
pageNumber Int Current page number (default: 1, auto-corrected) Controller logic
pageSize Int Items per page (fixed: 100) Controller logic
totalItems Int Total number of products data.Count
totalPages Int Total number of pages Math.Ceiling(totalItem / 100)
data[].productCode String Product identifier code T_PRODUIT.CODE_PRODUIT
data[].yearlyProductCode String Yearly product identifier (computed: OfferYear + ProductCode) T_OFFRE.LIB_OFFRE + T_PRODUIT.CODE_PRODUIT
data[].offerYear Int Product offer year T_OFFRE.LIB_OFFRE
data[].title String Product title T_TITRE.TITRE
data[].evolutionType String Product evolution type T_TYPE_EVOLUTION.LIB_TYPE_EVOLUTION
data[].cpf Boolean CPF eligibility T_PRODUIT.CPF
data[].rsCode String RS (Specific Register) code (optional, only if not empty) T_PRODUIT.CODE_RS
data[].rncpCode String RNCP (National Directory of Professional Certifications) code (optional, only if not empty) T_PRODUIT.CODE_RNCP
data[].cpfCode String CPF-specific code (optional, only if not empty) T_PRODUIT.CODE_CPF
data[].moduleDuration String Module duration T_PRODUIT.DUREE_MODULE
data[].partners Array[String] Partners T_PARTENAIRE.LIB_PARTENAIRE
data[].certification String Certification T_CERTIFICATION.LIB_CERTIFICATION
data[].certifier String Certifier T_CERTIFICATEUR.LIB_CERTIFICATEUR
data[].jobSheetTitle String Job sheet title T_PRODUIT.TITRE_FICHE_POSTE
data[].jobSheetUrl String Job sheet URL T_PRODUIT.URL_FICHE_POSTE
data[].modalityTitle String Modality title T_MODE_DELIVRANCE.LIB_MODE_DELIVRANCE
data[].marketingTitle String Marketing title T_PRODUIT.TITRE_MARKETING
data[].trainingMethod String Training methodology T_DISPOSITIF_FORMATION.LIB_DISPOSITIF_FORMATION
data[].familyOfferId Int Family offer identifier T_PRODUIT.ID_FAMILLE_OFFRE
data[].languages Array[String] Available languages P_API_GET_PRODUCTS → product extension mapping
data[].cities Array[String] Available cities P_API_GET_PRODUCTS → session cities aggregation
data[].availableCpfCities Array[String] Cities available for CPF P_API_GET_PRODUCTS → CPF-enabled cities filtering
data[].level ElementResponse Product difficulty level T_NIVEAU → ElementResponse
data[].professionalChallengesId Int Professional challenges identifier T_PRODUIT.ID_ENJEU
data[].bestSeller Boolean Best seller flag T_PRODUIT.TOP_BEST
data[].picto4Real Boolean Picto4Real flag (0 → 0, 1 → 1) T_PRODUIT.TOP_PICTO_4REAL
data[].titles Array[TitleResponse] Product titles (only if hydrate=true) P_API_GET_TITLES stored procedure
data[].formula Array[FormulaResponse] Product formula (only if hydrate=true) P_API_GET_FORMULA → T_CHAINAGE_PRODUIT
data[].catalogTopicRelations Array[CatalogTopicRelationResponse] Catalog topic relations (only if hydrate=true) P_API_GET_PRODUCTS → T_PRODUIT_THEME, T_THEME
data[].relatedProducts Array[RelatedProductResponse] List of related products P_API_GET_RELATED_PRODUCTS stored procedure
data[].range ElementResponse Product range/category T_GAMME → ElementResponse
data[].price Double Standard price (inter-enterprise) PRIX.Prix_Standard (MAX with TOP_PRIX_INTERDEDIE=0)
data[].iPackPrice Double iPack price (dedicated inter) PRIX.Prix_InterDedie (MAX with TOP_PRIX_INTERDEDIE=1)
data[].notice NoticeDetailsResponse Full product notice (only if hydrate=true) T_NOTICE via P_SSIS_NEXTPAGE_CONTENU_NOTICES (NextPage XML import)
data[].noticeUrl String Notice URL T_NOTICE.LIEN_NOTICE via ProductDetailsExtension mapping
data[].noticeUrlPdf String Notice PDF URL T_NOTICE.LIEN_NOTICE_PDF via ProductDetailsExtension mapping
data[].certificationInclude Boolean Is certification included T_PRODUIT.TOP_CERTIFICATION_INCLUSE
data[].internationalProduct Boolean Is international product T_PRODUIT.TOP_PRODUIT_INTERNATIONAL
data[].partners Array[String] Partners T_PARTENAIRE.LIB_PARTENAIRE
data[].certification String Certification T_CERTIFICATION.LIB_CERTIFICATION
data[].certifier String Certifier T_CERTIFICATEUR.LIB_CERTIFICATEUR
data[].jobSheetTitle String Job sheet title T_PRODUIT.TITRE_FICHE_POSTE
data[].jobSheetUrl String Job sheet URL T_PRODUIT.URL_FICHE_POSTE
data[].modalityTitle String Modality title T_MODE_DELIVRANCE.LIB_MODE_DELIVRANCE
data[].marketingTitle String Marketing title T_PRODUIT.TITRE_MARKETING
data[].deliveryMode String Delivery mode T_MODE_DELIVRANCE.LIB_MODE_DELIVRANCE
data[].commercialDuration CommercialDurationResponse Commercial duration information T_PRODUIT fields mapping
Complex Objects & Sub-Objects
Field Type Description Database Source
catalogTopicId Int Catalog topic identifier T_THEME.ID_THEME_MVS
order Int Display order of the topic relation T_PRODUIT_THEME business logic
relationType String Type of relation (Main, Secondary, etc.) T_PRODUIT_THEME business logic mapping
Field Type Description Database Source
days String Duration in days T_PRODUIT.DUREE_COM_J
forcedValues Boolean Are commercial duration values forced T_PRODUIT.DUREE_COM_CAST
hours String Duration in hours T_PRODUIT.DUREE_COM_H
minutes String Duration in minutes T_PRODUIT.DUREE_COM_M
remoteActivityIncluded Boolean Is remote activity included in commercial duration T_PRODUIT.DUREE_COM_ACTIVITE_CMPL
Field Type Description Database Source
id Int Formula identifier T_CHAINAGE_PRODUIT.ID_CHAINAGE_PRODUIT
label String Formula display name T_CHAINAGE_PRODUIT.LIB_CODE_FORMULE
modules Array[ModuleResponse] Formula modules P_API_GET_FORMULA → T_CHAINAGE
modules[].code String Module code (conditional: MODULE_GENERIQUE.CODE_MODULE if TOP_PRODUIT=0, else T_MODULE_PRODUIT.CODE_PRODUIT) T_MODULE_GENERIQUE.CODE_MODULE | T_MODULE_PRODUIT.CODE_PRODUIT
modules[].delayInDay Decimal Module delay in days (conditional: T_MODULE.DUREE_JOURS if TOP_PRODUIT=0, else T_MODULE_PRODUIT.DUREE_JOURS) T_MODULE.DUREE_JOURS | T_MODULE_PRODUIT.DUREE_JOURS
modules[].delayInHour Decimal Module delay in hours (conditional: T_MODULE.DUREE_HEURES if TOP_PRODUIT=0, else T_MODULE_PRODUIT.DUREE_HEURES) T_MODULE.DUREE_HEURES | T_MODULE_PRODUIT.DUREE_HEURES
modules[].delayInMinute Int Module delay in minutes (conditional: T_MODULE.DUREE_SEC/60 if TOP_PRODUIT=0, else T_MODULE_PRODUIT.DUREE_MINUTES) T_MODULE.DUREE_SEC/60 | T_MODULE_PRODUIT.DUREE_MINUTES
modules[].deliveryMode String Module delivery mode (conditional: T_MODULE_MODE_DELIVRANCE.LIB_MODE_DELIVRANCE if TOP_PRODUIT=0, else T_MODULE_PRODUIT.LIB_MODE_DELIVRANCE) T_MODULE_MODE_DELIVRANCE.LIB_MODE_DELIVRANCE | T_MODULE_PRODUIT.LIB_MODE_DELIVRANCE
modules[].id Int Module identifier (conditional: T_MODULE.ID_MODULE if TOP_PRODUIT=0, else T_MODULE_PRODUIT.ID_PRODUIT) T_MODULE.ID_MODULE | T_MODULE_PRODUIT.ID_PRODUIT
modules[].isProduct Boolean Is module a product (determines conditional field logic) T_CHAINAGE.TOP_PRODUIT
modules[].label String Module display name (conditional: T_MODULE_GENERIQUE.LIB_MODULE if TOP_PRODUIT=0, else T_MODULE_PRODUIT.TITRE) T_MODULE_GENERIQUE.LIB_MODULE | T_MODULE_PRODUIT.TITRE
modules[].optional Boolean Is module optional T_CHAINAGE.OPTIONNEL
modules[].order Int Module order in formula T_CHAINAGE.NUM_ORDRE
Field Type Description Database Source
id Int Level identifier T_NIVEAU.ID_NIVEAU
label String Level display name T_NIVEAU.LIB_NIVEAU
Field Type Description Database Source
applicationProcedure String Application procedure (optional, only if not empty) T_NOTICE.MODALITE_APPLICATION_HTML
bonus String Bonus information T_NOTICE.BONUS_HTML
certificationTitleOptionalOrIncluded String Certification title information T_NOTICE.TITRE_CERTIF_OPTION_OU_INCLUSE_HTML
cpfPopup String CPF popup content T_NOTICE.POP_UP_CPF_HTML
cpfText String CPF specific text T_NOTICE.CPF_TEXTE_HTML
evaluation String Evaluation method T_NOTICE.EVALUATION_HTML
expectedResults String Expected results T_NOTICE.RESULTATS_ATTENDUS_HTML
financing String Financing information T_NOTICE.FINANCEMENT_HTML
financingAssistance String Financing assistance information T_NOTICE.AIDES_AU_FINANCEMENT_HTML
firstMinute String First minute content T_NOTICE.LA_PREMIERE_MINUTE_HTML
forWho String Target audience description T_NOTICE.POUR_QUI_HTML
highlights String Program highlights T_NOTICE.LES_PLUS_POINTS_FORTS_HTML
imageProgramDesktop String Desktop program image URL T_NOTICE.IMAGE_PROGRAMME_DESKTOP_HTML
imageProgramMobile String Mobile program image URL T_NOTICE.IMAGE_PROGRAMME_MOBILE_HTML
imageSocialNetworks String Social networks image URL T_NOTICE.IMAGE_RESEAUX_SOCIAUX
introduction String Introduction text T_NOTICE.INTRODUCTION_HTML
introductionTitle String Introduction title (optional, only if not empty) T_NOTICE.TITRE_INTRODUCTION
morePrecisely String More precise information T_NOTICE.PLUS_PRECISEMENT_HTML
objective String Training objectives T_NOTICE.OBJECTIFS_HTML
participantBenefits String Participant benefits T_NOTICE.BENEFICES_PARTICIPANT_HTML
pedagogy String Pedagogy information T_NOTICE.DISPOSITIF_PEDAGOGIQUE_HTML
prerequisite String Prerequisites T_NOTICE.PRE_REQUIS_HTML
program String Program details T_NOTICE.PROGRAMME_HTML
programContent ProgramContentResponse Program content details T_NOTICE structured program fields
programContent.after ContentSectionResponse After program content T_NOTICE.TITRE_APRES_HTML + TEXTE_APRES_HTML
programContent.after.text String After section text T_NOTICE.TEXTE_APRES_HTML
programContent.after.title String After section title T_NOTICE.TITRE_APRES_HTML
programContent.before ContentSectionResponse Before program content T_NOTICE.TITRE_AVANT_HTML + TEXTE_AVANT_HTML
programContent.before.text String Before section text T_NOTICE.TEXTE_AVANT_HTML
programContent.before.title String Before section title T_NOTICE.TITRE_AVANT_HTML
programContent.duringTitle String During program title T_NOTICE.TITRE_PENDANT_HTML
programContent.parts Array[String] Program parts (P1-P10) T_NOTICE.TITRE_P1_HTML...TITRE_P10_HTML aggregated
programContent.upstream String Upstream content T_NOTICE.EN_AMONT_HTML
rncpText String RNCP specific text T_NOTICE.RNCP_TEXTE_HTML
theMostPartnerText String Partner specific text T_NOTICE.TEXTE_PARTENAIRE_HTML
video String Video content T_NOTICE.VIDEO_HTML
visioTrainingProcedure String Visio training procedure T_NOTICE.MODALITE_VISIO_FORMATION_HTML
Field Type Description Database Source
id Int Range identifier T_GAMME.ID_GAMME
label String Range display name T_GAMME.LIB_GAMME
Field Type Description Database Source
order Integer Display order of the related product T_PRESTATION_COMPLEMENTAIRE.ORDRE
relatedProductCode String Code of the related product T_PRODUIT_RELATION.CODE_PRODUIT
type String Type of relation (After, Before, Complementary, etc.) T_TYPE_PRESTATION_COMPLEMENTAIRE.ID_TYPE_PRESTATION_COMPLEMENTAIRE (mapped to string)
Field Type Description Database Source
lengthMaximum Int Maximum title length T_TYPE_TITRE.LONGUEUR_MAX
text String Title text content T_TITRE.TITRE
type String Title type T_TYPE_TITRE.LIB_TYPE_TITRE
Data Source: Stored procedure P_API_GET_PRODUCTS with complex joins and business logic
Usage: Primary endpoint for product catalog display, search, and filtering
Example Response

{
    "data": [
        {
            "productCode": "61072",
            "yearlyProductCode": "202561072",
            "offerYear": 2025,
            "title": "Management : les fondamentaux",
            "evolutionType": "Evolution",
            "cpf": true,
            "rsCode": "RS001",
            "rncpCode": "RNCP12345",
            "cpfCode": "CPF789",
            "trainingMethod": "Présentiel",
            "familyOfferId": 10,
            "moduleDuration": "2 jours",
            "languages": ["Français"],
            "cities": ["Paris", "Lyon"],
            "availableCpfCities": ["Paris"],
            "level": {
                "id": 1,
                "label": "Découverte"
            },
            "professionalChallengesId": 5,
            "bestSeller": true,
            "picto4Real": false,
            "titles": [
                {
                    "type": "Main",
                    "text": "Management : les fondamentaux",
                    "lengthMaximum": 50
                }
            ],
            "formula": [
                {
                    "id": 1,
                    "label": "Formule standard",
                    "modules": [
                        {
                            "id": 101,
                            "code": "MOD1",
                            "order": 1,
                            "optional": false,
                            "isProduct": true,
                            "label": "Introduction au management",
                            "delayInDay": 0,
                            "delayInHour": 0,
                            "delayInMinute": 0,
                            "deliveryMode": "Présentiel"
                        }
                    ]
                }
            ],
            "catalogTopicRelations": [
                {
                    "catalogTopicId": 15,
                    "relationType": "Main",
                    "order": 1
                }
            ],
            "relatedProducts": [
                {
                    "relatedProductCode": "61073",
                    "type": "After",
                    "order": 1
                }
            ],
            "range": {
                "id": 5,
                "label": "Management"
            },
            "price": 1350.0,
            "iPackPrice": 1200.0,
            "notice": {
                "introductionTitle": "Une formation pour découvrir le management",
                "introduction": "Cette formation vous permet de...",
                "forWho": "Managers débutants",
                "applicationProcedure": "Inscription directe",
                "prerequisite": "Aucun",
                "visioTrainingProcedure": "Via Teams",
                "objective": "Acquérir les bases du management",
                "evaluation": "QCM final",
                "programContent": {
                    "before": {
                        "title": "Avant la formation",
                        "text": "Autodiagnostic"
                    },
                    "duringTitle": "Pendant la formation",
                    "parts": ["Module 1", "Module 2"],
                    "after": {
                        "title": "Après la formation",
                        "text": "Suivi individualisé"
                    },
                    "upstream": "Préparation en amont"
                },
                "participantBenefits": "Certification incluse",
                "program": "Programme détaillé",
                "highlights": "Points forts",
                "morePrecisely": "Plus précisément",
                "firstMinute": "Première minute",
                "cpfText": "Éligible CPF",
                "rncpText": "Certification RNCP",
                "expectedResults": "Résultats attendus",
                "theMostPartnerText": "Texte partenaire",
                "financingAssistance": "Aide au financement",
                "certificationTitleOptionalOrIncluded": "Certification incluse",
                "bonus": "Bonus formation",
                "video": "Vidéo présentation",
                "financing": "Financement",
                "cpfPopup": "Popup CPF",
                "imageProgramDesktop": "image-desktop.jpg",
                "imageProgramMobile": "image-mobile.jpg",
                "imageSocialNetworks": "image-social.jpg",
                "pedagogy": "Pédagogie active"
            },
            "certificationInclude": true,
            "internationalProduct": false,
            "partners": ["Partenaire A", "Partenaire B"],
            "certification": "Certification Management",
            "certifier": "Cegos",
            "jobSheetTitle": "Fiche métier Manager",
            "jobSheetUrl": "https://fiche-metier.cegos.fr/manager",
            "modalityTitle": "Formation présentielle",
            "marketingTitle": "Formation Management Premium",
            "deliveryMode": "Présentiel",
            "commercialDuration": {
                "days": "2",
                "hours": "14",
                "minutes": "0",
                "forcedValues": false,
                "remoteActivityIncluded": true
            }
        }
    ],
    "pageNumber": 1,
    "pageSize": 100,
    "totalItems": 1247,
    "totalPages": 13
}

Products

GET /v1/Products/{yearlyProductCode}

Purpose: Retrieves detailed information for a specific product identified by its yearly product code. Returns comprehensive product data including specifications, pricing, formulas, related products, and detailed notice content.
GET /v1/Products/{yearlyProductCode}
Parameters:
yearlyProductCode (String, required, path parameter - Format: YYYYXXXXX where YYYY is offer year concatenated with 5-digit padded product code, no separator), hydrate (Boolean, optional, query parameter, default: true - Controls inclusion of enriched content blocks: notice details, related products, catalog topic relations, titles, and formulas)
Content-Type: application/json

Purpose: Single product endpoint leverages the same data aggregation logic as Products collection endpoint but filters for a specific yearlyProductCode, returning detailed product information with all enriched content.
Database Implementation
Database
Catalog Database
Stored Procedure
P_API_GET_PRODUCTS (filtered by specific product), P_API_GET_FORMULA (product formulas/modules), P_API_GET_RELATED_PRODUCTS (cross-selling products), P_API_GET_TITLES (product titles), P_API_GET_NOTICES (detailed product content)
Tables Used
T_PRODUIT, T_OFFRE, T_TITRE, T_NIVEAU, T_GAMME, T_PARTENAIRE, T_PRIX, T_CERTIFICATION, T_DISPOSITIF_FORMATION, T_MODE_DELIVRANCE, T_CERTIFICATEUR, T_TYPE_EVOLUTION, T_FAMILLE_OFFRE, T_NOTICE, T_CHAINAGE_PRODUIT, T_CHAINAGE, T_MODULE, T_MODULE_GENERIQUE, T_TYPE_MODULE, T_PRESTATION_COMPLEMENTAIRE, T_TYPE_PRESTATION_COMPLEMENTAIRE, T_PRODUIT_THEME, T_THEME, T_CATALOGUE, T_PRODUIT_LANGUE, T_PRODUIT_GAMME
Business Logic: Uses SessionService.GetAllProductsAsync() method to retrieve complete product dictionary, then filters by yearlyProductCode key lookup. The hydrate parameter controls whether to include enriched content blocks via ProductDetailsExtension.Map(hydrate). YearlyProductCode format: concatenation of OfferYear + ProductCode.PadLeft(5, '0') without separator. Product aggregation includes complex business rules for pricing, languages, cities filtering (StartDate >= Today, Status != Cancel), and CPF city filtering (additional TopCpf == true condition).

Purpose: Returns detailed information for a single product with comprehensive metadata, specifications, pricing, formulas, related products, and enriched content based on the hydrate parameter.
Product Detail Data Flow
How individual product data flows from database to API response with conditional hydration
yearlyProductCode Parameter SessionService.GetAsync() P_API_GET_PRODUCTS Product Hydration Map(hydrate) ProductDetailsResponse
Response Fields
Field Type Description Database Source
data ProductDetailsResponse Product details SessionService aggregation
data[].productCode String Product identifier code T_PRODUIT.CODE_PRODUIT
data[].yearlyProductCode String Yearly product identifier (computed: OfferYear + ProductCode) T_OFFRE.LIB_OFFRE + T_PRODUIT.CODE_PRODUIT
data[].offerYear Int Product offer year T_OFFRE.LIB_OFFRE
data[].title String Product title T_TITRE.TITRE
data[].evolutionType String Product evolution type T_TYPE_EVOLUTION.LIB_TYPE_EVOLUTION
data[].cpf Boolean Eligible for CPF (Compte Personnel de Formation) T_PRODUIT.TOP_ELIGIBLE_CPF
data[].rsCode String RS (Répertoire Spécifique) code T_PRODUIT.CODE_RS
data[].rncpCode String RNCP (Répertoire National des Certifications Professionnelles) code T_PRODUIT.CODE_RNCP
data[].cpfCode String CPF specific code T_PRODUIT.CODE_CPF
data[].trainingMethod String Training method label T_DISPOSITIF_FORMATION.LIB_DISPOSITIF_FORMATION
data[].familyOfferId Int Family offer identifier T_PRODUIT.ID_FAMILLE_OFFRE
data[].moduleDuration String Module duration formatted as string dbo.Convert_Sec_JHM(T_PRODUIT.DUREE_DIST_INDIV_SEC)
data[].languages Array[String] Available delivery languages T_PRODUIT_LANGUE via LanguageRepository.GetDeliveranceLanguagesAsync()
data[].cities Array[String] Available session cities T_SESSION via SessionService
data[].availableCpfCities Array[String] CPF-eligible session cities T_SESSION with CPF filtering
data[].level LevelResponse Product level information T_NIVEAU via level mapping
data[].professionalChallengesId Int Professional challenges identifier T_PRODUIT.ID_ENJEU
data[].bestSeller Boolean Is product a best seller T_PRODUIT.TOP_BEST_SELLER
data[].picto4Real Boolean 4Real picto indicator T_PRODUIT.PICTO_4REAL
data[].partners Array[String] Partners T_PARTENAIRE.LIB_PARTENAIRE
data[].range RangeResponse Product range information T_GAMME via range mapping
data[].price Decimal Product price T_PRIX.PRIX via PriceRepository.GetAllAsync()
data[].iPackPrice Decimal iPack price (package price) T_PRIX.PRIX_IPACK via PriceRepository.GetAllAsync()
data[].noticeUrl String URL to product notice page Generated: https://www.cegos.fr/{productCode}
data[].noticeUrlPdf String URL to product notice PDF Generated: https://static.cegos.fr/pdf/{offerYear}_{productCode.PadLeft(4, '0')}.pdf
data[].certificationInclude Boolean Is certification included T_PRODUIT.TOP_CERTIF_INCLUSE
data[].internationalProduct Boolean Is international product T_PRODUIT.TOP_PRODUIT_INTERNATIONAL
data[].deliveryMode String Product delivery mode T_MODE_DELIVRANCE.LIB_MODE_DELIVRANCE
data[].commercialDuration CommercialDurationResponse Commercial duration breakdown T_PRODUIT.DUREE_COM_J/H/M/CAST/ACTIVITE_CMPL fields
data[].notice NoticeResponse Detailed product notice content (only included when hydrate=true) T_NOTICE via NoticeService, mapped through MapDetails()
data[].relatedProducts Array[RelatedProductResponse] Related products for cross-selling (only included when hydrate=true) SessionService.GetRelatedProductsAsync() with YearlyProductCode grouping
data[].catalogTopicRelations Array[CatalogTopicRelationResponse] Catalog topic relationships (only included when hydrate=true) Product.CatalogTopicRelations with RelationType enum mapping
data[].titles Array[TitleResponse] Product titles with type and length constraints (only included when hydrate=true) TitleService.GetAllAsync() with YearlyProductCode grouping
data[].formula Array[FormulaResponse] Product formulas and modules (only included when hydrate=true) FormulaService.GetAllAsync() with YearlyProductCode grouping
Complex Objects & Sub-Objects
Field Type Description Database Source
catalogTopicId Int Catalog topic identifier T_PRODUIT_THEME.ID_THEME_MVS
order Int Relation order Business logic based on relation type
relationType String Relation type (Main, Secondary, etc.) T_PRODUIT_THEME.ID_TYPE_RATTACHEMENT with enum mapping
Field Type Description Database Source
id Int Formula identifier T_CHAINAGE.ID_CHAINAGE
label String Formula label T_CHAINAGE.LIB_CHAINAGE
modules[].code String Module code T_MODULE.CODE_MODULE
modules[].delayInDay Int Delay in days T_CHAINAGE_PRODUIT.DELAI_J
modules[].delayInHour Int Delay in hours T_CHAINAGE_PRODUIT.DELAI_H
modules[].delayInMinute Int Delay in minutes T_CHAINAGE_PRODUIT.DELAI_M
modules[].deliveryMode String Module delivery mode T_MODE_DELIVRANCE.LIB_MODE_DELIVRANCE
modules[].id Int Module identifier T_MODULE.ID_MODULE
modules[].isProduct Boolean Is module a product T_CHAINAGE.TOP_PRODUIT
modules[].label String Module label T_MODULE.LIB_MODULE
modules[].optional Boolean Is module optional T_CHAINAGE.OPTIONNEL
modules[].order Int Module order in sequence T_CHAINAGE_PRODUIT.ORDRE
Field Type Description Database Source
applicationProcedure String Application procedure details T_NOTICE.MODALITE_INSCRIPTION_HTML
bonus String Bonus information T_NOTICE.BONUS_HTML
certificationTitleOptionalOrIncluded String Certification title inclusion information T_NOTICE.TITRE_CERTIFICATION_OPTION_OU_INCLUS_HTML
cpfPopup String CPF popup content T_NOTICE.CPF_POPUP_HTML
cpfText String CPF specific text T_NOTICE.TEXTE_CPF_HTML
evaluation String Evaluation methods T_NOTICE.EVALUATION_HTML
expectedResults String Expected results T_NOTICE.RESULTATS_ATTENDUS_HTML
financing String Financing options T_NOTICE.FINANCEMENT_HTML
financingAssistance String Financing assistance information T_NOTICE.AIDE_FINANCEMENT_HTML
firstMinute String First minute information T_NOTICE.PREMIERE_MINUTE_HTML
forWho String Target audience description T_NOTICE.POUR_QUI_HTML
highlights String Program highlights T_NOTICE.POINTS_FORTS_HTML
imageProgramDesktop String Desktop program image URL T_NOTICE.IMAGE_PROGRAMME_DESKTOP_HTML
imageProgramMobile String Mobile program image URL T_NOTICE.IMAGE_PROGRAMME_MOBILE_HTML
imageSocialNetworks String Social networks image URL T_NOTICE.IMAGE_RESEAUX_SOCIAUX_HTML
introduction String Notice introduction content T_NOTICE.INTRODUCTION_HTML
introductionTitle String Notice introduction title T_NOTICE.TITRE_INTRODUCTION_HTML
morePrecisely String More precise details T_NOTICE.PLUS_PRECISEMENT_HTML
objective String Training objectives T_NOTICE.OBJECTIF_HTML
participantBenefits String Benefits for participants T_NOTICE.BENEFICE_PARTICIPANT_HTML
pedagogy String Pedagogy information T_NOTICE.PEDAGOGIE_HTML
prerequisite String Prerequisites T_NOTICE.PRE_REQUIS_HTML
program String Program details T_NOTICE.PROGRAMME_HTML
programContent ProgramContentResponse Detailed program content structure T_NOTICE various PROGRAMME fields
programContent.after.text String After training content T_NOTICE.PROGRAMME_APRES_HTML
programContent.after.title String After training title T_NOTICE.PROGRAMME_APRES_TITRE_HTML
programContent.before.text String Before training content T_NOTICE.PROGRAMME_AVANT_HTML
programContent.before.title String Before training title T_NOTICE.PROGRAMME_AVANT_TITRE_HTML
programContent.downstream String Downstream program information T_NOTICE.PROGRAMME_AVAL_HTML
programContent.duringTitle String During training title T_NOTICE.PROGRAMME_PENDANT_TITRE_HTML
programContent.parts Array[String] Training program parts T_NOTICE.PROGRAMME_PENDANT_HTML (parsed as array)
programContent.upstream String Upstream program information T_NOTICE.PROGRAMME_AMONT_HTML
rncpText String RNCP specific text T_NOTICE.TEXTE_RNCP_HTML
theMostPartnerText String Partner specific text T_NOTICE.TEXTE_LE_PLUS_PARTENAIRE_HTML
video String Video URL or information T_NOTICE.VIDEO_HTML
visioTrainingProcedure String Visio training procedure T_NOTICE.MODALITE_VISIO_HTML
Field Type Description Database Source
order Int Related product order T_PRODUIT_RELATION.ORDRE
relatedProductCode String Code of the related product T_PRODUIT_RELATION.CODE_PRODUIT with YearlyProductCode format
type String Type of relation (After, Before, etc.) T_PRODUIT_RELATION.TYPE_RELATION with enum mapping
Field Type Description Database Source
lengthMaximum Int Maximum length for the title Business rule based on title type
text String Title text content T_TITRE.TITRE
type String Title type (e.g., TITRE) T_TYPE_TITRE.LIB_TYPE_TITRE
Data Source: Stored procedure P_API_GET_PRODUCTS with SessionService aggregation and conditional hydration based on the hydrate parameter
Usage: Single product detail endpoint for product pages, detailed views, and enriched content display when hydration is enabled
Example Response
{
  "data": {
    "productCode": "38",
    "yearlyProductCode": "202500038",
    "offerYear": 2025,
    "title": "Pratique de la consolidation des comptes - Niv. 1",
    "evolutionType": "Reconduit",
    "cpf": false,
    "trainingMethod": "Stage",
    "familyOfferId": 1,
    "languages": ["Français"],
    "cities": ["A DISTANCE", "PARIS"],
    "availableCpfCities": [],
    "level": {
      "id": 1,
      "label": "Fondamental"
    },
    "professionalChallengesId": 3,
    "bestSeller": false,
    "picto4Real": true,
    "titles": [
      {
        "type": "BALISE TITRE",
        "text": "Formation consolidation des comptes - Cegos",
        "lengthMaximum": 128
      },
      {
        "type": "TITRE",
        "text": "Pratique de la consolidation des comptes - Niv. 1",
        "lengthMaximum": 256
      },
      {
        "type": "SOUS TITRE",
        "text": "Produire et présenter les comptes consolidés",
        "lengthMaximum": 256
      }
    ],
    "formula": [
      {
        "id": 22666,
        "label": "F1",
        "modules": [
          {
            "id": 32428,
            "code": "P01",
            "order": 1,
            "optional": false,
            "isProduct": false,
            "label": "Partie 1",
            "delayInDay": 3,
            "delayInHour": 21,
            "delayInMinute": 1260,
            "deliveryMode": "Présentiel"
          },
          {
            "id": 21280,
            "code": "PRAC102_FR",
            "order": 2,
            "optional": false,
            "isProduct": true,
            "label": "Practips générique : un défi par semaine pendant 7 semaines (1er pas : réservez 30 minutes…)",
            "delayInDay": 0.07,
            "delayInHour": 0.5,
            "delayInMinute": 30,
            "deliveryMode": "A distance"
          },
          {
            "id": 13949,
            "code": "EXP030_FR",
            "order": 3,
            "optional": false,
            "isProduct": true,
            "label": "Les états financiers en normes IFRS",
            "delayInDay": 0.04,
            "delayInHour": 0.3,
            "delayInMinute": 15,
            "deliveryMode": "A distance"
          }
        ]
      }
    ],
    "catalogTopicRelations": [
      {
        "catalogTopicId": 928100,
        "relationType": "Main",
        "order": 4
      }
    ],
    "partners": ["Cegos"],
    "relatedProducts": [
      {
        "relatedProductCode": "6464",
        "type": "After",
        "order": 1
      },
      {
        "relatedProductCode": "7833",
        "type": "After",
        "order": 2
      }
    ],
    "range": {
      "id": 219,
      "label": "Comptabilité"
    },
    "price": 2250,
    "iPackPrice": 5850,
    "notice": {
      "introductionTitle": "Formation consolidation des comptes",
      "introduction": "Cette formation vous permet de maîtriser la consolidation...",
      "forWho": "Consolideurs et responsables comptables",
      "applicationProcedure": "Inscription directe",
      "prerequisite": "Aucun",
      "visioTrainingProcedure": "Via Teams",
      "objective": "Maîtriser la consolidation des comptes",
      "evaluation": "QCM final et mise en situation",
      "programContent": {
        "before": {
          "title": "Avant la formation",
          "text": "Questionnaire de positionnement"
        },
        "duringTitle": "Pendant la formation",
        "parts": ["Module 1: Réglementation", "Module 2: Processus"],
        "after": {
          "title": "Après la formation",
          "text": "Programme de renforcement"
        },
        "upstream": "Préparation en amont"
      },
      "participantBenefits": "Supports pédagogiques inclus",
      "program": "Programme détaillé disponible",
      "highlights": "Formation adaptée normes françaises et IFRS",
      "morePrecisely": "Consolidation réalisée durant la formation",
      "firstMinute": "Présentation des objectifs",
      "cpfText": "Éligible CPF sous conditions",
      "rncpText": "Certification professionnelle",
      "expectedResults": "Autonomie en consolidation",
      "theMostPartnerText": "Expertise Cegos",
      "financingAssistance": "Prise en charge OPCO possible",
      "certificationTitleOptionalOrIncluded": "Certification non incluse",
      "bonus": "Accès ressources complémentaires",
      "video": "Vidéo présentation disponible",
      "financing": "Financement entreprise ou OPCO",
      "cpfPopup": "Plus d'infos sur le CPF",
      "imageProgramDesktop": "image-consolidation-desktop.jpg",
      "imageProgramMobile": "image-consolidation-mobile.jpg",
      "imageSocialNetworks": "image-consolidation-social.jpg",
      "pedagogy": "Pédagogie active et participative"
    },
    "noticeUrl": "https://www.cegos.fr/38",
    "noticeUrlPdf": "https://static.cegos.fr/pdf/2025_0038.pdf",
    "certificationInclude": false,
    "internationalProduct": false,
    "deliveryMode": "Mixte",
    "commercialDuration": {
      "days": "3",
      "hours": "21",
      "minutes": "0",
      "forcedValues": false,
      "remoteActivityIncluded": true
    }
  }
}

Referentials

GET /v1/Referentials/centers

Purpose: Retrieves all available training centers with their complete address information and contact details.
GET /v1/Referentials/centers
Parameters:
No parameters required
Content-Type: application/json

Purpose: Retrieves all available training centers with complete address information from complex multi-table joins.
Database Implementation
Database
HABILITATIONS (Authorizations DB - External dependency)
Stored Procedure
Direct SQL query (no stored procedure)
Tables Used
T_CENTRE, T_ADRESSE_GS, T_PAYS, T_SALLE, T_BERSP, T_BERSV, T_BERS, T_PARTIE_DE_SESSION_DE_STAGE, T_SESSION, T_PARTIE_STAGE, T_FORMULE_STAGE, T_CATALOGUE_FORMULE_STAGE, T_CATALOGUE
Business Logic: Complex multi-table joins to get active centers linked to current sessions/catalogs, filters by non-obsolete entries (TOP_OBSOLETE=0), non-deleted records (DATE_SUP IS NULL), non-video centers (TOP_VISIO=0), and catalogs from previous year to next year. Combines Address1 and Address2 into array format.

Purpose: Training center information for location-based filtering and session assignment.
External Database Architecture
Centers data comes from external HABILITATIONS database (not under Catalog API control). Long-term: Create dedicated Centers.API microservice owned by HABILITATIONS team.
HABILITATIONS DB Authorizations Connection SqlServerConnector<AuthorizationsDb> CenterRepository.GetAllAsync() Complex 13-table JOIN CenterService (Redis Cache) API Response
Response Fields
Field Type Description Database Source
data[].code String? Center unique code identifier (optional, only if not null) T_CENTRE.ADV_ID_CENTRE
data[].name String? Center name (optional, only if not null) T_CENTRE.LIB_CENTRE
data[].address Array[String] Address lines array (combines Address1 and Address2 if not empty) T_ADRESSE_GS.ADRESSE1 + T_ADRESSE_GS.ADRESSE2 (filtered non-empty)
data[].city String? Center city (optional, only if not null) T_ADRESSE_GS.VILLE
data[].postalCode String? Center postal code (optional, only if not null) T_ADRESSE_GS.CODE_POSTALE
data[].country String? Center country (optional, only if not null) T_PAYS.LIB_PAYS
Data Source: Complex SQL joins filtering active centers with sessions in current catalogs, with address composition logic
Usage: Used for center selection in sessions, location-based filtering, and training site information display
Example Response

{
    "data": [
        {
            "code": "679",
            "name": "ib-Cegos Nantes",
            "address": [
                "2 Impasse Augustin Fresnel - Imm Atalante 2"
            ],
            "city": "ST HERBLAIN",
            "postalCode": "44800",
            "country": "FRANCE"
        },
        {
            "code": "AJ4",
            "name": "GARE SNCF TOURS",
            "address": [
                "Place du Général Leclerc",
                "Porte 11"
            ],
            "city": "TOURS",
            "postalCode": "37000",
            "country": "FRANCE"
        }
    ]
}

Sessions

GET /v1/Sessions

Purpose: Provides comprehensive session information including scheduling, pricing, availability, and location details.
GET /v1/Sessions
Content-Type: application/json

Purpose: Provides comprehensive session information including scheduling, pricing, availability, and location details.
Database Implementation
Database
Offre_Vente
Stored Procedure
P_API_GET_SESSION_BY_PRODUCT
Tables Used
T_SESSION, T_PRODUIT, T_SESSION_COMPOSANT, T_COMPOSANT, T_PRIX_PAYS, T_VILLE, T_STATUT_SESSION, T_GAMME
Business Logic: Complex session scheduling with availability calculation (IsFull, IsLastPlaceAvailable, IsHighProbability based on registration count vs limits), price lookup with country-specific pricing, multi-part session support with dates/times, city and remote session handling, product association with catalog filtering, session status management

Purpose: Complete session information for booking and scheduling display.
Center Data Integration
Centers linked to sessions via complex multi-table joins for location information
Database (Offre_Vente) CenterRepository.GetCenterBySessionsAsync() Multi-table JOIN T_BERSP → T_SALLE → T_CENTRE CenterService enrichment SessionService (Parts) API Response (parts[].centerId)
Response Fields
Field Type Description Database Source
pageNumber Int Current page number (default: 1) Controller logic
pageSize Int Items per page (fixed: 100) Controller logic
totalItems Int Total number of sessions data.Count
totalPages Int Total number of pages Math.Ceiling(totalItems / 100)
data Array[SessionResponse] Array of session details SessionService aggregation
data[].yearlySessionCode String Unique session identifier combining year, product code and session number T_PRODUIT.ANNEE_OFFRE + T_PRODUIT.CODE_PRODUIT + T_SESSION.NUM_SESSION
data[].sessionNumber Int Session number within the product T_SESSION.NUM_SESSION
data[].yearlyProductCode String Yearly product code T_PRODUIT.ANNEE_OFFRE + T_PRODUIT.CODE_PRODUIT
data[].productCode String Product code identifier T_PRODUIT.CODE_PRODUIT
data[].price Double Session price T_PRIX_PAYS.PRIX
data[].componentCount Int? Number of components in the session (optional, only if not null) COUNT(T_SESSION_COMPOSANT.ID_COMPOSANT) excluding 'Visio formation'
data[].interDiscountPrice Double? Inter-enterprise discount price (optional, only if not null) Calculated inter-discount pricing logic
data[].startDate DateTime Session start date and time MIN(T_SESSION_COMPOSANT.DATE_DEBUT) via sessions_datemin CTE
data[].endDate DateTime Session end date and time MAX(T_SESSION_COMPOSANT.DATE_FIN) via sessions_datemax CTE
data[].durationInDays Double Session duration in days (calculated from hours) SUM(T_COMPOSANT.DUREE) / 60 / 60 / 7 with RoundHelper.AdjustDuration
data[].guaranteedSession Boolean Whether the session is guaranteed to run T_SESSION.TOP_SESSION_GARANTIE
data[].isRemote Boolean Whether the session is remote/online T_VILLE.LIB_VILLE is 'A distance' or null
data[].city String? Session city name (optional, only if not empty) T_VILLE.LIB_VILLE (transformed to 'A DISTANCE' if remote)
data[].isFull Boolean Whether the session is full (calculated dynamically) Business logic: RegistrationCount >= LimitMax for specific conditions
data[].isLastPlaceAvailable Boolean Whether last place is available (calculated dynamically) Business logic: LimitMax - 4 < RegistrationCount < LimitMax for non-Paris/non-remote
data[].isHighProbability Boolean Whether session has high probability to run (calculated dynamically) Business logic: RegistrationCount >= LimitMin for sessions
data[].registrationCount Int? Number of current registrations (optional, only if not null) T_SESSION.NB_INSCRIPTIONS
data[].limitMin Int? Minimum participants required (optional, only if not null) T_SESSION.SEUIL_MINI
data[].limitMax Int? Maximum participants allowed (optional, only if not null) T_SESSION.SEUIL_MAXI
data[].status SessionStatusResponse Session status enum (Open=0, Valid=100, Invited=200, Cancel=900) T_SESSION.ID_STATUT_SESSION mapped to enum
data[].topCpf Boolean? Whether session is CPF eligible (optional, only if not null) T_SESSION.TOP_CPF
data[].parts Array[SessionPartResponse] Session parts/components with detailed scheduling (only if hydrate=true) SessionPartService.GetSessionPartAsync() + CenterService mapping
Complex Objects & Sub-Objects
Field Type Description Database Source
centerId String? Center identifier for this part (optional, only if not null) CenterService.GetAllCenterBySessionsAsync() mapping
durationInDay Double Part duration in days T_COMPOSANT.DUREE converted to days
endDate DateTime? Part end date (optional, only if not null) T_SESSION_COMPOSANT.DATE_FIN
endTimeHour Int? Part end hour (optional, only if not null) T_SESSION_COMPOSANT end time extraction
endTimeMinute Int? Part end minute (optional, only if not null) T_SESSION_COMPOSANT end time extraction
isRemote Boolean Whether this part is remote T_SESSION_COMPOSANT remote logic
number Int Part number/sequence T_SESSION_COMPOSANT part numbering
startDate DateTime? Part start date (optional, only if not null) T_SESSION_COMPOSANT.DATE_DEBUT
startTimeHour Int? Part start hour (optional, only if not null) T_SESSION_COMPOSANT start time extraction
startTimeMinute Int? Part start minute (optional, only if not null) T_SESSION_COMPOSANT start time extraction
Data Source: Stored procedure P_API_GET_SESSION_BY_PRODUCT with complex session scheduling and availability logic
Usage: Primary endpoint for session booking and calendar display
Example Response

{
    "pageNumber": 1,
    "pageSize": 100,
    "totalItems": 2847,
    "totalPages": 29,
    "data": [
        {
            "yearlySessionCode": "2025-61072-PAR-001",
            "sessionNumber": 1,
            "yearlyProductCode": "2025-61072",
            "productCode": "61072",
            "price": 1350.00,
            "componentCount": 2,
            "interDiscountPrice": 1200.00,
            "startDate": "2025-03-15T09:00:00",
            "endDate": "2025-03-16T17:00:00",
            "durationInDays": 2.0,
            "guaranteedSession": true,
            "isRemote": false,
            "city": "Paris",
            "isFull": false,
            "isLastPlaceAvailable": false,
            "isHighProbability": true,
            "registrationCount": 8,
            "limitMin": 5,
            "limitMax": 12,
            "status": "Open",
            "topCpf": true,
            "parts": [
                {
                    "isRemote": false,
                    "startTimeHour": 9,
                    "startTimeMinute": 0,
                    "endTimeHour": 17,
                    "endTimeMinute": 0,
                    "startDate": "2025-03-15T09:00:00",
                    "endDate": "2025-03-15T17:00:00",
                    "durationInDay": 1.0,
                    "number": 1,
                    "centerId": "PAR-001"
                },
                {
                    "isRemote": false,
                    "startTimeHour": 9,
                    "startTimeMinute": 0,
                    "endTimeHour": 17,
                    "endTimeMinute": 0,
                    "startDate": "2025-03-16T09:00:00",
                    "endDate": "2025-03-16T17:00:00",
                    "durationInDay": 1.0,
                    "number": 2,
                    "centerId": "PAR-001"
                }
            ]
        }
    ]
}

Sessions

GET /v1/Sessions/{yearlySessionCode}

Purpose: Retrieves detailed information for a specific session using its yearly session code.
GET /v1/Sessions/{yearlySessionCode}
Content-Type: application/json

Purpose: Retrieves complete session details including scheduling, pricing, availability, and session parts from multiple database tables with complex version management.
Database Implementation
Database
Offre_Vente
Stored Procedure
P_API_GET_SESSION_BY_PRODUCT
Tables Used
T_SESSION, T_PRODUIT, T_SESSION_COMPOSANT, T_COMPOSANT, T_STATUT_SESSION, T_PRIX_PAYS, T_GAMME, T_VILLE
Business Logic: Complex multi-CTE query with version control (max_session, max_produit_session CTEs), date range calculation from session components (sessions_datemin, sessions_datemax CTEs), inter-company offer filtering (famille_offre = 'offre interentreprises'), session guarantee and CPF eligibility flags, price lookup with currency support, city/location resolution, component count calculation excluding 'Visio formation', registration limits and current count tracking, session status management, filtering by top_hors_structure = 0. SERVICE LAYER: SessionService.GetAsync(yearlySessionCode) calls GetAllAsync(DateTime.Today) then filters in-memory using FirstOrDefault with YearlySessionCode match, followed by session parts hydration from SessionPartService and center assignment via CenterService.GetAllCenterBySessionsAsync() with part number matching.

Purpose: Complete session detail information for a specific session identified by its yearly session code.
Response Fields
Field Type Description Database Source
yearlySessionCode String Yearly session code identifier (format: YYYY-NNNNN-XXX - calculated from ANNEE_OFFRE + CODE_PRODUIT + NUM_SESSION) T_PRODUIT.ANNEE_OFFRE + T_PRODUIT.CODE_PRODUIT + T_SESSION.NUM_SESSION
sessionNumber Integer Session number within the year T_SESSION.NUM_SESSION
yearlyProductCode String Associated product yearly code T_PRODUIT.ANNEE_OFFRE + T_PRODUIT.CODE_PRODUIT
productCode String Base product code without year T_PRODUIT.CODE_PRODUIT
price Decimal Session price in specified currency T_PRIX_PAYS.PRIX
componentCount Integer Number of session components/parts (excluding 'Visio formation' components) COUNT(T_SESSION_COMPOSANT) where T_COMPOSANT.FAMILLE_OFFRE <> 'Visio formation'
interDiscountPrice Decimal Inter-company discount price (calculated from base price) Calculated from T_PRIX_PAYS.PRIX
startDate DateTime Session start date (minimum date from all session components) MIN(T_SESSION_COMPOSANT.DATE_DEBUT)
endDate DateTime Session end date (maximum date from all session components) MAX(T_SESSION_COMPOSANT.DATE_FIN)
durationInDays Integer Total session duration in days (sum of component durations) SUM(T_COMPOSANT.DUREE) from session components
guaranteedSession Boolean Whether the session is guaranteed to run T_SESSION.TOP_SESSION_GARANTIE
isRemote Boolean Whether the session is conducted remotely (derived from session data) Calculated from session location and delivery mode
city String Session location city name T_VILLE.LIB_VILLE
isFull Boolean Whether the session is full (calculated dynamically) Business logic: T_SESSION.NB_INSCRIPTIONS >= T_SESSION.SEUIL_MAXI
isLastPlaceAvailable Boolean Whether only the last place is available Business logic: T_SESSION.NB_INSCRIPTIONS == T_SESSION.SEUIL_MAXI - 1
isHighProbability Boolean Whether the session has high probability to run Business logic based on T_SESSION.NB_INSCRIPTIONS vs T_SESSION.SEUIL_MINI
registrationCount Integer Current number of registrations T_SESSION.NB_INSCRIPTIONS
limitMin Integer Minimum registrations required for the session to run T_SESSION.SEUIL_MINI
limitMax Integer Maximum registrations allowed T_SESSION.SEUIL_MAXI
status String Session status (Open, Closed, Cancelled, etc.) T_STATUT_SESSION.LIB_STATUT_SESSION via T_SESSION.ID_STATUT_SESSION
topCpf Boolean Whether the session is CPF (Compte Personnel de Formation) eligible T_SESSION.TOP_CPF
parts[] Array Array of session parts/components with detailed scheduling information T_SESSION_COMPOSANT joined with T_COMPOSANT
Complex Objects & Sub-Objects
Field Type Description Database Source
centerId String Training center identifier for this part (dynamically assigned via service layer) CenterService.GetAllCenterBySessionsAsync() - matched by YearlySessionCode and part number, not directly from T_VILLE.CODE_VILLE
durationInDay Decimal Part duration in days (can be fractional) T_COMPOSANT.DUREE (component duration)
endDate DateTime Part end date and time T_SESSION_COMPOSANT.DATE_FIN
endTimeHour Integer Part end hour (24-hour format, extracted from end datetime) HOUR(T_SESSION_COMPOSANT.DATE_FIN)
endTimeMinute Integer Part end minute (extracted from end datetime) MINUTE(T_SESSION_COMPOSANT.DATE_FIN)
isRemote Boolean Whether this specific part is conducted remotely Derived from component delivery mode and location data
number Integer Part sequence number for ordering Component sequence from T_SESSION_COMPOSANT
startDate DateTime Part start date and time T_SESSION_COMPOSANT.DATE_DEBUT
startTimeHour Integer Part start hour (24-hour format, extracted from start datetime) HOUR(T_SESSION_COMPOSANT.DATE_DEBUT)
startTimeMinute Integer Part start minute (extracted from start datetime) MINUTE(T_SESSION_COMPOSANT.DATE_DEBUT)
Data Source:
Usage:
Example Response
{
  "data": {
    "yearlySessionCode": "2025-61072-PAR-001",
    "sessionNumber": 1,
    "yearlyProductCode": "2025-61072",
    "productCode": "61072",
    "price": 1890.00,
    "componentCount": 2,
    "interDiscountPrice": 1701.00,
    "startDate": "2025-09-15T09:00:00Z",
    "endDate": "2025-09-16T17:30:00Z",
    "durationInDays": 2,
    "guaranteedSession": true,
    "isRemote": false,
    "city": "Paris",
    "isFull": false,
    "isLastPlaceAvailable": false,
    "isHighProbability": true,
    "registrationCount": 8,
    "limitMin": 6,
    "limitMax": 12,
    "status": "Open",
    "topCpf": true,
    "parts": [
      {
        "isRemote": false,
        "startTimeHour": 9,
        "startTimeMinute": 0,
        "endTimeHour": 17,
        "endTimeMinute": 30,
        "startDate": "2025-09-15T09:00:00Z",
        "endDate": "2025-09-15T17:30:00Z",
        "durationInDay": 1.0,
        "number": 1,
        "centerId": "PAR"
      },
      {
        "isRemote": false,
        "startTimeHour": 9,
        "startTimeMinute": 0,
        "endTimeHour": 17,
        "endTimeMinute": 30,
        "startDate": "2025-09-16T09:00:00Z",
        "endDate": "2025-09-16T17:30:00Z",
        "durationInDay": 1.0,
        "number": 2,
        "centerId": "PAR"
      }
    ]
  }
}