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

# Check the progress and outcome of a PVFARM import

> Poll this with the ID returned by `POST /Project/{projectId}/Prediction/{predictionId}/Import/PVFarm`.
Checking once every 10 seconds is plenty; a large file can take a few minutes.

`status` is `Processing` while the import is running, then `Completed` or `Failed`.
On `Completed`, `plant` carries the headline figures of the built power plant and
`equipment` lists the library records created from the file's datasheet values. On
`Failed`, `errorCode` distinguishes a problem with the file, a problem with the
target prediction, and a problem on the PlantPredict side.

`plant` and `equipment` are empty until the import finishes, so read `status` first.

An import is visible only to the account that created it.

**Parameters:**

- `jobId` (path, required): The import job ID returned by the import request.




## OpenAPI

````yaml /api-docs/api-reference/plantpredict-api.yaml get /Project/Import/PVFarm/{jobId}
openapi: 3.1.0
info:
  title: PlantPredict API
  version: 12.13.0
  description: >
    ## What is PlantPredict?


    PlantPredict is an industry-leading performance modeling platform for
    utility-scale

    solar power plants. It predicts energy yield across the full project
    lifecycle —

    from early-stage site prospecting through detailed engineering and
    operational

    monitoring. The same engine that powers the PlantPredict web UI is fully
    exposed

    via this REST API, enabling automation of complex, high-time-resolution
    energy

    predictions without any UI interaction.


    ## Domain Model — read this first


    Understanding the object hierarchy is essential before calling the API:


    - **Weather** — A weather file (hourly irradiance, temperature, wind, etc.)
    for a
      geographic location. Imported from a provider (e.g. SolarAnywhere, Meteonorm) or
      uploaded manually. Weather files live in a company-wide library and are referenced
      by Predictions.

    - **Module** — A PV module definition parameterized with electrical
    characteristics
      (STC power, temperature coefficients, single-diode model parameters, IAM curves,
      etc.). Modules live in a company-wide library.

    - **Inverter** — An inverter definition with efficiency curves,
    voltage/power ratings,
      and optional kVA derating curves. Inverters live in a company-wide library.

    - **Project** — A named location (lat/lon) that acts as a container for one
    or more
      Predictions. Holds geographic metadata (country, elevation, UTC offset) and a status.

    - **Prediction** — The core simulation configuration nested under a Project.
    Defines
      the simulation period, model selections (transposition, air mass, degradation,
      soiling, shading, spectral shift models), uncertainty error terms, and references
      to a Weather file. A Prediction must be linked to a PowerPlant before it can be run.
      Status values: 0 = Draft, 1 = Active, 2 = Issued, 3 = Archived.

    - **PowerPlant** — The physical plant design attached to a Prediction.
    Describes the
      electrical topology: Blocks → Arrays → Inverters → DC Fields (strings of modules).
      Also includes transformers, transmission lines, energy storage (ESS), availability
      losses, and LGIA export limits.

    - **Shade Scene** — An optional 3D shading model (PVJ format) attached to a
      Prediction's DC Fields. Supports import from PVC or SHD files. Shade and TABT
      (Tracker Angle Back-Tracking) calculations are queued and run asynchronously.

    ## Typical workflow to run a prediction


    1. Ensure a **Weather** file exists (search, download, or import one).

    2. Ensure a **Module** and **Inverter** exist in the library.

    3. **POST /Project** — create a project at the site location.

    4. **POST /Project/{projectId}/Prediction** — create a prediction with model
    settings.

    5. **POST /Project/{projectId}/Prediction/{predictionId}/PowerPlant** —
    attach a plant
       design referencing your module and inverter.
    6. **POST /Project/{projectId}/Prediction/{predictionId}/Run** — queue the
    simulation.

    7. Poll **GET /Project/{projectId}/Prediction/{predictionId}/Overview**
    until
       `status` reaches 2 (complete), then retrieve results via `/ResultSummary`,
       `/ResultDetails`, or `/NodalJson`.

    ## Authentication


    OAuth 2.0 **Client Credentials** flow via AWS Cognito. The spec advertises

    a single `bearerAuth` scheme — fetch a token yourself with the snippet

    below, then either paste it into the in-browser playground or pass it on

    every request as `Authorization: Bearer <token>`.


    > **Why not advertise OAuth2 directly?** Most users have access to the

    > production tenant only, and we don't want to invite anyone to enter

    > long-lived `client_id` / `client_secret` credentials into a third-party

    > documentation site. Keep credentials in your own environment; ship

    > short-lived bearer tokens to wherever they are needed.


    - Token URL:
    `https://terabase-prd.auth.us-west-2.amazoncognito.com/oauth2/token`

    - Scopes: `transactions/get` (read), `transactions/post` (write) — request
      both to access the entire surface.
    - Send credentials as **Basic Auth** in the token request header.


    Example:


    ```bash

    curl -X POST
    'https://terabase-prd.auth.us-west-2.amazoncognito.com/oauth2/token' \
      -u "$PP_CLIENT_ID:$PP_CLIENT_SECRET" \
      -d 'grant_type=client_credentials&scope=transactions/get transactions/post'
    ```


    API credentials (Client ID + Secret) are generated per user by a company
    admin

    inside the PlantPredict UI (gear icon → user profile → Generate API
    Credentials).

    Store them securely — they are shown only once.


    ## Notes


    - All request/response bodies are JSON (`Content-Type: application/json`).

    - The API is stateless — every request must supply complete inputs; there is
    no session.

    - POST operations that create entities return `{"id": <integer>}`.

    - Many integer fields (model types, status codes) map to named enums — use
      `GET /Definitions` to retrieve the full enum catalog at runtime.
    - Long-running operations (Run, Shade calculations, TABT) are asynchronous;
    poll
      the corresponding `ProcessingStatus` endpoint to track progress.
    - Responses may include an `X-Message` header with non-blocking warnings
    (e.g.
      duplicate project name).
