Aurora Solar Proposals API

Create, retrieve, and delete customer-facing proposals, list and retrieve proposal templates, generate a hosted web proposal URL from a design, and run/retrieve proposal PDF generation.

OpenAPI Specification

aurora-solar-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Aurora Solar API
  description: >-
    The Aurora API lets you build apps and integrations on the Aurora Solar
    platform for solar sales and design. It is a tenant-scoped REST API: every
    resource lives under /tenants/{tenant_id}. Requests are authenticated with
    an API-key bearer token (Standard keys prefixed `sk_`, Restricted keys
    prefixed `rk_`; `sand_`/`prod_` denote the environment) passed as
    `Authorization: Bearer <token>`. The current API version is v2024.05,
    selected via the `Aurora-Version` request header.


    Scope note: A handful of paths in this document are confirmed directly
    against Aurora's public reference (List Projects, Create Design Request,
    Create Webhook). The remaining paths are HONESTLY MODELED from Aurora's
    published operation catalog (docs.aurorasolar.com/llms.txt) following the
    same `/tenants/{tenant_id}/<resource>` convention; exact path segments for
    modeled operations should be reconciled against the live reference, which is
    partially gated. Modeled operations carry `x-modeled: true`.
  version: v2024.05
  contact:
    name: Aurora Solar Developer Platform
    url: https://docs.aurorasolar.com
  license:
    name: Proprietary
    url: https://aurorasolar.com/terms-of-service/
servers:
  - url: https://api.aurorasolar.com
    description: Production
  - url: https://api-sandbox.aurorasolar.com
    description: Sandbox
security:
  - bearerAuth: []
tags:
  - name: Projects
    description: Customer/site records that anchor designs and proposals.
  - name: Designs
    description: Design requests and PV designs with simulation output.
  - name: Proposals
    description: Customer-facing proposals, templates, and PDFs.
  - name: Consumption Profiles
    description: Energy consumption profiles and utility bills.
  - name: Users & Tenants
    description: Tenant, users, roles, teams, and SSO.
  - name: Webhooks
    description: Event notification subscriptions.
  - name: Financings
    description: Financings and financier integrations.
  - name: Agreements
    description: Customer agreements and signed downloads.
