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

# Get a program

> Retrieve one program by its `program_identifier`, the same value **Look up incentives** returns on each eligible program. An identifier Leap does not hold returns 404.



## OpenAPI

````yaml /api-reference/specs/gcs-programs.json get /beta/incentives/programs/{program_id}
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/{program_id}:
    get:
      tags:
        - programs
      summary: Get a program
      description: >-
        Retrieve one program by its `program_identifier`, the same value **Look
        up incentives** returns on each eligible program. An identifier Leap
        does not hold returns 404.
      operationId: getProgram
      parameters:
        - $ref: '#/components/parameters/ProgramId'
      responses:
        '200':
          description: Successfully retrieved the program
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProgramResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  parameters:
    ProgramId:
      name: program_id
      in: path
      required: true
      description: Identifier of the program
      schema:
        type: string
  schemas:
    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.
    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
    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
  responses:
    Unauthorized:
      description: You are not authorized to perform this operation
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Forbidden:
      description: You do not have permission to perform this operation
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    NotFound:
      description: The requested resource was not found
      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>`.

````