servers:
  - url: https://api.plantpredict.terabase.energy
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Definitions
    description: Enum and model type definitions
  - name: Projects
    description: Solar project management
  - name: Predictions
    description: Energy prediction configuration and execution
  - name: PowerPlant
    description: Power plant design (blocks, arrays, inverters, transformers)
  - name: TimeSeries
    description: Custom time series data inputs
  - name: Results
    description: Prediction results — summary, details, nodal, average energy
  - name: FinancialModel
    description: Financial model parameters and cashflow results
  - name: Reports
    description: Report generation and export
  - name: ShadeScene
    description: 3D shade scene management and calculations
  - name: Weather
    description: Weather file import, download, and management
  - name: Inverters
    description: Inverter library management
  - name: Modules
    description: PV module library and single-diode parameter generation
  - name: ASHRAE
    description: ASHRAE climate station lookup
  - name: System
    description: System version and maintenance status
  - name: Company
    description: Company settings and user management
  - name: Country
    description: Reference country data
paths:
  /Project/Import/PVFarm/{jobId}:
    get:
      tags:
        - Projects
      summary: Check the progress and outcome of a PVFARM import
      description: >
        Poll this with the ID returned by `POST
        /Project/{projectId}/Prediction/{predictionId}/Import/PVFarm`.

        Checking once every 10 seconds is plenty; a large file can take a few
        minutes.


        `status` is `Processing` while the import is running, then `Completed`
        or `Failed`.

        On `Completed`, `plant` carries the headline figures of the built power
        plant and

        `equipment` lists the library records created from the file's datasheet
        values. On

        `Failed`, `errorCode` distinguishes a problem with the file, a problem
        with the

        target prediction, and a problem on the PlantPredict side.


        `plant` and `equipment` are empty until the import finishes, so read
        `status` first.


        An import is visible only to the account that created it.


        **Parameters:**


        - `jobId` (path, required): The import job ID returned by the import
        request.
      operationId: getPVFarmImportStatus
      parameters:
        - name: jobId
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: The current state of the import job
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PVFarmImportStatusResult'
              example:
                jobId: 316
                status: Completed
                originalFileName: Desert Ridge.pvfshade
                projectId: 192183
                predictionId: 965830
                summary: >-
                  Imported a 122.20 MW DC power plant (182,381 modules, 2,379
                  trackers, 28 inverters) onto prediction 965830 and built its
                  3D shade scene.
                errorCode: null
                error: null
                plant:
                  mwDc: 122.1953
                  modules: 182381
                  strings: 6289
                  trackers: 2379
                  inverters: 28
                equipment:
                  - kind: module
                    id: 47413
                    name: PVFARM California PV Module 670W
                  - kind: inverter
                    id: 10560
                    name: PVFARM Generic Inverter 3600kW
                notices: []
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/ServerError'
components:
  schemas:
    PVFarmImportStatusResult:
      type: object
      description: The state and outcome of a PVFARM import job.
      properties:
        jobId:
          type: integer
          format: int64
        status:
          type: string
          enum:
            - Processing
            - Completed
            - Failed
          description: >
            `Processing` — still running, check again shortly.

            `Completed` — finished; the power plant and its 3D shade scene are
            on the prediction.

            `Failed` — nothing was built; `errorCode` says why.
        originalFileName:
          type:
            - string
            - 'null'
          description: The uploaded filename.
        projectId:
          type: integer
          format: int64
          description: The project containing the target prediction.
        predictionId:
          type: integer
          format: int64
          description: The prediction the plant was built on.
        summary:
          type:
            - string
            - 'null'
          description: >
            One sentence describing the outcome in plain language, suitable to
            relay to a

            person as-is.
        errorCode:
          type:
            - string
            - 'null'
          description: >
            Set only when `status` is `Failed`. One of:


            * `invalid-file` — the file could not be used: not a PVFARM shading
            model file,
              an old format version, a fixed-tilt project, or a module technology
              PlantPredict does not recognize. Re-export from PVFARM, or use the web
              application's import.
            * `prediction-not-eligible` — the target prediction cannot take the
            import: no
              weather file selected, not a Block Builder prediction, or it already has a
              built power plant and the call did not carry `overwriteExistingPowerPlant=true`.
            * `import-error` — a fault on the PlantPredict side. Contact support
            with the
              `jobId`; retrying the same file will not help.
        error:
          type:
            - string
            - 'null'
          description: Free-form detail accompanying `errorCode`.
        plant:
          oneOf:
            - $ref: '#/components/schemas/PVFarmImportPlantSummary'
            - type: 'null'
          description: >-
            Headline figures for the built plant. Null until the import
            completes successfully.
        equipment:
          type:
            - array
            - 'null'
          description: >
            The library records created from the file's datasheet values — one
            Module per

            module type and one Inverter per inverter type. Re-importing the
            same data

            reuses these records rather than creating duplicates, and says so in
            `notices`.
          items:
            $ref: '#/components/schemas/PVFarmImportEquipment'
        notices:
          type:
            - array
            - 'null'
          description: >-
            Informational messages about the import, such as equipment records
            reused rather than created.
          items:
            type: string
      required:
        - jobId
        - status
    PVFarmImportPlantSummary:
      type: object
      description: Headline figures for the power plant the import built.
      properties:
        mwDc:
          type: number
          format: double
          description: Installed DC capacity, MWdc.
        modules:
          type: integer
          format: int32
        strings:
          type: integer
          format: int32
        trackers:
          type: integer
          format: int32
        inverters:
          type: integer
          format: int32
    PVFarmImportEquipment:
      type: object
      description: >-
        A library record the import created from the PVFARM file's datasheet
        values.
      properties:
        kind:
          type:
            - string
            - 'null'
          description: The kind of record, either `module` or `inverter`.
        id:
          type: integer
          format: int64
          description: The created library record.
        name:
          type:
            - string
            - 'null'
  responses:
    Unauthorized:
      description: >-
        Missing or invalid bearer token. The response body is empty and no
        `Content-Type` header is set; the 401 status code is the only signal.
        Fetch a fresh token (see the **Authentication** section of the API
        description) and retry.
    NotFound:
      description: >-
        The referenced resource does not exist or is not accessible to the
        caller.
      content:
        text/plain:
          schema:
            type: string
          example: Project not found.
    ServerError:
      description: |
        Unexpected server-side error. The body is usually a plain-text message
        but its structure is not guaranteed — treat it as opaque diagnostic
        text. Common causes: database constraint violation, downstream
        service timeout, internal exception. Retry-safe for idempotent
        requests; for non-idempotent ones, verify state before retrying.
      content:
        text/plain:
          schema:
            type: string
          example: An error has occurred.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Pass `Authorization: Bearer <token>` on every request. See the
        **Authentication** section of the API description for how to fetch a
        token.

````