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

# Get liability rollforward

> Returns the period liability rollforward decomposed by action type; lines sum exactly to closing minus opening, with no residual plug.

Explains how liability changed between `from` and `to`. For each asset and program, the response shows the opening balance, every movement decomposed into named categories (issued, redeemed, forfeited, expired, transfers, and others), and the closing balance.

The decomposition is exact: lines always sum to `closing - opening`, with no residual bucket. Activity the server cannot classify fails the request instead of misstating the report.

<Note>
  Pair with the [liability report](/api-reference/reporting/get-liability-report) at `from` and `to` to reconcile a period. For usage patterns, see the [Reporting guide](/guides/reporting).
</Note>


## OpenAPI

````yaml GET /v1/reports/liability-rollforward
openapi: 3.0.3
info:
  contact:
    email: support@scrip.dev
    name: Scrip Support
  description: >-
    Scrip is the operating system for rewards programs. Use this REST API to
    define earn and redemption rules, issue and redeem assets, and track every
    movement in a double-entry ledger. Full guides and reference:
    https://docs.scrip.dev


    Core concepts:

    - **Programs**: Containers for incentive logic (e.g., "Q1 Sales Bonus",
    "Customer Loyalty")

    - **Assets**: The currency or points being tracked (e.g., "Bonus Points",
    "Cash Rewards")

    - **Participants**: Users who earn and spend assets (identified by
    external_id)

    - **Groups**: Collections of participants for team-based incentives

    - **Rules**: Automated reward logic triggered by events

    - **Events**: Actions that trigger rule evaluation (e.g., "purchase",
    "referral")


    Response formats:

    - **Collection endpoints** return: {"data": [...], "pagination":
    {"has_more": true, "next_cursor": "..."}}

    - **Single-resource endpoints** return the resource directly

    - **Errors** return: {"code": "...", "message": "...", "details": {...}} —
    `details` is an optional object, present on input errors only
  license:
    name: Proprietary
  termsOfService: https://scrip.dev/terms
  title: Scrip API
  version: '1.0'
servers:
  - url: https://api.scrip.dev
security: []
tags:
  - description: >-
      Manage incentive programs. Programs are the top-level container for all
      incentive logic.
    name: Programs
  - description: >-
      Manage asset types (currencies, points). Assets define what participants
      can earn and spend.
    name: Assets
  - description: >-
      Manage participants and their balances. Participants are identified by
      external_id from your system.
    name: Participants
  - description: Manage participant groups for team-based incentives.
    name: Groups
  - description: >-
      Manage automated reward rules. Rules define conditions and actions
      triggered by events.
    name: Rules
  - description: Ingest events that trigger rule evaluation and reward distribution.
    name: Events
  - description: Transfer assets between participants.
    name: Transfers
  - description: Access ledger summaries and program activity reports.
    name: Reporting
  - description: >-
      Redeem participant balances for rewards. Supports raw amount redemptions
      and catalog item redemptions.
    name: Redemptions
  - description: >-
      Manage the reward catalog. Create and manage redeemable items with
      inventory tracking.
    name: Rewards
  - description: >-
      Schedule and manage automated event dispatching. Automations generate
      events on cron schedules, at specific times, or by evaluating participant
      state.
    name: Automations
  - description: >-
      Manage tier types and levels within programs. Tiers define status
      hierarchies that participants progress through based on qualification
      rules.
    name: Tiers
  - description: Inspect double-entry ledger records for auditing and reconciliation.
    name: Journal Entries
  - description: >-
      Manage webhook endpoints and delivery logs. Webhooks notify your
      application of real-time events via HTTP POST with HMAC-SHA256 signatures.
    name: Webhooks
paths:
  /v1/reports/liability-rollforward:
    get:
      tags:
        - Reporting
      summary: Get liability rollforward
      description: >-
        Returns the period liability rollforward decomposed by action type;
        lines sum exactly to closing minus opening, with no residual plug.
      operationId: getLiabilityRollforward
      parameters:
        - description: Period start (inclusive, RFC3339)
          in: query
          name: from
          required: true
          schema:
            format: date-time
            type: string
        - description: Period end (inclusive, RFC3339)
          in: query
          name: to
          required: true
          schema:
            format: date-time
            type: string
        - description: Filter to rows attributed to a specific program
          in: query
          name: program_id
          schema:
            format: uuid
            type: string
        - description: Filter to a specific asset
          in: query
          name: asset_id
          schema:
            format: uuid
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/handlers.LiabilityRollforwardResponse'
          description: Liability rollforward
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/handlers.ErrBadRequestResponse'
          description: 'Invalid query parameters (code: bad_request)'
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/handlers.ErrUnauthorizedResponse'
          description: 'Missing or invalid credentials (code: unauthorized)'
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/handlers.ErrInternalResponse'
          description: 'Internal server error (code: internal_error)'
      security:
        - ApiKeyAuth: []
        - BearerAuth: []