paths:
  /tenants/{tenant_id}/projects:
    parameters:
      - $ref: '#/components/parameters/TenantId'
    get:
      operationId: listProjects
      tags: [Projects]
      summary: List projects
      description: >-
        Lists projects for the tenant, sorted by created-at descending. Without
        `page`/`per_page` the first 100 projects are returned.
      parameters:
        - name: page
          in: query
          required: false
          description: Page to return, 1-indexed (default 1).
          schema:
            type: integer
            default: 1
        - name: per_page
          in: query
          required: false
          description: Items per page (default 100, max 250).
          schema:
            type: integer
            default: 100
            maximum: 250
      responses:
        '200':
          description: A page of projects.
          content:
            application/json:
              schema:
                type: object
                properties:
                  projects:
                    type: array
                    items:
                      $ref: '#/components/schemas/Project'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
    post:
      operationId: createProject
      tags: [Projects]
      summary: Create a project
      description: Creates a new project (customer/site) in the tenant.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProjectInput'
      responses:
        '201':
          description: The created project.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Project'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
        '429':
          $ref: '#/components/responses/RateLimited'
  /tenants/{tenant_id}/projects/{project_id}:
    parameters:
      - $ref: '#/components/parameters/TenantId'
      - $ref: '#/components/parameters/ProjectId'
    get:
      operationId: retrieveProject
      tags: [Projects]
      summary: Retrieve a project
      description: Retrieves a single project by ID.
      responses:
        '200':
          description: The requested project.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Project'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    patch:
      operationId: updateProject
      tags: [Projects]
      summary: Update a project
      description: Updates fields on an existing project.
      x-modeled: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProjectInput'
      responses:
        '200':
          description: The updated project.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Project'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/ValidationError'
    delete:
      operationId: deleteProject
      tags: [Projects]
      summary: Delete a project
      description: Deletes a project.
      x-modeled: true
      responses:
        '204':
          description: The project was deleted.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /tenants/{tenant_id}/projects/{project_id}/ahj:
    parameters:
      - $ref: '#/components/parameters/TenantId'
      - $ref: '#/components/parameters/ProjectId'
    get:
      operationId: retrieveAhj
      tags: [Projects]
      summary: Retrieve AHJ
      description: Retrieves the authority-having-jurisdiction details for a project.
      x-modeled: true
      responses:
        '200':
          description: AHJ details.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /tenants/{tenant_id}/design_requests:
    parameters:
      - $ref: '#/components/parameters/TenantId'
    post:
      operationId: createDesignRequest
      tags: [Designs]
      summary: Create a design request
      description: >-
        Submits an asynchronous design request for a project. If latitude and
        longitude are omitted, the project's coordinates are used. Poll the
        design request or subscribe to a webhook for completion.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DesignRequestInput'
      responses:
        '202':
          description: The accepted design request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DesignRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
        '429':
          $ref: '#/components/responses/RateLimited'
  /tenants/{tenant_id}/design_requests/{design_request_id}:
    parameters:
      - $ref: '#/components/parameters/TenantId'
      - name: design_request_id
        in: path
        required: true
        schema:
          type: string
    get:
      operationId: retrieveDesignRequest
      tags: [Designs]
      summary: Retrieve a design request
      description: Retrieves the status and result of a design request.
      x-modeled: true
      responses:
        '200':
          description: The design request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DesignRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    post:
      operationId: acceptDesignRequest
      tags: [Designs]
      summary: Accept a design request
      description: Accepts a completed design request, producing a design.
      x-modeled: true
      responses:
        '200':
          description: The resulting design.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Design'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /tenants/{tenant_id}/designs:
    parameters:
      - $ref: '#/components/parameters/TenantId'
    get:
      operationId: listDesigns
      tags: [Designs]
      summary: List designs
      description: Lists designs for the tenant, optionally filtered by project.
      x-modeled: true
      parameters:
        - name: project_id
          in: query
          required: false
          schema:
            type: string
      responses:
        '200':
          description: A list of designs.
          content:
            application/json:
              schema:
                type: object
                properties:
                  designs:
                    type: array
                    items:
                      $ref: '#/components/schemas/Design'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createDesign
      tags: [Designs]
      summary: Create a design
      description: Creates a design for a project.
      x-modeled: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DesignInput'
      responses:
        '201':
          description: The created design.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Design'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /tenants/{tenant_id}/designs/{design_id}:
    parameters:
      - $ref: '#/components/parameters/TenantId'
      - $ref: '#/components/parameters/DesignId'
    get:
      operationId: retrieveDesign
      tags: [Designs]
      summary: Retrieve a design
      description: Retrieves a design, including arrays, components, and pricing references.
      x-modeled: true
      responses:
        '200':
          description: The requested design.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Design'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /tenants/{tenant_id}/designs/{design_id}/summary:
    parameters:
      - $ref: '#/components/parameters/TenantId'
      - $ref: '#/components/parameters/DesignId'
    get:
      operationId: retrieveDesignSummary
      tags: [Designs]
      summary: Retrieve design summary
      description: >-
        Retrieves a design summary including system size, annual production, and
        performance-simulation outputs.
      x-modeled: true
      responses:
        '200':
          description: The design summary.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /tenants/{tenant_id}/proposals:
    parameters:
      - $ref: '#/components/parameters/TenantId'
    post:
      operationId: createProposal
      tags: [Proposals]
      summary: Create a proposal
      description: Creates a customer-facing proposal from a design.
      x-modeled: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProposalInput'
      responses:
        '201':
          description: The created proposal.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Proposal'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /tenants/{tenant_id}/proposals/{proposal_id}:
    parameters:
      - $ref: '#/components/parameters/TenantId'
      - name: proposal_id
        in: path
        required: true
        schema:
          type: string
    get:
      operationId: retrieveProposal
      tags: [Proposals]
      summary: Retrieve a proposal
      description: Retrieves a proposal by ID.
      x-modeled: true
      responses:
        '200':
          description: The requested proposal.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Proposal'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteProposal
      tags: [Proposals]
      summary: Delete a proposal
      description: Deletes a proposal.
      x-modeled: true
      responses:
        '204':
          description: The proposal was deleted.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /tenants/{tenant_id}/proposal_templates:
    parameters:
      - $ref: '#/components/parameters/TenantId'
    get:
      operationId: listProposalTemplates
      tags: [Proposals]
      summary: List proposal templates
      description: Lists the proposal templates configured for the tenant.
      x-modeled: true
      responses:
        '200':
          description: A list of proposal templates.
          content:
            application/json:
              schema:
                type: object
                properties:
                  proposal_templates:
                    type: array
                    items:
                      type: object
                      additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
  /tenants/{tenant_id}/designs/{design_id}/web_proposal:
    parameters:
      - $ref: '#/components/parameters/TenantId'
      - $ref: '#/components/parameters/DesignId'
    get:
      operationId: generateWebProposalUrl
      tags: [Proposals]
      summary: Generate web proposal URL
      description: Generates a hosted web proposal URL for a design.
      x-modeled: true
      responses:
        '200':
          description: The web proposal URL.
          content:
            application/json:
              schema:
                type: object
                properties:
                  url:
                    type: string
                    format: uri
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /tenants/{tenant_id}/projects/{project_id}/consumption_profile:
    parameters:
      - $ref: '#/components/parameters/TenantId'
      - $ref: '#/components/parameters/ProjectId'
    get:
      operationId: retrieveConsumptionProfile
      tags: [Consumption Profiles]
      summary: Retrieve consumption profile
      description: Retrieves the energy consumption profile for a project.
      x-modeled: true
      responses:
        '200':
          description: The consumption profile.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConsumptionProfile'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    patch:
      operationId: updateConsumptionProfile
      tags: [Consumption Profiles]
      summary: Update consumption profile
      description: Updates the energy consumption profile for a project.
      x-modeled: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConsumptionProfile'
      responses:
        '200':
          description: The updated consumption profile.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConsumptionProfile'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/ValidationError'
  /tenants/{tenant_id}/projects/{project_id}/utility_bills:
    parameters:
      - $ref: '#/components/parameters/TenantId'
      - $ref: '#/components/parameters/ProjectId'
    get:
      operationId: listUtilityBills
      tags: [Consumption Profiles]
      summary: List utility bills
      description: Lists the utility bills uploaded for a project.
      x-modeled: true
      responses:
        '200':
          description: A list of utility bills.
          content:
            application/json:
              schema:
                type: object
                properties:
                  utility_bills:
                    type: array
                    items:
                      type: object
                      additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
  /tenants/{tenant_id}/users:
    parameters:
      - $ref: '#/components/parameters/TenantId'
    get:
      operationId: listUsers
      tags: [Users & Tenants]
      summary: List users
      description: Lists the users in a tenant.
      x-modeled: true
      responses:
        '200':
          description: A list of users.
          content:
            application/json:
              schema:
                type: object
                properties:
                  users:
                    type: array
                    items:
                      $ref: '#/components/schemas/User'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createUser
      tags: [Users & Tenants]
      summary: Create a user
      description: Creates a user in a tenant.
      x-modeled: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/User'
      responses:
        '201':
          description: The created user.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /tenants/{tenant_id}/users/{user_id}:
    parameters:
      - $ref: '#/components/parameters/TenantId'
      - name: user_id
        in: path
        required: true
        schema:
          type: string
    get:
      operationId: retrieveUser
      tags: [Users & Tenants]
      summary: Retrieve a user
      description: Retrieves a single user.
      x-modeled: true
      responses:
        '200':
          description: The requested user.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    patch:
      operationId: updateUser
      tags: [Users & Tenants]
      summary: Update a user
      description: Updates a user, including activation state and role.
      x-modeled: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/User'
      responses:
        '200':
          description: The updated user.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /tenants/{tenant_id}:
    parameters:
      - $ref: '#/components/parameters/TenantId'
    get:
      operationId: retrieveTenant
      tags: [Users & Tenants]
      summary: Retrieve the tenant
      description: Retrieves the tenant record for the authenticated key.
      x-modeled: true
      responses:
        '200':
          description: The tenant.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Tenant'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /tenants/{tenant_id}/webhooks:
    parameters:
      - $ref: '#/components/parameters/TenantId'
    get:
      operationId: listWebhooks
      tags: [Webhooks]
      summary: List webhooks
      description: Lists the webhooks configured for the tenant.
      x-modeled: true
      responses:
        '200':
          description: A list of webhooks.
          content:
            application/json:
              schema:
                type: object
                properties:
                  webhooks:
                    type: array
                    items:
                      $ref: '#/components/schemas/Webhook'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createWebhook
      tags: [Webhooks]
      summary: Create a webhook
      description: >-
        Creates a webhook subscription so Aurora POSTs event notifications to
        your endpoint (for example when an async design job completes).
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookInput'
      responses:
        '201':
          description: The created webhook.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Webhook'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /tenants/{tenant_id}/webhooks/{webhook_id}:
    parameters:
      - $ref: '#/components/parameters/TenantId'
      - name: webhook_id
        in: path
        required: true
        schema:
          type: string
    get:
      operationId: retrieveWebhook
      tags: [Webhooks]
      summary: Retrieve a webhook
      description: Retrieves a webhook by ID.
      x-modeled: true
      responses:
        '200':
          description: The requested webhook.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Webhook'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    patch:
      operationId: updateWebhook
      tags: [Webhooks]
      summary: Update a webhook
      description: Updates a webhook subscription.
      x-modeled: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookInput'
      responses:
        '200':
          description: The updated webhook.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Webhook'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteWebhook
      tags: [Webhooks]
      summary: Delete a webhook
      description: Deletes a webhook subscription.
      x-modeled: true
      responses:
        '204':
          description: The webhook was deleted.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /tenants/{tenant_id}/financings:
    parameters:
      - $ref: '#/components/parameters/TenantId'
    get:
      operationId: listFinancings
      tags: [Financings]
      summary: List financings
      description: Lists financings for the tenant.
      x-modeled: true
      responses:
        '200':
          description: A list of financings.
          content:
            application/json:
              schema:
                type: object
                properties:
                  financings:
                    type: array
                    items:
                      $ref: '#/components/schemas/Financing'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /tenants/{tenant_id}/financings/{financing_id}:
    parameters:
      - $ref: '#/components/parameters/TenantId'
      - name: financing_id
        in: path
        required: true
        schema:
          type: string
    get:
      operationId: retrieveFinancing
      tags: [Financings]
      summary: Retrieve a financing
      description: Retrieves a financing by ID.
      x-modeled: true
      responses:
        '200':
          description: The requested financing.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Financing'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /tenants/{tenant_id}/financings/{financing_id}/push:
    parameters:
      - $ref: '#/components/parameters/TenantId'
      - name: financing_id
        in: path
        required: true
        schema:
          type: string
    post:
      operationId: pushFinancingToFinancier
      tags: [Financings]
      summary: Push financing to financier
      description: Submits a financing to the configured financier/lender.
      x-modeled: true
      responses:
        '200':
          description: The push result.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /tenants/{tenant_id}/agreements:
    parameters:
      - $ref: '#/components/parameters/TenantId'
    get:
      operationId: listAgreements
      tags: [Agreements]
      summary: List agreements
      description: Lists customer agreements for the tenant.
      x-modeled: true
      responses:
        '200':
          description: A list of agreements.
          content:
            application/json:
              schema:
                type: object
                properties:
                  agreements:
                    type: array
                    items:
                      $ref: '#/components/schemas/Agreement'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /tenants/{tenant_id}/agreements/{agreement_id}:
    parameters:
      - $ref: '#/components/parameters/TenantId'
      - name: agreement_id
        in: path
        required: true
        schema:
          type: string
    get:
      operationId: retrieveAgreement
      tags: [Agreements]
      summary: Retrieve an agreement
      description: Retrieves a customer agreement by ID.
      x-modeled: true
      responses:
        '200':
          description: The requested agreement.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Agreement'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /tenants/{tenant_id}/agreements/{agreement_id}/link:
    parameters:
      - $ref: '#/components/parameters/TenantId'
      - name: agreement_id
        in: path
        required: true
        schema:
          type: string
    get:
      operationId: retrieveAgreementLink
      tags: [Agreements]
      summary: Retrieve agreement link
      description: Retrieves a hosted link where the customer can view/sign the agreement.
      x-modeled: true
      responses:
        '200':
          description: The agreement link.
          content:
            application/json:
              schema:
                type: object
                properties:
                  url:
                    type: string
                    format: uri
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        API-key bearer token. Standard keys are prefixed `sk_`, Restricted keys
        `rk_`; `sand_`/`prod_` denote sandbox vs production. Passed as
        `Authorization: Bearer <token>`.
  parameters:
    TenantId:
      name: tenant_id
      in: path
      required: true
      description: The tenant (organization) ID that owns the resource.
      schema:
        type: string
    ProjectId:
      name: project_id
      in: path
      required: true
      description: The project ID.
      schema:
        type: string
    DesignId:
      name: design_id
      in: path
      required: true
      description: The design ID.
      schema:
        type: string
  responses:
    Unauthorized:
      description: Missing or invalid bearer token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The requested resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ValidationError:
      description: The request payload failed validation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimited:
      description: >-
        Rate limit exceeded (default 90 requests/minute). Inspect the
        `Retry-After` response header for when to retry.
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    Error:
      type: object
      properties:
        errors:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
              title:
                type: string
              detail:
                type: string
    ProjectInput:
      type: object
      required:
        - name
      properties:
        name:
          type: string
        customer_first_name:
          type: string
        customer_last_name:
          type: string
        customer_email:
          type: string
          format: email
        customer_phone:
          type: string
        status:
          type: string
        latitude:
          type: number
          format: double
        longitude:
          type: number
          format: double
        address:
          type: string
        tags:
          type: array
          items:
            type: string
    Project:
      allOf:
        - $ref: '#/components/schemas/ProjectInput'
        - type: object
          properties:
            id:
              type: string
              format: uuid
            tenant_id:
              type: string
              format: uuid
            created_at:
              type: string
              format: date-time
            updated_at:
              type: string
              format: date-time
    DesignRequestInput:
      type: object
      required:
        - project_id
      properties:
        project_id:
          type: string
        design_mode:
          type: string
          description: Design generation mode (for example manual or auto_designer).
          enum:
            - manual
            - auto_designer
        latitude:
          type: number
          format: double
        longitude:
          type: number
          format: double
    DesignRequest:
      allOf:
        - $ref: '#/components/schemas/DesignRequestInput'
        -

# --- truncated at 32 KB (36 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/aurora-solar/refs/heads/main/openapi/aurora-solar-openapi.yml