{
  "components": {
    "schemas": {
      "AcquisitionSourceDetailOutput": {
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "level": {
            "default": "detail",
            "enum": [
              "detail"
            ],
            "type": "string"
          },
          "parentId": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "label",
          "level",
          "parentId"
        ],
        "type": "object"
      },
      "AcquisitionSourceOutput": {
        "properties": {
          "details": {
            "items": {
              "$ref": "#/components/schemas/AcquisitionSourceDetailOutput"
            },
            "type": "array"
          },
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "level": {
            "default": "source",
            "enum": [
              "source"
            ],
            "type": "string"
          }
        },
        "required": [
          "id",
          "label",
          "level",
          "details"
        ],
        "type": "object"
      },
      "AddTagsRequest": {
        "properties": {
          "names": {
            "description": "Tag labels — upserted if missing, then assigned",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "tagIds": {
            "description": "Existing tag IDs",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "AdmissionStatusOutput": {
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "label",
          "type"
        ],
        "type": "object"
      },
      "AlumniInvitationRequest": {
        "properties": {
          "campus": {
            "description": "Alumni campus, identified by its Grimp ID or its name.",
            "type": "string"
          },
          "dateOfBirth": {
            "format": "date-time",
            "type": "string"
          },
          "degree": {
            "description": "Degree obtained, identified by its Grimp ID or its name.",
            "type": "string"
          },
          "email": {
            "format": "email",
            "type": "string"
          },
          "enterpriseName": {
            "type": "string"
          },
          "externalId": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "graduationYear": {
            "description": "Graduation year, as a 4 digit year or an ISO date.",
            "example": "2024",
            "pattern": "^\\d{4}(-\\d{2}-\\d{2}.*)?$",
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "linkedInUrl": {
            "type": "string"
          },
          "location": {
            "allOf": [
              {
                "$ref": "#/components/schemas/LocationInputStudentUpdate"
              }
            ],
            "example": {
              "address": "Paris"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/LocationInputStudentUpdate"
              }
            ]
          },
          "phone": {
            "type": "string"
          },
          "workSituation": {
            "enum": [
              "to place",
              "opportunity",
              "placed"
            ],
            "type": "string"
          }
        },
        "required": [
          "campus",
          "degree",
          "graduationYear",
          "firstName",
          "lastName",
          "email"
        ],
        "type": "object"
      },
      "ApplicationListItemOutput": {
        "properties": {
          "conclusion": {
            "$ref": "#/components/schemas/Conclusion"
          },
          "contacts": {
            "items": {
              "$ref": "#/components/schemas/ContactRefDTO"
            },
            "type": "array"
          },
          "contractType": {
            "enum": [
              "FIXED_TERM_CONTRACT",
              "PERMANENT_CONTRACT",
              "PART_TIME",
              "INTERNSHIP",
              "SEASONAL",
              "WORK_LINKED_TRAINING",
              "VOLUNTEER",
              "OTHER",
              "CIVIC_SERVICE"
            ],
            "type": "string"
          },
          "creationDate": {
            "type": "string"
          },
          "currentStep": {
            "type": "string"
          },
          "enterprise": {
            "$ref": "#/components/schemas/EnterpriseRefDto"
          },
          "id": {
            "type": "string"
          },
          "offer": {
            "$ref": "#/components/schemas/OfferRefDTO"
          },
          "place": {
            "type": "string"
          },
          "salaryExpcatationMax": {
            "type": "string"
          },
          "salaryExpcatationMin": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "student": {
            "$ref": "#/components/schemas/StudentRefDTO"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "currentStep",
          "source",
          "creationDate",
          "student"
        ],
        "type": "object"
      },
      "BulkCreatePartnerTasksRequest": {
        "properties": {
          "tasks": {
            "description": "Tasks to create, 1000 at most per call.",
            "items": {
              "$ref": "#/components/schemas/CreatePartnerTaskRequest"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "tasks"
        ],
        "type": "object"
      },
      "BulkCreatePartnerTasksResponse": {
        "properties": {
          "created": {
            "type": "number"
          },
          "failed": {
            "type": "number"
          },
          "results": {
            "items": {
              "$ref": "#/components/schemas/PartnerTaskCreationResultDTO"
            },
            "type": "array"
          }
        },
        "required": [
          "created",
          "failed",
          "results"
        ],
        "type": "object"
      },
      "CampusOutput": {
        "properties": {
          "classes": {
            "items": {
              "$ref": "#/components/schemas/ProgramOutput"
            },
            "type": "array"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "programs": {
            "items": {
              "$ref": "#/components/schemas/ProgramOutput"
            },
            "type": "array"
          },
          "reference": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "classes",
          "programs"
        ],
        "type": "object"
      },
      "CampusRefOutput": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "ClassDTO": {
        "properties": {
          "campusId": {
            "description": "Identifiant du campus qui héberge le programme",
            "type": "string"
          },
          "defaultContractType": {
            "enum": [
              "PROFESSIONAL_CONTRACT",
              "APPRENTICESHIP",
              "INTERNSHIP"
            ],
            "type": "string"
          },
          "defaultScolarship": {
            "enum": [
              "INITIAL",
              "ALTERNANCE"
            ],
            "type": "string"
          },
          "degree": {
            "description": "Identifiant du diplôme préparé",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Identifiant unique du programme",
            "type": "string"
          },
          "name": {
            "description": "Nom du programme",
            "type": "string"
          },
          "pipelineId": {
            "type": "string"
          },
          "reference": {
            "description": "Référence interne du programme",
            "type": "string"
          },
          "sectors": {
            "description": "Secteurs d'activité associés au programme",
            "items": {
              "$ref": "#/components/schemas/SectorDTO"
            },
            "type": "array"
          }
        },
        "required": [
          "id",
          "name",
          "reference",
          "sectors",
          "campusId",
          "pipelineId"
        ],
        "type": "object"
      },
      "ClassRefOutput": {
        "description": "A program (formation), referenced from another resource. Named `class` here for backward compatibility; `program` is the term used by the endpoints added from now on (see PartnerProgramRefOutput).",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "Conclusion": {
        "properties": {
          "comment": {
            "type": "string"
          },
          "reason": {
            "enum": [
              "EXPERIENCE",
              "SALARY",
              "QUALIFICATIONS",
              "VALUES",
              "OTHER"
            ],
            "type": "string"
          },
          "status": {
            "enum": [
              "REFUSED",
              "ACCEPTED",
              "PENDING"
            ],
            "type": "string"
          }
        },
        "required": [
          "status",
          "reason",
          "comment"
        ],
        "type": "object"
      },
      "ConclusionDTO": {
        "properties": {
          "comment": {
            "type": "string"
          },
          "reason": {
            "enum": [
              "EXPERIENCE",
              "SALARY",
              "QUALIFICATIONS",
              "VALUES",
              "OTHER"
            ],
            "nullable": true,
            "type": "string"
          },
          "status": {
            "enum": [
              "REFUSED",
              "ACCEPTED",
              "PENDING"
            ],
            "type": "string"
          }
        },
        "required": [
          "status"
        ],
        "type": "object"
      },
      "ConfirmRecruitmentRequest": {
        "properties": {
          "admissionApplicationId": {
            "description": "ID of the admission application (ex studentYear) to confirm",
            "format": "uuid",
            "type": "string"
          },
          "contractType": {
            "description": "Contract type. Only WORK_LINKED_TRAINING and INTERNSHIP are accepted for a recruitment confirmation.",
            "enum": [
              "FIXED_TERM_CONTRACT",
              "PERMANENT_CONTRACT",
              "PART_TIME",
              "INTERNSHIP",
              "SEASONAL",
              "WORK_LINKED_TRAINING",
              "VOLUNTEER",
              "CIVIC_SERVICE",
              "OTHER"
            ],
            "type": "string"
          },
          "enterpriseName": {
            "description": "Name of the hiring company",
            "type": "string"
          },
          "hiringAt": {
            "description": "Hiring date (ISO 8601), for instance the start of the contract. Defaults to now.",
            "format": "date-time",
            "type": "string"
          },
          "jobTitle": {
            "description": "Job title of the student",
            "type": "string"
          },
          "siret": {
            "description": "SIRET of the hiring company",
            "type": "string"
          }
        },
        "required": [
          "admissionApplicationId",
          "enterpriseName",
          "siret",
          "jobTitle",
          "contractType"
        ],
        "type": "object"
      },
      "ContactListItemOutput": {
        "properties": {
          "email": {
            "type": "string"
          },
          "enterprise": {
            "$ref": "#/components/schemas/EnterpriseRefDto"
          },
          "fullName": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "position": {
            "type": "string"
          },
          "student": {
            "$ref": "#/components/schemas/StudentRefDTO"
          }
        },
        "required": [
          "id",
          "fullName",
          "student"
        ],
        "type": "object"
      },
      "ContactRefDTO": {
        "properties": {
          "email": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "email"
        ],
        "type": "object"
      },
      "CreateAcquisitionSourceDetailRequest": {
        "properties": {
          "admissionSourceId": {
            "format": "uuid",
            "type": "string"
          },
          "label": {
            "example": "Salon Studyrama Nantes",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "label",
          "admissionSourceId"
        ],
        "type": "object"
      },
      "CreateClassRequest": {
        "properties": {
          "campusId": {
            "description": "Identifiant du campus auquel appartient le programme",
            "type": "string"
          },
          "coaches": {
            "description": "Emails des coaches à assigner au programme (doivent exister dans l'école)",
            "items": {
              "format": "email",
              "type": "string"
            },
            "type": "array"
          },
          "degreeId": {
            "description": "Identifiant du diplôme préparé",
            "type": "string"
          },
          "name": {
            "description": "Nom du programme",
            "type": "string"
          },
          "reference": {
            "description": "Référence interne du programme (doit être unique au sein du campus)",
            "type": "string"
          },
          "sectorIds": {
            "description": "Identifiants des secteurs d'activité associés au programme",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "name",
          "campusId"
        ],
        "type": "object"
      },
      "CreateCustomFieldDefinitionRequest": {
        "properties": {
          "helpText": {
            "maxLength": 500,
            "nullable": true,
            "type": "string"
          },
          "label": {
            "maxLength": 120,
            "type": "string"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/CustomFieldOptionInputRequest"
            },
            "type": "array"
          },
          "target": {
            "enum": [
              "student",
              "student_year",
              "contact",
              "enterprise"
            ],
            "type": "string"
          },
          "type": {
            "enum": [
              "text",
              "number",
              "date",
              "select",
              "multi_select",
              "boolean"
            ],
            "type": "string"
          }
        },
        "required": [
          "target",
          "label",
          "type"
        ],
        "type": "object"
      },
      "CreateOfferRequest": {
        "properties": {
          "annualGrossSalary": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "attachment": {
            "type": "string"
          },
          "contractType": {
            "example": [
              "FIXED_TERM_CONTRACT",
              "PERMANENT_CONTRACT",
              "PART_TIME",
              "INTERNSHIP",
              "SEASONAL",
              "WORK_LINKED_TRAINING",
              "VOLUNTEER",
              "OTHER"
            ],
            "items": {
              "enum": [
                "FIXED_TERM_CONTRACT",
                "PERMANENT_CONTRACT",
                "PART_TIME",
                "INTERNSHIP",
                "SEASONAL",
                "WORK_LINKED_TRAINING",
                "VOLUNTEER",
                "CIVIC_SERVICE",
                "OTHER"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "description": {
            "type": "string"
          },
          "diplomas": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "durationInMonths": {
            "type": "number"
          },
          "emails": {
            "description": "Required when `url` is absent (quick apply). Omit or leave empty when using external `url`.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "enterpriseIndustry": {
            "example": [
              "agriculture",
              "association_ngo",
              "banking_insurance_finance",
              "construction",
              "distribution_business",
              "education",
              "hotel_catering_tourism",
              "real_estate",
              "aerospace_defense",
              "food_industry",
              "automotive_industrie",
              "telecom",
              "manufacturing_industry",
              "pharmaceutical_industry",
              "marketing_communication",
              "health",
              "energy_sector",
              "software",
              "public_sector_administration",
              "business_services",
              "personnal_service",
              "transport_logistics",
              "other"
            ],
            "type": "string"
          },
          "enterpriseName": {
            "type": "string"
          },
          "expireDate": {
            "format": "date-time",
            "type": "string"
          },
          "externalId": {
            "type": "string"
          },
          "levels": {
            "example": [
              "PROFESSIONNAL",
              "A_0",
              "A_2",
              "A_3",
              "A_4",
              "A_5",
              "PHD"
            ],
            "items": {
              "enum": [
                "PROFESSIONNAL",
                "A_0",
                "A_2",
                "A_3",
                "A_4",
                "A_5",
                "PHD"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "logo": {
            "type": "string"
          },
          "messageRequired": {
            "type": "boolean"
          },
          "place": {
            "type": "string"
          },
          "programs": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "remoteJob": {
            "example": [
              "none",
              "partial",
              "total"
            ],
            "type": "string"
          },
          "siret": {
            "description": "SIRET of the company. When provided, the company linked to the job is created with this SIRET and enriched from it. An existing company without a SIRET is completed with it.",
            "example": "12345678900011",
            "pattern": "^\\d{14}$",
            "type": "string"
          },
          "skills": {
            "example": [
              "FEEDBACK",
              "ADAPTATION",
              "INNOVATION",
              "CLARITY_SIMPLICITY",
              "VERBAL_COMMUNICATION",
              "CREATIVITY",
              "ACTIVE_LISTENNING",
              "COMFORTABLE_NUMBER",
              "CRITICAL_MIND",
              "DYNAMIC",
              "FIABILITY",
              "MANAGEMENT_TIME",
              "HONEST",
              "LEADERSHIP",
              "CUSTOMER_ORIENTED",
              "PERSUASION",
              "SPEAKING_PUBLIC",
              "THINK_OUTSIDE",
              "PROBLEM_SOLVING",
              "KNOW_WHITE",
              "MANAGEMENT_STRESS",
              "TEAM_WORK"
            ],
            "items": {
              "enum": [
                "FEEDBACK",
                "ADAPTATION",
                "INNOVATION",
                "CLARITY_SIMPLICITY",
                "VERBAL_COMMUNICATION",
                "CREATIVITY",
                "ACTIVE_LISTENNING",
                "COMFORTABLE_NUMBER",
                "CRITICAL_MIND",
                "DYNAMIC",
                "FIABILITY",
                "MANAGEMENT_TIME",
                "HONEST",
                "LEADERSHIP",
                "CUSTOMER_ORIENTED",
                "PERSUASION",
                "SPEAKING_PUBLIC",
                "THINK_OUTSIDE",
                "PROBLEM_SOLVING",
                "KNOW_WHITE",
                "MANAGEMENT_STRESS",
                "TEAM_WORK"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "startingDate": {
            "format": "date-time",
            "type": "string"
          },
          "tagIds": {
            "description": "Replace all tags by ID. Send [] to clear.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "description": "Required when `emails` is absent or empty (apply on external URL). Omit when using `emails`.",
            "type": "string"
          },
          "user": {
            "type": "object"
          }
        },
        "required": [
          "contractType",
          "programs",
          "diplomas",
          "user",
          "title",
          "description",
          "expireDate",
          "enterpriseName"
        ],
        "type": "object"
      },
      "CreatePartnerAdmissionApplicationRequest": {
        "properties": {
          "createdAt": {
            "description": "Original date of the application, to carry over its history from another system (ISO 8601, not in the future). Applied only when the application is created: an application the student already has keeps its date. Defaults to now.",
            "format": "date-time",
            "type": "string"
          },
          "dateOfBirth": {
            "format": "date-time",
            "type": "string"
          },
          "email": {
            "format": "email",
            "type": "string"
          },
          "enterpriseName": {
            "type": "string"
          },
          "externalId": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "linkedInUrl": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "programId": {
            "description": "Program the student applies to",
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "description": "Reason for moving the application to `stepId`, given as the `code` of one of the school's reasons, or as its `id` for a reason without code. List the values accepted on a step with `GET /partner/education/v1/admission/reasons?stepId=…`. Only used when the step qualifies its applications (`reasonMode` other than `NONE`), ignored otherwise. When omitted, the step's default reason applies, if it has one.",
            "type": "string"
          },
          "reasonComment": {
            "description": "Free comment on the reason, required when the reason has `requiresComment`",
            "type": "string"
          },
          "stepId": {
            "description": "Admission step (étape) the application is created on. Step IDs come from\n`GET /partner/education/v1/admission/steps`.",
            "format": "uuid",
            "type": "string"
          },
          "workSituation": {
            "enum": [
              "to place",
              "opportunity",
              "placed"
            ],
            "type": "string"
          },
          "yearId": {
            "description": "Academic year of the application",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "firstName",
          "lastName",
          "email",
          "programId",
          "stepId"
        ],
        "type": "object"
      },
      "CreatePartnerContactRequest": {
        "properties": {
          "assignedCoachEmails": {
            "description": "Emails of the administrators (coaches) following the contact. Unknown emails are rejected.",
            "items": {
              "format": "email",
              "type": "string"
            },
            "type": "array"
          },
          "campusIds": {
            "description": "Campuses the contact is visible from. Defaults to every campus the caller can reach.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "comment": {
            "description": "Added to the contact's comments, authored by the owner of the API token. Skipped when the contact already has this exact comment.",
            "type": "string"
          },
          "customFields": {
            "additionalProperties": true,
            "description": "Custom fields to merge, keyed by slug (^[a-z0-9_]{1,64}$). Values are strings (max 2000 chars), numbers, booleans or arrays of those. Only the keys sent are written; a null value deletes the key. At most 50 keys per record. Invalid payloads are rejected with a 422. Definitions only control how Grimp displays a key (label, type, choices) and never limit the keys the partner API accepts. The admin interface endpoint is stricter: it only accepts keys with an active definition and a value matching its type. For a multiple choice field, send an array of choice values.",
            "example": {
              "boursier": true,
              "dossier_opco": "AT-2026-1234",
              "financeur": "OPCO Atlas"
            },
            "type": "object"
          },
          "email": {
            "description": "Email of the contact, unique per school",
            "format": "email",
            "type": "string"
          },
          "firstName": {
            "description": "First name",
            "type": "string"
          },
          "jobTitle": {
            "description": "Job title",
            "type": "string"
          },
          "lastName": {
            "description": "Last name",
            "type": "string"
          },
          "linkedInUrl": {
            "description": "LinkedIn profile URL",
            "type": "string"
          },
          "phone": {
            "description": "Phone number",
            "type": "string"
          },
          "siret": {
            "description": "SIRET or SIREN of an enterprise already in the CRM, the contact is attached to it.",
            "type": "string"
          },
          "tags": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AddTagsRequest"
              }
            ],
            "description": "Tags to assign, by ID or by label (labels are upserted)."
          },
          "visibilityMode": {
            "description": "PRIVATE (default) restricts the contact to its creator.",
            "enum": [
              "PRIVATE",
              "SHARED"
            ],
            "type": "string"
          }
        },
        "required": [
          "email",
          "firstName",
          "lastName"
        ],
        "type": "object"
      },
      "CreatePartnerEnterpriseRequest": {
        "properties": {
          "campusIds": {
            "description": "Campuses the enterprise is visible from. Defaults to every campus the caller can reach.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "customFields": {
            "additionalProperties": true,
            "description": "Custom fields to merge, keyed by slug (^[a-z0-9_]{1,64}$). Values are strings (max 2000 chars), numbers, booleans or arrays of those. Only the keys sent are written; a null value deletes the key. At most 50 keys per record. Invalid payloads are rejected with a 422. Definitions only control how Grimp displays a key (label, type, choices) and never limit the keys the partner API accepts. The admin interface endpoint is stricter: it only accepts keys with an active definition and a value matching its type. For a multiple choice field, send an array of choice values.",
            "example": {
              "boursier": true,
              "dossier_opco": "AT-2026-1234",
              "financeur": "OPCO Atlas"
            },
            "type": "object"
          },
          "name": {
            "description": "Legal name of the enterprise",
            "type": "string"
          },
          "siret": {
            "description": "SIRET (14 digits) or SIREN (9 digits). Separators are stripped. An enterprise already registered with this identifier is returned as is.",
            "type": "string"
          },
          "tags": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AddTagsRequest"
              }
            ],
            "description": "Tags to assign, by ID or by label (labels are upserted)."
          },
          "visibilityMode": {
            "description": "PRIVATE (default) restricts the enterprise to its creator.",
            "enum": [
              "PRIVATE",
              "SHARED"
            ],
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "CreatePartnerOpportunityRequest": {
        "properties": {
          "enterpriseId": {
            "format": "uuid",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "stageId": {
            "format": "uuid",
            "type": "string"
          },
          "status": {
            "enum": [
              "IDENTIFIED",
              "QUALIFIED",
              "ENGAGED",
              "WON",
              "LOST"
            ],
            "type": "string"
          },
          "targetDate": {
            "format": "date-time",
            "type": "string"
          },
          "type": {
            "enum": [
              "MANDATE",
              "CONTINUING_EDUCATION",
              "PARTNERSHIP",
              "APPRENTICESHIP_TAX",
              "OTHER"
            ],
            "type": "string"
          },
          "value": {
            "type": "number"
          }
        },
        "required": [
          "name",
          "enterpriseId"
        ],
        "type": "object"
      },
      "CreatePartnerProgramRequest": {
        "properties": {
          "campusId": {
            "description": "ID of the campus hosting the program",
            "type": "string"
          },
          "coaches": {
            "description": "Emails of the administrators assigned to the program",
            "items": {
              "format": "email",
              "type": "string"
            },
            "type": "array"
          },
          "defaultContractType": {
            "description": "Education contract type pre-filled on the students joining the program",
            "enum": [
              "PROFESSIONAL_CONTRACT",
              "APPRENTICESHIP",
              "INTERNSHIP"
            ],
            "type": "string"
          },
          "defaultScolarship": {
            "description": "Schooling type pre-filled on the students joining the program",
            "enum": [
              "INITIAL",
              "ALTERNANCE"
            ],
            "type": "string"
          },
          "degreeId": {
            "description": "ID of the degree prepared",
            "type": "string"
          },
          "name": {
            "description": "Name of the program",
            "type": "string"
          },
          "pipelineId": {
            "description": "ID of the admission pipeline the program follows, as listed by `GET /partner/education/v1/admission/pipelines`. Defaults to the pipeline most used by the campus.",
            "type": "string"
          },
          "reference": {
            "description": "Your own identifier for the program, unique per campus",
            "type": "string"
          },
          "sectorIds": {
            "description": "IDs of the sectors covered by the program",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "name",
          "campusId"
        ],
        "type": "object"
      },
      "CreatePartnerTaskRequest": {
        "properties": {
          "assignedAdminEmails": {
            "description": "Administrators assigned to the task, by email",
            "items": {
              "format": "email",
              "type": "string"
            },
            "type": "array"
          },
          "assignedAdminIds": {
            "description": "Administrators assigned to the task, by ID",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "contactEmails": {
            "description": "CRM contacts, by email",
            "items": {
              "format": "email",
              "type": "string"
            },
            "type": "array"
          },
          "contactIds": {
            "description": "CRM contacts, by ID",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "createdByEmail": {
            "description": "Email of the administrator who owns the task. Defaults to the owner of the API token.",
            "format": "email",
            "type": "string"
          },
          "dateTime": {
            "description": "Due date of the task (ISO 8601). Defaults to now.",
            "type": "string"
          },
          "doneAt": {
            "description": "Completion date (ISO 8601) of a FINISHED task. Defaults to the due date. Ignored for a TODO task.",
            "type": "string"
          },
          "enterpriseIds": {
            "description": "Enterprises, by ID",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "enterpriseSirets": {
            "description": "Enterprises, by SIRET or SIREN",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "note": {
            "description": "Free text note",
            "type": "string"
          },
          "opportunityIds": {
            "description": "Opportunities, by ID",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "reminder": {
            "default": false,
            "description": "Email the creator a reminder the day before the due date. Ignored for a due date already past.",
            "type": "boolean"
          },
          "status": {
            "default": "TODO",
            "enum": [
              "TODO",
              "FINISHED"
            ],
            "type": "string"
          },
          "studentEmails": {
            "description": "Students, by email",
            "items": {
              "format": "email",
              "type": "string"
            },
            "type": "array"
          },
          "studentIds": {
            "description": "Students, by ID",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "title": {
            "description": "Title of the task",
            "type": "string"
          },
          "type": {
            "default": "OTHER",
            "enum": [
              "WORKSHOP_CV",
              "WORKSHOP_LETTER",
              "WORKSHOP_JOB_SEEKING",
              "WORKSHOP_INTERVIEW",
              "OTHER",
              "JOB_SEARCH_SUPPORT",
              "TODO",
              "CONTACT_PHONE",
              "CONTACT_EMAIL",
              "PROFESSIONAL_PLACING",
              "MEETING"
            ],
            "type": "string"
          }
        },
        "required": [
          "title"
        ],
        "type": "object"
      },
      "CustomFieldDefinitionDTO": {
        "properties": {
          "archivedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "helpText": {
            "nullable": true,
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/CustomFieldOptionDTO"
            },
            "type": "array"
          },
          "orderIndex": {
            "type": "number"
          },
          "slug": {
            "type": "string"
          },
          "target": {
            "enum": [
              "student",
              "student_year",
              "contact",
              "enterprise"
            ],
            "type": "string"
          },
          "type": {
            "enum": [
              "text",
              "number",
              "date",
              "select",
              "multi_select",
              "boolean"
            ],
            "type": "string"
          }
        },
        "required": [
          "target",
          "type",
          "options",
          "id",
          "slug",
          "label",
          "orderIndex"
        ],
        "type": "object"
      },
      "CustomFieldOptionDTO": {
        "properties": {
          "archivedAt": {
            "nullable": true,
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        },
        "required": [
          "value",
          "label"
        ],
        "type": "object"
      },
      "CustomFieldOptionInputRequest": {
        "properties": {
          "label": {
            "maxLength": 120,
            "type": "string"
          },
          "value": {
            "description": "Value of an existing choice. Leave empty for a new choice, the value is generated from the label.",
            "type": "string"
          }
        },
        "required": [
          "label"
        ],
        "type": "object"
      },
      "DegreeCampusOutput": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "DegreeOutput": {
        "properties": {
          "campuses": {
            "items": {
              "$ref": "#/components/schemas/DegreeCampusOutput"
            },
            "type": "array"
          },
          "degreeLevel": {
            "enum": [
              "LEVEL_3",
              "LEVEL_4",
              "LEVEL_5",
              "LEVEL_6",
              "LEVEL_7",
              "LEVEL_8"
            ],
            "type": "string"
          },
          "duration": {
            "type": "number"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "officialCode": {
            "type": "string"
          },
          "programs": {
            "items": {
              "$ref": "#/components/schemas/DegreeProgramOutput"
            },
            "type": "array"
          },
          "reference": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "campuses",
          "programs"
        ],
        "type": "object"
      },
      "DegreeProgramOutput": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "DegreeRefOutput": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "EducationPartnerAdminDTO": {
        "properties": {
          "email": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "email",
          "name"
        ],
        "type": "object"
      },
      "EnterpriseRefDto": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "EnterprisesListItemOutput": {
        "properties": {
          "contacts": {
            "items": {
              "$ref": "#/components/schemas/ContactRefDTO"
            },
            "type": "array"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "sector": {
            "type": "string"
          },
          "student": {
            "$ref": "#/components/schemas/StudentRefDTO"
          }
        },
        "required": [
          "id",
          "name",
          "sector",
          "student",
          "contacts"
        ],
        "type": "object"
      },
      "FindAllApplicationsResponse": {
        "properties": {
          "applications": {
            "items": {
              "$ref": "#/components/schemas/ApplicationListItemOutput"
            },
            "type": "array"
          },
          "metadata": {
            "$ref": "#/components/schemas/Pagination"
          },
          "nextCursor": {
            "type": "string"
          }
        },
        "required": [
          "applications",
          "metadata"
        ],
        "type": "object"
      },
      "FindAllContactsResponse": {
        "properties": {
          "contacts": {
            "items": {
              "$ref": "#/components/schemas/ContactListItemOutput"
            },
            "type": "array"
          },
          "metadata": {
            "$ref": "#/components/schemas/Pagination"
          }
        },
        "required": [
          "contacts",
          "metadata"
        ],
        "type": "object"
      },
      "FindAllEnterprisesResponse": {
        "properties": {
          "enterprises": {
            "items": {
              "$ref": "#/components/schemas/EnterprisesListItemOutput"
            },
            "type": "array"
          },
          "metadata": {
            "$ref": "#/components/schemas/Pagination"
          }
        },
        "required": [
          "enterprises",
          "metadata"
        ],
        "type": "object"
      },
      "GetPartnerAdminsResponse": {
        "properties": {
          "admins": {
            "items": {
              "$ref": "#/components/schemas/PartnerAdminDTO"
            },
            "type": "array"
          },
          "metadata": {
            "$ref": "#/components/schemas/Pagination"
          }
        },
        "required": [
          "admins",
          "metadata"
        ],
        "type": "object"
      },
      "GetPartnerAdmissionApplicationsResponse": {
        "properties": {
          "admissionApplications": {
            "description": "Admission applications, ordered by `sort` and `order` — most recently created first by default",
            "items": {
              "$ref": "#/components/schemas/PartnerAdmissionApplicationOutput"
            },
            "type": "array"
          },
          "metadata": {
            "$ref": "#/components/schemas/Pagination"
          }
        },
        "required": [
          "admissionApplications",
          "metadata"
        ],
        "type": "object"
      },
      "GetPartnerAdmissionReasonsResponse": {
        "properties": {
          "data": {
            "description": "Reasons of the school, or of the step when `stepId` is given",
            "items": {
              "$ref": "#/components/schemas/PartnerAdmissionReasonOutput"
            },
            "type": "array"
          },
          "metadata": {
            "properties": {
              "totalCount": {
                "type": "number"
              }
            },
            "required": [
              "totalCount"
            ],
            "type": "object"
          }
        },
        "required": [
          "data",
          "metadata"
        ],
        "type": "object"
      },
      "GetPartnerAdmissionStatusesResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/PartnerAdmissionStatusOutput"
            },
            "type": "array"
          },
          "metadata": {
            "properties": {
              "totalCount": {
                "type": "number"
              }
            },
            "required": [
              "totalCount"
            ],
            "type": "object"
          }
        },
        "required": [
          "data",
          "metadata"
        ],
        "type": "object"
      },
      "GetPartnerAdmissionStepsResponse": {
        "properties": {
          "data": {
            "description": "Admission steps, ordered by pipeline then by position inside the pipeline",
            "items": {
              "$ref": "#/components/schemas/PartnerAdmissionStepOutput"
            },
            "type": "array"
          },
          "metadata": {
            "properties": {
              "totalCount": {
                "type": "number"
              }
            },
            "required": [
              "totalCount"
            ],
            "type": "object"
          }
        },
        "required": [
          "data",
          "metadata"
        ],
        "type": "object"
      },
      "GetPartnerDegreesResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/DegreeOutput"
            },
            "type": "array"
          },
          "metadata": {
            "properties": {
              "page": {
                "type": "number"
              },
              "pageSize": {
                "type": "number"
              },
              "totalCount": {
                "type": "number"
              }
            },
            "required": [
              "totalCount",
              "page",
              "pageSize"
            ],
            "type": "object"
          }
        },
        "required": [
          "data",
          "metadata"
        ],
        "type": "object"
      },
      "GetPartnerInteractionsResponse": {
        "properties": {
          "interactions": {
            "items": {
              "$ref": "#/components/schemas/PartnerInteractionDTO"
            },
            "type": "array"
          },
          "metadata": {
            "$ref": "#/components/schemas/Pagination"
          }
        },
        "required": [
          "interactions",
          "metadata"
        ],
        "type": "object"
      },
      "GetPartnerJobMatchingStudentsResponse": {
        "properties": {
          "matches": {
            "items": {
              "$ref": "#/components/schemas/PartnerJobMatchingStudentDTO"
            },
            "type": "array"
          },
          "metadata": {
            "$ref": "#/components/schemas/Pagination"
          }
        },
        "required": [
          "matches",
          "metadata"
        ],
        "type": "object"
      },
      "GetPartnerMatchingConfigurationResponse": {
        "properties": {
          "threshold": {
            "description": "Lowest global score a match must reach, 0 to 1.",
            "type": "number"
          },
          "weighting": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PartnerMatchingWeightingDTO"
              }
            ],
            "description": "Relative weight of each criterion in the global score."
          }
        },
        "required": [
          "threshold",
          "weighting"
        ],
        "type": "object"
      },
      "GetPartnerOpportunityPipelinesResponse": {
        "properties": {
          "data": {
            "description": "Opportunity pipelines of the school, oldest first",
            "items": {
              "$ref": "#/components/schemas/PartnerOpportunityPipelineOutput"
            },
            "type": "array"
          },
          "metadata": {
            "properties": {
              "totalCount": {
                "type": "number"
              }
            },
            "required": [
              "totalCount"
            ],
            "type": "object"
          }
        },
        "required": [
          "data",
          "metadata"
        ],
        "type": "object"
      },
      "GetPartnerOpportunityStagesResponse": {
        "properties": {
          "data": {
            "description": "Opportunity stages, ordered by pipeline then by position inside the pipeline",
            "items": {
              "$ref": "#/components/schemas/PartnerOpportunityStageOutput"
            },
            "type": "array"
          },
          "metadata": {
            "properties": {
              "totalCount": {
                "type": "number"
              }
            },
            "required": [
              "totalCount"
            ],
            "type": "object"
          }
        },
        "required": [
          "data",
          "metadata"
        ],
        "type": "object"
      },
      "GetPartnerPipelinesResponse": {
        "properties": {
          "data": {
            "description": "Pipelines of the school, ordered by name",
            "items": {
              "$ref": "#/components/schemas/PartnerPipelineOutput"
            },
            "type": "array"
          },
          "metadata": {
            "properties": {
              "totalCount": {
                "type": "number"
              }
            },
            "required": [
              "totalCount"
            ],
            "type": "object"
          }
        },
        "required": [
          "data",
          "metadata"
        ],
        "type": "object"
      },
      "GetPartnerProgramsResponse": {
        "properties": {
          "metadata": {
            "$ref": "#/components/schemas/Pagination"
          },
          "programs": {
            "items": {
              "$ref": "#/components/schemas/PartnerProgramDTO"
            },
            "type": "array"
          }
        },
        "required": [
          "programs",
          "metadata"
        ],
        "type": "object"
      },
      "GetPartnerStudentMatchingOffersResponse": {
        "properties": {
          "matches": {
            "items": {
              "$ref": "#/components/schemas/PartnerStudentMatchingOfferDTO"
            },
            "type": "array"
          },
          "metadata": {
            "$ref": "#/components/schemas/Pagination"
          }
        },
        "required": [
          "matches",
          "metadata"
        ],
        "type": "object"
      },
      "GetStudentsResponse": {
        "properties": {
          "metadata": {
            "$ref": "#/components/schemas/Pagination"
          },
          "students": {
            "items": {
              "$ref": "#/components/schemas/StudentListItemOutput"
            },
            "type": "array"
          }
        },
        "required": [
          "students",
          "metadata"
        ],
        "type": "object"
      },
      "InvitationRequest": {
        "properties": {
          "campus": {
            "type": "string"
          },
          "class": {
            "description": "Program ID to enroll the student in (called `class` here for backward compatibility)",
            "type": "string"
          },
          "courtesyTitle": {
            "description": "Civility: `mr` (Monsieur) or `ms` (Madame). `null` clears it (« Non défini »).",
            "enum": [
              "mr",
              "ms"
            ],
            "nullable": true,
            "type": "string"
          },
          "currentSchool": {
            "description": "Current school or establishment (free text).",
            "type": "string"
          },
          "currentSituation": {
            "description": "Current situation of the student.",
            "enum": [
              "studying",
              "career_change",
              "unemployed",
              "employed",
              "other"
            ],
            "type": "string"
          },
          "currentStudyLevel": {
            "description": "Current study level: `PROFESSIONNAL`, `A_0` (bac), `A_2` (bac+2), `A_3` (licence), `A_4` (bac+4), `A_5` (master), `PHD`.",
            "enum": [
              "PROFESSIONNAL",
              "A_0",
              "A_2",
              "A_3",
              "A_4",
              "A_5",
              "PHD"
            ],
            "type": "string"
          },
          "customFields": {
            "additionalProperties": true,
            "description": "Custom fields to merge, keyed by slug (^[a-z0-9_]{1,64}$). Values are strings (max 2000 chars), numbers, booleans or arrays of those. Only the keys sent are written; a null value deletes the key. At most 50 keys per record. Invalid payloads are rejected with a 422. Definitions only control how Grimp displays a key (label, type, choices) and never limit the keys the partner API accepts. The admin interface endpoint is stricter: it only accepts keys with an active definition and a value matching its type. For a multiple choice field, send an array of choice values.",
            "example": {
              "boursier": true,
              "dossier_opco": "AT-2026-1234",
              "financeur": "OPCO Atlas"
            },
            "type": "object"
          },
          "dateOfBirth": {
            "format": "date-time",
            "type": "string"
          },
          "email": {
            "format": "email",
            "type": "string"
          },
          "enterpriseName": {
            "type": "string"
          },
          "externalId": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "inDisabilitySituation": {
            "description": "In a situation of disability. Same access rules as `rqth`.",
            "type": "boolean"
          },
          "jobSearchZones": {
            "description": "Job search zones. Replaces the whole list; each zone takes coordinates or an address (a city or area name). An empty list removes every zone.",
            "items": {
              "$ref": "#/components/schemas/LocationInputStudentUpdate"
            },
            "type": "array"
          },
          "lastName": {
            "type": "string"
          },
          "linkedInUrl": {
            "type": "string"
          },
          "location": {
            "allOf": [
              {
                "$ref": "#/components/schemas/LocationInputStudentUpdate"
              }
            ],
            "example": {
              "address": "Paris"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/LocationInputStudentUpdate"
              }
            ]
          },
          "phone": {
            "type": "string"
          },
          "referents": {
            "description": "Referent coaches to assign to the student, each identified by the coach email or ID. These coaches are added to the student's existing referents; none are removed.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "rqth": {
            "description": "Recognised as a disabled worker (RQTH). Readable by the staff who see the student, writable by admins and coaches, as in the interface.",
            "type": "boolean"
          },
          "sendSMS": {
            "description": "Whether to also send an invitation SMS to the student's phone number, in addition to the invitation email. Requires a phone number and a campus resolvable from the assigned program.",
            "type": "boolean"
          },
          "studyProject": {
            "description": "Study project (free text). Distinct from `professionnelProject`.",
            "type": "string"
          },
          "workSituation": {
            "enum": [
              "to place",
              "opportunity",
              "placed"
            ],
            "type": "string"
          },
          "year": {
            "type": "string"
          }
        },
        "required": [
          "firstName",
          "lastName",
          "email"
        ],
        "type": "object"
      },
      "JobSearchOutput": {
        "properties": {
          "city": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "formattedAddress": {
            "type": "string"
          },
          "latitude": {
            "type": "number"
          },
          "longitude": {
            "type": "number"
          }
        },
        "type": "object"
      },
      "LeadDetailsOutput": {
        "properties": {
          "campus": {
            "$ref": "#/components/schemas/CampusOutput"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "data": {
            "additionalProperties": true,
            "type": "object"
          },
          "id": {
            "type": "string"
          },
          "leadId": {
            "description": "Alias de `id`, nommé explicitement pour l'appelant qui doit ensuite mettre à jour la\ncandidature (lot 2) : `leadId`/`studentYearId` sont les champs bloquants pour N8N.",
            "type": "string"
          },
          "referents": {
            "$ref": "#/components/schemas/PartnerEducationLeadReferentsResponse"
          },
          "source": {
            "type": "string"
          },
          "student": {
            "$ref": "#/components/schemas/StudentDetailsOutput"
          },
          "studentYearId": {
            "nullable": true,
            "type": "string"
          },
          "tags": {
            "description": "The student's final tag labels after this lead's tags, if any, were added.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "tracking": {
            "$ref": "#/components/schemas/PartnerEducationLeadTrackingResponse"
          }
        },
        "required": [
          "tags",
          "id",
          "leadId",
          "studentYearId",
          "createdAt",
          "source",
          "data",
          "student"
        ],
        "type": "object"
      },
      "LeadRequest": {
        "properties": {
          "acquisitionSourceDetailId": {
            "format": "uuid",
            "type": "string"
          },
          "admissionSourceId": {
            "format": "uuid",
            "type": "string"
          },
          "campus": {
            "type": "string"
          },
          "customFields": {
            "additionalProperties": true,
            "description": "Custom fields to merge, keyed by slug (^[a-z0-9_]{1,64}$). Values are strings (max 2000 chars), numbers, booleans or arrays of those. Only the keys sent are written; a null value deletes the key. At most 50 keys per record. Invalid payloads are rejected with a 422. Definitions only control how Grimp displays a key (label, type, choices) and never limit the keys the partner API accepts. The admin interface endpoint is stricter: it only accepts keys with an active definition and a value matching its type. For a multiple choice field, send an array of choice values.",
            "example": {
              "boursier": true,
              "dossier_opco": "AT-2026-1234",
              "financeur": "OPCO Atlas"
            },
            "type": "object"
          },
          "data": {
            "additionalProperties": true,
            "description": "Raw data attached to the lead itself, free form and never validated. It is not displayed as custom fields: use customFields to set the student custom fields.",
            "type": "object"
          },
          "dateOfBirth": {
            "format": "date-time",
            "type": "string"
          },
          "email": {
            "format": "email",
            "type": "string"
          },
          "enterpriseName": {
            "type": "string"
          },
          "externalId": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "form": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "linkedInUrl": {
            "type": "string"
          },
          "locale": {
            "type": "string"
          },
          "location": {
            "allOf": [
              {
                "$ref": "#/components/schemas/LocationInputStudentUpdate"
              }
            ],
            "example": {
              "address": "Paris"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/LocationInputStudentUpdate"
              }
            ]
          },
          "phone": {
            "type": "string"
          },
          "referents": {
            "description": "Referent coaches, each identified by email or id (max 10).",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "source": {
            "type": "string"
          },
          "tags": {
            "description": "Tags to add to the student, by exact label (max 50). Add-only: existing tags are never removed. An unknown or invisible label is rejected (400 UNKNOWN_TAG) and nothing is created.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "tracking": {
            "$ref": "#/components/schemas/LeadTrackingRequest"
          },
          "workSituation": {
            "enum": [
              "to place",
              "opportunity",
              "placed"
            ],
            "type": "string"
          }
        },
        "required": [
          "firstName",
          "lastName",
          "source",
          "form",
          "locale"
        ],
        "type": "object"
      },
      "LeadTrackingRequest": {
        "properties": {
          "acquisitionValue": {
            "description": "Valeur d'acquisition en centimes, calculée côté N8N.",
            "minimum": 0,
            "type": "number"
          },
          "channel": {
            "description": "Canal d'entrée (\"Formulaire Salon\", \"Appel entrant\"…) — jamais déduit de `form`.",
            "type": "string"
          },
          "externalId": {
            "description": "Identifiant de la touche côté intégration (N8N…), pour le rejeu idempotent du même événement.",
            "type": "string"
          },
          "extra": {
            "additionalProperties": true,
            "description": "Métadonnées sans équivalent UTM (ex: noms de campagne/adset bruts du partenaire publicitaire).",
            "type": "object"
          },
          "fbclid": {
            "description": "Identifiant de clic Meta Ads.",
            "type": "string"
          },
          "gclid": {
            "description": "Identifiant de clic Google Ads.",
            "type": "string"
          },
          "occurredAt": {
            "description": "Date réelle du contact. À défaut, la date de création du lead est utilisée.",
            "format": "date-time",
            "type": "string"
          },
          "utmCampaign": {
            "type": "string"
          },
          "utmContent": {
            "type": "string"
          },
          "utmMedium": {
            "type": "string"
          },
          "utmSource": {
            "type": "string"
          },
          "utmTerm": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "LegalGuardianOutput": {
        "properties": {
          "email": {
            "nullable": true,
            "type": "string"
          },
          "firstName": {
            "nullable": true,
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "isPrimary": {
            "type": "boolean"
          },
          "lastName": {
            "nullable": true,
            "type": "string"
          },
          "phone": {
            "nullable": true,
            "type": "string"
          },
          "relationship": {
            "enum": [
              "father",
              "mother",
              "legal_tutor",
              "other"
            ],
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "id",
          "relationship",
          "firstName",
          "lastName",
          "email",
          "phone",
          "isPrimary"
        ],
        "type": "object"
      },
      "LocationInputStudentUpdate": {
        "properties": {
          "address": {
            "type": "string"
          },
          "latitude": {
            "maximum": 90,
            "minimum": -90,
            "type": "number"
          },
          "longitude": {
            "maximum": 180,
            "minimum": -180,
            "type": "number"
          }
        },
        "type": "object"
      },
      "LocationOutput": {
        "properties": {
          "city": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "formattedAddress": {
            "type": "string"
          },
          "latitude": {
            "type": "number"
          },
          "longitude": {
            "type": "number"
          }
        },
        "type": "object"
      },
      "LocationSchemaEntity": {
        "properties": {},
        "type": "object"
      },
      "OfferDTO": {
        "properties": {
          "annualGrossSalary": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "applications": {
            "items": {
              "$ref": "#/components/schemas/PartnerApplicationDTO"
            },
            "type": "array"
          },
          "archived": {
            "type": "boolean"
          },
          "attachment": {
            "type": "string"
          },
          "canApply": {
            "type": "boolean"
          },
          "contractType": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "$ref": "#/components/schemas/EducationPartnerAdminDTO"
          },
          "description": {
            "type": "string"
          },
          "durationInMonths": {
            "type": "number"
          },
          "email": {
            "type": "string"
          },
          "enterpriseIndustry": {
            "type": "string"
          },
          "enterpriseName": {
            "type": "string"
          },
          "enterpriseSiret": {
            "type": "string"
          },
          "expireDate": {
            "type": "string"
          },
          "externalId": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "levels": {
            "items": {
              "enum": [
                "PROFESSIONNAL",
                "A_0",
                "A_2",
                "A_3",
                "A_4",
                "A_5",
                "PHD"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "location": {
            "allOf": [
              {
                "$ref": "#/components/schemas/LocationSchemaEntity"
              }
            ],
            "nullable": true,
            "type": "object"
          },
          "logo": {
            "type": "string"
          },
          "quickApply": {
            "type": "boolean"
          },
          "remoteJob": {
            "type": "string"
          },
          "skills": {
            "items": {
              "enum": [
                "FEEDBACK",
                "ADAPTATION",
                "INNOVATION",
                "CLARITY_SIMPLICITY",
                "VERBAL_COMMUNICATION",
                "CREATIVITY",
                "ACTIVE_LISTENNING",
                "COMFORTABLE_NUMBER",
                "CRITICAL_MIND",
                "DYNAMIC",
                "FIABILITY",
                "MANAGEMENT_TIME",
                "HONEST",
                "LEADERSHIP",
                "CUSTOMER_ORIENTED",
                "PERSUASION",
                "SPEAKING_PUBLIC",
                "THINK_OUTSIDE",
                "PROBLEM_SOLVING",
                "KNOW_WHITE",
                "MANAGEMENT_STRESS",
                "TEAM_WORK"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "startingDate": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "url": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "contractType",
          "description",
          "skills",
          "canApply",
          "quickApply",
          "createdAt",
          "levels",
          "startingDate",
          "location",
          "archived",
          "applications"
        ],
        "type": "object"
      },
      "OfferRefDTO": {
        "properties": {
          "enterpriseName": {
            "type": "string"
          },
          "externalId": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "OffersResponse": {
        "properties": {
          "metadata": {
            "$ref": "#/components/schemas/Pagination"
          },
          "offers": {
            "items": {
              "$ref": "#/components/schemas/OfferDTO"
            },
            "type": "array"
          }
        },
        "required": [
          "offers",
          "metadata"
        ],
        "type": "object"
      },
      "OpportunitiesResponse": {
        "properties": {
          "metadata": {
            "$ref": "#/components/schemas/Pagination"
          },
          "opportunities": {
            "items": {
              "$ref": "#/components/schemas/OpportunityDTO"
            },
            "type": "array"
          }
        },
        "required": [
          "opportunities",
          "metadata"
        ],
        "type": "object"
      },
      "OpportunityDTO": {
        "properties": {
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "enterprise": {
            "$ref": "#/components/schemas/OpportunityEnterpriseRefDTO"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "stage": {
            "$ref": "#/components/schemas/PartnerOpportunityStageDTO"
          },
          "stageId": {
            "nullable": true,
            "type": "string"
          },
          "status": {
            "deprecated": true,
            "enum": [
              "IDENTIFIED",
              "QUALIFIED",
              "ENGAGED",
              "WON",
              "LOST"
            ],
            "type": "string"
          },
          "tags": {
            "items": {
              "$ref": "#/components/schemas/OpportunityTagRefDTO"
            },
            "type": "array"
          },
          "targetDate": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "type": {
            "enum": [
              "MANDATE",
              "CONTINUING_EDUCATION",
              "PARTNERSHIP",
              "APPRENTICESHIP_TAX",
              "OTHER"
            ],
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "value": {
            "nullable": true,
            "type": "number"
          }
        },
        "required": [
          "id",
          "name",
          "type",
          "status",
          "createdAt",
          "updatedAt"
        ],
        "type": "object"
      },
      "OpportunityEnterpriseRefDTO": {
        "properties": {
          "id": {
            "type": "string"
          },
          "logo": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "OpportunityStageTypeEnum": {
        "description": "Outcome the stage stands for: still open, won or lost",
        "enum": [
          "OPEN",
          "WON",
          "LOST"
        ],
        "type": "string"
      },
      "OpportunityTagRefDTO": {
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "label"
        ],
        "type": "object"
      },
      "Pagination": {
        "properties": {
          "currentPage": {
            "type": "number"
          },
          "pageSize": {
            "type": "number"
          },
          "totalPages": {
            "type": "number"
          },
          "totalResults": {
            "type": "number"
          }
        },
        "required": [
          "pageSize",
          "totalResults",
          "currentPage",
          "totalPages"
        ],
        "type": "object"
      },
      "PartnerAdminCampusDTO": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "PartnerAdminDTO": {
        "properties": {
          "campuses": {
            "description": "Campuses the admin directs (Admin role)",
            "items": {
              "$ref": "#/components/schemas/PartnerAdminCampusDTO"
            },
            "type": "array"
          },
          "email": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "lastConnection": {
            "format": "date-time",
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "programs": {
            "description": "Programs the admin handles (Coach and ReadOnly roles)",
            "items": {
              "$ref": "#/components/schemas/PartnerAdminProgramDTO"
            },
            "type": "array"
          },
          "role": {
            "enum": [
              "Admin",
              "Coach",
              "ReadOnly"
            ],
            "type": "string"
          },
          "state": {
            "enum": [
              "CREATED",
              "ACTIVE",
              "INVITED",
              "UNACTIVE",
              "PENDING",
              "REFUSED"
            ],
            "type": "string"
          }
        },
        "required": [
          "id",
          "firstName",
          "lastName",
          "email",
          "role",
          "campuses",
          "programs"
        ],
        "type": "object"
      },
      "PartnerAdminProgramDTO": {
        "properties": {
          "campusId": {
            "description": "ID of the campus hosting the program",
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "campusId"
        ],
        "type": "object"
      },
      "PartnerAdmissionApplicationDetailOutput": {
        "properties": {
          "admissionFileStatus": {
            "description": "Review state of the admission file",
            "enum": [
              "pending",
              "validated",
              "incomplete"
            ],
            "type": "string"
          },
          "campus": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CampusRefOutput"
              }
            ],
            "description": "Campus hosting the program"
          },
          "comment": {
            "description": "Note on the application (« note de candidature » in the interface)",
            "type": "string"
          },
          "createdAt": {
            "description": "When the admission application was created",
            "format": "date-time",
            "type": "string"
          },
          "customFields": {
            "additionalProperties": true,
            "description": "Custom fields of the record, keyed by slug. Always an object, empty when no value is set.",
            "example": {
              "boursier": true,
              "dossier_opco": "AT-2026-1234",
              "financeur": "OPCO Atlas"
            },
            "type": "object"
          },
          "degree": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DegreeRefOutput"
              }
            ],
            "description": "Degree prepared by the program"
          },
          "educationContractType": {
            "enum": [
              "PROFESSIONAL_CONTRACT",
              "APPRENTICESHIP",
              "INTERNSHIP"
            ],
            "type": "string"
          },
          "hiringAt": {
            "description": "When the student was hired, for a work-linked training",
            "format": "date-time",
            "type": "string"
          },
          "hiringEnterprise": {
            "$ref": "#/components/schemas/StudentHiringEnterpriseDTO"
          },
          "hiringJobTitle": {
            "type": "string"
          },
          "hirings": {
            "items": {
              "$ref": "#/components/schemas/StudentHiringOutput"
            },
            "type": "array"
          },
          "history": {
            "items": {
              "$ref": "#/components/schemas/PartnerAdmissionHistoryEventOutput"
            },
            "type": "array"
          },
          "id": {
            "description": "Unique ID of the admission application",
            "type": "string"
          },
          "pipeline": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PartnerPipelineRefOutput"
              }
            ],
            "description": "Pipeline the current step belongs to, absent when the step is attached to none"
          },
          "program": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PartnerProgramRefOutput"
              }
            ],
            "description": "Program the student applies to"
          },
          "reason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PartnerAdmissionReasonRefOutput"
              }
            ],
            "description": "Reason the application sits on its current step, absent when none was given"
          },
          "reasonComment": {
            "description": "Free comment given with the reason",
            "type": "string"
          },
          "reasonSetAt": {
            "description": "When the reason was last set or corrected",
            "format": "date-time",
            "type": "string"
          },
          "scolarityType": {
            "enum": [
              "INITIAL",
              "ALTERNANCE"
            ],
            "type": "string"
          },
          "step": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PartnerAdmissionStepOutput"
              }
            ],
            "description": "Admission step the application currently sits on"
          },
          "student": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PartnerAdmissionApplicationStudentOutput"
              }
            ],
            "description": "The student the admission application belongs to"
          },
          "updatedAt": {
            "description": "When the admission application was last modified",
            "format": "date-time",
            "type": "string"
          },
          "year": {
            "allOf": [
              {
                "$ref": "#/components/schemas/YearRefOutput"
              }
            ],
            "description": "Academic year of the application"
          }
        },
        "required": [
          "customFields",
          "id",
          "createdAt",
          "updatedAt",
          "student",
          "step",
          "hirings",
          "history"
        ],
        "type": "object"
      },
      "PartnerAdmissionApplicationIdOutput": {
        "properties": {
          "id": {
            "description": "Unique ID of the created or updated admission application",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "PartnerAdmissionApplicationOutput": {
        "properties": {
          "admissionFileStatus": {
            "description": "Review state of the admission file",
            "enum": [
              "pending",
              "validated",
              "incomplete"
            ],
            "type": "string"
          },
          "campus": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CampusRefOutput"
              }
            ],
            "description": "Campus hosting the program"
          },
          "comment": {
            "description": "Note on the application (« note de candidature » in the interface)",
            "type": "string"
          },
          "createdAt": {
            "description": "When the admission application was created",
            "format": "date-time",
            "type": "string"
          },
          "customFields": {
            "additionalProperties": true,
            "description": "Custom fields of the record, keyed by slug. Always an object, empty when no value is set.",
            "example": {
              "boursier": true,
              "dossier_opco": "AT-2026-1234",
              "financeur": "OPCO Atlas"
            },
            "type": "object"
          },
          "degree": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DegreeRefOutput"
              }
            ],
            "description": "Degree prepared by the program"
          },
          "educationContractType": {
            "enum": [
              "PROFESSIONAL_CONTRACT",
              "APPRENTICESHIP",
              "INTERNSHIP"
            ],
            "type": "string"
          },
          "hiringAt": {
            "description": "When the student was hired, for a work-linked training",
            "format": "date-time",
            "type": "string"
          },
          "hiringEnterprise": {
            "$ref": "#/components/schemas/StudentHiringEnterpriseDTO"
          },
          "hiringJobTitle": {
            "type": "string"
          },
          "hirings": {
            "items": {
              "$ref": "#/components/schemas/StudentHiringOutput"
            },
            "type": "array"
          },
          "id": {
            "description": "Unique ID of the admission application",
            "type": "string"
          },
          "pipeline": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PartnerPipelineRefOutput"
              }
            ],
            "description": "Pipeline the current step belongs to, absent when the step is attached to none"
          },
          "program": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PartnerProgramRefOutput"
              }
            ],
            "description": "Program the student applies to"
          },
          "reason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PartnerAdmissionReasonRefOutput"
              }
            ],
            "description": "Reason the application sits on its current step, absent when none was given"
          },
          "reasonComment": {
            "description": "Free comment given with the reason",
            "type": "string"
          },
          "reasonSetAt": {
            "description": "When the reason was last set or corrected",
            "format": "date-time",
            "type": "string"
          },
          "scolarityType": {
            "enum": [
              "INITIAL",
              "ALTERNANCE"
            ],
            "type": "string"
          },
          "step": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PartnerAdmissionStepOutput"
              }
            ],
            "description": "Admission step the application currently sits on"
          },
          "student": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PartnerAdmissionApplicationStudentOutput"
              }
            ],
            "description": "The student the admission application belongs to"
          },
          "updatedAt": {
            "description": "When the admission application was last modified",
            "format": "date-time",
            "type": "string"
          },
          "year": {
            "allOf": [
              {
                "$ref": "#/components/schemas/YearRefOutput"
              }
            ],
            "description": "Academic year of the application"
          }
        },
        "required": [
          "customFields",
          "id",
          "createdAt",
          "updatedAt",
          "student",
          "step",
          "hirings"
        ],
        "type": "object"
      },
      "PartnerAdmissionApplicationStudentOutput": {
        "properties": {
          "dateOfBirth": {
            "format": "date-time",
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "externalId": {
            "description": "ID of the student in the partner's own system, when a mapping exists",
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "fullName": {
            "type": "string"
          },
          "hasRegistered": {
            "description": "Whether the student has activated their Grimp account",
            "type": "boolean"
          },
          "id": {
            "description": "Unique ID of the student, as used by `GET /partner/education/v1/students/{id}`",
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "linkedInUrl": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "workSituation": {
            "enum": [
              "to place",
              "opportunity",
              "placed"
            ],
            "type": "string"
          }
        },
        "required": [
          "id",
          "firstName",
          "lastName",
          "fullName",
          "email",
          "hasRegistered"
        ],
        "type": "object"
      },
      "PartnerAdmissionFileTemplateRef": {
        "properties": {
          "id": {
            "description": "ID of the admission file template",
            "type": "string"
          },
          "name": {
            "description": "Name of the admission file template",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "PartnerAdmissionHistoryEventOutput": {
        "properties": {
          "author": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PartnerAdmissionHistoryRefOutput"
              }
            ],
            "description": "The staff member who made the move"
          },
          "fromProgram": {
            "$ref": "#/components/schemas/PartnerAdmissionHistoryRefOutput"
          },
          "fromStep": {
            "$ref": "#/components/schemas/PartnerAdmissionHistoryRefOutput"
          },
          "occurredAt": {
            "description": "When the move happened",
            "format": "date-time",
            "type": "string"
          },
          "toProgram": {
            "$ref": "#/components/schemas/PartnerAdmissionHistoryRefOutput"
          },
          "toStep": {
            "$ref": "#/components/schemas/PartnerAdmissionHistoryRefOutput"
          },
          "type": {
            "enum": [
              "STATUS_CHANGE",
              "PROGRAM_CHANGE",
              "REASON_CHANGE",
              "ADMISSION_FILE_NOT_REQUESTED"
            ],
            "type": "string"
          }
        },
        "required": [
          "type",
          "occurredAt"
        ],
        "type": "object"
      },
      "PartnerAdmissionHistoryRefOutput": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "PartnerAdmissionReasonOutput": {
        "properties": {
          "code": {
            "description": "Stable code of the reason, absent for a reason created by the school",
            "enum": [
              "NOT_ELIGIBLE",
              "REJECTED_BY_SCHOOL",
              "REJECTED_BY_COMPANY",
              "NOT_INTERESTED",
              "UNREACHABLE",
              "DROPPED_OUT",
              "OTHER",
              "DUPLICATE",
              "WRONG_PROGRAM",
              "INCOMPLETE_PROFILE"
            ],
            "type": "string"
          },
          "id": {
            "description": "Unique ID of the reason",
            "type": "string"
          },
          "isActive": {
            "description": "Whether the reason is still offered in the Grimp interface. An inactive reason is still accepted by this API",
            "type": "boolean"
          },
          "label": {
            "description": "Name of the reason, as configured by the school",
            "type": "string"
          },
          "requiresComment": {
            "description": "Whether a `reasonComment` must be sent along with this reason",
            "type": "boolean"
          }
        },
        "required": [
          "isActive",
          "requiresComment",
          "id",
          "label"
        ],
        "type": "object"
      },
      "PartnerAdmissionReasonRefOutput": {
        "properties": {
          "code": {
            "description": "Stable code of the reason, absent for a reason created by the school",
            "enum": [
              "NOT_ELIGIBLE",
              "REJECTED_BY_SCHOOL",
              "REJECTED_BY_COMPANY",
              "NOT_INTERESTED",
              "UNREACHABLE",
              "DROPPED_OUT",
              "OTHER",
              "DUPLICATE",
              "WRONG_PROGRAM",
              "INCOMPLETE_PROFILE"
            ],
            "type": "string"
          },
          "id": {
            "description": "Unique ID of the reason",
            "type": "string"
          },
          "label": {
            "description": "Name of the reason, as configured by the school",
            "type": "string"
          }
        },
        "required": [
          "id",
          "label"
        ],
        "type": "object"
      },
      "PartnerAdmissionSourceOutput": {
        "properties": {
          "id": {
            "description": "ID to pass in the `admissionSourceIds` filter.",
            "type": "string"
          },
          "label": {
            "description": "How the student heard of the school.",
            "type": "string"
          }
        },
        "required": [
          "id",
          "label"
        ],
        "type": "object"
      },
      "PartnerAdmissionStatusOutput": {
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "label",
          "type"
        ],
        "type": "object"
      },
      "PartnerAdmissionStepOutput": {
        "properties": {
          "id": {
            "description": "Unique ID of the step",
            "type": "string"
          },
          "label": {
            "description": "Name of the step, as configured by the school",
            "type": "string"
          },
          "orderIndex": {
            "description": "Position of the step inside its pipeline, starting at 0",
            "type": "number"
          },
          "pipelineId": {
            "description": "ID of the pipeline the step belongs to. Absent for a step attached to no pipeline: the\ndatabase column is nullable, and schools created before pipelines may still have such steps.",
            "type": "string"
          },
          "reasonMode": {
            "description": "Whether an application moved to this step carries a reason: `NONE` ignores any reason,\n`OPTIONAL` and `REQUIRED` accept one of the reasons listed by\n`GET /partner/education/v1/admission/reasons?stepId=…`",
            "enum": [
              "NONE",
              "OPTIONAL",
              "REQUIRED"
            ],
            "type": "string"
          },
          "type": {
            "description": "Category the step belongs to",
            "enum": [
              "ACQUISITION",
              "QUALIFICATION",
              "COMPANY_SEARCH",
              "SUCCESS",
              "REJECT"
            ],
            "type": "string"
          }
        },
        "required": [
          "id",
          "label",
          "type",
          "orderIndex"
        ],
        "type": "object"
      },
      "PartnerApplicationDTO": {
        "properties": {
          "conclusion": {
            "$ref": "#/components/schemas/ConclusionDTO"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "currentStep": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "resumeUrl": {
            "type": "string"
          },
          "student": {
            "$ref": "#/components/schemas/StudentDTO"
          }
        },
        "required": [
          "id",
          "currentStep",
          "createdAt"
        ],
        "type": "object"
      },
      "PartnerApplicationDetailOutput": {
        "properties": {
          "conclusion": {
            "$ref": "#/components/schemas/Conclusion"
          },
          "contacts": {
            "items": {
              "$ref": "#/components/schemas/ContactRefDTO"
            },
            "type": "array"
          },
          "contractType": {
            "enum": [
              "FIXED_TERM_CONTRACT",
              "PERMANENT_CONTRACT",
              "PART_TIME",
              "INTERNSHIP",
              "SEASONAL",
              "WORK_LINKED_TRAINING",
              "VOLUNTEER",
              "OTHER",
              "CIVIC_SERVICE"
            ],
            "type": "string"
          },
          "creationDate": {
            "type": "string"
          },
          "currentStep": {
            "type": "string"
          },
          "enterprise": {
            "$ref": "#/components/schemas/EnterpriseRefDto"
          },
          "id": {
            "type": "string"
          },
          "interviews": {
            "items": {
              "$ref": "#/components/schemas/PartnerApplicationInterviewOutput"
            },
            "type": "array"
          },
          "offer": {
            "$ref": "#/components/schemas/OfferRefDTO"
          },
          "place": {
            "type": "string"
          },
          "salaryExpcatationMax": {
            "type": "string"
          },
          "salaryExpcatationMin": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "statusHistory": {
            "items": {
              "$ref": "#/components/schemas/PartnerApplicationStepChangeOutput"
            },
            "type": "array"
          },
          "student": {
            "$ref": "#/components/schemas/StudentRefDTO"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "currentStep",
          "source",
          "creationDate",
          "student",
          "statusHistory",
          "interviews"
        ],
        "type": "object"
      },
      "PartnerApplicationInterviewOutput": {
        "properties": {
          "interviewDate": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "interviewDate"
        ],
        "type": "object"
      },
      "PartnerApplicationStepChangeOutput": {
        "properties": {
          "occurredAt": {
            "format": "date-time",
            "type": "string"
          },
          "status": {
            "description": "Kanban step the application moved to",
            "type": "string"
          }
        },
        "required": [
          "status",
          "occurredAt"
        ],
        "type": "object"
      },
      "PartnerBreakHiringRequest": {
        "properties": {
          "breakAt": {
            "description": "Date the contract was broken (ISO 8601).",
            "format": "date-time",
            "type": "string"
          },
          "reason": {
            "description": "Why it was broken.",
            "enum": [
              "TRIAL_PERIOD",
              "RESIGNATION",
              "EMPLOYER_TERMINATION",
              "TRAINING_DROPOUT",
              "REORIENTATION",
              "OTHER"
            ],
            "type": "string"
          },
          "reasonDetail": {
            "description": "Free-text reason, required when `reason` is `OTHER`.",
            "type": "string"
          }
        },
        "required": [
          "breakAt",
          "reason"
        ],
        "type": "object"
      },
      "PartnerContactCrmDTO": {
        "properties": {
          "campusIds": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "customFields": {
            "additionalProperties": true,
            "description": "Custom fields of the record, keyed by slug. Always an object, empty when no value is set.",
            "example": {
              "boursier": true,
              "dossier_opco": "AT-2026-1234",
              "financeur": "OPCO Atlas"
            },
            "type": "object"
          },
          "email": {
            "type": "string"
          },
          "enterprises": {
            "items": {
              "$ref": "#/components/schemas/PartnerContactEnterpriseRefDTO"
            },
            "type": "array"
          },
          "firstName": {
            "type": "string"
          },
          "fullName": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "jobTitle": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "linkedInUrl": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "tags": {
            "items": {
              "$ref": "#/components/schemas/PartnerCrmTagDTO"
            },
            "type": "array"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "visibilityMode": {
            "enum": [
              "PRIVATE",
              "SHARED"
            ],
            "type": "string"
          }
        },
        "required": [
          "customFields",
          "id",
          "lastName",
          "fullName",
          "visibilityMode",
          "campusIds",
          "createdAt",
          "updatedAt"
        ],
        "type": "object"
      },
      "PartnerContactEnterpriseRefDTO": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "siret": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "PartnerContactsCrmResponse": {
        "properties": {
          "contacts": {
            "items": {
              "$ref": "#/components/schemas/PartnerContactCrmDTO"
            },
            "type": "array"
          },
          "metadata": {
            "$ref": "#/components/schemas/Pagination"
          }
        },
        "required": [
          "contacts",
          "metadata"
        ],
        "type": "object"
      },
      "PartnerCreateLegalGuardianRequest": {
        "properties": {
          "email": {
            "format": "email",
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "isPrimary": {
            "description": "Makes this guardian the primary one; the previous primary guardian is demoted. The first guardian of a student is always primary.",
            "type": "boolean"
          },
          "lastName": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "relationship": {
            "description": "Relationship to the student.",
            "enum": [
              "father",
              "mother",
              "legal_tutor",
              "other"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "PartnerCrmTagDTO": {
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "label"
        ],
        "type": "object"
      },
      "PartnerCustomFieldsOutput": {
        "properties": {
          "customFields": {
            "additionalProperties": true,
            "description": "Custom fields of the record, keyed by slug. Always an object, empty when no value is set.",
            "example": {
              "boursier": true,
              "dossier_opco": "AT-2026-1234",
              "financeur": "OPCO Atlas"
            },
            "type": "object"
          }
        },
        "required": [
          "customFields"
        ],
        "type": "object"
      },
      "PartnerCustomFieldsPatchRequest": {
        "properties": {
          "customFields": {
            "additionalProperties": true,
            "description": "Custom fields to merge, keyed by slug (^[a-z0-9_]{1,64}$). Values are strings (max 2000 chars), numbers, booleans or arrays of those. Only the keys sent are written; a null value deletes the key. At most 50 keys per record. Invalid payloads are rejected with a 422. Definitions only control how Grimp displays a key (label, type, choices) and never limit the keys the partner API accepts. The admin interface endpoint is stricter: it only accepts keys with an active definition and a value matching its type. For a multiple choice field, send an array of choice values.",
            "example": {
              "boursier": true,
              "dossier_opco": "AT-2026-1234",
              "financeur": "OPCO Atlas"
            },
            "type": "object"
          }
        },
        "required": [
          "customFields"
        ],
        "type": "object"
      },
      "PartnerEducationAddedReferentResponse": {
        "properties": {
          "email": {
            "type": "string"
          },
          "id": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "email"
        ],
        "type": "object"
      },
      "PartnerEducationLeadReferentsResponse": {
        "properties": {
          "added": {
            "items": {
              "$ref": "#/components/schemas/PartnerEducationAddedReferentResponse"
            },
            "type": "array"
          },
          "skipped": {
            "items": {
              "$ref": "#/components/schemas/PartnerEducationSkippedReferentResponse"
            },
            "type": "array"
          }
        },
        "required": [
          "added",
          "skipped"
        ],
        "type": "object"
      },
      "PartnerEducationLeadTrackingResponse": {
        "properties": {
          "status": {
            "enum": [
              "created",
              "duplicate_ignored"
            ],
            "type": "string"
          }
        },
        "required": [
          "status"
        ],
        "type": "object"
      },
      "PartnerEducationSkippedReferentResponse": {
        "properties": {
          "reason": {
            "enum": [
              "COACH_NOT_FOUND",
              "COACH_DISABLED",
              "COACH_OUT_OF_SCOPE",
              "ALREADY_REFERENT"
            ],
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        },
        "required": [
          "value",
          "reason"
        ],
        "type": "object"
      },
      "PartnerEnterpriseCrmDTO": {
        "properties": {
          "campusIds": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "collectiveAgreementCode": {
            "nullable": true,
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "customFields": {
            "additionalProperties": true,
            "description": "Custom fields of the record, keyed by slug. Always an object, empty when no value is set.",
            "example": {
              "boursier": true,
              "dossier_opco": "AT-2026-1234",
              "financeur": "OPCO Atlas"
            },
            "type": "object"
          },
          "domain": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "industry": {
            "type": "string"
          },
          "linkedInUrl": {
            "type": "string"
          },
          "logo": {
            "type": "string"
          },
          "nafCode": {
            "nullable": true,
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "siret": {
            "type": "string"
          },
          "tags": {
            "items": {
              "$ref": "#/components/schemas/PartnerCrmTagDTO"
            },
            "type": "array"
          },
          "tradeName": {
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "visibilityMode": {
            "enum": [
              "PRIVATE",
              "SHARED"
            ],
            "type": "string"
          },
          "website": {
            "type": "string"
          }
        },
        "required": [
          "customFields",
          "id",
          "name",
          "visibilityMode",
          "campusIds",
          "createdAt",
          "updatedAt"
        ],
        "type": "object"
      },
      "PartnerEnterprisesCrmResponse": {
        "properties": {
          "enterprises": {
            "items": {
              "$ref": "#/components/schemas/PartnerEnterpriseCrmDTO"
            },
            "type": "array"
          },
          "metadata": {
            "$ref": "#/components/schemas/Pagination"
          }
        },
        "required": [
          "enterprises",
          "metadata"
        ],
        "type": "object"
      },
      "PartnerInteractionAuthorDTO": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "PartnerInteractionDTO": {
        "properties": {
          "author": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PartnerInteractionAuthorDTO"
              }
            ],
            "description": "Staff member who wrote or sent it; absent for replies and for messages sent by the school portal."
          },
          "channel": {
            "enum": [
              "email",
              "sms",
              "whatsapp",
              "comment"
            ],
            "type": "string"
          },
          "content": {
            "description": "Full content, only when `includeBody=true`.",
            "type": "string"
          },
          "direction": {
            "enum": [
              "inbound",
              "outbound",
              "internal"
            ],
            "type": "string"
          },
          "excerpt": {
            "description": "First 500 characters of the content, without HTML.",
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "occurredAt": {
            "format": "date-time",
            "type": "string"
          },
          "origin": {
            "description": "Where a message came from: ui, automation, marketing, api, mcp…",
            "type": "string"
          },
          "status": {
            "description": "Delivery status of a message: PENDING, SENT, DELIVERED, READ, FAILED, DISCONNECTED or UNSUBSCRIBED.",
            "type": "string"
          },
          "subject": {
            "description": "Email subject.",
            "type": "string"
          },
          "target": {
            "$ref": "#/components/schemas/PartnerInteractionTargetDTO"
          }
        },
        "required": [
          "id",
          "channel",
          "direction",
          "occurredAt",
          "target"
        ],
        "type": "object"
      },
      "PartnerInteractionTargetDTO": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "enum": [
              "student",
              "contact",
              "enterprise",
              "opportunity"
            ],
            "type": "string"
          }
        },
        "required": [
          "type",
          "id"
        ],
        "type": "object"
      },
      "PartnerJobMatchingStudentDTO": {
        "properties": {
          "hasApplied": {
            "type": "boolean"
          },
          "score": {
            "description": "Global score combining the three criteria, 0 to 1.",
            "type": "number"
          },
          "scores": {
            "$ref": "#/components/schemas/PartnerMatchingScoresDTO"
          },
          "student": {
            "$ref": "#/components/schemas/PartnerMatchingStudentDTO"
          }
        },
        "required": [
          "student",
          "score",
          "scores",
          "hasApplied"
        ],
        "type": "object"
      },
      "PartnerLeadTrackingOutput": {
        "properties": {
          "channel": {
            "nullable": true,
            "type": "string"
          },
          "externalId": {
            "nullable": true,
            "type": "string"
          },
          "extra": {
            "additionalProperties": true,
            "nullable": true,
            "type": "object"
          },
          "fbclid": {
            "nullable": true,
            "type": "string"
          },
          "gclid": {
            "nullable": true,
            "type": "string"
          },
          "occurredAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "utmCampaign": {
            "nullable": true,
            "type": "string"
          },
          "utmContent": {
            "nullable": true,
            "type": "string"
          },
          "utmMedium": {
            "nullable": true,
            "type": "string"
          },
          "utmSource": {
            "nullable": true,
            "type": "string"
          },
          "utmTerm": {
            "nullable": true,
            "type": "string"
          },
          "value": {
            "nullable": true,
            "type": "number"
          }
        },
        "required": [
          "externalId",
          "channel",
          "occurredAt",
          "utmSource",
          "utmMedium",
          "utmCampaign",
          "utmContent",
          "utmTerm",
          "gclid",
          "fbclid",
          "value",
          "extra"
        ],
        "type": "object"
      },
      "PartnerMatchingJobDTO": {
        "properties": {
          "city": {
            "type": "string"
          },
          "contractTypes": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "enterpriseName": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "contractTypes",
          "createdAt"
        ],
        "type": "object"
      },
      "PartnerMatchingScoresDTO": {
        "properties": {
          "contractTypes": {
            "description": "Contract type overlap, 0 or 1.",
            "type": "number"
          },
          "location": {
            "description": "Distance score: 1 under 20 km, 0.5 under 50 km.",
            "type": "number"
          },
          "skillProject": {
            "description": "Skills and project similarity, 0 to 1.",
            "type": "number"
          }
        },
        "required": [
          "skillProject",
          "contractTypes",
          "location"
        ],
        "type": "object"
      },
      "PartnerMatchingStudentDTO": {
        "properties": {
          "city": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "workSituation": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "firstName",
          "lastName",
          "email"
        ],
        "type": "object"
      },
      "PartnerMatchingWeightingDTO": {
        "properties": {
          "contractTypes": {
            "type": "number"
          },
          "location": {
            "type": "number"
          },
          "skillProject": {
            "type": "number"
          }
        },
        "required": [
          "skillProject",
          "contractTypes",
          "location"
        ],
        "type": "object"
      },
      "PartnerOpportunityPipelineOutput": {
        "description": "An opportunity pipeline and the ordered list of the stages it is made of.",
        "properties": {
          "id": {
            "description": "Unique ID of the pipeline",
            "type": "string"
          },
          "isDefault": {
            "description": "Whether this is the school's default pipeline: an opportunity created without `stageId` lands on its first open stage",
            "type": "boolean"
          },
          "name": {
            "description": "Name of the pipeline, as configured by the school",
            "type": "string"
          },
          "stages": {
            "description": "Stages of the pipeline, ordered by their position inside the pipeline",
            "items": {
              "$ref": "#/components/schemas/PartnerOpportunityStageOutput"
            },
            "type": "array"
          }
        },
        "required": [
          "id",
          "name",
          "isDefault",
          "stages"
        ],
        "type": "object"
      },
      "PartnerOpportunityStageDTO": {
        "properties": {
          "color": {
            "enum": [
              "info",
              "success",
              "error"
            ],
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "orderIndex": {
            "type": "number"
          },
          "pipelineId": {
            "type": "string"
          },
          "type": {
            "enum": [
              "OPEN",
              "WON",
              "LOST"
            ],
            "type": "string"
          }
        },
        "required": [
          "id",
          "label",
          "type",
          "color",
          "orderIndex",
          "pipelineId"
        ],
        "type": "object"
      },
      "PartnerOpportunityStageOutput": {
        "description": "A step of an opportunity pipeline. An opportunity sits on exactly one stage at a time: its `stageId` is the `id` of one of these stages.",
        "properties": {
          "color": {
            "description": "Display color, derived from `type`",
            "enum": [
              "info",
              "success",
              "error"
            ],
            "type": "string"
          },
          "id": {
            "description": "Unique ID of the stage — the value to send as `stageId` when creating or updating an opportunity",
            "type": "string"
          },
          "label": {
            "description": "Name of the stage, as configured by the school",
            "type": "string"
          },
          "orderIndex": {
            "description": "Position of the stage inside its pipeline, starting at 0",
            "type": "number"
          },
          "pipelineId": {
            "description": "ID of the pipeline the stage belongs to",
            "type": "string"
          },
          "type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/OpportunityStageTypeEnum"
              }
            ],
            "description": "Outcome the stage stands for: still open, won or lost"
          }
        },
        "required": [
          "id",
          "label",
          "type",
          "color",
          "pipelineId",
          "orderIndex"
        ],
        "type": "object"
      },
      "PartnerPipelineOutput": {
        "properties": {
          "id": {
            "description": "Unique ID of the pipeline",
            "type": "string"
          },
          "name": {
            "description": "Name of the pipeline, as configured by the school",
            "type": "string"
          },
          "steps": {
            "description": "Steps of the pipeline, ordered by their position inside the pipeline",
            "items": {
              "$ref": "#/components/schemas/PartnerAdmissionStepOutput"
            },
            "type": "array"
          }
        },
        "required": [
          "id",
          "name",
          "steps"
        ],
        "type": "object"
      },
      "PartnerPipelineRefOutput": {
        "properties": {
          "id": {
            "description": "Unique ID of the pipeline",
            "type": "string"
          },
          "name": {
            "description": "Name of the pipeline, as configured by the school",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "PartnerProgramDTO": {
        "properties": {
          "admissionFileTemplate": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PartnerAdmissionFileTemplateRef"
              }
            ],
            "description": "Admission file template the program requests from its\napplicants (documents and information to provide). Absent when the program requests no admission\nfile. Read-only."
          },
          "campusId": {
            "description": "ID of the campus hosting the program",
            "type": "string"
          },
          "defaultContractType": {
            "description": "Education contract type pre-filled on the students joining the program",
            "enum": [
              "PROFESSIONAL_CONTRACT",
              "APPRENTICESHIP",
              "INTERNSHIP"
            ],
            "type": "string"
          },
          "defaultScolarship": {
            "description": "Schooling type pre-filled on the students joining the program",
            "enum": [
              "INITIAL",
              "ALTERNANCE"
            ],
            "type": "string"
          },
          "degree": {
            "description": "ID of the degree prepared",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Unique ID of the program",
            "type": "string"
          },
          "name": {
            "description": "Name of the program",
            "type": "string"
          },
          "pipelineId": {
            "description": "ID of the admission pipeline the program follows",
            "type": "string"
          },
          "reference": {
            "description": "Your own identifier for the program, unique per campus",
            "type": "string"
          },
          "sectors": {
            "description": "Sectors covered by the program",
            "items": {
              "$ref": "#/components/schemas/SectorDTO"
            },
            "type": "array"
          }
        },
        "required": [
          "id",
          "name",
          "reference",
          "sectors",
          "campusId",
          "pipelineId"
        ],
        "type": "object"
      },
      "PartnerProgramRefOutput": {
        "description": "A program (formation), referenced from another resource. `program` is the term used by the endpoints added from now on; the older endpoints of this API still call the same resource `class`.",
        "properties": {
          "id": {
            "description": "Unique ID of the program",
            "type": "string"
          },
          "name": {
            "description": "Name of the program, as configured by the school",
            "type": "string"
          },
          "reference": {
            "description": "Reference of the program in the school's own referential, when set",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "PartnerSendStudentSMSRequest": {
        "properties": {
          "content": {
            "maxLength": 1600,
            "type": "string"
          }
        },
        "required": [
          "content"
        ],
        "type": "object"
      },
      "PartnerStudentDocumentOutput": {
        "properties": {
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "fileUrl": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "originalName": {
            "description": "Title given to the document when it was uploaded",
            "type": "string"
          },
          "title": {
            "description": "Normalized title: {lastName}_{firstName}_{title}",
            "example": "Dupont_Marie_Pièce d'identité",
            "type": "string"
          },
          "type": {
            "enum": [
              "IDENTITY",
              "DIPLOMA",
              "ACADEMIC_TRANSCRIPT",
              "CV",
              "COVER_LETTER",
              "SOCIAL_SECURITY_CERTIFICATE",
              "CIVIL_LIABILITY_CERTIFICATE",
              "RIB",
              "PROMISE_OF_EMPLOYMENT",
              "CONTRACT",
              "INTERNSHIP_CERTIFICATE",
              "ENROLLMENT_CERTIFICATE",
              "PROOF_OF_RESIDENCE",
              "INTERVIEW",
              "FOLLOW_UP",
              "OTHER"
            ],
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "title",
          "originalName",
          "id",
          "type",
          "createdAt",
          "updatedAt"
        ],
        "type": "object"
      },
      "PartnerStudentMatchingOfferDTO": {
        "properties": {
          "hasApplied": {
            "type": "boolean"
          },
          "job": {
            "$ref": "#/components/schemas/PartnerMatchingJobDTO"
          },
          "score": {
            "description": "Global score combining the three criteria, 0 to 1.",
            "type": "number"
          },
          "scores": {
            "$ref": "#/components/schemas/PartnerMatchingScoresDTO"
          }
        },
        "required": [
          "job",
          "score",
          "scores",
          "hasApplied"
        ],
        "type": "object"
      },
      "PartnerTaskCreationResultDTO": {
        "properties": {
          "errors": {
            "description": "Why the task was not created, e.g. `contact_not_found: jane@acme.io`",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "id": {
            "description": "ID of the created task",
            "type": "string"
          },
          "index": {
            "description": "Position of the task in the request",
            "type": "number"
          }
        },
        "required": [
          "index"
        ],
        "type": "object"
      },
      "PartnerTaskDTO": {
        "properties": {
          "assignedAdmins": {
            "items": {
              "$ref": "#/components/schemas/PartnerTaskPersonRefDTO"
            },
            "type": "array"
          },
          "contacts": {
            "items": {
              "$ref": "#/components/schemas/PartnerTaskPersonRefDTO"
            },
            "type": "array"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "$ref": "#/components/schemas/PartnerTaskPersonRefDTO"
          },
          "dateTime": {
            "description": "Due date",
            "format": "date-time",
            "type": "string"
          },
          "doneAt": {
            "description": "Completion date of a FINISHED task",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "enterprises": {
            "items": {
              "$ref": "#/components/schemas/PartnerTaskEnterpriseRefDTO"
            },
            "type": "array"
          },
          "id": {
            "type": "string"
          },
          "isLate": {
            "description": "TODO task past its due date",
            "type": "boolean"
          },
          "note": {
            "type": "string"
          },
          "opportunities": {
            "items": {
              "$ref": "#/components/schemas/PartnerTaskOpportunityRefDTO"
            },
            "type": "array"
          },
          "reminder": {
            "type": "boolean"
          },
          "reminderSent": {
            "type": "boolean"
          },
          "status": {
            "enum": [
              "TODO",
              "FINISHED"
            ],
            "type": "string"
          },
          "students": {
            "items": {
              "$ref": "#/components/schemas/PartnerTaskPersonRefDTO"
            },
            "type": "array"
          },
          "title": {
            "type": "string"
          },
          "type": {
            "enum": [
              "WORKSHOP_CV",
              "WORKSHOP_LETTER",
              "WORKSHOP_JOB_SEEKING",
              "WORKSHOP_INTERVIEW",
              "OTHER",
              "JOB_SEARCH_SUPPORT",
              "TODO",
              "CONTACT_PHONE",
              "CONTACT_EMAIL",
              "PROFESSIONAL_PLACING",
              "MEETING"
            ],
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "type",
          "status",
          "dateTime",
          "isLate",
          "id",
          "title",
          "reminder",
          "reminderSent",
          "createdAt",
          "updatedAt"
        ],
        "type": "object"
      },
      "PartnerTaskEnterpriseRefDTO": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "siret": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "PartnerTaskOpportunityRefDTO": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "PartnerTaskPersonRefDTO": {
        "properties": {
          "email": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "PartnerTasksResponse": {
        "properties": {
          "metadata": {
            "$ref": "#/components/schemas/Pagination"
          },
          "tasks": {
            "items": {
              "$ref": "#/components/schemas/PartnerTaskDTO"
            },
            "type": "array"
          }
        },
        "required": [
          "tasks",
          "metadata"
        ],
        "type": "object"
      },
      "PartnerUpdateAdmissionApplicationRequest": {
        "properties": {
          "admissionFileStatus": {
            "description": "Review state of the admission file.",
            "enum": [
              "pending",
              "validated",
              "incomplete"
            ],
            "type": "string"
          },
          "comment": {
            "description": "Note on the application (« note de candidature » in the interface). Replaces the current one; `null` or an empty string clears it.",
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "PartnerUpdateLegalGuardianRequest": {
        "properties": {
          "email": {
            "format": "email",
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "isPrimary": {
            "description": "Makes this guardian the primary one; the previous primary guardian is demoted. The first guardian of a student is always primary.",
            "type": "boolean"
          },
          "lastName": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "relationship": {
            "description": "Relationship to the student.",
            "enum": [
              "father",
              "mother",
              "legal_tutor",
              "other"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "PipelineOutput": {
        "properties": {
          "admissionStatuses": {
            "items": {
              "$ref": "#/components/schemas/AdmissionStatusOutput"
            },
            "type": "array"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "admissionStatuses"
        ],
        "type": "object"
      },
      "ProgramOutput": {
        "properties": {
          "admissionFileTemplate": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PartnerAdmissionFileTemplateRef"
              }
            ],
            "description": "Admission file template the program requests from its\napplicants (documents and information to provide). Absent when the program requests no admission\nfile. Read-only."
          },
          "defaultContractType": {
            "enum": [
              "PROFESSIONAL_CONTRACT",
              "APPRENTICESHIP",
              "INTERNSHIP"
            ],
            "type": "string"
          },
          "defaultScolarship": {
            "enum": [
              "INITIAL",
              "ALTERNANCE"
            ],
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "pipelineId": {
            "type": "string"
          },
          "reference": {
            "type": "string"
          },
          "years": {
            "items": {
              "$ref": "#/components/schemas/YearOutput"
            },
            "type": "array"
          }
        },
        "required": [
          "id",
          "name",
          "years",
          "reference",
          "pipelineId"
        ],
        "type": "object"
      },
      "ReferentsRequest": {
        "properties": {
          "referents": {
            "description": "Referent coaches, each identified by the coach email or ID.",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "referents"
        ],
        "type": "object"
      },
      "RemoveTagsRequest": {
        "properties": {
          "names": {
            "description": "Tag labels to remove",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "tagIds": {
            "description": "Tag IDs to remove",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "ReorderCustomFieldDefinitionsRequest": {
        "properties": {
          "ids": {
            "description": "Every active field of the object, in the wanted order.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array",
            "uniqueItems": true
          },
          "target": {
            "enum": [
              "student",
              "student_year",
              "contact",
              "enterprise"
            ],
            "type": "string"
          }
        },
        "required": [
          "target",
          "ids"
        ],
        "type": "object"
      },
      "ResumeOutput": {
        "properties": {
          "id": {
            "type": "string"
          },
          "revisionStatus": {
            "enum": [
              "VALIDATED",
              "PENDING"
            ],
            "type": "string"
          },
          "uploadedFromAPI": {
            "type": "boolean"
          },
          "url": {
            "type": "string"
          },
          "validatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "uploadedFromAPI"
        ],
        "type": "object"
      },
      "SectorDTO": {
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "label"
        ],
        "type": "object"
      },
      "StudentAdmissionApplicationOutput": {
        "description": "One student applying to one program. Replaces `StudentYearOutput`, which carries the same payload under the former name of the resource.",
        "properties": {
          "acquisitionLeadId": {
            "description": "Read-only: the lead that created this application (never written by the API).",
            "nullable": true,
            "type": "string"
          },
          "acquisitionValue": {
            "description": "Read-only: pushed via `PATCH /student-years/{id}/acquisition`, never via this endpoint.",
            "nullable": true,
            "type": "number"
          },
          "acquisitionValueUpdatedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "applicationValue": {
            "description": "Read-only: the application's own base value (training × year), distinct from\n`acquisitionValue` and never written by the API.",
            "nullable": true,
            "type": "number"
          },
          "campus": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CampusRefOutput"
              }
            ],
            "description": "Campus hosting the program"
          },
          "class": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ClassRefOutput"
              }
            ],
            "description": "Program the student applies to (called `class` here for backward compatibility)"
          },
          "degree": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DegreeRefOutput"
              }
            ],
            "description": "Degree prepared by the program"
          },
          "fbclid": {
            "description": "Read-only: promoted from the creating lead's tracking (never written by the API).",
            "nullable": true,
            "type": "string"
          },
          "gclid": {
            "description": "Read-only: promoted from the creating lead's tracking (never written by the API).",
            "nullable": true,
            "type": "string"
          },
          "graduationYear": {
            "description": "Year the student graduates, when known",
            "type": "number"
          },
          "hiringAt": {
            "description": "When the student was hired, for a work-linked training",
            "format": "date-time",
            "type": "string"
          },
          "hiringEnterprise": {
            "$ref": "#/components/schemas/StudentHiringEnterpriseDTO"
          },
          "hiringJobTitle": {
            "type": "string"
          },
          "hirings": {
            "description": "Every recruitment attached to the application, the cancelled ones included",
            "items": {
              "$ref": "#/components/schemas/StudentHiringOutput"
            },
            "type": "array"
          },
          "id": {
            "description": "Unique ID of the admission application",
            "type": "string"
          },
          "year": {
            "allOf": [
              {
                "$ref": "#/components/schemas/YearRefOutput"
              }
            ],
            "description": "Academic year of the application"
          }
        },
        "required": [
          "id",
          "hirings",
          "acquisitionLeadId",
          "gclid",
          "fbclid",
          "acquisitionValue",
          "acquisitionValueUpdatedAt",
          "applicationValue"
        ],
        "type": "object"
      },
      "StudentApplicationOutput": {
        "properties": {
          "creationDate": {
            "type": "string"
          },
          "currentStep": {
            "type": "string"
          },
          "enterprise": {
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "id",
              "name"
            ],
            "type": "object"
          },
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "currentStep",
          "creationDate"
        ],
        "type": "object"
      },
      "StudentContactOutput": {
        "properties": {
          "email": {
            "type": "string"
          },
          "enterprise": {
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "id",
              "name"
            ],
            "type": "object"
          },
          "fullName": {
            "type": "string"
          },
          "id": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "fullName"
        ],
        "type": "object"
      },
      "StudentDTO": {
        "properties": {
          "email": {
            "type": "string"
          },
          "externalId": {
            "type": "string"
          },
          "fullName": {
            "type": "string"
          },
          "id": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "fullName",
          "email",
          "externalId"
        ],
        "type": "object"
      },
      "StudentDetailsOutput": {
        "properties": {
          "CVs": {
            "items": {
              "$ref": "#/components/schemas/ResumeOutput"
            },
            "type": "array"
          },
          "admissionApplications": {
            "description": "Admission applications of the student, one per program applied to.",
            "items": {
              "$ref": "#/components/schemas/StudentAdmissionApplicationOutput"
            },
            "type": "array"
          },
          "applications": {
            "items": {
              "$ref": "#/components/schemas/StudentApplicationOutput"
            },
            "type": "array"
          },
          "campus": {
            "$ref": "#/components/schemas/CampusRefOutput"
          },
          "class": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ClassRefOutput"
              }
            ],
            "description": "Program the student is enrolled in (called `class` here for backward compatibility)"
          },
          "contacts": {
            "items": {
              "$ref": "#/components/schemas/StudentContactOutput"
            },
            "type": "array"
          },
          "courtesyTitle": {
            "description": "Civility: `mr` (Monsieur) or `ms` (Madame); absent when not set.",
            "enum": [
              "mr",
              "ms"
            ],
            "type": "string"
          },
          "currentSchool": {
            "description": "Current school or establishment (free text).",
            "type": "string"
          },
          "currentSituation": {
            "description": "Current situation of the student.",
            "enum": [
              "studying",
              "career_change",
              "unemployed",
              "employed",
              "other"
            ],
            "type": "string"
          },
          "currentStudyLevel": {
            "description": "Current study level: `PROFESSIONNAL`, `A_0` (bac), `A_2` (bac+2), `A_3` (licence), `A_4` (bac+4), `A_5` (master), `PHD`.",
            "enum": [
              "PROFESSIONNAL",
              "A_0",
              "A_2",
              "A_3",
              "A_4",
              "A_5",
              "PHD"
            ],
            "type": "string"
          },
          "customFields": {
            "additionalProperties": true,
            "description": "Custom fields of the record, keyed by slug. Always an object, empty when no value is set.",
            "example": {
              "boursier": true,
              "dossier_opco": "AT-2026-1234",
              "financeur": "OPCO Atlas"
            },
            "type": "object"
          },
          "cvUrl": {
            "type": "string"
          },
          "dateOfBirth": {
            "format": "date-time",
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "enterprise": {
            "items": {
              "$ref": "#/components/schemas/StudentEnterpriseOutput"
            },
            "type": "array"
          },
          "enterpriseName": {
            "type": "string"
          },
          "externalId": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "hasRegistered": {
            "type": "boolean"
          },
          "hiringAt": {
            "format": "date-time",
            "type": "string"
          },
          "hiringEnterprise": {
            "$ref": "#/components/schemas/StudentHiringEnterpriseDTO"
          },
          "id": {
            "type": "string"
          },
          "inDisabilitySituation": {
            "description": "In a situation of disability.",
            "type": "boolean"
          },
          "jobSearchLocation": {
            "allOf": [
              {
                "$ref": "#/components/schemas/LocationOutput"
              }
            ],
            "deprecated": true,
            "description": "Deprecated: use `jobSearchZones`. The first of them, kept for backward compatibility."
          },
          "jobSearchZones": {
            "description": "Areas where the student looks for a job.",
            "items": {
              "$ref": "#/components/schemas/JobSearchOutput"
            },
            "type": "array"
          },
          "lastConnection": {
            "format": "date-time",
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "leads": {
            "description": "Every lead that brought this student in, most recent last — never truncated.",
            "items": {
              "$ref": "#/components/schemas/StudentLeadOutput"
            },
            "type": "array"
          },
          "legalGuardians": {
            "items": {
              "$ref": "#/components/schemas/LegalGuardianOutput"
            },
            "type": "array"
          },
          "linkedInUrl": {
            "type": "string"
          },
          "location": {
            "$ref": "#/components/schemas/LocationOutput"
          },
          "phone": {
            "type": "string"
          },
          "placedInEnterprise": {
            "type": "boolean"
          },
          "portfolio": {
            "type": "string"
          },
          "professionnelProject": {
            "type": "string"
          },
          "profileCompletion": {
            "type": "number"
          },
          "rqth": {
            "description": "Recognised as a disabled worker (RQTH).",
            "type": "boolean"
          },
          "state": {
            "enum": [
              "CREATED",
              "ACTIVE",
              "INVITED",
              "UNACTIVE",
              "PENDING",
              "REFUSED"
            ],
            "type": "string"
          },
          "studentYears": {
            "deprecated": true,
            "description": "Deprecated: use `admissionApplications` instead, which carries the same payload under the current name of the resource. Kept as released for backward compatibility.",
            "items": {
              "$ref": "#/components/schemas/StudentYearOutput"
            },
            "type": "array"
          },
          "studyProject": {
            "description": "Study project (free text), distinct from the professional project.",
            "type": "string"
          },
          "tags": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "videoResume": {
            "type": "string"
          },
          "workSituation": {
            "enum": [
              "to place",
              "opportunity",
              "placed"
            ],
            "type": "string"
          },
          "year": {
            "$ref": "#/components/schemas/YearRefOutput"
          }
        },
        "required": [
          "jobSearchZones",
          "admissionApplications",
          "studentYears",
          "customFields",
          "id",
          "firstName",
          "lastName",
          "email",
          "placedInEnterprise",
          "hasRegistered",
          "state",
          "profileCompletion",
          "tags",
          "legalGuardians",
          "applications",
          "contacts",
          "enterprise",
          "leads"
        ],
        "type": "object"
      },
      "StudentEnterpriseOutput": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "StudentHiringEnterpriseDTO": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "siret": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "StudentHiringOutput": {
        "properties": {
          "canceledAt": {
            "format": "date-time",
            "type": "string"
          },
          "canceledReason": {
            "enum": [
              "TRIAL_PERIOD",
              "RESIGNATION",
              "EMPLOYER_TERMINATION",
              "TRAINING_DROPOUT",
              "REORIENTATION",
              "OTHER"
            ],
            "type": "string"
          },
          "canceledReasonDetail": {
            "type": "string"
          },
          "contractType": {
            "enum": [
              "FIXED_TERM_CONTRACT",
              "PERMANENT_CONTRACT",
              "PART_TIME",
              "INTERNSHIP",
              "SEASONAL",
              "WORK_LINKED_TRAINING",
              "VOLUNTEER",
              "CIVIC_SERVICE",
              "OTHER"
            ],
            "type": "string"
          },
          "enterprise": {
            "$ref": "#/components/schemas/StudentHiringEnterpriseDTO"
          },
          "hiringAt": {
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "jobTitle": {
            "type": "string"
          },
          "status": {
            "enum": [
              "IN_PROGRESS",
              "FINISHED",
              "CANCELED"
            ],
            "type": "string"
          }
        },
        "required": [
          "id",
          "status",
          "jobTitle",
          "contractType",
          "hiringAt"
        ],
        "type": "object"
      },
      "StudentIdDTO": {
        "properties": {
          "id": {
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "StudentLeadOutput": {
        "properties": {
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "form": {
            "description": "Mode technique de création du lead — distinct du canal d'entrée (`tracking.channel`).",
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "resolvedAcquisitionSourceDetail": {
            "type": "object"
          },
          "resolvedAdmissionSource": {
            "type": "object"
          },
          "source": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "tracking": {
            "$ref": "#/components/schemas/PartnerLeadTrackingOutput"
          }
        },
        "required": [
          "id",
          "createdAt",
          "form",
          "source",
          "tracking",
          "resolvedAdmissionSource",
          "resolvedAcquisitionSourceDetail"
        ],
        "type": "object"
      },
      "StudentListItemOutput": {
        "properties": {
          "CVs": {
            "items": {
              "$ref": "#/components/schemas/ResumeOutput"
            },
            "type": "array"
          },
          "admissionApplications": {
            "description": "Admission applications of the student, one per program applied to.",
            "items": {
              "$ref": "#/components/schemas/StudentAdmissionApplicationOutput"
            },
            "type": "array"
          },
          "campus": {
            "$ref": "#/components/schemas/CampusRefOutput"
          },
          "class": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ClassRefOutput"
              }
            ],
            "description": "Program the student is enrolled in (called `class` here for backward compatibility)"
          },
          "courtesyTitle": {
            "description": "Civility: `mr` (Monsieur) or `ms` (Madame); absent when not set.",
            "enum": [
              "mr",
              "ms"
            ],
            "type": "string"
          },
          "currentSchool": {
            "description": "Current school or establishment (free text).",
            "type": "string"
          },
          "currentSituation": {
            "description": "Current situation of the student.",
            "enum": [
              "studying",
              "career_change",
              "unemployed",
              "employed",
              "other"
            ],
            "type": "string"
          },
          "currentStudyLevel": {
            "description": "Current study level: `PROFESSIONNAL`, `A_0` (bac), `A_2` (bac+2), `A_3` (licence), `A_4` (bac+4), `A_5` (master), `PHD`.",
            "enum": [
              "PROFESSIONNAL",
              "A_0",
              "A_2",
              "A_3",
              "A_4",
              "A_5",
              "PHD"
            ],
            "type": "string"
          },
          "customFields": {
            "additionalProperties": true,
            "description": "Custom fields of the record, keyed by slug. Always an object, empty when no value is set.",
            "example": {
              "boursier": true,
              "dossier_opco": "AT-2026-1234",
              "financeur": "OPCO Atlas"
            },
            "type": "object"
          },
          "cvUrl": {
            "type": "string"
          },
          "dateOfBirth": {
            "format": "date-time",
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "enterpriseName": {
            "type": "string"
          },
          "externalId": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "hasRegistered": {
            "type": "boolean"
          },
          "hiringAt": {
            "format": "date-time",
            "type": "string"
          },
          "hiringEnterprise": {
            "$ref": "#/components/schemas/StudentHiringEnterpriseDTO"
          },
          "id": {
            "type": "string"
          },
          "inDisabilitySituation": {
            "description": "In a situation of disability.",
            "type": "boolean"
          },
          "jobSearchLocation": {
            "allOf": [
              {
                "$ref": "#/components/schemas/LocationOutput"
              }
            ],
            "deprecated": true,
            "description": "Deprecated: use `jobSearchZones`. The first of them, kept for backward compatibility."
          },
          "jobSearchZones": {
            "description": "Areas where the student looks for a job.",
            "items": {
              "$ref": "#/components/schemas/JobSearchOutput"
            },
            "type": "array"
          },
          "lastName": {
            "type": "string"
          },
          "legalGuardians": {
            "items": {
              "$ref": "#/components/schemas/LegalGuardianOutput"
            },
            "type": "array"
          },
          "linkedInUrl": {
            "type": "string"
          },
          "location": {
            "$ref": "#/components/schemas/LocationOutput"
          },
          "phone": {
            "type": "string"
          },
          "placedInEnterprise": {
            "type": "boolean"
          },
          "portfolio": {
            "type": "string"
          },
          "profileCompletion": {
            "type": "number"
          },
          "rqth": {
            "description": "Recognised as a disabled worker (RQTH).",
            "type": "boolean"
          },
          "state": {
            "enum": [
              "CREATED",
              "ACTIVE",
              "INVITED",
              "UNACTIVE",
              "PENDING",
              "REFUSED"
            ],
            "type": "string"
          },
          "studentYears": {
            "deprecated": true,
            "description": "Deprecated: use `admissionApplications` instead, which carries the same payload under the current name of the resource. Kept as released for backward compatibility.",
            "items": {
              "$ref": "#/components/schemas/StudentYearOutput"
            },
            "type": "array"
          },
          "studyProject": {
            "description": "Study project (free text), distinct from the professional project.",
            "type": "string"
          },
          "tags": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "videoResume": {
            "type": "string"
          },
          "workSituation": {
            "enum": [
              "to place",
              "opportunity",
              "placed"
            ],
            "type": "string"
          },
          "year": {
            "$ref": "#/components/schemas/YearRefOutput"
          }
        },
        "required": [
          "jobSearchZones",
          "admissionApplications",
          "studentYears",
          "customFields",
          "id",
          "firstName",
          "lastName",
          "email",
          "placedInEnterprise",
          "hasRegistered",
          "state",
          "profileCompletion",
          "tags",
          "legalGuardians"
        ],
        "type": "object"
      },
      "StudentRefDTO": {
        "properties": {
          "email": {
            "type": "string"
          },
          "fullName": {
            "type": "string"
          },
          "id": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "fullName",
          "email"
        ],
        "type": "object"
      },
      "StudentYearOutput": {
        "description": "Deprecated: an admission application under its former name of *student year*. Same payload as `StudentAdmissionApplicationOutput`, kept as released for backward compatibility.",
        "properties": {
          "campus": {
            "$ref": "#/components/schemas/CampusRefOutput"
          },
          "class": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ClassRefOutput"
              }
            ],
            "description": "Program the student is enrolled in (called `class` here for backward compatibility)"
          },
          "degree": {
            "$ref": "#/components/schemas/DegreeRefOutput"
          },
          "graduationYear": {
            "type": "number"
          },
          "hiringAt": {
            "format": "date-time",
            "type": "string"
          },
          "hiringEnterprise": {
            "$ref": "#/components/schemas/StudentHiringEnterpriseDTO"
          },
          "hiringJobTitle": {
            "type": "string"
          },
          "hirings": {
            "items": {
              "$ref": "#/components/schemas/StudentHiringOutput"
            },
            "type": "array"
          },
          "id": {
            "type": "string"
          },
          "year": {
            "$ref": "#/components/schemas/YearRefOutput"
          }
        },
        "required": [
          "id",
          "hirings"
        ],
        "type": "object"
      },
      "TagIdsRequest": {
        "properties": {
          "tagIds": {
            "description": "Tag IDs to assign. Send [] to clear all tags.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "tagIds"
        ],
        "type": "object"
      },
      "TagLabelRequest": {
        "properties": {
          "label": {
            "description": "Tag label",
            "type": "string"
          }
        },
        "required": [
          "label"
        ],
        "type": "object"
      },
      "TagOutput": {
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "label"
        ],
        "type": "object"
      },
      "UpdateAcquisitionValueRequest": {
        "properties": {
          "currency": {
            "description": "Only \"EUR\" is accepted today; any other value is rejected (400 INVALID_CURRENCY).",
            "example": "EUR",
            "type": "string"
          },
          "value": {
            "description": "Valeur d'acquisition, en unité majeure (euros).",
            "minimum": 0,
            "type": "number"
          }
        },
        "required": [
          "value",
          "currency"
        ],
        "type": "object"
      },
      "UpdateAcquisitionValueResponse": {
        "properties": {
          "acquisitionLeadId": {
            "nullable": true,
            "type": "string"
          },
          "acquisitionValue": {
            "type": "number"
          },
          "acquisitionValueUpdatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "applicationValue": {
            "nullable": true,
            "type": "number"
          },
          "currentAdmissionStatus": {
            "nullable": true,
            "type": "string"
          },
          "currentAdmissionStatusAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "fbclid": {
            "nullable": true,
            "type": "string"
          },
          "gclid": {
            "nullable": true,
            "type": "string"
          },
          "studentYearId": {
            "type": "string"
          }
        },
        "required": [
          "studentYearId",
          "acquisitionLeadId",
          "gclid",
          "fbclid",
          "acquisitionValue",
          "acquisitionValueUpdatedAt",
          "applicationValue",
          "currentAdmissionStatus",
          "currentAdmissionStatusAt"
        ],
        "type": "object"
      },
      "UpdateClassRequest": {
        "properties": {
          "coaches": {
            "description": "Emails des coaches à assigner au programme (remplace la liste existante)",
            "items": {
              "format": "email",
              "type": "string"
            },
            "type": "array"
          },
          "degreeId": {
            "description": "Identifiant du diplôme préparé",
            "type": "string"
          },
          "name": {
            "description": "Nouveau nom du programme",
            "type": "string"
          },
          "reference": {
            "description": "Nouvelle référence interne (doit être unique au sein du campus)",
            "type": "string"
          },
          "sectorIds": {
            "description": "Nouveaux identifiants des secteurs d'activité",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "UpdateCustomFieldDefinitionRequest": {
        "properties": {
          "helpText": {
            "maxLength": 500,
            "nullable": true,
            "type": "string"
          },
          "label": {
            "maxLength": 120,
            "type": "string"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/CustomFieldOptionInputRequest"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "UpdateOfferCampusPrivacyRequest": {
        "properties": {
          "campusId": {
            "type": "string"
          },
          "privacy": {
            "enum": [
              "internal",
              "private",
              "exclusive"
            ],
            "type": "string"
          },
          "privateTo": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "campusId",
          "privacy",
          "privateTo"
        ],
        "type": "object"
      },
      "UpdateOfferRequest": {
        "properties": {
          "annualGrossSalary": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "attachment": {
            "type": "string"
          },
          "campusPrivacies": {
            "items": {
              "$ref": "#/components/schemas/UpdateOfferCampusPrivacyRequest"
            },
            "type": "array"
          },
          "contractType": {
            "example": [
              "FIXED_TERM_CONTRACT",
              "PERMANENT_CONTRACT",
              "PART_TIME",
              "INTERNSHIP",
              "SEASONAL",
              "WORK_LINKED_TRAINING",
              "VOLUNTEER",
              "OTHER"
            ],
            "items": {
              "enum": [
                "FIXED_TERM_CONTRACT",
                "PERMANENT_CONTRACT",
                "PART_TIME",
                "INTERNSHIP",
                "SEASONAL",
                "WORK_LINKED_TRAINING",
                "VOLUNTEER",
                "CIVIC_SERVICE",
                "OTHER"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "description": {
            "type": "string"
          },
          "durationInMonths": {
            "type": "number"
          },
          "emails": {
            "description": "Required when `url` is absent (quick apply). Omit or leave empty when using external `url`.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "enterpriseIndustry": {
            "example": [
              "agriculture",
              "association_ngo",
              "banking_insurance_finance",
              "construction",
              "distribution_business",
              "education",
              "hotel_catering_tourism",
              "real_estate",
              "aerospace_defense",
              "food_industry",
              "automotive_industrie",
              "telecom",
              "manufacturing_industry",
              "pharmaceutical_industry",
              "marketing_communication",
              "health",
              "energy_sector",
              "software",
              "public_sector_administration",
              "business_services",
              "personnal_service",
              "transport_logistics",
              "other"
            ],
            "type": "string"
          },
          "enterpriseName": {
            "type": "string"
          },
          "expireDate": {
            "format": "date-time",
            "type": "string"
          },
          "externalId": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "levels": {
            "example": [
              "PROFESSIONNAL",
              "A_0",
              "A_2",
              "A_3",
              "A_4",
              "A_5",
              "PHD"
            ],
            "items": {
              "enum": [
                "PROFESSIONNAL",
                "A_0",
                "A_2",
                "A_3",
                "A_4",
                "A_5",
                "PHD"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "logo": {
            "type": "string"
          },
          "messageRequired": {
            "type": "boolean"
          },
          "place": {
            "type": "string"
          },
          "remoteJob": {
            "example": [
              "none",
              "partial",
              "total"
            ],
            "type": "string"
          },
          "skills": {
            "example": [
              "FEEDBACK",
              "ADAPTATION",
              "INNOVATION",
              "CLARITY_SIMPLICITY",
              "VERBAL_COMMUNICATION",
              "CREATIVITY",
              "ACTIVE_LISTENNING",
              "COMFORTABLE_NUMBER",
              "CRITICAL_MIND",
              "DYNAMIC",
              "FIABILITY",
              "MANAGEMENT_TIME",
              "HONEST",
              "LEADERSHIP",
              "CUSTOMER_ORIENTED",
              "PERSUASION",
              "SPEAKING_PUBLIC",
              "THINK_OUTSIDE",
              "PROBLEM_SOLVING",
              "KNOW_WHITE",
              "MANAGEMENT_STRESS",
              "TEAM_WORK"
            ],
            "items": {
              "enum": [
                "FEEDBACK",
                "ADAPTATION",
                "INNOVATION",
                "CLARITY_SIMPLICITY",
                "VERBAL_COMMUNICATION",
                "CREATIVITY",
                "ACTIVE_LISTENNING",
                "COMFORTABLE_NUMBER",
                "CRITICAL_MIND",
                "DYNAMIC",
                "FIABILITY",
                "MANAGEMENT_TIME",
                "HONEST",
                "LEADERSHIP",
                "CUSTOMER_ORIENTED",
                "PERSUASION",
                "SPEAKING_PUBLIC",
                "THINK_OUTSIDE",
                "PROBLEM_SOLVING",
                "KNOW_WHITE",
                "MANAGEMENT_STRESS",
                "TEAM_WORK"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "startingDate": {
            "format": "date-time",
            "type": "string"
          },
          "tagIds": {
            "description": "Replace all tags by ID. Send [] to clear.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "description": "Required when `emails` is absent or empty (apply on external URL). Omit when using `emails`.",
            "type": "string"
          },
          "user": {
            "type": "object"
          }
        },
        "required": [
          "contractType",
          "id",
          "user",
          "title",
          "description",
          "expireDate",
          "enterpriseName"
        ],
        "type": "object"
      },
      "UpdatePartnerEnterpriseRequest": {
        "properties": {
          "collectiveAgreementCode": {
            "description": "Collective agreement (IDCC) code. Send null to clear the manual selection.",
            "nullable": true,
            "type": "string"
          },
          "customFields": {
            "additionalProperties": true,
            "description": "Custom fields to merge, keyed by slug (^[a-z0-9_]{1,64}$). Values are strings (max 2000 chars), numbers, booleans or arrays of those. Only the keys sent are written; a null value deletes the key. At most 50 keys per record. Invalid payloads are rejected with a 422. Definitions only control how Grimp displays a key (label, type, choices) and never limit the keys the partner API accepts. The admin interface endpoint is stricter: it only accepts keys with an active definition and a value matching its type. For a multiple choice field, send an array of choice values.",
            "example": {
              "boursier": true,
              "dossier_opco": "AT-2026-1234",
              "financeur": "OPCO Atlas"
            },
            "type": "object"
          },
          "domain": {
            "type": "string"
          },
          "industry": {
            "type": "string"
          },
          "linkedInUrl": {
            "type": "string"
          },
          "logo": {
            "description": "Logo URL",
            "type": "string"
          },
          "nafCode": {
            "description": "NAF/APE code. Send null to clear the manual selection.",
            "nullable": true,
            "type": "string"
          },
          "name": {
            "description": "Legal name of the enterprise",
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "siret": {
            "description": "SIRET (14 digits) or SIREN (9 digits). Separators are stripped.",
            "type": "string"
          },
          "tradeName": {
            "description": "Trade name (nom commercial)",
            "type": "string"
          },
          "visibilityMode": {
            "enum": [
              "PRIVATE",
              "SHARED"
            ],
            "type": "string"
          },
          "website": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "UpdatePartnerOpportunityRequest": {
        "properties": {
          "enterpriseId": {
            "format": "uuid",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "stageId": {
            "format": "uuid",
            "type": "string"
          },
          "status": {
            "enum": [
              "IDENTIFIED",
              "QUALIFIED",
              "ENGAGED",
              "WON",
              "LOST"
            ],
            "type": "string"
          },
          "targetDate": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "type": {
            "enum": [
              "MANDATE",
              "CONTINUING_EDUCATION",
              "PARTNERSHIP",
              "APPRENTICESHIP_TAX",
              "OTHER"
            ],
            "type": "string"
          },
          "value": {
            "nullable": true,
            "type": "number"
          }
        },
        "type": "object"
      },
      "UpdatePartnerProgramRequest": {
        "properties": {
          "coaches": {
            "description": "Emails of the administrators assigned to the program, replacing the current ones",
            "items": {
              "format": "email",
              "type": "string"
            },
            "type": "array"
          },
          "defaultContractType": {
            "description": "Education contract type pre-filled on the students joining the program",
            "enum": [
              "PROFESSIONAL_CONTRACT",
              "APPRENTICESHIP",
              "INTERNSHIP"
            ],
            "type": "string"
          },
          "defaultScolarship": {
            "description": "Schooling type pre-filled on the students joining the program",
            "enum": [
              "INITIAL",
              "ALTERNANCE"
            ],
            "type": "string"
          },
          "degreeId": {
            "description": "ID of the degree prepared",
            "type": "string"
          },
          "name": {
            "description": "New name of the program",
            "type": "string"
          },
          "pipelineId": {
            "description": "ID of the admission pipeline the program follows. Every student of the program is moved to the first step of the new pipeline.",
            "type": "string"
          },
          "reference": {
            "description": "Your own identifier for the program, unique per campus",
            "type": "string"
          },
          "sectorIds": {
            "description": "IDs of the sectors covered by the program, replacing the current ones",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "UpdatePartnerTaskRequest": {
        "properties": {
          "assignedAdminEmails": {
            "description": "Administrators assigned to the task, by email",
            "items": {
              "format": "email",
              "type": "string"
            },
            "type": "array"
          },
          "assignedAdminIds": {
            "description": "Administrators assigned to the task, by ID",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "contactEmails": {
            "description": "CRM contacts, by email",
            "items": {
              "format": "email",
              "type": "string"
            },
            "type": "array"
          },
          "contactIds": {
            "description": "CRM contacts, by ID",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "createdByEmail": {
            "description": "Email of the administrator who owns the task",
            "format": "email",
            "type": "string"
          },
          "dateTime": {
            "description": "Due date of the task (ISO 8601)",
            "type": "string"
          },
          "doneAt": {
            "description": "Completion date (ISO 8601) of a FINISHED task. Ignored for a TODO task.",
            "type": "string"
          },
          "enterpriseIds": {
            "description": "Enterprises, by ID",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "enterpriseSirets": {
            "description": "Enterprises, by SIRET or SIREN",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "note": {
            "description": "Free text note",
            "type": "string"
          },
          "opportunityIds": {
            "description": "Opportunities, by ID",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "reminder": {
            "description": "Email the creator a reminder the day before the due date. Ignored for a due date already past.",
            "type": "boolean"
          },
          "status": {
            "enum": [
              "TODO",
              "FINISHED"
            ],
            "type": "string"
          },
          "studentEmails": {
            "description": "Students, by email",
            "items": {
              "format": "email",
              "type": "string"
            },
            "type": "array"
          },
          "studentIds": {
            "description": "Students, by ID",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "title": {
            "description": "Title of the task",
            "type": "string"
          },
          "type": {
            "enum": [
              "WORKSHOP_CV",
              "WORKSHOP_LETTER",
              "WORKSHOP_JOB_SEEKING",
              "WORKSHOP_INTERVIEW",
              "OTHER",
              "JOB_SEARCH_SUPPORT",
              "TODO",
              "CONTACT_PHONE",
              "CONTACT_EMAIL",
              "PROFESSIONAL_PLACING",
              "MEETING"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "UpdateRequest": {
        "properties": {
          "campus": {
            "type": "string"
          },
          "class": {
            "description": "Program ID to move the student to (called `class` here for backward compatibility)",
            "type": "string"
          },
          "courtesyTitle": {
            "description": "Civility: `mr` (Monsieur) or `ms` (Madame). `null` clears it (« Non défini »).",
            "enum": [
              "mr",
              "ms"
            ],
            "nullable": true,
            "type": "string"
          },
          "currentSchool": {
            "description": "Current school or establishment (free text).",
            "type": "string"
          },
          "currentSituation": {
            "description": "Current situation of the student.",
            "enum": [
              "studying",
              "career_change",
              "unemployed",
              "employed",
              "other"
            ],
            "type": "string"
          },
          "currentStudyLevel": {
            "description": "Current study level: `PROFESSIONNAL`, `A_0` (bac), `A_2` (bac+2), `A_3` (licence), `A_4` (bac+4), `A_5` (master), `PHD`.",
            "enum": [
              "PROFESSIONNAL",
              "A_0",
              "A_2",
              "A_3",
              "A_4",
              "A_5",
              "PHD"
            ],
            "type": "string"
          },
          "customFields": {
            "additionalProperties": true,
            "description": "Custom fields to merge, keyed by slug (^[a-z0-9_]{1,64}$). Values are strings (max 2000 chars), numbers, booleans or arrays of those. Only the keys sent are written; a null value deletes the key. At most 50 keys per record. Invalid payloads are rejected with a 422. Definitions only control how Grimp displays a key (label, type, choices) and never limit the keys the partner API accepts. The admin interface endpoint is stricter: it only accepts keys with an active definition and a value matching its type. For a multiple choice field, send an array of choice values.",
            "example": {
              "boursier": true,
              "dossier_opco": "AT-2026-1234",
              "financeur": "OPCO Atlas"
            },
            "type": "object"
          },
          "dateOfBirth": {
            "format": "date-time",
            "type": "string"
          },
          "email": {
            "format": "email",
            "type": "string"
          },
          "enterpriseName": {
            "type": "string"
          },
          "externalId": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "inDisabilitySituation": {
            "description": "In a situation of disability. Same access rules as `rqth`.",
            "type": "boolean"
          },
          "interestedIn": {
            "items": {
              "enum": [
                "FIXED_TERM_CONTRACT",
                "PERMANENT_CONTRACT",
                "PART_TIME",
                "INTERNSHIP",
                "SEASONAL",
                "WORK_LINKED_TRAINING",
                "VOLUNTEER",
                "CIVIC_SERVICE",
                "OTHER"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "jobSearchLocation": {
            "allOf": [
              {
                "$ref": "#/components/schemas/LocationInputStudentUpdate"
              }
            ],
            "deprecated": true,
            "description": "Deprecated: use `jobSearchZones`. Replaces a single zone and keeps the others.",
            "example": {
              "address": "Paris"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/LocationInputStudentUpdate"
              }
            ]
          },
          "jobSearchZones": {
            "description": "Job search zones. Replaces the whole list; each zone takes coordinates or an address (a city or area name). An empty list removes every zone.",
            "items": {
              "$ref": "#/components/schemas/LocationInputStudentUpdate"
            },
            "type": "array"
          },
          "lastName": {
            "type": "string"
          },
          "linkedInUrl": {
            "type": "string"
          },
          "location": {
            "allOf": [
              {
                "$ref": "#/components/schemas/LocationInputStudentUpdate"
              }
            ],
            "example": {
              "latitude": 47.216671,
              "longitude": -1.55
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/LocationInputStudentUpdate"
              }
            ]
          },
          "phone": {
            "type": "string"
          },
          "portfolio": {
            "type": "string"
          },
          "professionnelProject": {
            "type": "string"
          },
          "referents": {
            "description": "Replace all referent coaches, each identified by the coach email or ID. Send [] to clear.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "rqth": {
            "description": "Recognised as a disabled worker (RQTH). Readable by the staff who see the student, writable by admins and coaches, as in the interface.",
            "type": "boolean"
          },
          "studyProject": {
            "description": "Study project (free text). Distinct from `professionnelProject`.",
            "type": "string"
          },
          "tags": {
            "description": "Replace all tags by label. Send [] to clear.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "videoResume": {
            "type": "string"
          },
          "workSituation": {
            "enum": [
              "to place",
              "opportunity",
              "placed"
            ],
            "type": "string"
          },
          "year": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "WebhookApplicationDTO": {
        "properties": {
          "conclusion": {
            "$ref": "#/components/schemas/WebhookConclusionDTO"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "currentStep": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "offer": {
            "$ref": "#/components/schemas/WebhookOfferDTO"
          },
          "resumeUrl": {
            "type": "string"
          },
          "student": {
            "$ref": "#/components/schemas/WebhookStudentDTO"
          }
        },
        "required": [
          "id",
          "currentStep",
          "createdAt",
          "student",
          "resumeUrl",
          "offer"
        ],
        "type": "object"
      },
      "WebhookConclusionDTO": {
        "properties": {
          "comment": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "status": {
            "enum": [
              "REFUSED",
              "ACCEPTED",
              "PENDING"
            ],
            "type": "string"
          }
        },
        "required": [
          "status",
          "reason",
          "comment"
        ],
        "type": "object"
      },
      "WebhookEventDTO": {
        "properties": {
          "event": {
            "type": "string"
          },
          "payload": {
            "$ref": "#/components/schemas/WebhookPayloadDTO"
          }
        },
        "required": [
          "payload",
          "event"
        ],
        "type": "object"
      },
      "WebhookOfferDTO": {
        "properties": {
          "attachment": {
            "type": "string"
          },
          "contractType": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "email": {
            "type": "string"
          },
          "enterpriseIndustry": {
            "type": "string"
          },
          "enterpriseName": {
            "type": "string"
          },
          "externalId": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "contractType"
        ],
        "type": "object"
      },
      "WebhookPayloadDTO": {
        "properties": {
          "data": {
            "$ref": "#/components/schemas/WebhookApplicationDTO"
          },
          "entityId": {
            "type": "string"
          },
          "user": {
            "$ref": "#/components/schemas/WebhookStudentUserDTO"
          }
        },
        "required": [
          "entityId",
          "data",
          "user"
        ],
        "type": "object"
      },
      "WebhookStudentDTO": {
        "properties": {
          "email": {
            "type": "string"
          },
          "externalId": {
            "type": "string"
          },
          "fullName": {
            "type": "string"
          },
          "id": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "fullName",
          "email",
          "externalId"
        ],
        "type": "object"
      },
      "WebhookStudentUserDTO": {
        "properties": {
          "email": {
            "type": "string"
          },
          "externalId": {
            "type": "string"
          },
          "fullName": {
            "type": "string"
          },
          "id": {
            "type": "string"
          }
        },
        "required": [
          "externalId",
          "id",
          "fullName",
          "email"
        ],
        "type": "object"
      },
      "WhoamiResponse": {
        "properties": {
          "campuses": {
            "description": "Campuses whose students, jobs and CRM records the caller sees",
            "items": {
              "$ref": "#/components/schemas/PartnerAdminCampusDTO"
            },
            "type": "array"
          },
          "email": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "permissions": {
            "description": "Read permissions resolved from the role and the admin's overrides; the endpoints guarded by a permission answer 403 without it.",
            "type": "object"
          },
          "programs": {
            "description": "Programs whose students and admission applications the caller sees",
            "items": {
              "$ref": "#/components/schemas/PartnerAdminProgramDTO"
            },
            "type": "array"
          },
          "role": {
            "enum": [
              "Admin",
              "Coach",
              "ReadOnly"
            ],
            "type": "string"
          },
          "school": {
            "$ref": "#/components/schemas/WhoamiSchoolDTO"
          }
        },
        "required": [
          "email",
          "id",
          "name",
          "role",
          "school",
          "permissions",
          "campuses",
          "programs"
        ],
        "type": "object"
      },
      "WhoamiSchoolDTO": {
        "properties": {
          "id": {
            "type": "string"
          },
          "mcpDataExposure": {
            "description": "Data the school lets the Grimp AI assistant (MCP) read. `recommended`: no contact details of students; `full`: also their email, phone, date of birth, LinkedIn profile and address. Applies to the assistant only, never to the other callers of this API.",
            "enum": [
              "recommended",
              "full"
            ],
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "mcpDataExposure"
        ],
        "type": "object"
      },
      "YearOutput": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "YearRefOutput": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      }
    },
    "securitySchemes": {
      "bearer": {
        "bearerFormat": "JWT",
        "description": "Get token from Administrator account on Grimp interface",
        "scheme": "bearer",
        "type": "http"
      }
    }
  },
  "info": {
    "contact": {
      "email": "florian@grimp.io",
      "name": "Grimp Team",
      "url": "https://www.grimp.io"
    },
    "description": "## Introduction\n\nL'API Partenaire Grimp Education donne à vos outils un accès programmatique aux données de\nvotre école sur Grimp : les étudiants et leur recherche d'emploi, les admissions, les offres,\nle CRM entreprises (entreprises, contacts, opportunités), les tâches et les référentiels\n(campus, programmes, tags, champs personnalisés).\n\nC'est une API REST en JSON, servie en HTTPS. Toutes les routes partagent une même URL de base :\n\n```\nhttps://api.grimp.io/partner/education/v1\n```\n\n### Démarrage rapide\n\n1. Dans Grimp, ouvrez **Paramètres → Intégrations → Tokens API** et créez un token. Choisissez\n   les ressources (et les campus) auxquelles il a accès.\n2. Vérifiez le token avec `GET /whoami` : la réponse indique à qui il appartient, l'école, et\n   les droits et campus qui bornent tous les autres appels.\n\n```bash\ncurl https://api.grimp.io/partner/education/v1/whoami \\\n  -H \"Authorization: Bearer $GRIMP_API_TOKEN\"\n```\n\n3. Parcourez les endpoints ci-dessous. Chaque opération a un bouton **Tester la requête** :\n   collez votre token une fois dans la partie *Authentification* et appelez l'API directement\n   depuis cette page.\n\n## Authentification\n\nEnvoyez votre token dans l'en-tête `Authorization` de chaque requête, en bearer token :\n\n```http\nAuthorization: Bearer <votre token>\n```\n\nUne requête sans token valide reçoit une réponse `403 Forbidden`.\n\n### Scopes\n\nUn token API d'école n'accède qu'aux ressources choisies à sa création. Chaque ressource est\naccordée en lecture (`read`) ou en écriture (`write`), sous la forme `ressource:accès` :\n\n| Ressource       | Couvre                                          |\n| --------------- | ----------------------------------------------- |\n| `students`      | Les étudiants, leur profil et leurs représentants légaux |\n| `alumni`        | Les alumni                                      |\n| `applications`  | Les candidatures des étudiants aux offres       |\n| `admissions`    | Les pipelines et candidatures d'admission       |\n| `jobs`          | Les offres et le matching                       |\n| `opportunities` | Les opportunités du CRM                         |\n| `enterprises`   | Les entreprises du CRM                          |\n| `contacts`      | Les contacts du CRM                             |\n| `leads`         | Les leads                                       |\n| `tasks`         | Les tâches                                      |\n| `catalog`       | Les campus, programmes, diplômes et secteurs    |\n| `settings`      | Les tags et champs personnalisés                |\n| `sms`           | L'envoi de SMS                                  |\n\nLes requêtes `GET`, `HEAD` et `OPTIONS` demandent l'accès `read` ; toutes les autres méthodes\ndemandent `write`. Un scope `write` accorde aussi `read`. Un appel hors des scopes du token\nreçoit une réponse `403 Forbidden` qui nomme le scope manquant, par exemple\n`Missing scope students:write`.\n\n### Restriction par campus\n\nUn token peut être restreint à certains campus. Il ne voit alors que les enregistrements de ces\ncampus : demander par son ID un enregistrement hors de ces campus renvoie `404 Not Found`,\nexactement comme pour un enregistrement qui n'existe pas.\n\n## Pagination\n\nLes endpoints de liste renvoient leurs résultats page par page : les enregistrements sous une\nclé au nom de la ressource (`students`, `jobs`…), à côté d'un objet `metadata` qui décrit la\npagination :\n\n```json\n{\n  \"metadata\": {\n    \"pageSize\": 50,\n    \"totalResults\": 1234,\n    \"currentPage\": 1,\n    \"totalPages\": 25\n  },\n  \"students\": []\n}\n```\n\nDemandez une page avec le paramètre de requête `page`. **Les pages commencent à 1.** Au-delà de\nla dernière page, la liste est simplement vide : parcourir `page` de `1` à `totalPages` ne\nrenvoie jamais deux fois le même enregistrement.\n\n```bash\ncurl \"https://api.grimp.io/partner/education/v1/students?page=2\" \\\n  -H \"Authorization: Bearer $GRIMP_API_TOKEN\"\n```\n\n### Ancienne pagination à partir de 0\n\nQuelques listes comptaient historiquement les pages à partir de 0. Les appels authentifiés avec\nl'ancien token administrateur gardent ce comportement jusqu'au **15 janvier 2027**, et leurs\nréponses portent les en-têtes standard `Deprecation` et `Sunset`. Ajoutez `pageBase=1` à ces\nappels pour passer dès maintenant aux pages à partir de 1. Les tokens API d'école et les tokens\nOAuth comptent toujours à partir de 1.\n\n## Erreurs et limites\n\nGrimp utilise les codes de statut HTTP habituels. Le corps d'une erreur contient toujours le\nstatut et un message lisible :\n\n```json\n{\n  \"statusCode\": 400,\n  \"message\": \"page must be a positive number\"\n}\n```\n\n| Statut | Signification                                                                   |\n| ------ | ------------------------------------------------------------------------------- |\n| `400`  | Requête invalide : un champ ne passe pas la validation, ou un paramètre de requête est inconnu |\n| `403`  | Token absent ou invalide, ou scope que le token ne détient pas                  |\n| `404`  | L'enregistrement n'existe pas, ou se trouve hors des campus du token            |\n| `429`  | Trop de requêtes : ralentissez et réessayez                                     |\n| `5xx`  | Un problème de notre côté : réessayez plus tard                                 |\n\nLes paramètres de requête sont stricts : un paramètre que l'endpoint ne déclare pas est refusé\navec une `400` qui liste les paramètres acceptés, au lieu d'être ignoré en silence.\n\n### Limite de débit\n\nL'API accepte jusqu'à **20 requêtes par seconde** depuis une même adresse IP. Au-delà, elle\nrépond `429 Too Many Requests` : patientez un instant, puis réessayez.\n\n## Webhooks\n\nLes webhooks envoient les événements à votre propre endpoint HTTPS au moment où ils se\nproduisent dans Grimp, sans que vous ayez à interroger l'API. Ils se configurent par école, avec\nune URL par événement : contactez votre customer success manager Grimp pour les mettre en place.\n\n### Événements\n\n| Événement             | Envoyé quand                             |\n| --------------------- | ---------------------------------------- |\n| `application.created` | Un étudiant postule à une offre          |\n| `application.updated` | Une candidature à une offre change       |\n| `application.deleted` | Une candidature à une offre est supprimée |\n| `student.hired`       | Un étudiant est recruté                  |\n\n### Contenu\n\nGrimp envoie une requête `POST` avec un corps JSON :\n\n```json\n{\n  \"event\": \"application.created\",\n  \"payload\": {\n    \"entityId\": \"…\",\n    \"data\": { },\n    \"user\": { }\n  }\n}\n```\n\n`data` est la candidature et `user` l'étudiant auquel elle appartient : leur structure complète\nest celle du modèle `WebhookEventDTO` de cette référence.\n\n### Vérifier la signature\n\nQuand un secret est configuré, chaque requête porte un en-tête `X-Signature-SHA256` : le\nHMAC-SHA256 en hexadécimal du corps brut de la requête, calculé avec le secret. Calculez-le de\nvotre côté et comparez avant de faire confiance au contenu :\n\n```js\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\n\nfunction isFromGrimp(rawBody, signature, secret) {\n  const expected = createHmac(\"sha256\", secret).update(rawBody).digest();\n  const received = Buffer.from(signature ?? \"\", \"hex\");\n  return (\n    received.length === expected.length && timingSafeEqual(received, expected)\n  );\n}\n```\n\nRépondez rapidement avec un statut `2xx` : Grimp ne réessaie pas un envoi échoué. Rendez votre\ntraitement idempotent, sur `event` et `payload.entityId` : un même changement peut vous parvenir\ndeux fois.",
    "title": "Grimp API Partenaire Education",
    "version": "1.0.0"
  },
  "openapi": "3.0.0",
  "paths": {
    "/partner/education/v1/acquisition-sources": {
      "get": {
        "operationId": "AcquisitionSourceController_findAll",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AcquisitionSourceOutput"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `admissionRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the acquisition sources referential: product-wide level-1 sources, with the school's own level-2 details nested",
        "tags": [
          "Sources d'acquisition"
        ]
      }
    },
    "/partner/education/v1/acquisition-sources/details": {
      "post": {
        "operationId": "AcquisitionSourceController_createDetail",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateAcquisitionSourceDetailRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AcquisitionSourceDetailOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "Invalid label or admissionSourceId"
          },
          "403": {
            "description": "The token owner lacks the `admissionRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create (or upsert by normalized label) a level-2 acquisition source detail for the caller's school",
        "tags": [
          "Sources d'acquisition"
        ]
      }
    },
    "/partner/education/v1/admins": {
      "get": {
        "description": "Returns the token owner and its peers — the admins directing its campuses and the coaches handling programs hosted there, as the interface shows them — with their role, campuses and programs. Use their email or ID in the `assignedCoaches` filters of the other endpoints.",
        "operationId": "GetPartnerAdmins",
        "parameters": [
          {
            "description": "Partial, accent-insensitive match on the name or email.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Roles, comma-separated.",
            "in": "query",
            "name": "roles",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "Admin",
                  "Coach",
                  "ReadOnly"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Account states, comma-separated. ACTIVE only by default.",
            "in": "query",
            "name": "states",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "CREATED",
                  "ACTIVE",
                  "INVITED",
                  "UNACTIVE",
                  "PENDING",
                  "REFUSED"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Campus IDs, comma-separated: admins directing the campus or coaches handling one of its programs.",
            "in": "query",
            "name": "campusIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Page number, from 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Admins per page, between 1 and 200.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerAdminsResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the school staff the caller works with",
        "tags": [
          "Administrateurs"
        ]
      }
    },
    "/partner/education/v1/admission-statuses": {
      "get": {
        "deprecated": true,
        "description": "Deprecated: use `GET /partner/education/v1/admission/steps` instead, which names the resource\nan *admission step*, exposes its pipeline and can be filtered by pipeline. Kept as-is for\nbackward compatibility.",
        "operationId": "GetPartnerAdmissionStatuses",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerAdmissionStatusesResponse"
                }
              }
            },
            "description": "Admission statuses retrieved successfully"
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `admissionRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List all admission statuses for the school",
        "tags": [
          "Admissions"
        ]
      }
    },
    "/partner/education/v1/admission-statuses/pipeline": {
      "get": {
        "deprecated": true,
        "description": "Deprecated: use `GET /partner/education/v1/admission/pipelines` instead. Kept as-is (a bare\narray, without the `{ data, metadata }` envelope) for backward compatibility.",
        "operationId": "GetPartnerAdmissionStatusesByPipeline",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/PipelineOutput"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Pipelines retrieved successfully"
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `admissionRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List all admission statuses for the school grouped by pipeline",
        "tags": [
          "Admissions"
        ]
      }
    },
    "/partner/education/v1/admission/applications": {
      "get": {
        "description": "Returns the admission applications (candidatures) the caller has access to: one entry per\nstudent and program, with the admission step it currently sits on and the essential information\nabout the student. Same scope as the admission board of the Grimp interface — active\napplications only, alumni records excluded, `pipeline` omitted when the step is attached to\nnone. Combine `stepIds` / `stepTypes` / `pipelineIds` with\n`GET /partner/education/v1/admission/pipelines` to read a whole pipeline step by step, and\n`updatedSince` (with `sort=updatedAt&order=asc`) to sync incrementally. Every list filter\nmatches any of the values given; different filters narrow each other.",
        "operationId": "GetPartnerAdmissionApplications",
        "parameters": [
          {
            "description": "Page number, from 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Created at or after this ISO 8601 date.",
            "in": "query",
            "name": "createdAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Created at or before this ISO 8601 date.",
            "in": "query",
            "name": "createdBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Updated at or after this ISO 8601 date — the filter to use for incremental synchronisation. Replaces `updatedSince`.",
            "in": "query",
            "name": "updatedAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Updated at or before this ISO 8601 date.",
            "in": "query",
            "name": "updatedBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "deprecated": true,
            "description": "Deprecated alias of `updatedAfter`, which wins if both are sent.",
            "in": "query",
            "name": "updatedSince",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Admission step IDs to filter on, comma separated. Step IDs come from\n`GET /partner/education/v1/admission/steps`.",
            "in": "query",
            "name": "stepIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Admission step categories to filter on, comma separated",
            "in": "query",
            "name": "stepTypes",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "ACQUISITION",
                  "QUALIFICATION",
                  "COMPANY_SEARCH",
                  "SUCCESS",
                  "REJECT"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Pipeline IDs to filter on, comma separated",
            "in": "query",
            "name": "pipelineIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Campus ID to filter on",
            "in": "query",
            "name": "campus",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Program ID to filter on (the older endpoints of this API also accept it under its deprecated name, `class`)",
            "in": "query",
            "name": "program",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Academic year ID to filter on",
            "in": "query",
            "name": "year",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Degree IDs to filter on, comma separated",
            "in": "query",
            "name": "degreeIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Scolarity types to filter on, comma separated",
            "in": "query",
            "name": "scolarityTypes",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "INITIAL",
                  "ALTERNANCE"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Education contract types to filter on, comma separated",
            "in": "query",
            "name": "educationContractTypes",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "PROFESSIONAL_CONTRACT",
                  "APPRENTICESHIP",
                  "INTERNSHIP"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Admission file states to filter on, comma separated",
            "in": "query",
            "name": "admissionFileStatuses",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "pending",
                  "validated",
                  "incomplete"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Work situations of the student to filter on, comma separated",
            "in": "query",
            "name": "workSituations",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "to place",
                  "opportunity",
                  "placed"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Student tag IDs to filter on, comma separated. An application matches as soon as its student\ncarries one of them. Tag IDs come from `GET /partner/education/v1/tags/student`.",
            "in": "query",
            "name": "tagIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Admission source IDs of the student, comma separated",
            "in": "query",
            "name": "admissionSourceIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Referent coaches of the student, each identified by email or ID, comma separated",
            "in": "query",
            "name": "assignedCoaches",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Field to sort on. Defaults to `createdAt`",
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "enum": [
                "createdAt",
                "updatedAt"
              ],
              "type": "string"
            }
          },
          {
            "description": "Sort direction, case-insensitive. Defaults to `desc`",
            "in": "query",
            "name": "order",
            "required": false,
            "schema": {
              "enum": [
                "asc",
                "desc"
              ],
              "type": "string"
            }
          },
          {
            "description": "`true` for applications whose recruitment is confirmed, `false` for the others",
            "in": "query",
            "name": "hired",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Student email to filter on, exact match",
            "in": "query",
            "name": "email",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Free-text search on the student's name, email and phone number",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Student ID to filter on, either the Grimp ID or the partner's external ID",
            "in": "query",
            "name": "studentId",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Only the applications of the students the calling token owner is a referent of",
            "in": "query",
            "name": "assignedOnly",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Number of applications per page, between 1 and 200. Defaults to 50",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "maximum": 200,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Pages count from 1. Integrations authenticated with a static API token were served 0-based pages on this list and still are until 2027-01-15 (see the `Deprecation` and `Sunset` response headers): send `pageBase=1` to switch to 1-based pages now. OAuth tokens always get 1-based pages.",
            "in": "query",
            "name": "pageBase",
            "required": false,
            "schema": {
              "enum": [
                1
              ],
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerAdmissionApplicationsResponse"
                }
              }
            },
            "description": "Admission applications retrieved successfully"
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `admissionRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the admission applications of the school",
        "tags": [
          "Admissions"
        ]
      },
      "post": {
        "description": "Creates a student (or reuses an existing one matched by email) and their admission\napplication (candidature) to a program, placed on the given admission step — the same board the\nGrimp interface's admission kanban reads from. If the student already applied to that program, the\nexisting application is moved to the given step instead of creating a duplicate. Returns only the\ncreated or updated application's ID — fetch its full representation with\n`GET /partner/education/v1/admission/applications`.\n\nWhen the step qualifies its applications (`reasonMode` other than `NONE`), `reason` tells why\nthe application sits there: the `code` of one of the school's reasons, or its `id` for a reason\nwithout code — see `GET /partner/education/v1/admission/reasons?stepId=…`. Without `reason`,\nthe step's default reason applies, if it has one. On a step whose `reasonMode` is `NONE`,\n`reason` is ignored.",
        "operationId": "CreatePartnerAdmissionApplication",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePartnerAdmissionApplicationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerAdmissionApplicationIdOutput"
                }
              }
            },
            "description": "Admission application created successfully"
          },
          "400": {
            "description": "Invalid input (programId or stepId not found, stepId outside programId's pipeline, reason not accepted on stepId — the message lists the accepted values —, or reasonComment missing for a reason that requires it). Nothing is created nor modified."
          },
          "403": {
            "description": "The token owner lacks the `admissionRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Add a student with an admission application",
        "tags": [
          "Admissions"
        ]
      }
    },
    "/partner/education/v1/admission/applications/{id}": {
      "get": {
        "description": "Same representation as an item of `GET /partner/education/v1/admission/applications`, plus `history`: every step and program change of the application, oldest first, with who made it and when. Answers 404 when the application does not exist or is outside the caller's scope.",
        "operationId": "GetPartnerAdmissionApplication",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerAdmissionApplicationDetailOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `admissionRead` permission, or has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "admission_application_not_found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Get an admission application and its history",
        "tags": [
          "Admissions"
        ]
      },
      "patch": {
        "description": "Only the fields sent are changed, with the same effect as in the Grimp interface. Returns the application as `GET /partner/education/v1/admission/applications/{id}` does. Answers 404 when the application does not exist or is outside the caller's scope.",
        "operationId": "UpdatePartnerAdmissionApplication",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PartnerUpdateAdmissionApplicationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerAdmissionApplicationDetailOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `admissionRead` permission, or has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "admission_application_not_found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Update the note or the file status of an admission application",
        "tags": [
          "Admissions"
        ]
      }
    },
    "/partner/education/v1/admission/applications/{id}/custom-fields": {
      "patch": {
        "description": "The values belong to this admission application only (one student in one program for one year), not to the student. Only the keys sent are written; a null value deletes the key. No field definition is required.",
        "operationId": "AdmissionApplicationController_patchCustomFields",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PartnerCustomFieldsPatchRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerCustomFieldsOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `admissionRead` permission, or has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Not found"
          },
          "422": {
            "description": "Invalid custom fields"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Merge custom fields into an admission application",
        "tags": [
          "Admissions"
        ]
      }
    },
    "/partner/education/v1/admission/pipelines": {
      "get": {
        "description": "Returns the pipelines the caller has access to, each one with its ordered admission steps. A\npipeline without any step is not returned. Filter admission applications with\n`GET /partner/education/v1/admission/applications?pipelineIds=…`.",
        "operationId": "GetPartnerPipelines",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerPipelinesResponse"
                }
              }
            },
            "description": "Pipelines retrieved successfully"
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `admissionRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the admission pipelines of the school",
        "tags": [
          "Admissions"
        ]
      }
    },
    "/partner/education/v1/admission/reasons": {
      "get": {
        "description": "Returns the reasons the school uses to qualify why an admission application sits on a\nstep (not eligible, unreachable, withdrew…). Each school has its own list: read it here before sending\n`reason` to `POST /partner/education/v1/admission/applications`. With `stepId`, only the\nreasons accepted on that step are returned — a step whose `reasonMode` is `NONE` ignores any\nreason. Inactive reasons are listed too: the Grimp interface no longer offers them, but this API\nstill accepts them.",
        "operationId": "GetPartnerAdmissionReasons",
        "parameters": [
          {
            "description": "Only return the reasons accepted on this step, in the order configured on the step",
            "in": "query",
            "name": "stepId",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerAdmissionReasonsResponse"
                }
              }
            },
            "description": "Reasons retrieved successfully"
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the reasons of the school",
        "tags": [
          "Admissions"
        ]
      }
    },
    "/partner/education/v1/admission/sources": {
      "get": {
        "description": "How students heard of the school. Use their IDs in the `admissionSourceIds` filter of `GET /partner/education/v1/admission/applications`.",
        "operationId": "GetPartnerAdmissionSources",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/PartnerAdmissionSourceOutput"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `admissionRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the admission sources",
        "tags": [
          "Référentiels d'admission"
        ]
      }
    },
    "/partner/education/v1/admission/steps": {
      "get": {
        "description": "Returns every admission step configured by the school — the steps a candidature moves through —\nordered by pipeline then by position inside the pipeline. Use `pipelineIds` to restrict the\nlist to some pipelines, or `GET /partner/education/v1/admission/pipelines` to get the steps\nalready grouped by pipeline. Replaces `GET /partner/education/v1/admission-statuses`, which\nnamed the same resource an *admission status*.",
        "operationId": "GetPartnerAdmissionSteps",
        "parameters": [
          {
            "description": "Pipeline IDs to filter on, comma separated",
            "in": "query",
            "name": "pipelineIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerAdmissionStepsResponse"
                }
              }
            },
            "description": "Admission steps retrieved successfully"
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `admissionRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the admission steps of the school",
        "tags": [
          "Admissions"
        ]
      }
    },
    "/partner/education/v1/alumni": {
      "post": {
        "operationId": "PartnerAlumniController_create",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AlumniInvitationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentDetailsOutput"
                }
              }
            },
            "description": "Alumni created successfully"
          },
          "400": {
            "description": "Invalid input, unknown campus or unknown degree"
          },
          "403": {
            "description": "The token owner lacks the `alumniRead` permission, or has the ReadOnly role and called a write endpoint."
          },
          "406": {
            "description": "Alumni already existing"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create an alumni",
        "tags": [
          "Alumni"
        ]
      }
    },
    "/partner/education/v1/applications": {
      "get": {
        "operationId": "ApplicationController_findAll",
        "parameters": [
          {
            "description": "Page number, from 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Campus ID to filter on",
            "in": "query",
            "name": "campus",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Program ID to filter on. Replaces `class`, which is deprecated; if both are sent, `program` wins.",
            "in": "query",
            "name": "program",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "deprecated": true,
            "description": "Class ID to filter on. Deprecated: use `program` instead, which names the resource the way the rest of the API does. Both filter on the same field and stay available in parallel; if both are sent, `program` wins. The end-of-support date of `class` will be announced to the integrations still using it.",
            "in": "query",
            "name": "class",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Year ID to filter on",
            "in": "query",
            "name": "year",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Student Email to filter on",
            "in": "query",
            "name": "email",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Created at or after this ISO 8601 date.",
            "in": "query",
            "name": "createdAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Created at or before this ISO 8601 date.",
            "in": "query",
            "name": "createdBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Updated at or after this ISO 8601 date — the filter to use for incremental synchronisation. Replaces `updatedSince`.",
            "in": "query",
            "name": "updatedAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Updated at or before this ISO 8601 date.",
            "in": "query",
            "name": "updatedBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "deprecated": true,
            "description": "Deprecated alias of `updatedAfter`, which wins if both are sent.",
            "in": "query",
            "name": "updatedSince",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Cursor pagination: return the applications following this application id. Takes precedence over `page` and scales better on large result sets.",
            "in": "query",
            "name": "after",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Accent-insensitive search on the job title, the enterprise and the student's name.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Kanban steps. Comma-separated; an application matches any of them.",
            "in": "query",
            "name": "statuses",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "TO_APPLY",
                  "APPLIED",
                  "FOLLOW_UP",
                  "GOT_INTERVIEW",
                  "SAY_THANK"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Conclusions. Comma-separated; an application matches any of them.",
            "in": "query",
            "name": "conclusions",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "REFUSED",
                  "ACCEPTED",
                  "PENDING"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Sources the application came from. Comma-separated; an application matches any of them.",
            "in": "query",
            "name": "sources",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "ALUMNI",
                  "SCHOOL_PARTNER",
                  "INTERNAL",
                  "GRIMP_PARTNER",
                  "EXTERNAL",
                  "WELCOME_TO_THE_JUNGLE",
                  "INDEED",
                  "LINKEDIN",
                  "SPECULATIVE_APPLICATION",
                  "WEBSITE",
                  "SCHOOL_NETWORK",
                  "JOBTEASER",
                  "WORK_AGENCY",
                  "HELLO_WORK",
                  "MY_NETWORK",
                  "APEC",
                  "SPORTY_JOB",
                  "JOB_MAKE_SENSE",
                  "BEYOND_JOBS",
                  "JOB_BOARD",
                  "JOB_CENTER",
                  "LA_BONNE_ALTERNANCE",
                  "INTERIM",
                  "ALUMNFORCE",
                  "MONSTER",
                  "OUEST_FRANCE_EMPLOI",
                  "METEO_JOB",
                  "WE_LOVE_DEVS",
                  "OTHER"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Contract types. Comma-separated; an application matches any of them.",
            "in": "query",
            "name": "contractTypes",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "FIXED_TERM_CONTRACT",
                  "PERMANENT_CONTRACT",
                  "PART_TIME",
                  "INTERNSHIP",
                  "SEASONAL",
                  "WORK_LINKED_TRAINING",
                  "VOLUNTEER",
                  "OTHER",
                  "CIVIC_SERVICE"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Job IDs (from `GET /jobs`), comma-separated.",
            "in": "query",
            "name": "jobIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Student IDs, comma-separated.",
            "in": "query",
            "name": "studentIds",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Partial, accent-insensitive match on the enterprise name.",
            "in": "query",
            "name": "enterpriseName",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "`true` for archived applications only, `false` to exclude them.",
            "in": "query",
            "name": "archived",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Applications per page, between 1 and 200. Defaults to 50.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "maximum": 200,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Pages count from 1. Integrations authenticated with a static API token were served 0-based pages on this list and still are until 2027-01-15 (see the `Deprecation` and `Sunset` response headers): send `pageBase=1` to switch to 1-based pages now. OAuth tokens always get 1-based pages.",
            "in": "query",
            "name": "pageBase",
            "required": false,
            "schema": {
              "enum": [
                1
              ],
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FindAllApplicationsResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Get all applications for students",
        "tags": [
          "Recherche d'emploi des étudiants"
        ]
      }
    },
    "/partner/education/v1/applications/{id}": {
      "get": {
        "description": "Same representation as an item of `GET /partner/education/v1/applications`, plus the kanban step history and the interview dates. Answers 404 when the application does not exist or belongs to a student outside the caller's scope.",
        "operationId": "GetPartnerApplication",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerApplicationDetailOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "application_not_found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Get a job application with its history",
        "tags": [
          "Recherche d'emploi des étudiants"
        ]
      }
    },
    "/partner/education/v1/campuses": {
      "get": {
        "operationId": "CampusController_findAll",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/CampusOutput"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Get all campuses, programs and years",
        "tags": [
          "Campus"
        ]
      }
    },
    "/partner/education/v1/class": {
      "post": {
        "deprecated": true,
        "description": "Deprecated: use `POST /partner/education/v1/programs` instead, which names the resource a\n*program*, the way the rest of the API does, and documents the `defaultScolarship`,\n`defaultContractType` and `pipelineId` fields this route already accepts. Kept as-is for\nbackward compatibility.\n\nCreates a program on a campus. `defaultScolarship` and `defaultContractType` are the\nvalues pre-filled on the students of the program. `pipelineId` must reference a pipeline of the\nschool, listed by `GET /partner/education/v1/admission/pipelines`; when omitted, the pipeline most\nused by the campus is applied.",
        "operationId": "ClassController_create",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateClassRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassDTO"
                }
              }
            },
            "description": "Program created successfully"
          },
          "400": {
            "description": "Invalid input"
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "406": {
            "description": "Program with the same name or reference already exists"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create a class",
        "tags": [
          "Campus"
        ]
      }
    },
    "/partner/education/v1/class/{id}": {
      "post": {
        "deprecated": true,
        "description": "Deprecated: use `POST /partner/education/v1/programs/{id}` instead. Kept as-is for backward\ncompatibility.\n\nOnly the fields present in the body are updated. Changing `pipelineId` moves every\nstudent of the program to the first step of the new pipeline.",
        "operationId": "ClassController_update",
        "parameters": [
          {
            "description": "ID of the program to update",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateClassRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassDTO"
                }
              }
            },
            "description": "Program updated successfully"
          },
          "400": {
            "description": "Invalid input"
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "406": {
            "description": "Program with the same name or reference already exists"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Update an existing class",
        "tags": [
          "Campus"
        ]
      }
    },
    "/partner/education/v1/contact-tags": {
      "get": {
        "operationId": "ContactReferenceTagsController_findAll",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/TagOutput"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `contactRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List all contact tags for the school",
        "tags": [
          "Tags"
        ]
      },
      "post": {
        "operationId": "ContactReferenceTagsController_create",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagLabelRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TagOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `contactRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create a contact tag",
        "tags": [
          "Tags"
        ]
      }
    },
    "/partner/education/v1/contact-tags/{id}": {
      "delete": {
        "operationId": "ContactReferenceTagsController_remove",
        "parameters": [
          {
            "description": "Tag ID (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `contactRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Delete a contact tag",
        "tags": [
          "Tags"
        ]
      },
      "put": {
        "operationId": "ContactReferenceTagsController_update",
        "parameters": [
          {
            "description": "Tag ID (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagLabelRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TagOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `contactRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Rename a contact tag",
        "tags": [
          "Tags"
        ]
      }
    },
    "/partner/education/v1/contacts": {
      "get": {
        "description": "Returns the contacts students recorded themselves while looking for a job, from the\nstudent side of Grimp. It is empty while students have not logged any, whatever\nthe school's CRM holds.\n\nTo read the school's CRM contacts, use `GET /partner/education/v1/contacts/search`.",
        "operationId": "ContactController_findAll",
        "parameters": [
          {
            "description": "Page number, from 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Campus ID to filter on",
            "in": "query",
            "name": "campus",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Program ID to filter on. Replaces `class`, which is deprecated; if both are sent, `program` wins.",
            "in": "query",
            "name": "program",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "deprecated": true,
            "description": "Class ID to filter on. Deprecated: use `program` instead, which names the resource the way the rest of the API does. Both filter on the same field and stay available in parallel; if both are sent, `program` wins. The end-of-support date of `class` will be announced to the integrations still using it.",
            "in": "query",
            "name": "class",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Year ID to filter on",
            "in": "query",
            "name": "year",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Student Email to filter on",
            "in": "query",
            "name": "email",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Pages count from 1. Integrations authenticated with a static API token were served 0-based pages on this list and still are until 2027-01-15 (see the `Deprecation` and `Sunset` response headers): send `pageBase=1` to switch to 1-based pages now. OAuth tokens always get 1-based pages.",
            "in": "query",
            "name": "pageBase",
            "required": false,
            "schema": {
              "enum": [
                1
              ],
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FindAllContactsResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the contacts students logged in their own job search (not the CRM)",
        "tags": [
          "Recherche d'emploi des étudiants"
        ]
      },
      "post": {
        "operationId": "ContactCrmController_createContact",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePartnerContactRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerContactCrmDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `contactRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create a CRM contact. Idempotent: a contact already known under the same email is returned and attached to the enterprise instead; its empty fields (phone, job title, LinkedIn) are filled and the given coaches are added, existing values are never overwritten.",
        "tags": [
          "Contacts"
        ]
      }
    },
    "/partner/education/v1/contacts/search": {
      "get": {
        "description": "Every filter is optional and they combine with AND. The filters mirror the ones\noffered by the Grimp interface on the contact CRM list.\n\n- `email` matches exactly (case insensitive); `name` matches the full name partially.\n- `search` is the free-text search of the interface: name, email, tag label or enterprise name.\n- `siret` and `enterpriseIds` restrict to the contacts attached to those enterprises.\n- `tagIds` / `tagLabels` return a contact carrying at least one of them.\n- `assignedCoaches` accepts coach emails or IDs and returns a contact assigned to at least one;\n  `assignedOnly=true` restricts to the contacts assigned to the calling token owner.\n- `campusIds` narrows the campuses the contact must be visible from, within the caller's scope.\n- `updatedAfter` is the filter to use for incremental synchronisation.\n\nResults are paginated (`page`, `pageSize`, 50 by default) and sorted by `sort`/`order`\n(`createdAt` DESC by default), with the contact ID as a stable tie-breaker.",
        "operationId": "ContactCrmController_searchContacts",
        "parameters": [
          {
            "description": "Tag IDs. A record matching at least one of them is returned. Comma-separated.",
            "in": "query",
            "name": "tagIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Tag labels, matched the way the interface does (case and accent insensitive). A label unknown to the school is rejected with a 400. Comma-separated.",
            "in": "query",
            "name": "tagLabels",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Restrict to records visible from these campuses. Must be within the caller's scope. Comma-separated.",
            "in": "query",
            "name": "campusIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Referent coaches, each identified by the coach email or ID. A record assigned to at least one of them is returned. Comma-separated.",
            "in": "query",
            "name": "assignedCoaches",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Restrict to the records assigned to the calling token owner.",
            "in": "query",
            "name": "assignedOnly",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "visibilityMode",
            "required": false,
            "schema": {
              "enum": [
                "PRIVATE",
                "SHARED"
              ],
              "type": "string"
            }
          },
          {
            "description": "Created at or after this ISO 8601 date.",
            "in": "query",
            "name": "createdAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Created at or before this ISO 8601 date.",
            "in": "query",
            "name": "createdBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Updated at or after this ISO 8601 date — the filter to use for incremental synchronisation.",
            "in": "query",
            "name": "updatedAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Updated at or before this ISO 8601 date.",
            "in": "query",
            "name": "updatedBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Sort direction, DESC by default.",
            "in": "query",
            "name": "order",
            "required": false,
            "schema": {
              "enum": [
                "ASC",
                "DESC"
              ],
              "type": "string"
            }
          },
          {
            "description": "Results per page, 50 by default.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Page number, starting at 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Exact email, case-insensitive.",
            "in": "query",
            "name": "email",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Partial, case-insensitive match on the full name.",
            "in": "query",
            "name": "name",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Only contacts attached to the enterprise with this SIRET.",
            "in": "query",
            "name": "siret",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Free-text search, as in the interface: name, email, tag label or enterprise name.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Only contacts attached to at least one of these enterprise IDs. Comma-separated.",
            "in": "query",
            "name": "enterpriseIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Field to sort on, createdAt by default.",
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "enum": [
                "createdAt",
                "updatedAt",
                "name",
                "email",
                "jobTitle"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerContactsCrmResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `contactRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Search CRM contacts",
        "tags": [
          "Contacts"
        ]
      }
    },
    "/partner/education/v1/contacts/{id}": {
      "get": {
        "operationId": "ContactCrmController_getContact",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerContactCrmDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `contactRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Get a CRM contact from its ID",
        "tags": [
          "Contacts"
        ]
      },
      "put": {
        "operationId": "ContactCrmController_updateContact",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagIdsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `contactRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Replace all tags on a CRM contact (tagIds required; send [] to clear)",
        "tags": [
          "Contacts"
        ]
      }
    },
    "/partner/education/v1/contacts/{id}/custom-fields": {
      "patch": {
        "description": "Only the keys sent are written; a null value deletes the key. No field definition is required.",
        "operationId": "ContactCrmController_patchCustomFields",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PartnerCustomFieldsPatchRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerCustomFieldsOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `contactRead` permission, or has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Not found"
          },
          "422": {
            "description": "Invalid custom fields"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Merge custom fields into a CRM contact",
        "tags": [
          "Contacts"
        ]
      }
    },
    "/partner/education/v1/contacts/{id}/interactions": {
      "get": {
        "description": "Emails, SMS and WhatsApp messages exchanged with students and CRM contacts, and the internal comments left on students, contacts, enterprises and opportunities — newest first, across all channels. Only records the token owner can open are included: students of its programs or campuses, CRM records of its campuses (private ones only when assigned), contacts, enterprises and opportunities only with the matching read permission. Synced emails of a student or contact who refused the mailbox synchronisation are left out, and on a private portal so are messages sent by staff outside the caller's peers (comments on CRM records are always limited to the caller's peers, comments on students never are). `enterpriseIds` also brings the messages of the enterprise's contacts, when the caller can see the enterprise.",
        "operationId": "GetPartnerContactInteractions",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Channels, comma-separated.",
            "in": "query",
            "name": "channels",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "email",
                  "sms",
                  "whatsapp",
                  "comment"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "`outbound` for what the school sent, `inbound` for replies, `internal` for comments.",
            "in": "query",
            "name": "direction",
            "required": false,
            "schema": {
              "enum": [
                "inbound",
                "outbound",
                "internal"
              ],
              "type": "string"
            }
          },
          {
            "description": "IDs of the staff members who wrote or sent the interaction. Comma-separated; an interaction matches any of them.",
            "in": "query",
            "name": "authorIds",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Only what the calling token owner wrote or sent.",
            "in": "query",
            "name": "mine",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Where a message came from (ui, automation, marketing, api, mcp), comma-separated. Comments and WhatsApp messages carry no origin, so this filter leaves them out.",
            "in": "query",
            "name": "origins",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "ui",
                  "automation",
                  "marketing",
                  "api",
                  "mcp"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "At or after this ISO 8601 date.",
            "in": "query",
            "name": "after",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "At or before this ISO 8601 date.",
            "in": "query",
            "name": "before",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Accent-insensitive search on the subject and the content.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Return the full content instead of a 500-character excerpt. Defaults to false.",
            "in": "query",
            "name": "includeBody",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "order",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "type": "string"
            }
          },
          {
            "description": "Page number, from 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Interactions per page, between 1 and 100.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 100,
              "minimum": 1,
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerInteractionsResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `contactRead` permission."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the communications and comments about one CRM contact",
        "tags": [
          "Interactions"
        ]
      }
    },
    "/partner/education/v1/contacts/{id}/tags/add": {
      "post": {
        "operationId": "ContactCrmController_addContactTags",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddTagsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `contactRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Add tags to a CRM contact",
        "tags": [
          "Contacts"
        ]
      }
    },
    "/partner/education/v1/contacts/{id}/tags/remove": {
      "post": {
        "operationId": "ContactCrmController_removeContactTags",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RemoveTagsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `contactRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Remove tags from a CRM contact (by tagIds or names)",
        "tags": [
          "Contacts"
        ]
      }
    },
    "/partner/education/v1/custom-field-definitions": {
      "get": {
        "description": "A definition only describes how Grimp displays a key (label, type, choices, order). It never restricts customFields: the API keeps accepting any valid key and any value, with or without a definition. Archived definitions are only returned with includeArchived=true. A multi_select field stores an array of choice values in customFields.",
        "operationId": "PartnerCustomFieldDefinitionsController_findAll",
        "parameters": [
          {
            "description": "Object the fields belong to. student_year is one learner in one program for one year.",
            "in": "query",
            "name": "target",
            "required": false,
            "schema": {
              "enum": [
                "student",
                "student_year",
                "contact",
                "enterprise"
              ],
              "type": "string"
            }
          },
          {
            "description": "Also return the archived fields, for the settings page.",
            "in": "query",
            "name": "includeArchived",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/CustomFieldDefinitionDTO"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the custom field definitions of the school",
        "tags": [
          "Champs personnalisés"
        ]
      },
      "post": {
        "description": "A definition only describes how Grimp displays a key (label, type, choices, order). It never restricts customFields: the API keeps accepting any valid key and any value, with or without a definition. The number of active definitions per object is limited by school (10 by default); archived definitions do not count. This limit only caps the fields shown in the Grimp interface, not the keys stored in customFields. The key (slug) is generated from the label and returned in the response; it is the key to use in customFields. Choices (select and multi_select only) are sent as labels, their values are generated.",
        "operationId": "PartnerCustomFieldDefinitionsController_create",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateCustomFieldDefinitionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomFieldDefinitionDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create a custom field definition",
        "tags": [
          "Champs personnalisés"
        ]
      }
    },
    "/partner/education/v1/custom-field-definitions/order": {
      "put": {
        "description": "Send every active definition id of the object, in the wanted display order.",
        "operationId": "PartnerCustomFieldDefinitionsController_reorder",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReorderCustomFieldDefinitionsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Reorder the custom field definitions of an object",
        "tags": [
          "Champs personnalisés"
        ]
      }
    },
    "/partner/education/v1/custom-field-definitions/{id}": {
      "patch": {
        "description": "The label and the help text can change. The key (slug), the object and the type cannot. For select and multi_select, send the whole list of choices: a choice sent with its value is renamed, a choice without value is added, and a choice left out is archived (stored values are kept).",
        "operationId": "PartnerCustomFieldDefinitionsController_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateCustomFieldDefinitionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomFieldDefinitionDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Update a custom field definition",
        "tags": [
          "Champs personnalisés"
        ]
      }
    },
    "/partner/education/v1/custom-field-definitions/{id}/archive": {
      "post": {
        "description": "The field is no longer displayed in Grimp. Values stored in customFields are kept and come back when the definition is restored.",
        "operationId": "PartnerCustomFieldDefinitionsController_archive",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomFieldDefinitionDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Archive a custom field definition",
        "tags": [
          "Champs personnalisés"
        ]
      }
    },
    "/partner/education/v1/custom-field-definitions/{id}/restore": {
      "post": {
        "description": "The number of active definitions per object is limited by school (10 by default); archived definitions do not count. This limit only caps the fields shown in the Grimp interface, not the keys stored in customFields.",
        "operationId": "PartnerCustomFieldDefinitionsController_restore",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomFieldDefinitionDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Restore an archived custom field definition",
        "tags": [
          "Champs personnalisés"
        ]
      }
    },
    "/partner/education/v1/degrees": {
      "get": {
        "description": "Returns the degrees/diplomas configured by the school, ordered by name, with their associated campuses and programs.",
        "operationId": "GetPartnerDegrees",
        "parameters": [
          {
            "description": "Page number, from 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Filter degrees by name (case-insensitive partial match)",
            "in": "query",
            "name": "name",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Number of results per page (default: 50)",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerDegreesResponse"
                }
              }
            },
            "description": "Degrees retrieved successfully"
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the degrees of the school",
        "tags": [
          "Diplômes"
        ]
      }
    },
    "/partner/education/v1/enterprise-tags": {
      "get": {
        "operationId": "EnterpriseReferenceTagsController_findAll",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/TagOutput"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `enterpriseRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List all enterprise tags for the school",
        "tags": [
          "Tags"
        ]
      },
      "post": {
        "operationId": "EnterpriseReferenceTagsController_create",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagLabelRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TagOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `enterpriseRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create an enterprise tag",
        "tags": [
          "Tags"
        ]
      }
    },
    "/partner/education/v1/enterprise-tags/{id}": {
      "delete": {
        "operationId": "EnterpriseReferenceTagsController_remove",
        "parameters": [
          {
            "description": "Tag ID (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `enterpriseRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Delete an enterprise tag",
        "tags": [
          "Tags"
        ]
      },
      "put": {
        "operationId": "EnterpriseReferenceTagsController_update",
        "parameters": [
          {
            "description": "Tag ID (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagLabelRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TagOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `enterpriseRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Rename an enterprise tag",
        "tags": [
          "Tags"
        ]
      }
    },
    "/partner/education/v1/enterprises": {
      "get": {
        "description": "Returns the enterprises students recorded themselves while looking for a job, from the\nstudent side of Grimp. It is empty while students have not logged any, whatever\nthe school's CRM holds.\n\nTo read the school's CRM enterprises, use `GET /partner/education/v1/enterprises/search`.",
        "operationId": "EnterpriseController_findAll",
        "parameters": [
          {
            "description": "Page number, from 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Campus ID to filter on",
            "in": "query",
            "name": "campus",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Program ID to filter on. Replaces `class`, which is deprecated; if both are sent, `program` wins.",
            "in": "query",
            "name": "program",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "deprecated": true,
            "description": "Class ID to filter on. Deprecated: use `program` instead, which names the resource the way the rest of the API does. Both filter on the same field and stay available in parallel; if both are sent, `program` wins. The end-of-support date of `class` will be announced to the integrations still using it.",
            "in": "query",
            "name": "class",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Year ID to filter on",
            "in": "query",
            "name": "year",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Student Email to filter on",
            "in": "query",
            "name": "email",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Cursor pagination: return the enterprises following this enterprise id. Takes precedence over `page` and scales better on large result sets.",
            "in": "query",
            "name": "after",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Pages count from 1. Integrations authenticated with a static API token were served 0-based pages on this list and still are until 2027-01-15 (see the `Deprecation` and `Sunset` response headers): send `pageBase=1` to switch to 1-based pages now. OAuth tokens always get 1-based pages.",
            "in": "query",
            "name": "pageBase",
            "required": false,
            "schema": {
              "enum": [
                1
              ],
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FindAllEnterprisesResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the enterprises students logged in their own job search (not the CRM)",
        "tags": [
          "Recherche d'emploi des étudiants"
        ]
      },
      "post": {
        "operationId": "EnterpriseCrmController_createEnterprise",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePartnerEnterpriseRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerEnterpriseCrmDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `enterpriseRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create a CRM enterprise. Idempotent: an enterprise already known under the same SIRET or the same name is returned and enriched instead.",
        "tags": [
          "Entreprises"
        ]
      }
    },
    "/partner/education/v1/enterprises/search": {
      "get": {
        "description": "Every filter is optional and they combine with AND. The filters mirror the ones\noffered by the Grimp interface on the enterprise CRM list.\n\n- `siret` matches the SIRET/SIREN exactly, separators aside; `name` matches the legal name partially.\n- `search` is the free-text search of the interface: legal name, trade name or SIRET.\n- `industries` and `nafCodes` match exactly; pass several values comma-separated.\n- `tagIds` / `tagLabels` return an enterprise carrying at least one of them.\n- `assignedCoaches` accepts coach emails or IDs and returns an enterprise assigned to at least one;\n  `assignedOnly=true` restricts to the enterprises assigned to the calling token owner.\n- `campusIds` narrows the campuses the enterprise must be visible from, within the caller's scope.\n- `updatedAfter` is the filter to use for incremental synchronisation.\n\nResults are paginated (`page`, `pageSize`, 50 by default) and sorted by `sort`/`order`\n(`createdAt` DESC by default), with the enterprise ID as a stable tie-breaker.",
        "operationId": "EnterpriseCrmController_searchEnterprises",
        "parameters": [
          {
            "description": "Tag IDs. A record matching at least one of them is returned. Comma-separated.",
            "in": "query",
            "name": "tagIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Tag labels, matched the way the interface does (case and accent insensitive). A label unknown to the school is rejected with a 400. Comma-separated.",
            "in": "query",
            "name": "tagLabels",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Restrict to records visible from these campuses. Must be within the caller's scope. Comma-separated.",
            "in": "query",
            "name": "campusIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Referent coaches, each identified by the coach email or ID. A record assigned to at least one of them is returned. Comma-separated.",
            "in": "query",
            "name": "assignedCoaches",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Restrict to the records assigned to the calling token owner.",
            "in": "query",
            "name": "assignedOnly",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "visibilityMode",
            "required": false,
            "schema": {
              "enum": [
                "PRIVATE",
                "SHARED"
              ],
              "type": "string"
            }
          },
          {
            "description": "Created at or after this ISO 8601 date.",
            "in": "query",
            "name": "createdAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Created at or before this ISO 8601 date.",
            "in": "query",
            "name": "createdBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Updated at or after this ISO 8601 date — the filter to use for incremental synchronisation.",
            "in": "query",
            "name": "updatedAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Updated at or before this ISO 8601 date.",
            "in": "query",
            "name": "updatedBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Sort direction, DESC by default.",
            "in": "query",
            "name": "order",
            "required": false,
            "schema": {
              "enum": [
                "ASC",
                "DESC"
              ],
              "type": "string"
            }
          },
          {
            "description": "Results per page, 50 by default.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Page number, starting at 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Exact SIRET or SIREN. Separators are stripped.",
            "in": "query",
            "name": "siret",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Partial, case-insensitive name match.",
            "in": "query",
            "name": "name",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Free-text search, as in the interface: legal name, trade name or SIRET.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Industry keys, as returned in the `industry` field. Comma-separated.",
            "in": "query",
            "name": "industries",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "NAF/APE codes. Comma-separated.",
            "in": "query",
            "name": "nafCodes",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Field to sort on, createdAt by default.",
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "enum": [
                "createdAt",
                "updatedAt",
                "name",
                "industry",
                "domain"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerEnterprisesCrmResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `enterpriseRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Search CRM enterprises",
        "tags": [
          "Entreprises"
        ]
      }
    },
    "/partner/education/v1/enterprises/{id}": {
      "get": {
        "operationId": "EnterpriseCrmController_getEnterprise",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerEnterpriseCrmDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `enterpriseRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Get a CRM enterprise from its ID",
        "tags": [
          "Entreprises"
        ]
      },
      "patch": {
        "operationId": "EnterpriseCrmController_updateEnterpriseFields",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdatePartnerEnterpriseRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerEnterpriseCrmDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `enterpriseRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Update company fields on a CRM enterprise. Every field is optional and only the ones provided are changed; tags are managed through the dedicated tag endpoints.",
        "tags": [
          "Entreprises"
        ]
      },
      "put": {
        "operationId": "EnterpriseCrmController_updateEnterprise",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagIdsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `enterpriseRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Replace all tags on a CRM enterprise (tagIds required; send [] to clear)",
        "tags": [
          "Entreprises"
        ]
      }
    },
    "/partner/education/v1/enterprises/{id}/custom-fields": {
      "patch": {
        "description": "Only the keys sent are written; a null value deletes the key. No field definition is required.",
        "operationId": "EnterpriseCrmController_patchCustomFields",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PartnerCustomFieldsPatchRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerCustomFieldsOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `enterpriseRead` permission, or has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Not found"
          },
          "422": {
            "description": "Invalid custom fields"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Merge custom fields into a CRM enterprise",
        "tags": [
          "Entreprises"
        ]
      }
    },
    "/partner/education/v1/enterprises/{id}/interactions": {
      "get": {
        "description": "Emails, SMS and WhatsApp messages exchanged with students and CRM contacts, and the internal comments left on students, contacts, enterprises and opportunities — newest first, across all channels. Only records the token owner can open are included: students of its programs or campuses, CRM records of its campuses (private ones only when assigned), contacts, enterprises and opportunities only with the matching read permission. Synced emails of a student or contact who refused the mailbox synchronisation are left out, and on a private portal so are messages sent by staff outside the caller's peers (comments on CRM records are always limited to the caller's peers, comments on students never are). `enterpriseIds` also brings the messages of the enterprise's contacts, when the caller can see the enterprise.",
        "operationId": "GetPartnerEnterpriseInteractions",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Channels, comma-separated.",
            "in": "query",
            "name": "channels",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "email",
                  "sms",
                  "whatsapp",
                  "comment"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "`outbound` for what the school sent, `inbound` for replies, `internal` for comments.",
            "in": "query",
            "name": "direction",
            "required": false,
            "schema": {
              "enum": [
                "inbound",
                "outbound",
                "internal"
              ],
              "type": "string"
            }
          },
          {
            "description": "IDs of the staff members who wrote or sent the interaction. Comma-separated; an interaction matches any of them.",
            "in": "query",
            "name": "authorIds",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Only what the calling token owner wrote or sent.",
            "in": "query",
            "name": "mine",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Where a message came from (ui, automation, marketing, api, mcp), comma-separated. Comments and WhatsApp messages carry no origin, so this filter leaves them out.",
            "in": "query",
            "name": "origins",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "ui",
                  "automation",
                  "marketing",
                  "api",
                  "mcp"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "At or after this ISO 8601 date.",
            "in": "query",
            "name": "after",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "At or before this ISO 8601 date.",
            "in": "query",
            "name": "before",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Accent-insensitive search on the subject and the content.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Return the full content instead of a 500-character excerpt. Defaults to false.",
            "in": "query",
            "name": "includeBody",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "order",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "type": "string"
            }
          },
          {
            "description": "Page number, from 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Interactions per page, between 1 and 100.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 100,
              "minimum": 1,
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerInteractionsResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `enterpriseRead` permission."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the comments on one CRM enterprise and the messages with its contacts",
        "tags": [
          "Interactions"
        ]
      }
    },
    "/partner/education/v1/enterprises/{id}/tags/add": {
      "post": {
        "operationId": "EnterpriseCrmController_addEnterpriseTags",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddTagsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `enterpriseRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Add tags to a CRM enterprise",
        "tags": [
          "Entreprises"
        ]
      }
    },
    "/partner/education/v1/enterprises/{id}/tags/remove": {
      "post": {
        "operationId": "EnterpriseCrmController_removeEnterpriseTags",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RemoveTagsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `enterpriseRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Remove tags from a CRM enterprise (by tagIds or names)",
        "tags": [
          "Entreprises"
        ]
      }
    },
    "/partner/education/v1/interactions": {
      "get": {
        "description": "Emails, SMS and WhatsApp messages exchanged with students and CRM contacts, and the internal comments left on students, contacts, enterprises and opportunities — newest first, across all channels. Only records the token owner can open are included: students of its programs or campuses, CRM records of its campuses (private ones only when assigned), contacts, enterprises and opportunities only with the matching read permission. Synced emails of a student or contact who refused the mailbox synchronisation are left out, and on a private portal so are messages sent by staff outside the caller's peers (comments on CRM records are always limited to the caller's peers, comments on students never are). `enterpriseIds` also brings the messages of the enterprise's contacts, when the caller can see the enterprise.",
        "operationId": "GetPartnerInteractions",
        "parameters": [
          {
            "description": "Student IDs the interaction is about. Comma-separated; an interaction matches any of them.",
            "in": "query",
            "name": "studentIds",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "CRM contact IDs the interaction is about. Comma-separated; an interaction matches any of them.",
            "in": "query",
            "name": "contactIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "CRM enterprise IDs: comments on the enterprise and messages with its contacts. Comma-separated; an interaction matches any of them.",
            "in": "query",
            "name": "enterpriseIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Opportunity IDs: comments on the opportunity. Comma-separated; an interaction matches any of them.",
            "in": "query",
            "name": "opportunityIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Channels, comma-separated.",
            "in": "query",
            "name": "channels",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "email",
                  "sms",
                  "whatsapp",
                  "comment"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "`outbound` for what the school sent, `inbound` for replies, `internal` for comments.",
            "in": "query",
            "name": "direction",
            "required": false,
            "schema": {
              "enum": [
                "inbound",
                "outbound",
                "internal"
              ],
              "type": "string"
            }
          },
          {
            "description": "IDs of the staff members who wrote or sent the interaction. Comma-separated; an interaction matches any of them.",
            "in": "query",
            "name": "authorIds",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Only what the calling token owner wrote or sent.",
            "in": "query",
            "name": "mine",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Where a message came from (ui, automation, marketing, api, mcp), comma-separated. Comments and WhatsApp messages carry no origin, so this filter leaves them out.",
            "in": "query",
            "name": "origins",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "ui",
                  "automation",
                  "marketing",
                  "api",
                  "mcp"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "At or after this ISO 8601 date.",
            "in": "query",
            "name": "after",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "At or before this ISO 8601 date.",
            "in": "query",
            "name": "before",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Accent-insensitive search on the subject and the content.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Return the full content instead of a 500-character excerpt. Defaults to false.",
            "in": "query",
            "name": "includeBody",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "order",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "type": "string"
            }
          },
          {
            "description": "Page number, from 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Interactions per page, between 1 and 100.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 100,
              "minimum": 1,
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerInteractionsResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the communications and comments the caller can see",
        "tags": [
          "Interactions"
        ]
      }
    },
    "/partner/education/v1/job-tags": {
      "get": {
        "operationId": "JobReferenceTagsController_findAll",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/TagOutput"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List all job tags for the school",
        "tags": [
          "Tags"
        ]
      },
      "post": {
        "operationId": "JobReferenceTagsController_create",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagLabelRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TagOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create a job tag",
        "tags": [
          "Tags"
        ]
      }
    },
    "/partner/education/v1/job-tags/{id}": {
      "delete": {
        "operationId": "JobReferenceTagsController_remove",
        "parameters": [
          {
            "description": "Tag ID (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Delete a job tag",
        "tags": [
          "Tags"
        ]
      },
      "put": {
        "operationId": "JobReferenceTagsController_update",
        "parameters": [
          {
            "description": "Tag ID (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagLabelRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TagOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Rename a job tag",
        "tags": [
          "Tags"
        ]
      }
    },
    "/partner/education/v1/jobs": {
      "get": {
        "description": "Get all jobs created from the interface or the API. Doesn't return jobs from partner enterprises from Grimp Business. Can be filtered using GET parameters.",
        "operationId": "OfferController_getOffers",
        "parameters": [
          {
            "description": "Partial, accent-insensitive search on the job title and the company name.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Contract types, comma-separated; a job matches any of them.",
            "in": "query",
            "name": "contractTypes",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "FIXED_TERM_CONTRACT",
                  "PERMANENT_CONTRACT",
                  "PART_TIME",
                  "INTERNSHIP",
                  "SEASONAL",
                  "WORK_LINKED_TRAINING",
                  "VOLUNTEER",
                  "CIVIC_SERVICE",
                  "OTHER"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Publication statuses, comma-separated.",
            "in": "query",
            "name": "statuses",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "PUBLISHED",
                  "UNPUBLISHED",
                  "DRAFT"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Campus IDs the job is posted on, comma-separated. Narrows the caller's campuses, never widens them.",
            "in": "query",
            "name": "campusIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Job tag IDs (from `GET /partner/education/v1/job-tags`), comma-separated.",
            "in": "query",
            "name": "tagIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "`true` for jobs archived on at least one campus, `false` for jobs still open on at least one campus.",
            "in": "query",
            "name": "archived",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Filter on the expiration flag.",
            "in": "query",
            "name": "expired",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "`true` for jobs marked as filled on at least one campus.",
            "in": "query",
            "name": "filled",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Created at or after this ISO 8601 date.",
            "in": "query",
            "name": "createdAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Created at or before this ISO 8601 date.",
            "in": "query",
            "name": "createdBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Updated at or after this ISO 8601 date, for incremental sync.",
            "in": "query",
            "name": "updatedAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Updated at or before this ISO 8601 date.",
            "in": "query",
            "name": "updatedBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "default": "createdAt",
              "enum": [
                "createdAt",
                "updatedAt",
                "lastPublishedDate",
                "expireDate"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "type": "string"
            }
          },
          {
            "description": "Page index (1-based). Default is 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "description": "Number of jobs per page, between 1 and 200. Default is 50.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "description": "Filter jobs by external partner ID.",
            "in": "query",
            "name": "externalId",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Filter jobs by company name (exact match).",
            "in": "query",
            "name": "enterpriseName",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Filter jobs by job posting URL.",
            "in": "query",
            "name": "url",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Filter jobs by title (exact match).",
            "in": "query",
            "name": "title",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OffersResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Get list of all jobs",
        "tags": [
          "Offres"
        ]
      },
      "post": {
        "description": "Create and publish a job. The job will be visible for students and administrators in the jobs list. Visibility can be setup using programIds property. To publish job on a specific campus please provide all campus programs.",
        "operationId": "OfferController_createOffer",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateOfferRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OfferDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create a job",
        "tags": [
          "Offres"
        ]
      }
    },
    "/partner/education/v1/jobs/{id}": {
      "delete": {
        "description": "Archive a job. A job archived is not visible anymore for students but is still visible for administrators in the archive tab. It's not possible to delete a job for now. Job ID in the path should be the Grimp ID or the external ID provided in the job creation from the API.",
        "operationId": "OfferController_archiveOffer",
        "parameters": [
          {
            "description": "Grimp ID or the external ID provided when the job was created from the API.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {}
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Archive a job",
        "tags": [
          "Offres"
        ]
      },
      "get": {
        "description": "Get details, including applications, for a job created from the interface or the API. Job ID in the path should be the Grimp ID or the external ID provided in the job creation from the API. Also opens the jobs from enterprises, job boards or other schools that were accepted on one of the caller's campuses — the ones `GET /students/{id}/matching-offers` can return — without their author.",
        "operationId": "OfferController_getOffer",
        "parameters": [
          {
            "description": "Grimp ID or the external ID provided when the job was created from the API.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {}
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OfferDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Get a job from his ID",
        "tags": [
          "Offres"
        ]
      },
      "post": {
        "description": "Replace data for a job. Job ID in the path should be the Grimp ID or the external ID provided in the job creation from the API.",
        "operationId": "OfferController_updateOffer",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateOfferRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OfferDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Update a job from his ID",
        "tags": [
          "Offres"
        ]
      }
    },
    "/partner/education/v1/jobs/{id}/matching-students": {
      "get": {
        "description": "Scores are computed live from the student's profile and the job description: skills and project similarity, contract type overlap and distance, combined with the weights `GET /matching/configuration` shows. Only matches at or above the school's threshold are returned, best first. Requires the offer matching feature (403 `matching_disabled` otherwise). Candidates are the caller's students who are visible in the talent library: consenting, with a complete enough profile, alumni excluded. 425 means the job is still being analysed, 422 that its description is too poor to match.",
        "operationId": "GetPartnerJobMatchingStudents",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Lowest global score to return, between 0 and 1. The school's own threshold still applies when it is higher.",
            "in": "query",
            "name": "minScore",
            "required": false,
            "schema": {
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            }
          },
          {
            "description": "Page number, from 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Results per page, between 1 and 50.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "default": 20,
              "maximum": 50,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Search on the student's name.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Only students looking for a position (to place or open to opportunities).",
            "in": "query",
            "name": "openToWork",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Contract types the student wants, comma-separated.",
            "in": "query",
            "name": "contractTypes",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "FIXED_TERM_CONTRACT",
                  "PERMANENT_CONTRACT",
                  "PART_TIME",
                  "INTERNSHIP",
                  "SEASONAL",
                  "WORK_LINKED_TRAINING",
                  "VOLUNTEER",
                  "CIVIC_SERVICE",
                  "OTHER"
                ],
                "type": "string"
              },
              "type": "array"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerJobMatchingStudentsResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "`matching_disabled`: the offer matching feature is not enabled for the school."
          },
          "404": {
            "description": "`job_not_found`"
          },
          "422": {
            "description": "The job description cannot be matched."
          },
          "425": {
            "description": "The job has not been analysed yet."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the students who best match one job",
        "tags": [
          "Matching"
        ]
      }
    },
    "/partner/education/v1/jobs/{id}/tags/add": {
      "post": {
        "operationId": "OfferController_addOfferTags",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddTagsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Add tags to a job",
        "tags": [
          "Offres"
        ]
      }
    },
    "/partner/education/v1/jobs/{id}/tags/remove": {
      "post": {
        "operationId": "OfferController_removeOfferTags",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RemoveTagsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Remove tags from a job (by tagIds or names)",
        "tags": [
          "Offres"
        ]
      }
    },
    "/partner/education/v1/leads": {
      "post": {
        "operationId": "LeadController_create",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LeadRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeadDetailsOutput"
                }
              }
            },
            "description": "Lead created successfully"
          },
          "400": {
            "description": "Invalid input"
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create a new lead",
        "tags": [
          "Leads"
        ]
      }
    },
    "/partner/education/v1/matching/configuration": {
      "get": {
        "description": "Explains a score: the global score combines the three criteria with these weights, and only matches at or above the threshold are returned. Requires the offer matching feature (403 `matching_disabled` otherwise).",
        "operationId": "GetPartnerMatchingConfiguration",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerMatchingConfigurationResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "`matching_disabled`: the offer matching feature is not enabled for the school."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Read the school's matching threshold and weighting",
        "tags": [
          "Matching"
        ]
      }
    },
    "/partner/education/v1/opportunities": {
      "get": {
        "operationId": "PartnerOpportunityController_getOpportunities",
        "parameters": [
          {
            "description": "Tag IDs. A record matching at least one of them is returned. Comma-separated.",
            "in": "query",
            "name": "tagIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Tag labels, matched the way the interface does (case and accent insensitive). A label unknown to the school is rejected with a 400. Comma-separated.",
            "in": "query",
            "name": "tagLabels",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Restrict to records visible from these campuses. Must be within the caller's scope. Comma-separated.",
            "in": "query",
            "name": "campusIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Referent coaches, each identified by the coach email or ID. A record assigned to at least one of them is returned. Comma-separated.",
            "in": "query",
            "name": "assignedCoaches",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Restrict to the records assigned to the calling token owner.",
            "in": "query",
            "name": "assignedOnly",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "visibilityMode",
            "required": false,
            "schema": {
              "enum": [
                "PRIVATE",
                "SHARED"
              ],
              "type": "string"
            }
          },
          {
            "description": "Created at or after this ISO 8601 date.",
            "in": "query",
            "name": "createdAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Created at or before this ISO 8601 date.",
            "in": "query",
            "name": "createdBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Updated at or after this ISO 8601 date — the filter to use for incremental synchronisation.",
            "in": "query",
            "name": "updatedAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Updated at or before this ISO 8601 date.",
            "in": "query",
            "name": "updatedBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Sort direction, DESC by default.",
            "in": "query",
            "name": "order",
            "required": false,
            "schema": {
              "enum": [
                "ASC",
                "DESC"
              ],
              "type": "string"
            }
          },
          {
            "description": "Results per page, 50 by default.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Page number, starting at 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Partial, case-insensitive name match.",
            "in": "query",
            "name": "name",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Accent-insensitive search on the opportunity name and its enterprise name.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Only this enterprise's opportunities.",
            "in": "query",
            "name": "enterpriseId",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Enterprise IDs. Comma-separated; an opportunity matches any of them.",
            "in": "query",
            "name": "enterpriseIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Partial match on the enterprise name.",
            "in": "query",
            "name": "enterpriseName",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "CRM contact IDs attached to the opportunity. Comma-separated; an opportunity matches any of them.",
            "in": "query",
            "name": "contactIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Opportunity types, comma-separated.",
            "in": "query",
            "name": "types",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "MANDATE",
                  "CONTINUING_EDUCATION",
                  "PARTNERSHIP",
                  "APPRENTICESHIP_TAX",
                  "OTHER"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Pipeline stage IDs. Comma-separated; an opportunity matches any of them.",
            "in": "query",
            "name": "stageIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Stage categories, comma-separated: OPEN for opportunities in progress, WON or LOST for closed ones.",
            "in": "query",
            "name": "stageTypes",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "OPEN",
                  "WON",
                  "LOST"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Pipeline IDs. Comma-separated; an opportunity matches any of them.",
            "in": "query",
            "name": "pipelineIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Target date at or after this ISO 8601 date.",
            "in": "query",
            "name": "targetDateAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Target date at or before this ISO 8601 date.",
            "in": "query",
            "name": "targetDateBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Field to sort on, createdAt by default.",
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "enum": [
                "createdAt",
                "updatedAt",
                "name",
                "targetDate",
                "value"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpportunitiesResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `opportunityRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Get list of all opportunities",
        "tags": [
          "Opportunités"
        ]
      },
      "post": {
        "operationId": "PartnerOpportunityController_createOpportunity",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePartnerOpportunityRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpportunityDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `opportunityRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create an opportunity",
        "tags": [
          "Opportunités"
        ]
      }
    },
    "/partner/education/v1/opportunities/{id}": {
      "delete": {
        "operationId": "PartnerOpportunityController_deleteOpportunity",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `opportunityRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Delete an opportunity from its ID",
        "tags": [
          "Opportunités"
        ]
      },
      "get": {
        "operationId": "PartnerOpportunityController_getOpportunity",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpportunityDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `opportunityRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Get an opportunity from its ID",
        "tags": [
          "Opportunités"
        ]
      },
      "post": {
        "operationId": "PartnerOpportunityController_updateOpportunity",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdatePartnerOpportunityRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpportunityDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `opportunityRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Update an opportunity from its ID",
        "tags": [
          "Opportunités"
        ]
      },
      "put": {
        "operationId": "PartnerOpportunityController_replaceOpportunityTags",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagIdsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `opportunityRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Replace all tags on an opportunity (tagIds required; send [] to clear)",
        "tags": [
          "Opportunités"
        ]
      }
    },
    "/partner/education/v1/opportunities/{id}/interactions": {
      "get": {
        "description": "Emails, SMS and WhatsApp messages exchanged with students and CRM contacts, and the internal comments left on students, contacts, enterprises and opportunities — newest first, across all channels. Only records the token owner can open are included: students of its programs or campuses, CRM records of its campuses (private ones only when assigned), contacts, enterprises and opportunities only with the matching read permission. Synced emails of a student or contact who refused the mailbox synchronisation are left out, and on a private portal so are messages sent by staff outside the caller's peers (comments on CRM records are always limited to the caller's peers, comments on students never are). `enterpriseIds` also brings the messages of the enterprise's contacts, when the caller can see the enterprise.",
        "operationId": "GetPartnerOpportunityInteractions",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Channels, comma-separated.",
            "in": "query",
            "name": "channels",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "email",
                  "sms",
                  "whatsapp",
                  "comment"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "`outbound` for what the school sent, `inbound` for replies, `internal` for comments.",
            "in": "query",
            "name": "direction",
            "required": false,
            "schema": {
              "enum": [
                "inbound",
                "outbound",
                "internal"
              ],
              "type": "string"
            }
          },
          {
            "description": "IDs of the staff members who wrote or sent the interaction. Comma-separated; an interaction matches any of them.",
            "in": "query",
            "name": "authorIds",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Only what the calling token owner wrote or sent.",
            "in": "query",
            "name": "mine",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Where a message came from (ui, automation, marketing, api, mcp), comma-separated. Comments and WhatsApp messages carry no origin, so this filter leaves them out.",
            "in": "query",
            "name": "origins",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "ui",
                  "automation",
                  "marketing",
                  "api",
                  "mcp"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "At or after this ISO 8601 date.",
            "in": "query",
            "name": "after",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "At or before this ISO 8601 date.",
            "in": "query",
            "name": "before",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Accent-insensitive search on the subject and the content.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Return the full content instead of a 500-character excerpt. Defaults to false.",
            "in": "query",
            "name": "includeBody",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "order",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "type": "string"
            }
          },
          {
            "description": "Page number, from 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Interactions per page, between 1 and 100.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 100,
              "minimum": 1,
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerInteractionsResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `opportunityRead` permission."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the comments on one opportunity",
        "tags": [
          "Interactions"
        ]
      }
    },
    "/partner/education/v1/opportunities/{id}/tags/add": {
      "post": {
        "operationId": "PartnerOpportunityController_addOpportunityTags",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddTagsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `opportunityRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Add tags to an opportunity",
        "tags": [
          "Opportunités"
        ]
      }
    },
    "/partner/education/v1/opportunities/{id}/tags/remove": {
      "post": {
        "operationId": "PartnerOpportunityController_removeOpportunityTags",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RemoveTagsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `opportunityRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Remove tags from an opportunity (by tagIds or names)",
        "tags": [
          "Opportunités"
        ]
      }
    },
    "/partner/education/v1/opportunity-tags": {
      "get": {
        "operationId": "OpportunityReferenceTagsController_findAll",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/TagOutput"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `opportunityRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List all opportunity tags for the school",
        "tags": [
          "Tags"
        ]
      },
      "post": {
        "operationId": "OpportunityReferenceTagsController_create",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagLabelRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TagOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `opportunityRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create an opportunity tag",
        "tags": [
          "Tags"
        ]
      }
    },
    "/partner/education/v1/opportunity-tags/{id}": {
      "delete": {
        "operationId": "OpportunityReferenceTagsController_remove",
        "parameters": [
          {
            "description": "Tag ID (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `opportunityRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Delete an opportunity tag",
        "tags": [
          "Tags"
        ]
      },
      "put": {
        "operationId": "OpportunityReferenceTagsController_update",
        "parameters": [
          {
            "description": "Tag ID (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagLabelRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TagOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner lacks the `opportunityRead` permission, or has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Rename an opportunity tag",
        "tags": [
          "Tags"
        ]
      }
    },
    "/partner/education/v1/opportunity/pipelines": {
      "get": {
        "description": "Returns every opportunity pipeline configured by the school, each one with its ordered stages.\nUse a stage `id` as `stageId` when creating or updating an opportunity through\n`/partner/education/v1/opportunities`. `GET /partner/education/v1/opportunity/stages` returns\nthe same stages as a flat list.",
        "operationId": "GetPartnerOpportunityPipelines",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerOpportunityPipelinesResponse"
                }
              }
            },
            "description": "Opportunity pipelines retrieved successfully"
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the opportunity pipelines of the school",
        "tags": [
          "Opportunités"
        ]
      }
    },
    "/partner/education/v1/opportunity/stages": {
      "get": {
        "description": "Returns every opportunity stage configured by the school — the steps an opportunity moves\nthrough — ordered by pipeline then by position inside the pipeline. Use `pipelineIds` to\nrestrict the list to some pipelines, or `GET /partner/education/v1/opportunity/pipelines` to get\nthe stages already grouped by pipeline.",
        "operationId": "GetPartnerOpportunityStages",
        "parameters": [
          {
            "description": "Opportunity pipeline IDs to filter on, comma separated",
            "in": "query",
            "name": "pipelineIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerOpportunityStagesResponse"
                }
              }
            },
            "description": "Opportunity stages retrieved successfully"
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the opportunity stages of the school",
        "tags": [
          "Opportunités"
        ]
      }
    },
    "/partner/education/v1/programs": {
      "get": {
        "description": "Returns the active programs of the campuses the token owner directs (Admin role) or the programs it handles (Coach and ReadOnly roles), ordered by name. Use their IDs in the `programIds` / `program` filters of the other endpoints.",
        "operationId": "GetPartnerPrograms",
        "parameters": [
          {
            "description": "Partial, accent-insensitive match on the name or reference.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Campus IDs hosting the program, comma-separated.",
            "in": "query",
            "name": "campusIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Page number, from 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Programs per page, between 1 and 200.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerProgramsResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the programs the caller sees",
        "tags": [
          "Campus"
        ]
      },
      "post": {
        "description": "Creates a program on a campus. `defaultScolarship` and `defaultContractType` are the\nvalues pre-filled on the students of the program. `pipelineId` must reference a pipeline of the\nschool, listed by `GET /partner/education/v1/admission/pipelines`; when omitted, the pipeline most\nused by the campus is applied. Replaces `POST /partner/education/v1/class`, which names the same\nresource a *class*.",
        "operationId": "CreatePartnerProgram",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePartnerProgramRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerProgramDTO"
                }
              }
            },
            "description": "Program created successfully"
          },
          "400": {
            "description": "Invalid input"
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "406": {
            "description": "Program with the same name or reference already exists"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create a program",
        "tags": [
          "Campus"
        ]
      }
    },
    "/partner/education/v1/programs/{id}": {
      "post": {
        "description": "Only the fields present in the body are updated. Changing `pipelineId` moves every\nstudent of the program to the first step of the new pipeline. Replaces\n`POST /partner/education/v1/class/{id}`.",
        "operationId": "UpdatePartnerProgram",
        "parameters": [
          {
            "description": "ID of the program to update",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdatePartnerProgramRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerProgramDTO"
                }
              }
            },
            "description": "Program updated successfully"
          },
          "400": {
            "description": "Invalid input"
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "406": {
            "description": "Program with the same name or reference already exists"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Update an existing program",
        "tags": [
          "Campus"
        ]
      }
    },
    "/partner/education/v1/sectors": {
      "get": {
        "operationId": "SectorController_get",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/SectorDTO"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Get all sectors",
        "tags": [
          "Secteurs"
        ]
      }
    },
    "/partner/education/v1/sms/authorization": {
      "get": {
        "operationId": "PartnerSMSController_getSendSMSAuthorization",
        "parameters": [
          {
            "in": "query",
            "name": "smsToSendCount",
            "required": true,
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Check whether enough SMS credits remain to send messages",
        "tags": [
          "SMS"
        ]
      }
    },
    "/partner/education/v1/sms/students/{id}": {
      "post": {
        "operationId": "PartnerSMSController_sendToStudent",
        "parameters": [
          {
            "description": "Grimp or external ID",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PartnerSendStudentSMSRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Send a SMS to a student",
        "tags": [
          "SMS"
        ]
      }
    },
    "/partner/education/v1/student-tags": {
      "get": {
        "operationId": "StudentReferenceTagsController_findAll",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/TagOutput"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List all student tags for the school",
        "tags": [
          "Tags"
        ]
      },
      "post": {
        "operationId": "StudentReferenceTagsController_create",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagLabelRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TagOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create a student tag",
        "tags": [
          "Tags"
        ]
      }
    },
    "/partner/education/v1/student-tags/{id}": {
      "delete": {
        "operationId": "StudentReferenceTagsController_remove",
        "parameters": [
          {
            "description": "Tag ID (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Delete a student tag",
        "tags": [
          "Tags"
        ]
      },
      "put": {
        "operationId": "StudentReferenceTagsController_update",
        "parameters": [
          {
            "description": "Tag ID (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagLabelRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TagOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Rename a student tag",
        "tags": [
          "Tags"
        ]
      }
    },
    "/partner/education/v1/student-years/{id}/acquisition": {
      "patch": {
        "operationId": "StudentYearController_updateAcquisitionValue",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateAcquisitionValueRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateAcquisitionValueResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "Invalid value"
          },
          "403": {
            "description": "The token owner lacks the `admissionRead` permission, or has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Candidature not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Update the acquisition value of a candidature, computed externally (e.g. by N8N)",
        "tags": [
          "Années étudiantes"
        ]
      }
    },
    "/partner/education/v1/students": {
      "get": {
        "operationId": "StudentController_findAll",
        "parameters": [
          {
            "description": "Page number, from 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Campus ID to filter on",
            "in": "query",
            "name": "campus",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Program ID to filter on. Replaces `class`, which is deprecated; if both are sent, `program` wins.",
            "in": "query",
            "name": "program",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "deprecated": true,
            "description": "Class ID to filter on. Deprecated: use `program` instead, which names the resource the way the rest of the API does. Both filter on the same field and stay available in parallel; if both are sent, `program` wins. The end-of-support date of `class` will be announced to the integrations still using it.",
            "in": "query",
            "name": "class",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Year ID to filter on",
            "in": "query",
            "name": "year",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Student Email to filter on",
            "in": "query",
            "name": "email",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Created at or after this ISO 8601 date.",
            "in": "query",
            "name": "createdAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Created at or before this ISO 8601 date.",
            "in": "query",
            "name": "createdBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Updated at or after this ISO 8601 date — the filter to use for incremental synchronisation. Replaces `updatedSince`.",
            "in": "query",
            "name": "updatedAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Updated at or before this ISO 8601 date.",
            "in": "query",
            "name": "updatedBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "deprecated": true,
            "description": "Deprecated alias of `updatedAfter`, which wins if both are sent.",
            "in": "query",
            "name": "updatedSince",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Accent-insensitive search on the student's name, email and phone number.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Campus IDs of the student's active enrolments (or alumni campus). Comma-separated; a student matches any of the values.",
            "in": "query",
            "name": "campusIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Program IDs of the student's active enrolments. Comma-separated; a student matches any of the values.",
            "in": "query",
            "name": "programIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Academic year IDs of the student's active enrolments. Comma-separated; a student matches any of the values.",
            "in": "query",
            "name": "yearIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Account states, comma-separated.",
            "in": "query",
            "name": "states",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "CREATED",
                  "ACTIVE",
                  "INVITED",
                  "UNACTIVE",
                  "PENDING",
                  "REFUSED"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Work situations, comma-separated.",
            "in": "query",
            "name": "workSituations",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "to place",
                  "opportunity",
                  "placed"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "`true` for students with a confirmed (non-canceled) hiring on an active enrolment, `false` for the others.",
            "in": "query",
            "name": "hired",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "`true` for students with at least one CV, `false` for the others.",
            "in": "query",
            "name": "hasResume",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "`true` for alumni only, `false` to exclude them.",
            "in": "query",
            "name": "isAlumni",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Student tag IDs, from `GET /partner/education/v1/student-tags`. Comma-separated; a student matches any of the values.",
            "in": "query",
            "name": "tagIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Student tag labels, matched case and accent insensitively. An unknown label is rejected with a 400. Comma-separated; a student matches any of the values.",
            "in": "query",
            "name": "tagLabels",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Referent coaches, each identified by email or ID. Comma-separated; a student matches any of the values.",
            "in": "query",
            "name": "assignedCoaches",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Only the students the calling token owner is a referent of.",
            "in": "query",
            "name": "assignedOnly",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Last connection at or after this ISO 8601 date.",
            "in": "query",
            "name": "lastConnectionAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Last connection at or before this ISO 8601 date, or never connected — e.g. students inactive for a month.",
            "in": "query",
            "name": "lastConnectionBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "default": "createdAt",
              "enum": [
                "createdAt",
                "updatedAt",
                "lastName",
                "lastConnection"
              ],
              "type": "string"
            }
          },
          {
            "description": "Sort direction, case-insensitive.",
            "in": "query",
            "name": "order",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "type": "string"
            }
          },
          {
            "description": "Students per page, between 1 and 200. Defaults to 50.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "maximum": 200,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Pages count from 1. Integrations authenticated with a static API token were served 0-based pages on this list and still are until 2027-01-15 (see the `Deprecation` and `Sunset` response headers): send `pageBase=1` to switch to 1-based pages now. OAuth tokens always get 1-based pages.",
            "in": "query",
            "name": "pageBase",
            "required": false,
            "schema": {
              "enum": [
                1
              ],
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetStudentsResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List all students",
        "tags": [
          "Étudiants"
        ]
      },
      "post": {
        "operationId": "StudentController_invite",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvitationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentDetailsOutput"
                }
              }
            },
            "description": "Student invited (or the existing one updated), with its profile, zones and legal guardians"
          },
          "400": {
            "description": "Invalid input"
          },
          "403": {
            "description": "The token owner has the ReadOnly role, or `student_out_of_scope`: the email matches an existing student none of whose applications the caller sees"
          },
          "406": {
            "description": "Student already existing"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Invite a student to Grimp",
        "tags": [
          "Étudiants"
        ]
      }
    },
    "/partner/education/v1/students/{id}": {
      "delete": {
        "operationId": "StudentController_unactiveStudent",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentIdDTO"
                }
              }
            },
            "description": "Student disabled successfully"
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Student not found"
          },
          "409": {
            "description": "Student already disabled"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Disable a student",
        "tags": [
          "Étudiants"
        ]
      },
      "get": {
        "operationId": "StudentController_findOne",
        "parameters": [
          {
            "description": "Grimp or external ID",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentDetailsOutput"
                }
              }
            },
            "description": "Student found successfully"
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Student not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Get details for a student",
        "tags": [
          "Étudiants"
        ]
      },
      "post": {
        "operationId": "StudentController_update",
        "parameters": [
          {
            "description": "Grimp or external ID",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentDetailsOutput"
                }
              }
            },
            "description": "Student updated successfully"
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Student not found"
          },
          "405": {
            "description": "Invalid input"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Update an existing student",
        "tags": [
          "Étudiants"
        ]
      }
    },
    "/partner/education/v1/students/{id}/confirm-recruitment": {
      "post": {
        "operationId": "StudentController_confirmRecruitment",
        "parameters": [
          {
            "description": "Grimp or external ID",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmRecruitmentRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentDetailsOutput"
                }
              }
            },
            "description": "Recruitment confirmed successfully"
          },
          "400": {
            "description": "Invalid input (admission application not owned by the student, or unsupported contract type)"
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Student not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Confirm the recruitment of a student for an admission application",
        "tags": [
          "Étudiants"
        ]
      }
    },
    "/partner/education/v1/students/{id}/custom-fields": {
      "patch": {
        "description": "Only the keys sent are written; a null value deletes the key. No field definition is required. The id can be the Grimp id or your external id.",
        "operationId": "StudentController_patchCustomFields",
        "parameters": [
          {
            "description": "Grimp id or external id of the student",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PartnerCustomFieldsPatchRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerCustomFieldsOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Student not found"
          },
          "422": {
            "description": "Invalid custom fields"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Merge custom fields into a student",
        "tags": [
          "Étudiants"
        ]
      }
    },
    "/partner/education/v1/students/{id}/documents": {
      "get": {
        "operationId": "StudentController_findDocuments",
        "parameters": [
          {
            "description": "Grimp or external ID",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/PartnerStudentDocumentOutput"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Documents retrieved successfully"
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Student not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List documents for a student",
        "tags": [
          "Étudiants"
        ]
      },
      "post": {
        "operationId": "StudentController_addDocument",
        "parameters": [
          {
            "description": "Grimp or external ID",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "properties": {
                  "admissionApplicationIds": {
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "file": {
                    "format": "binary",
                    "type": "string"
                  },
                  "title": {
                    "type": "string"
                  },
                  "type": {
                    "enum": [
                      "IDENTITY",
                      "DIPLOMA",
                      "ACADEMIC_TRANSCRIPT",
                      "CV",
                      "COVER_LETTER",
                      "SOCIAL_SECURITY_CERTIFICATE",
                      "CIVIL_LIABILITY_CERTIFICATE",
                      "RIB",
                      "PROMISE_OF_EMPLOYMENT",
                      "CONTRACT",
                      "INTERNSHIP_CERTIFICATE",
                      "ENROLLMENT_CERTIFICATE",
                      "PROOF_OF_RESIDENCE",
                      "INTERVIEW",
                      "FOLLOW_UP",
                      "OTHER"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "file",
                  "title",
                  "type"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerStudentDocumentOutput"
                }
              }
            },
            "description": "Document added successfully"
          },
          "400": {
            "description": "Invalid input (missing file or unknown student years)"
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Student not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Add a document to a student and optionally assign it to one or more student years",
        "tags": [
          "Étudiants"
        ]
      }
    },
    "/partner/education/v1/students/{id}/hirings/{hiringId}/break": {
      "post": {
        "description": "Marks the hiring as `CANCELED` with its date and reason, as the Grimp interface does; the admission step of the application is left as it is. `hiringId` is the `id` of an item of `hirings` in the student or application representation. Returns the student.",
        "operationId": "StudentController_breakHiring",
        "parameters": [
          {
            "description": "Grimp or external ID",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "ID of the hiring",
            "in": "path",
            "name": "hiringId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PartnerBreakHiringRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentDetailsOutput"
                }
              }
            },
            "description": "Hiring broken"
          },
          "400": {
            "description": "Invalid input, or `breakAt_before_hiringAt`"
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Student not found, or `hiring_not_found`"
          },
          "409": {
            "description": "`hiring_already_broken`"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Break the hiring of a student",
        "tags": [
          "Étudiants"
        ]
      }
    },
    "/partner/education/v1/students/{id}/interactions": {
      "get": {
        "description": "Emails, SMS and WhatsApp messages exchanged with students and CRM contacts, and the internal comments left on students, contacts, enterprises and opportunities — newest first, across all channels. Only records the token owner can open are included: students of its programs or campuses, CRM records of its campuses (private ones only when assigned), contacts, enterprises and opportunities only with the matching read permission. Synced emails of a student or contact who refused the mailbox synchronisation are left out, and on a private portal so are messages sent by staff outside the caller's peers (comments on CRM records are always limited to the caller's peers, comments on students never are). `enterpriseIds` also brings the messages of the enterprise's contacts, when the caller can see the enterprise.",
        "operationId": "GetPartnerStudentInteractions",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Channels, comma-separated.",
            "in": "query",
            "name": "channels",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "email",
                  "sms",
                  "whatsapp",
                  "comment"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "`outbound` for what the school sent, `inbound` for replies, `internal` for comments.",
            "in": "query",
            "name": "direction",
            "required": false,
            "schema": {
              "enum": [
                "inbound",
                "outbound",
                "internal"
              ],
              "type": "string"
            }
          },
          {
            "description": "IDs of the staff members who wrote or sent the interaction. Comma-separated; an interaction matches any of them.",
            "in": "query",
            "name": "authorIds",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Only what the calling token owner wrote or sent.",
            "in": "query",
            "name": "mine",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Where a message came from (ui, automation, marketing, api, mcp), comma-separated. Comments and WhatsApp messages carry no origin, so this filter leaves them out.",
            "in": "query",
            "name": "origins",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "ui",
                  "automation",
                  "marketing",
                  "api",
                  "mcp"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "At or after this ISO 8601 date.",
            "in": "query",
            "name": "after",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "At or before this ISO 8601 date.",
            "in": "query",
            "name": "before",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Accent-insensitive search on the subject and the content.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Return the full content instead of a 500-character excerpt. Defaults to false.",
            "in": "query",
            "name": "includeBody",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "order",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "type": "string"
            }
          },
          {
            "description": "Page number, from 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Interactions per page, between 1 and 100.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 100,
              "minimum": 1,
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerInteractionsResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the communications and comments about one student",
        "tags": [
          "Interactions"
        ]
      }
    },
    "/partner/education/v1/students/{id}/legal-guardians": {
      "get": {
        "description": "Oldest first. Exactly one of them is primary.",
        "operationId": "PartnerLegalGuardiansController_list",
        "parameters": [
          {
            "description": "Grimp or external ID",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/LegalGuardianOutput"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Student not found or not visible to the caller"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the legal guardians of a student",
        "tags": [
          "Étudiants"
        ]
      },
      "post": {
        "description": "The first guardian of a student is always primary. `isPrimary: true` makes the new one primary and demotes the previous one.",
        "operationId": "PartnerLegalGuardiansController_create",
        "parameters": [
          {
            "description": "Grimp or external ID",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PartnerCreateLegalGuardianRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegalGuardianOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Student not found or not visible to the caller"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Add a legal guardian to a student",
        "tags": [
          "Étudiants"
        ]
      }
    },
    "/partner/education/v1/students/{id}/legal-guardians/{guardianId}": {
      "delete": {
        "description": "Returns the guardians left. When the primary guardian is removed, the oldest remaining one becomes primary.",
        "operationId": "PartnerLegalGuardiansController_delete",
        "parameters": [
          {
            "description": "Grimp or external ID",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "ID of the legal guardian, as returned by the list",
            "in": "path",
            "name": "guardianId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/LegalGuardianOutput"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Student or legal guardian not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Remove a legal guardian from a student",
        "tags": [
          "Étudiants"
        ]
      },
      "put": {
        "description": "Only the fields sent are changed. `isPrimary: true` makes this guardian primary and demotes the previous one. To change the primary guardian, set `isPrimary: true` on the new one: `isPrimary: false` on the current primary answers 400 `primary_guardian_required`.",
        "operationId": "PartnerLegalGuardiansController_update",
        "parameters": [
          {
            "description": "Grimp or external ID",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "ID of the legal guardian, as returned by the list",
            "in": "path",
            "name": "guardianId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PartnerUpdateLegalGuardianRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegalGuardianOutput"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "Invalid input, an undeclared query parameter (`unknown_query_parameters`), or `primary_guardian_required`"
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Student or legal guardian not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Update a legal guardian of a student",
        "tags": [
          "Étudiants"
        ]
      }
    },
    "/partner/education/v1/students/{id}/matching-offers": {
      "get": {
        "description": "Scores are computed live from the student's profile and the job description: skills and project similarity, contract type overlap and distance, combined with the weights `GET /matching/configuration` shows. Only matches at or above the school's threshold are returned, best first. Requires the offer matching feature (403 `matching_disabled` otherwise). Candidates are the published, non-expired jobs posted on the caller's campuses and visible to the student's programs — including jobs from enterprises and job boards that `GET /jobs` does not list. An empty list can also mean the student has no skills profile yet.",
        "operationId": "GetPartnerStudentMatchingOffers",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Lowest global score to return, between 0 and 1. The school's own threshold still applies when it is higher.",
            "in": "query",
            "name": "minScore",
            "required": false,
            "schema": {
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            }
          },
          {
            "description": "Page number, from 1.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Results per page, between 1 and 50.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "default": 20,
              "maximum": 50,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Leave out the jobs the student already applied to.",
            "in": "query",
            "name": "noApplications",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPartnerStudentMatchingOffersResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "`matching_disabled`: the offer matching feature is not enabled for the school."
          },
          "404": {
            "description": "`student_not_found`"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "List the jobs that best match one student",
        "tags": [
          "Matching"
        ]
      }
    },
    "/partner/education/v1/students/{id}/reactivate": {
      "post": {
        "operationId": "StudentController_reactivateStudent",
        "parameters": [
          {
            "description": "Grimp or external ID",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentIdDTO"
                }
              }
            },
            "description": "Student reactivated successfully"
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Student not found"
          },
          "409": {
            "description": "Student is not deactivated"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Reactivate a deactivated student (explicit reactivation, independent of invite payload)",
        "tags": [
          "Étudiants"
        ]
      }
    },
    "/partner/education/v1/students/{id}/referents/add": {
      "post": {
        "operationId": "StudentController_addStudentReferents",
        "parameters": [
          {
            "description": "Grimp or external ID",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReferentsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Add referent coaches to a student (by coach email or ID), keeping existing ones",
        "tags": [
          "Étudiants"
        ]
      }
    },
    "/partner/education/v1/students/{id}/referents/remove": {
      "post": {
        "operationId": "StudentController_removeStudentReferents",
        "parameters": [
          {
            "description": "Grimp or external ID",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReferentsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Remove referent coaches from a student (by coach email or ID)",
        "tags": [
          "Étudiants"
        ]
      }
    },
    "/partner/education/v1/students/{id}/resume": {
      "post": {
        "operationId": "StudentController_addResume",
        "parameters": [
          {
            "description": "Grimp or external ID",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "properties": {
                  "file": {
                    "format": "binary",
                    "type": "string"
                  }
                },
                "required": [
                  "file"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Resume added successfully"
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          },
          "404": {
            "description": "Student not found"
          },
          "405": {
            "description": "Invalid input"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Add resume to existing student",
        "tags": [
          "Étudiants"
        ]
      }
    },
    "/partner/education/v1/students/{id}/tags/add": {
      "post": {
        "operationId": "StudentController_addStudentTags",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddTagsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Add tags to a student (by tagIds or names with upsert)",
        "tags": [
          "Étudiants"
        ]
      }
    },
    "/partner/education/v1/students/{id}/tags/remove": {
      "post": {
        "operationId": "StudentController_removeStudentTags",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RemoveTagsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Remove tags from a student (by tagIds or names)",
        "tags": [
          "Étudiants"
        ]
      }
    },
    "/partner/education/v1/tasks": {
      "get": {
        "operationId": "PartnerTaskController_getTasks",
        "parameters": [
          {
            "description": "Created at or after this ISO 8601 date.",
            "in": "query",
            "name": "createdAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Created at or before this ISO 8601 date.",
            "in": "query",
            "name": "createdBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Updated at or after this ISO 8601 date — the filter to use for incremental synchronisation. Replaces `updatedSince`.",
            "in": "query",
            "name": "updatedAfter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Updated at or before this ISO 8601 date.",
            "in": "query",
            "name": "updatedBefore",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "deprecated": true,
            "description": "Deprecated alias of `updatedAfter`, which wins if both are sent.",
            "in": "query",
            "name": "updatedSince",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "enum": [
                "TODO",
                "FINISHED"
              ],
              "type": "string"
            }
          },
          {
            "description": "Task types, comma separated. A task matches any of them.",
            "in": "query",
            "name": "types",
            "required": false,
            "schema": {
              "items": {
                "enum": [
                  "WORKSHOP_CV",
                  "WORKSHOP_LETTER",
                  "WORKSHOP_JOB_SEEKING",
                  "WORKSHOP_INTERVIEW",
                  "OTHER",
                  "JOB_SEARCH_SUPPORT",
                  "TODO",
                  "CONTACT_PHONE",
                  "CONTACT_EMAIL",
                  "PROFESSIONAL_PLACING",
                  "MEETING"
                ],
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Accent-insensitive search on the title and on the names of the linked students, enterprises, contacts and opportunities",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Student IDs, comma separated. A task matches any of them.",
            "in": "query",
            "name": "studentIds",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Enterprise IDs, comma separated. A task matches any of them.",
            "in": "query",
            "name": "enterpriseIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "CRM contact IDs, comma separated. A task matches any of them.",
            "in": "query",
            "name": "contactIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Opportunity IDs, comma separated. A task matches any of them.",
            "in": "query",
            "name": "opportunityIds",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Assigned administrator IDs, comma separated. A task matches any of them.",
            "in": "query",
            "name": "assignedAdminIds",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Assigned administrators, each identified by email or ID, comma separated. A task matches any of them.",
            "in": "query",
            "name": "assignedCoaches",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Only the tasks assigned to the calling token owner.",
            "in": "query",
            "name": "assignedOnly",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "IDs of the administrators who created the task, comma separated.",
            "in": "query",
            "name": "createdByIds",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "true: only TODO tasks past their due date. Takes precedence over `range`.",
            "in": "query",
            "name": "isLate",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Due date range: two ISO 8601 dates, comma separated (start,end)",
            "in": "query",
            "name": "range",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "maxItems": 2,
              "minItems": 2,
              "type": "array"
            }
          },
          {
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "default": "dateTime",
              "enum": [
                "dateTime",
                "title",
                "type",
                "createdAt",
                "updatedAt"
              ],
              "type": "string"
            }
          },
          {
            "description": "Sort direction, case-insensitive.",
            "in": "query",
            "name": "order",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "type": "number"
            }
          },
          {
            "description": "Page number, from 1",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerTasksResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Get list of tasks",
        "tags": [
          "Tâches"
        ]
      },
      "post": {
        "operationId": "PartnerTaskController_createTask",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePartnerTaskRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerTaskDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create a task linked to students, enterprises, CRM contacts and/or opportunities",
        "tags": [
          "Tâches"
        ]
      }
    },
    "/partner/education/v1/tasks/bulk": {
      "post": {
        "description": "Meant for data migrations. Each task is validated on its own: tasks with an unknown or out-of-scope reference are rejected and reported with their index, the others are created. Unlike the single-task endpoint, no `todo.created` event is emitted (no analytics, no integration callback).",
        "operationId": "PartnerTaskController_bulkCreateTasks",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkCreatePartnerTasksRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkCreatePartnerTasksResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Create up to 1000 tasks in one call",
        "tags": [
          "Tâches"
        ]
      }
    },
    "/partner/education/v1/tasks/{id}": {
      "delete": {
        "operationId": "PartnerTaskController_deleteTask",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Delete a task from its ID",
        "tags": [
          "Tâches"
        ]
      },
      "get": {
        "operationId": "PartnerTaskController_getTask",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerTaskDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Get a task from its ID",
        "tags": [
          "Tâches"
        ]
      },
      "post": {
        "description": "Every field is optional. A list of links replaces all the links of that kind (`[]` removes them), an absent list leaves them untouched. For a kind addressable by ID or by key (e.g. `contactIds` / `contactEmails`), sending either list replaces all links of that kind.",
        "operationId": "PartnerTaskController_updateTask",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdatePartnerTaskRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerTaskDTO"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Update a task from its ID",
        "tags": [
          "Tâches"
        ]
      }
    },
    "/partner/education/v1/whoami": {
      "get": {
        "description": "Who the token belongs to and what it can see: role, school, resolved permissions, and the campuses and programs that bound every other endpoint.",
        "operationId": "WhoamiController_getWhoAmI",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WhoamiResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "A query parameter is not declared by the endpoint (`unknown_query_parameters`); the response lists the accepted ones."
          },
          "403": {
            "description": "The token owner has the ReadOnly role and called a write endpoint."
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Get current user",
        "tags": [
          "Qui suis-je"
        ]
      }
    }
  },
  "servers": [
    {
      "url": "https://api.grimp.io",
      "description": "Production"
    },
    {
      "url": "https://api-preprod.grimp.app",
      "description": "Préproduction"
    }
  ],
  "tags": [
    {
      "name": "Sources d'acquisition"
    },
    {
      "name": "Administrateurs"
    },
    {
      "name": "Admissions"
    },
    {
      "name": "Référentiels d'admission"
    },
    {
      "name": "Alumni"
    },
    {
      "name": "Recherche d'emploi des étudiants"
    },
    {
      "name": "Campus"
    },
    {
      "name": "Tags"
    },
    {
      "name": "Contacts"
    },
    {
      "name": "Interactions"
    },
    {
      "name": "Champs personnalisés"
    },
    {
      "name": "Diplômes"
    },
    {
      "name": "Entreprises"
    },
    {
      "name": "Offres"
    },
    {
      "name": "Matching"
    },
    {
      "name": "Leads"
    },
    {
      "name": "Opportunités"
    },
    {
      "name": "Secteurs"
    },
    {
      "name": "SMS"
    },
    {
      "name": "Années étudiantes"
    },
    {
      "name": "Étudiants"
    },
    {
      "name": "Tâches"
    },
    {
      "name": "Qui suis-je"
    }
  ],
  "security": [
    {
      "bearer": []
    }
  ],
  "x-tagGroups": [
    {
      "name": "Compte",
      "tags": [
        "Qui suis-je",
        "Administrateurs"
      ]
    },
    {
      "name": "Étudiants",
      "tags": [
        "Étudiants",
        "Années étudiantes",
        "Recherche d'emploi des étudiants",
        "Alumni",
        "SMS"
      ]
    },
    {
      "name": "Admissions",
      "tags": [
        "Admissions",
        "Référentiels d'admission",
        "Leads",
        "Sources d'acquisition"
      ]
    },
    {
      "name": "Offres",
      "tags": [
        "Offres",
        "Matching"
      ]
    },
    {
      "name": "CRM",
      "tags": [
        "Entreprises",
        "Contacts",
        "Opportunités",
        "Interactions",
        "Tâches"
      ]
    },
    {
      "name": "Référentiels",
      "tags": [
        "Campus",
        "Diplômes",
        "Secteurs",
        "Tags",
        "Champs personnalisés"
      ]
    }
  ]
}