components:
  schemas:
    handlers.LiabilityRollforwardResponse:
      description: >-
        Period liability rollforward results. Every line is attributed to
        journal action types; lines sum exactly to closing − opening per row (no
        plug line).
      properties:
        data:
          description: >-
            Rollforward rows, one per asset x program with ledger activity at or
            before `to`
          items:
            $ref: '#/components/schemas/handlers.LiabilityRollforwardRowResponse'
          type: array
        from:
          description: Period start (inclusive, RFC 3339), echoed from the request
          example: '2026-01-01T00:00:00Z'
          type: string
        pagination:
          allOf:
            - $ref: '#/components/schemas/handlers.PaginationResponse'
          description: Pagination metadata for list responses
        to:
          description: Period end (inclusive, RFC 3339), echoed from the request
          example: '2026-03-31T23:59:59Z'
          type: string
      type: object
    handlers.ErrBadRequestResponse:
      additionalProperties: false
      properties:
        code:
          description: Code is the machine-readable error code
          example: bad_request
          type: string
        details:
          allOf:
            - $ref: '#/components/schemas/handlers.ErrorDetails'
          description: >-
            Details provides optional structured error context (field errors,
            etc.)
        message:
          description: Message is the human-readable error description
          example: Invalid request parameters
          type: string
      type: object
    handlers.ErrUnauthorizedResponse:
      properties:
        code:
          description: Code is the machine-readable error code
          example: unauthorized
          type: string
        details:
          allOf:
            - $ref: '#/components/schemas/handlers.ErrorDetails'
          description: Details provides optional structured error context
        message:
          description: Message is the human-readable error description
          example: Missing or invalid credentials
          type: string
      type: object
    handlers.ErrInternalResponse:
      properties:
        code:
          description: Code is the machine-readable error code
          example: internal_error
          type: string
        message:
          description: Message is the human-readable error description
          example: An internal error occurred
          type: string
      type: object
    handlers.LiabilityRollforwardRowResponse:
      description: >-
        One asset x program cell of the period liability rollforward. Lines sum
        exactly to closing_balance − opening_balance.
      properties:
        adjustments_net:
          description: >-
            ADJUSTMENT entries: signed net effect. No current write path creates
            ADJUSTMENT entries; reported so the decomposition is complete.
          example: '0.00'
          type: string
        asset_id:
          description: Unique identifier for this asset
          example: 550e8400-e29b-41d4-a716-446655440000
          format: uuid
          type: string
        asset_name:
          description: Display name for this asset
          example: Loyalty Points
          type: string
        asset_symbol:
          description: Ticker or symbol for this asset (e.g., `POINTS`)
          example: POINTS
          type: string
        bucket_movements_net:
          description: >-
            HOLD/RELEASE/MATURITY entries: signed net effect. These move value
            between buckets of the same entity, so this is provably 0; reported
            so the decomposition is complete.
          example: '0.00'
          type: string
        closing_balance:
          description: >-
            Outstanding liability for this cell at the end of the period (ledger
            time <= to). May legitimately be negative for per-program cells of
            assets shared across programs (cross-program redemption — see the
            endpoint description); the per-cell identity still holds and
            asset-level aggregates remain exact.
          example: '561400.00'
          type: string
        debited:
          description: >-
            DEBIT entries: amount debited from participant/group accounts
            (manual API debits and rule-driven debits)
          example: '300.00'
          type: string
        expired:
          description: >-
            EXPIRATION entries: amount expired out of participant/group accounts
            during the period. Expiration entries carry no program attribution,
            so this is non-zero only on null-program rows.
          example: '2500.00'
          type: string
        forfeited:
          description: >-
            FORFEIT entries: amount forfeited from participant/group accounts
            during the period
          example: '2000.00'
          type: string
        holds_voided:
          description: >-
            VOID_HOLD entries: provisionally held amounts voided back to the
            issuance source during the period
          example: '0.00'
          type: string
        issuance_returns:
          description: >-
            CREDIT entries: amount returned to the issuance source during the
            period — produced by under-capture settles (settling for less than
            the held amount)
          example: '500.00'
          type: string
        issued:
          description: >-
            CREDIT entries: amount issued into participant/group accounts from
            system or program supply during the period
          example: '150000.00'
          type: string
        opening_balance:
          description: >-
            Outstanding liability for this cell immediately before the period
            (ledger time < from)
          example: '500000.00'
          type: string
        program_id:
          description: >-
            Program this activity is attributed to (via each posting's journal
            entry). Null for activity not attributed to a program — notably lot
            expirations and maturities.
          example: 550e8400-e29b-41d4-a716-446655440001
          format: uuid
          type: string
        program_name:
          description: >-
            Display name of the attributed program (null when program_id is
            null)
          example: Premium Rewards
          type: string
        redeemed:
          description: >-
            REDEMPTION entries: gross amount redeemed out of participant/group
            accounts during the period. Attributed to the redemption's channel
            program — the program the redemption was requested through — which
            for assets shared across programs is not necessarily the program
            that issued the redeemed value.
          example: '85000.00'
          type: string
        redemption_receipts:
          description: >-
            REDEMPTION entries: amount received INTO participant/group accounts
            — redemptions whose configured target is a group ledger entity
            (value stays inside the liability)
          example: '0.00'
          type: string
        redemption_reversals:
          description: >-
            REVERSAL entries: amount credited back to participant/group accounts
            by redemption reversals during the period
          example: '1200.00'
          type: string
        reversal_clawbacks:
          description: >-
            REVERSAL entries: amount debited from participant/group accounts by
            reversals — clawbacks from group redemption targets
          example: '0.00'
          type: string
        scale:
          description: >-
            Number of decimal places for this asset; every amount in this row is
            rendered with exactly this many decimals
          example: 2
          type: integer
        transfers_net:
          description: >-
            TRANSFER entries: signed net effect on this cell. Both transfer legs
            are participant/group accounts in the same program, so this is
            provably 0; reported so the decomposition is complete.
          example: '0.00'
          type: string
      type: object
    handlers.PaginationResponse:
      properties:
        has_more:
          description: Whether more results are available beyond this page
          example: true
          type: boolean
        next_cursor:
          description: Cursor to fetch the next page. Absent when there are no more results
          example: YWJjMTIz
          type: string
      type: object
    handlers.ErrorDetails:
      description: >-
        Optional structured details about the error. Always a JSON object: a
        `fields` array for validation errors, or flat
        field/reason/expected/received properties for other input errors.
      properties:
        expected:
          description: Expected value or format (non-validation input errors)
          example: uuid
          type: string
        field:
          description: Field name that caused the error (non-validation input errors)
          example: asset_id
          type: string
        fields:
          description: >-
            Fields lists each offending input field on validation_error
            responses.
          items:
            $ref: '#/components/schemas/handlers.ErrorFieldDetail'
          type: array
        reason:
          description: Machine-readable reason code (non-validation input errors)
          example: invalid
          type: string
        received:
          description: Value that was received (non-validation input errors)
          example: not-a-uuid
          type: string
      type: object
    handlers.ErrorFieldDetail:
      description: >-
        A single field-level error: which input field failed, why, and (where
        known) the expected and received values.
      properties:
        expected:
          description: >-
            Expected value or format. Usually a string; for "one of" constraints
            it

            is an array of the allowed values.
        field:
          description: Field name that caused the error
          example: amount
          type: string
        message:
          description: Human-readable explanation (validation errors only)
          example: This field is required
          type: string
        reason:
          description: Machine-readable reason code
          example: required
          type: string
        received:
          description: Value that was received
          example: '-10.00'
          type: string
      type: object
  securitySchemes:
    ApiKeyAuth:
      description: API key passed in the X-API-Key header.
      in: header
      name: X-API-Key
      type: apiKey
    BearerAuth:
      description: Bearer token passed in the Authorization header (e.g. "Bearer sk_...").
      in: header
      name: Authorization
      type: apiKey

````