> ## 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.

# List pension membership endings (refunds report)

> Every pension membership ending in the organisation over a date range, with the member and employer refund amounts for each. This is the report to reconcile against what the pension provider actually returned: employer contributions are repaid by the scheme to the employer directly and never appear on a payslip.



## OpenAPI

````yaml /api-reference/specs/pension-v2.json get /organisation/pension-membership-ends
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:
  /organisation/pension-membership-ends:
    get:
      tags:
        - Organisation defaults
      summary: List pension membership endings (refunds report)
      description: >-
        Every pension membership ending in the organisation over a date range,
        with the member and employer refund amounts for each. This is the report
        to reconcile against what the pension provider actually returned:
        employer contributions are repaid by the scheme to the employer directly
        and never appear on a payslip.
      operationId: ListPensionMembershipEnds
      parameters:
        - name: fromDate
          in: query
          description: >-
            Include endings on or after this date. Defaults to a year before
            toDate.
          schema:
            type: string
            description: >-
              Include endings on or after this date. Defaults to a year before
              toDate.
            format: date
        - name: toDate
          in: query
          description: Include endings on or before this date. Defaults to today.
          schema:
            type: string
            description: Include endings on or before this date. Defaults to today.
            format: date
        - name: pageSize
          in: query
          description: Endings per page, 1 to 100. Defaults to 50.
          schema:
            type: integer
            description: Endings per page, 1 to 100. Defaults to 50.
            format: int32
        - name: paginationToken
          in: query
          description: The paginationToken from the previous page. Omit for the first page.
          schema:
            type: string
            description: >-
              The paginationToken from the previous page. Omit for the first
              page.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PensionMembershipEndListModelResponseBody'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectResponseBody'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectResponseBody'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectResponseBody'
components:
  schemas:
    PensionMembershipEndListModelResponseBody:
      required:
        - message
      type: object
      properties:
        message:
          $ref: '#/components/schemas/MessageWithTokenResponse'
        content:
          $ref: '#/components/schemas/PensionMembershipEndListModelContentResponse'
        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`.
    PensionMembershipEndListModelContentResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/PensionMembershipEndListModel'
        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
    PensionMembershipEndListModel:
      required:
        - items
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/PensionMembershipEndModel'
          nullable: true
        paginationToken:
          type: string
          description: >-
            Deprecated: the same value as `content.metadata.paginationToken`.
            Read that; this will be removed.
          nullable: true
          deprecated: true
      additionalProperties: false
      description: A page of membership endings.
    PensionMembershipEndModel:
      required:
        - employeeId
        - employeeRefundTotal
        - employerRefundTotal
        - membershipEndDate
        - membershipEndReason
        - organisationId
        - recordedBy
        - recordedDate
        - refundProcessedThroughPayroll
        - refundedPeriods
      type: object
      properties:
        organisationId:
          type: string
          nullable: true
        employeeId:
          type: string
          nullable: true
        membershipEndDate:
          type: string
          description: The date the membership ended (the opt-out date, for an opt-out).
          nullable: true
        membershipEndReason:
          enum:
            - OptOut
            - MembershipCeased
            - AdministrativeRemoval
          type: string
          description: >-
            Why the membership ended, as the employer asserted it: "OptOut" (a
            valid

            opt-out notice), "MembershipCeased" (a later notice, so scheme rules

            govern any refund) or "AdministrativeRemoval" (a data correction, no

            statutory event).
          nullable: true
        enrolmentDate:
          type: string
          description: When the membership began, so the span the refund covers is visible.
          nullable: true
        pensionGroupId:
          type: string
          nullable: true
        pensionProviderId:
          type: string
          description: >-
            The provider that holds the money. It is the provider, not the
            employer,

            who repays employer contributions, and providers differ in how: some
            pay

            cash to a nominated bank account, others credit the employer's
            balance

            against the next contribution schedule.
          nullable: true
        refundProcessedThroughPayroll:
          type: boolean
          description: >-
            Whether the member refund was put through payroll. False when the

            operator chose to handle it outside payroll, or when there was
            nothing

            to refund.
        employeeRefundTotal:
          type: number
          description: >-
            Member contributions refunded through payroll. Always 0 for a salary

            sacrifice arrangement: the employee gave up salary rather than
            paying a

            contribution, so the whole amount is the employer's and appears in

            employerRefundTotal instead.
          format: double
        employerRefundTotal:
          type: number
          description: >-
            Employer contributions the scheme owes back to the employer. Never
            paid

            through the payslip and never part of the employee's pay: the scheme

            repays the employer directly (The Pensions Regulator's detailed
            guidance

            7, paragraphs 46 to 47). A scheme may retain it to offset its

            administrative expenses (paragraph 48), so treat this as the amount
            to

            reconcile against the provider rather than a guaranteed receipt.
          format: double
        refundedPeriods:
          type: array
          items:
            $ref: '#/components/schemas/RefundedPensionPeriodModel'
          description: The settled pay periods the refund covers, one entry per pay run.
          nullable: true
        enrolmentInformationSentDate:
          type: string
          description: >-
            When the member was given their enrolment information, as at the
            moment

            the membership ended. The opt-out period runs from the later of this
            and

            the enrolment date. Absent when the platform could not evidence it,
            or

            on endings recorded before it was kept.
          nullable: true
        optOutPeriodEndDate:
          type: string
          description: >-
            The last day an opt-out still carried a payroll refund, as assessed
            when

            the membership ended. Absent when no refund was requested, or on
            endings

            recorded before the window was assessed.
          nullable: true
        withinOptOutPeriod:
          type: boolean
          description: >-
            Whether the end date fell inside that window. Absent means it was
            not

            assessed, which is not the same as false.
          nullable: true
        refundOutsideOptOutPeriodReason:
          type: string
          description: >-
            Why a refund was made even though the membership ended outside the

            opt-out period. Present only on that case, and the audit trail for
            it.
          nullable: true
        recordedBy:
          type: string
          nullable: true
        recordedDate:
          type: string
          nullable: true
      additionalProperties: false
      description: |-
        The record of a pension membership ending: why it ended, when, and what
        each side is owed. Kept after the enrolment itself is deleted, so an
        operator or an auditor can answer "what was refunded, and what is the
        provider sending back?" months later.
    RefundedPensionPeriodModel:
      required:
        - amount
        - employerAmount
        - period
        - taxYear
      type: object
      properties:
        taxYear:
          type: integer
          description: The tax year the pay period belongs to (e.g. 2026 for 2026/27).
          format: int32
        period:
          type: integer
          description: The pay period number within the tax year.
          format: int32
        amount:
          type: number
          description: Member contributions refunded for this pay period, via the payslip.
          format: double
        employerAmount:
          type: number
          description: >-
            Employer contributions for this pay period, returned by the provider
            to the employer.
          format: double
      additionalProperties: false
      description: One settled pay period inside a refund.

````

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