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

# List programs

> Browse Leap's catalog of rebate programs. The catalog is shared across partners, so a program you read here is not necessarily one your account can claim. Narrow it with `filter`, and page through it with `page_size` and `page_token`.



## OpenAPI

````yaml /api-reference/specs/gcs-programs.json get /beta/incentives/programs
openapi: 3.0.1
info:
  title: Leap Incentives — Programs
  description: >-
    API for managing program definitions, requirement catalog, field groups, and
    partner data preferences
  contact:
    email: apiteam@leap.energy
  version: '0.1'
servers:
  - url: https://api.leap.energy
    description: Production
  - url: https://api.staging.leap.energy
    description: Staging
security:
  - BearerAuth: []
tags:
  - name: programs
paths:
  /beta/incentives/programs:
    get:
      tags:
        - programs
      summary: List programs
      description: >-
        Browse Leap's catalog of rebate programs. The catalog is shared across
        partners, so a program you read here is not necessarily one your account
        can claim. Narrow it with `filter`, and page through it with `page_size`
        and `page_token`.
      operationId: listPrograms
      parameters:
        - name: filter
          in: query
          description: >
            Comma-separated `field=value` pairs, combined with AND. Three fields
            are supported: `program_type`, `transmission_region` and `enabled`.
            For example, `filter=transmission_region=CAISO,enabled=true` returns
            the enabled CAISO programs.


            Leap ignores a field name it does not recognise rather than
            rejecting it, so check your spelling. `enabled` must be `true` or
            `false`; anything else returns 400. With no `enabled` filter the
            response mixes enabled and disabled programs, and each row carries
            its own `enabled` flag.
          required: false
          schema:
            type: string
        - $ref: '#/components/parameters/PageToken'
        - $ref: '#/components/parameters/PageSize'
      responses:
        '200':
          description: Successfully retrieved programs
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProgramListResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  parameters:
    PageToken:
      name: page_token
      in: query
      required: false
      description: >-
        Cursor from a previous response's `next_page_token`. Follow it until it
        is absent to walk the whole catalog. Replay a token only with the
        `filter` that produced it. Programs are ordered by `program_identifier`,
        so a program added below your cursor part-way through a walk is missed
        rather than duplicated. This route pages with `page_size` and
        `page_token` only: `limit` and `offset` return 400.
      schema:
        type: string
    PageSize:
      name: page_size
      in: query
      required: false
      description: >-
        Rows per page. Defaults to 50 and is capped at 200; a larger value is
        clamped rather than rejected.
      schema:
        type: integer
        default: 50
  schemas:
    ProgramListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/ProgramResponse'
        next_page_token:
          type: string
          description: >-
            Cursor for the next page, absent on the last page. Pass it back as
            `page_token`, with the same filter that produced it.
      description: One page of catalog programs, plus the cursor for the next page.
    ProgramResponse:
      type: object
      properties:
        program_identifier:
          type: string
          description: >-
            Stable identifier for the program, and the value **Look up
            incentives** returns as `program_identifier` on each eligible
            program. Send it as the `program_id` path segment on the other
            program routes.
        label:
          type: string
        description:
          type: string
        program_type:
          type: string
        transmission_region:
          $ref: '#/components/schemas/TransmissionRegion'
        enabled:
          type: boolean
          description: >-
            Whether Leap currently evaluates this program. A disabled program
            never appears in a lookup result. Filter on it with
            `filter=enabled=true` or `filter=enabled=false`.
        source:
          $ref: '#/components/schemas/RequirementSource'
        metadata:
          type: object
          additionalProperties: true
          description: >-
            The partner-visible subset of the program's stored metadata.
            Responses carry an allowlist of keys rather than everything Leap
            stores against a program. Catalog description: `url`,
            `operator_name`, `operator_type`, `device_category`,
            `application_path`, `state_province`, `country`. Partner offer
            publication, present on `PARTNER_OFFER` rows: `display_name`,
            `operator_display_name`, `logo_url`, `terms_url`, `description`. Any
            other key is omitted, including keys added after this was written,
            and including a partner offer's private configuration. Present but
            empty when the program carries none of the twelve.


            Values are constrained as well as names. An allowlisted key survives
            only when its value is a string, a number or a boolean; a key whose
            value is an object or an array is omitted, because a nested value
            can carry fields nobody reviewed. Strings longer than 2048
            characters are omitted rather than truncated, so a value you receive
            is always the whole value. No stored value under the seven catalog
            keys comes close to that bound.
        upstream_program_id:
          type: string
          nullable: true
          description: >-
            The program's identifier in the upstream incentives system that owns
            application records. Stable, and the intended join key between this
            catalog and any API that reports a program in that id space, such as
            the applications feed. Always a positive integer, rendered as a
            string so the id stays exact for clients whose numbers are IEEE
            doubles.


            Not to be confused with `source_program_identifier` on the
            eligibility-details response, which is a program identifier in
            *this* service's id space, attributing a check to the program that
            imposed it. The two never hold interchangeable values.


            Omitted entirely when the program has no upstream counterpart, so
            treat an absent field and a null one the same way. That is normal
            rather than a gap: programs sourced from Leap's own definitions were
            never defined in the upstream system, so a missing id here says
            "this program cannot be joined", never "no applications exist".
            Programs promoted from that system, including partner offers, always
            carry one.
        eiaids:
          type: array
          items:
            type: string
          description: >-
            Every EIA utility id this program serves. A customer qualifies on
            the utility dimension when the utility resolved from their address
            appears in this list. An empty list means the program has no utility
            footprint and is never selected on that dimension.
        customer_classification:
          $ref: '#/components/schemas/CustomerClassification'
        device_category:
          type: string
      description: >-
        One program in Leap's rebate catalog. The catalog is shared across
        partners and covers utility, state and market programs, so a program you
        read here is not necessarily one your account can claim.
    ErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - message
          properties:
            message:
              type: string
            details:
              type: array
              items:
                type: object
                properties:
                  error_code:
                    type: string
                  reason:
                    type: string
    TransmissionRegion:
      type: string
      enum:
        - CAISO
        - ERCOT
        - NYISO
        - ISONE
        - PJM
        - SERC
        - WECC_SW
        - WECC_PC
    RequirementSource:
      type: string
      enum:
        - LEAP_DEFINITIONS
        - INCENTIVES_DB
        - PARTNER_OFFER
      description: >-
        Where the definition came from. `LEAP_DEFINITIONS` and `INCENTIVES_DB`
        are rebate programs Leap maintains. `PARTNER_OFFER` marks a partner
        offer, which a partner account configures rather than Leap.
    CustomerClassification:
      description: >-
        The customer or site class this program serves. `RESIDENTIAL` and
        `COMMERCIAL` are the long-standing values; `MULTIFAMILY` and
        `MANUFACTURED_HOME` exist because rebate qualification differs across
        single-family, multifamily and manufactured housing.
      type: string
      enum:
        - RESIDENTIAL
        - MULTIFAMILY
        - MANUFACTURED_HOME
        - COMMERCIAL
  responses:
    BadRequest:
      description: Malformed or invalid request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Unauthorized:
      description: You are not authorized to perform this operation
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    InternalServerError:
      description: An internal server error occurred
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        Your Leap API key as a Bearer token. Send it in the `Authorization`
        header: `Authorization: Bearer <api-key>`.

````