> ## Documentation Index
> Fetch the complete documentation index at: https://docs.flowpayroll.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Get an employee's enrolment

> Returns an employee's pension association: the link to their pension group and the enrolment date.



## OpenAPI

````yaml /api-reference/specs/pension-v2.json get /employee-pension/{employeeId}
openapi: 3.0.4
info:
  title: FlowPayroll Pension API
  version: v2
servers:
  - url: https://api.sandbox.flowpayroll.ai/v2/pension
security: []
tags:
  - name: Pension providers
    description: >-
      Look up the pension providers available to your organisation. Providers
      are set up in the product, so the API exposes them read-only.
  - name: Pension schemes
    description: >-
      Your organisation's arrangements with providers. Scheme endpoints use the
      /pension-schema path.
  - name: Pension groups
    description: >-
      Contribution rule sets within a scheme: pension type, contribution basis,
      and employee and employer factors.
  - name: Employee enrolment
    description: >-
      Associate employees with pension groups, remove associations, and send
      enrolment letters.
  - name: Pension information
    description: >-
      An employee's full pension picture in one call: composition, latest
      assessment, and postponement.
  - name: Auto-enrolment
    description: >-
      Assessment results per pay run, employees with outstanding or no
      auto-enrolment, and a stateless assessment preview.
  - name: Postponement
    description: Defer auto-enrolment per employee, overriding the organisation defaults.
  - name: Organisation defaults
    description: >-
      The organisation's default pension group, postponement definitions, and
      auto-enrolment mode.
  - name: Pension calculations
    description: >-
      Per-period contribution amounts, the contributions CSV, and provider
      export files.
  - name: Provider submissions
    description: >-
      Send a completed pay run to its connected pension provider, approve the
      payment, and read back what the provider reported: opt-outs, stopped
      contributions, refunds and schedules.
paths:
  /employee-pension/{employeeId}:
    get:
      tags:
        - Employee enrolment
      summary: Get an employee's enrolment
      description: >-
        Returns an employee's pension association: the link to their pension
        group and the enrolment date.
      operationId: GetEmployeePensionAssociation
      parameters:
        - name: employeeId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmployeePensionCompositionV2ResponseBody'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectResponseBody'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectResponseBody'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectResponseBody'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectResponseBody'
components:
  schemas:
    EmployeePensionCompositionV2ResponseBody:
      required:
        - message
      type: object
      properties:
        message:
          $ref: '#/components/schemas/MessageWithTokenResponse'
        content:
          $ref: '#/components/schemas/EmployeePensionCompositionV2ContentResponse'
        validationIssues:
          type: array
          items:
            $ref: '#/components/schemas/ValidationIssue'
          nullable: true
        errors:
          type: array
          items:
            $ref: '#/components/schemas/Error'
          description: >-
            Deprecated: the same issues as `validationIssues` (`reasonText` is
            `reason`, `reasonId` is `reasonToken`, `reasonParameters` is
            `reasonTokenArguments`). Read `validationIssues`; this will be
            removed.
          nullable: true
          readOnly: true
          deprecated: true
        metadata:
          allOf:
            - $ref: '#/components/schemas/ContentMetadataResponse'
          description: >-
            Deprecated: the same values as `content.metadata`. Read that; this
            will be removed.
          deprecated: true
      additionalProperties: false
      description: >-
        The response envelope every FlowPayroll API answers with: a `message`,
        the

        `content`, and any `validationIssues`. `errors` and the top-level

        `metadata` are deprecated copies of `validationIssues` and

        `content.metadata`, and will be removed.
    ObjectResponseBody:
      required:
        - message
      type: object
      properties:
        message:
          $ref: '#/components/schemas/MessageWithTokenResponse'
        content:
          $ref: '#/components/schemas/ObjectContentResponse'
        validationIssues:
          type: array
          items:
            $ref: '#/components/schemas/ValidationIssue'
          nullable: true
        errors:
          type: array
          items:
            $ref: '#/components/schemas/Error'
          description: >-
            Deprecated: the same issues as `validationIssues` (`reasonText` is
            `reason`, `reasonId` is `reasonToken`, `reasonParameters` is
            `reasonTokenArguments`). Read `validationIssues`; this will be
            removed.
          nullable: true
          readOnly: true
          deprecated: true
        metadata:
          allOf:
            - $ref: '#/components/schemas/ContentMetadataResponse'
          description: >-
            Deprecated: the same values as `content.metadata`. Read that; this
            will be removed.
          deprecated: true
      additionalProperties: false
      description: >-
        The response envelope every FlowPayroll API answers with: a `message`,
        the

        `content`, and any `validationIssues`. `errors` and the top-level

        `metadata` are deprecated copies of `validationIssues` and

        `content.metadata`, and will be removed.
    MessageWithTokenResponse:
      required:
        - token
      type: object
      properties:
        text:
          type: string
          nullable: true
        token:
          type: string
          description: >-
            Stable snake_case key for the message, for clients that translate
            it.
          nullable: true
        tokenArguments:
          type: array
          items:
            $ref: '#/components/schemas/ValidationIssueArgument'
          nullable: true
        textId:
          type: string
          description: >-
            Deprecated: the same value as `token`. Read that; this will be
            removed.
          nullable: true
          readOnly: true
          deprecated: true
        textParameters:
          type: array
          items:
            $ref: '#/components/schemas/Pair'
          description: >-
            Deprecated: the same values as `tokenArguments`. Read that; this
            will be removed.
          nullable: true
          readOnly: true
          deprecated: true
      additionalProperties: false
      description: >-
        What happened, as English `text` and a stable `token` to translate from.

        `textId` and `textParameters` are deprecated copies of `token` and
        `tokenArguments`.
    EmployeePensionCompositionV2ContentResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/EmployeePensionCompositionV2'
        metadata:
          $ref: '#/components/schemas/ContentMetadataResponse'
      additionalProperties: false
    ValidationIssue:
      type: object
      properties:
        field:
          type: string
          nullable: true
        reason:
          type: string
          nullable: true
        reasonToken:
          type: string
          nullable: true
        reasonTokenArguments:
          type: array
          items:
            $ref: '#/components/schemas/ValidationIssueArgument'
          nullable: true
      additionalProperties: false
    Error:
      type: object
      properties:
        field:
          type: string
          nullable: true
        reasonText:
          type: string
          nullable: true
        reasonId:
          type: string
          nullable: true
        reasonParameters:
          type: array
          items:
            $ref: '#/components/schemas/Pair'
          nullable: true
      additionalProperties: false
      description: >-
        Deprecated: an entry of the old `errors` list. Read `validationIssues`
        instead.
      deprecated: true
    ContentMetadataResponse:
      type: object
      properties:
        dateFormat:
          type: string
          nullable: true
        dateTimeFormat:
          type: string
          nullable: true
        paginationToken:
          type: string
          nullable: true
      additionalProperties: false
    ObjectContentResponse:
      type: object
      properties:
        data:
          nullable: true
        metadata:
          $ref: '#/components/schemas/ContentMetadataResponse'
      additionalProperties: false
    ValidationIssueArgument:
      type: object
      properties:
        name:
          type: string
          nullable: true
        value:
          nullable: true
      additionalProperties: false
    Pair:
      type: object
      properties:
        key:
          type: string
          nullable: true
        value:
          type: string
          nullable: true
      additionalProperties: false
      description: >-
        Deprecated: a key and value of the old `textParameters` and
        `reasonParameters`.
      deprecated: true
    EmployeePensionCompositionV2:
      required:
        - employeeId
        - enrolmentDate
        - enrolmentLetterScheduled
        - isAutoEnrolled
        - organisationId
        - pensionGroup
        - pensionGroupId
      type: object
      properties:
        organisationId:
          type: string
          nullable: true
        employeeId:
          type: string
          nullable: true
        pensionGroupId:
          type: string
          nullable: true
        enrolmentDate:
          type: string
          format: date
          nullable: true
        pensionGroup:
          $ref: '#/components/schemas/PensionGroupV2'
        isAutoEnrolled:
          type: boolean
        autoEnrolmentPensionGroup:
          allOf:
            - $ref: '#/components/schemas/PensionGroupV2'
          description: >-
            Deprecated: exposes how the association is stored rather than the
            employee's pension. Rely on `pensionGroup` for the group in force,
            and `isAutoEnrolled` for how the employee came to be enrolled.
          deprecated: true
        manualEnrolmentPensionGroup:
          allOf:
            - $ref: '#/components/schemas/PensionGroupV2'
          description: >-
            Deprecated: exposes how the association is stored rather than the
            employee's pension. Rely on `pensionGroup` for the group in force,
            and `isAutoEnrolled` for how the employee came to be enrolled.
          deprecated: true
        enrolmentType:
          enum:
            - AutoEnrolment
            - OptIn
            - Voluntary
            - NotEligible
          type: string
          nullable: true
        enrolmentInformationSentDate:
          type: string
          description: >-
            The day the member was given their enrolment information, if the

            platform can evidence it. The statutory opt-out period runs from the

            later of this and the enrolment date (TPR DG7 paras 17-18), so it is

            the first CONFIRMED send and never moves on a resend.
                        

            Null means the platform cannot evidence it, NOT that nothing was

            sent: a provider's own welcome pack, or a letter the employer
            posted,

            are dates it never sees. Check `enrolmentLetter` for what Flow

            itself did.
          format: date
          nullable: true
        enrolmentInformationSentBy:
          type: string
          description: Who issued that first confirmed letter.
          nullable: true
        enrolmentLetter:
          $ref: '#/components/schemas/EnrolmentLetterModel'
        enrolmentLetterScheduled:
          type: boolean
          description: >-
            Flow will send this member's enrolment letter itself when the pay
            run

            that enrolled them is finalised.
                        

            Published so a screen can say so before offering to send one by

            hand. Sending anyway is allowed and is not a duplicate, because any
            send

            discharges the pending automatic one, but somebody pressing the
            button

            should know it was already coming.
        recurringContributionOverride:
          $ref: '#/components/schemas/ContributionOverrideValuesModel'
        recurringAdditionalVoluntaryContribution:
          $ref: '#/components/schemas/RecurringAdditionalVoluntaryContributionModel'
      additionalProperties: false
    PensionGroupV2:
      required:
        - basis
        - createdBy
        - createdDate
        - employeeFactor
        - employerFactor
        - id
        - isDefault
        - name
        - nationalInsuranceSavingsFactor
        - organisationId
        - pensionSchemaId
        - pensionType
        - updatedBy
        - updatedDate
      type: object
      properties:
        id:
          type: string
          nullable: true
        organisationId:
          type: string
          description: >-
            Deprecated: a pension group always belongs to the organisation in
            the access token. Rely on the `organisationId` of the enclosing
            resource where one is present, or on the organisation the request
            was authenticated as.
          nullable: true
          deprecated: true
        pensionSchemaId:
          type: string
          nullable: true
        name:
          type: string
          nullable: true
        isDefault:
          type: boolean
        pensionType:
          enum:
            - ReliefAtSource
            - SalarySacrifice
            - NetPayArrangement
          type: string
          nullable: true
        isSalarySacrifice:
          type: boolean
          description: >-
            Deprecated: derived field, true only when `pensionType` is
            `SalarySacrifice`. Rely on `pensionType`, which also distinguishes
            `ReliefAtSource` from `NetPayArrangement`.
          readOnly: true
          deprecated: true
        basis:
          enum:
            - Pensionable
            - QualifyingEarnings
          type: string
          nullable: true
        employeeFactor:
          type: number
          format: float
        employerFactor:
          type: number
          format: float
        nationalInsuranceSavingsFactor:
          type: number
          format: float
        contributionType:
          enum:
            - Percentage
            - FixedAmount
          type: string
          nullable: true
        employeeFixedAmount:
          type: number
          format: double
          nullable: true
        employerFixedAmount:
          type: number
          format: double
          nullable: true
        externalReferenceId:
          type: string
          nullable: true
        createdBy:
          type: string
          nullable: true
        createdDate:
          type: string
          format: date-time
        updatedBy:
          type: string
          nullable: true
        updatedDate:
          type: string
          format: date-time
      additionalProperties: false
    EnrolmentLetterModel:
      required:
        - lastEmailedAt
        - lastEmailedBy
        - lastEmailedStatus
      type: object
      properties:
        lastEmailedAt:
          type: string
          format: date-time
        lastEmailedTo:
          type: string
          nullable: true
        lastEmailedBy:
          type: string
          description: |-
            The user who pressed send, or `System` when Flow sent it as part of
            enrolling the member.
          nullable: true
        lastEmailedStatus:
          enum:
            - Sending
            - Sent
            - Failed
          type: string
          description: |-
            `Sending`, `Sent` or `Failed`. Spelled as on a payslip,
                        with one addition: `Sending` means a send was asked for and has
                        not come back yet, so a second request is refused with a 409 until it
                        resolves or goes stale. It never means the information was GIVEN —
                        only `enrolmentInformationSentDate` means that, and the member's
                        opt-out period counts from that alone.
          nullable: true
        lastEmailError:
          type: string
          nullable: true
      additionalProperties: false
      description: >-
        Whether this member has been sent their enrolment letter, and what
        happened.
                    

        Deliberately the same field names the platform already uses for

        payslips, P45s and P60s (`lastEmailed*`): a consumer that can answer

        "has this gone out" for a payslip answers it here the same way, with no

        second vocabulary to learn.

        Absent on the parent when no letter has ever been attempted, which is

        the honest answer to "has it been sent" and is different from a failed

        attempt.
    ContributionOverrideValuesModel:
      required:
        - contributionType
      type: object
      properties:
        contributionType:
          enum:
            - Percentage
            - FixedAmount
          type: string
          nullable: true
        employeeFactor:
          type: number
          format: float
          nullable: true
        employerFactor:
          type: number
          format: float
          nullable: true
        employeeFixedAmount:
          type: number
          format: double
          nullable: true
        employerFixedAmount:
          type: number
          format: double
          nullable: true
      additionalProperties: false
      description: >-
        Per-employee contribution override. When present on an association it
        fully

        replaces the pension group's contribution settings.
    RecurringAdditionalVoluntaryContributionModel:
      required:
        - contributionType
        - value
      type: object
      properties:
        contributionType:
          enum:
            - Percentage
            - FixedAmount
          type: string
          description: >-
            How the value is read: Percentage (of the group's contribution
            basis)

            or FixedAmount (per pay period).
          nullable: true
        value:
          type: number
          description: >-
            The percentage when contributionType is Percentage (at most 100), or
            the

            per-period amount when contributionType is FixedAmount.
          format: double
      additionalProperties: false
      description: |-
        Standing additional voluntary contribution the member pays every pay
        period on top of the scheme contribution.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.