openapi: '3.0.0' info: version: '1.0.0' title: 'Elios Fund API' description: The Elios Fund API provides a robust interface for partners to integrate and access the most powerful financing options in solar today. contact: name: Elios Fund Engineering url: https://portal.support.eliosfund.com email: engineering@eliosfund.com externalDocs: url: https://partners.eliosfund.com description: Manage your Elios Fund API keys and OAuth 2.0 clients. servers: - url: https://api.eliosfund.com description: All requests should be directed to the production environment. - url: https://api.uat.eliosfund.com description: For access to the UAT environment, please contact Elios Fund support. - url: https://api.staging.eliosfund.com description: For access to the staging environment, please contact Elios Fund support. paths: /action-items: get: summary: Get all action items description: |- Retrieves all action items associated with your partner account. **Business Context:** Action items represent tasks, issues, or documentation requirements that need attention during the solar installation process. They help track project progress, ensure compliance, and maintain quality standards. **Action Item Types:** - **Documentation**: Required documents, permits, or certificates - **Quality Assurance**: Inspection items or compliance checks - **Customer Communication**: Follow-ups, confirmations, or notifications - **Technical**: Engineering reviews, design approvals, or system testing - **Financial**: Payment processing, rebate applications, or funding requirements **Use Cases:** - Project management and milestone tracking - Quality assurance and compliance monitoring - Team coordination and task assignment - Customer communication management - Audit trail and project documentation **Response Information:** - Action item details (title, description, priority, status) - Assignment information (project, team member) - Due dates and completion tracking - Related attachments and comments - Creation and update timestamps **Filtering and Organization:** Action items are automatically filtered by your partner account access. Results include items from all projects and applications you have permission to view. **Status Management:** - `open`: Newly created, requires attention - `in_review`: Under review or being processed - `needs_corrections`: Requires updates or fixes - `hold`: Temporarily paused or waiting for dependencies - `complete`: Successfully finished **Priority Levels:** - `critical`: Immediate attention required, blocks project progress - `high`: Important, should be addressed soon - `medium`: Standard priority, normal workflow - `low`: Nice to have, can be addressed when time permits security: - ApiKey: - view:action::items - OAuth: - view:action::items responses: 200: description: All action items assigned to your account. content: application/ld+json: schema: $ref: '#/components/schemas/ActionItemCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /action-items/{actionItemId}: parameters: - name: actionItemId description: The unique reference identifier of the action item. in: path required: true schema: type: string format: uuid get: summary: Get a specific action item description: |- Retrieves detailed information about a specific action item by its unique identifier. **Business Context:** Use this endpoint to get complete details about a specific action item, including its current status, assignee information, due dates, and any associated attachments or comments. **Response Information:** - Complete action item details (title, description, priority, status) - Assignment information (project, team member, due date) - Creation and update timestamps - Links to related attachments and comments - Project context and relationships **Common Use Cases:** - Displaying action item details in project management interfaces - Checking status before making updates - Retrieving information for notifications or reports - Accessing action item data for workflow integrations **Status Values:** - `open`: Newly created, requires attention - `in_review`: Under review or being processed - `needs_corrections`: Requires updates or fixes - `hold`: Temporarily paused or waiting for dependencies - `complete`: Successfully finished **Priority Levels:** - `critical`: Immediate attention required, blocks project progress - `high`: Important, should be addressed soon - `medium`: Standard priority, normal workflow - `low`: Nice to have, can be addressed when time permits security: - ApiKey: - view:action::items - OAuth: - view:action::items responses: 200: description: The requested action item. content: application/ld+json: schema: $ref: '#/components/schemas/ActionItem' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested action item could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /action-items/{actionItemId}/attachments: parameters: - name: actionItemId description: The unique reference identifier of the action item. in: path required: true schema: type: string format: uuid get: summary: Get action item attachments description: Returns all the current action item attachments. security: - ApiKey: - view:attachments - OAuth: - view:attachments responses: 200: description: The action item attachments. content: application/ld+json: schema: $ref: '#/components/schemas/AttachmentCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested application could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' post: summary: Upload action item documents and attachments description: | Uploads new documents, photos, or files to an action item. **Business Context:** Use this endpoint to add supporting documentation to action items during the project lifecycle. Proper document management helps track progress and maintain compliance requirements. **Upload Process:** 1. Prepare files with appropriate names and types 2. Categorize each file with the correct attachment type 3. Upload single file per request 4. Files are automatically processed and organized **File Requirements:** - **Maximum Size**: 10MB per file - **Supported Formats**: JPG, PNG, PDF, DOCX - **Naming**: Descriptive filenames help with organization **Required for Each File:** - `name`: Descriptive name for the document - `type`: Categorization using AttachmentType enum - `file`: The binary file data **When to Upload Documents:** **Action Item Documentation:** - Supporting evidence for task completion - Inspection photos and verification materials - Compliance documentation and certifications - Customer communications and approvals **Best Practices:** - Upload documents promptly when completing action items - Use clear, descriptive names for easy identification - Organize files by task or milestone - Include date information in filenames when relevant - Verify file completeness before marking action items complete security: - ApiKey: - create:attachments - OAuth: - create:attachments requestBody: content: multipart/form-data: schema: $ref: "#/components/schemas/AttachmentCreate" responses: 201: description: The attachment was created successfully. content: application/ld+json: schema: $ref: '#/components/schemas/AttachmentCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested action item could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /action-items/{actionItemId}/comments: parameters: - name: actionItemId description: The unique reference identifier of the action item. in: path required: true schema: type: string format: uuid get: summary: Get action item comments description: Returns all the current action item comments. security: - ApiKey: - view:comments - OAuth: - view:comments responses: 200: description: The action item comments. content: application/ld+json: schema: $ref: '#/components/schemas/CommentCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested application could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' post: summary: Create a new comment for an action item description: |- Creates a new comment for the specified action item. **Business Context:** Comments provide a communication channel for project stakeholders to discuss action item progress, issues, and updates. This enables collaborative tracking of action item resolution and maintains an audit trail of communication. **Common Use Cases:** - Progress updates from team members - Issue reporting and resolution discussions - Status clarifications and questions - Documentation of completion notes **After Creation:** - Comment is immediately visible to all users with access to the action item - Comment creation is logged in the action item's activity timeline - Relevant stakeholders may receive notifications (depending on system configuration) security: - ApiKey: - create:comments - OAuth: - create:comments requestBody: content: application/ld+json: schema: $ref: "#/components/schemas/CommentCreate" responses: 201: description: The comment was created successfully. content: application/ld+json: schema: $ref: '#/components/schemas/Comment' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested action item could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /adders: post: summary: Create a new project adder description: |- Creates a new adder for a specific project. **Business Context:** Adders represent additional upgrades, equipment, or work items beyond the base solar installation. Use this endpoint to add upgrades such as electrical work, structural improvements, additional equipment, or site preparation items to a project. **Common Adder Types:** - **Electrical Upgrades**: Panel upgrades, sub-panels, electrical work - **Structural Work**: Roof repairs, reinforcement, re-roofing - **Additional Equipment**: EV chargers, energy storage, monitoring systems - **Site Preparation**: Tree removal, trenching, access improvements - **Permits and Fees**: Additional permit costs, utility fees **Business Rules:** - Project must be in "new" status to add adders - Adders can only be added to projects you have permission to modify - Cost calculations may trigger project total updates - Customer approval may be required for significant additions **Common Use Cases:** - Adding customer-requested upgrades during proposal phase - Including necessary electrical work identified during site survey - Adding equipment discovered during engineering review - Including permit fees and additional costs security: - ApiKey: - update:projects - OAuth: - update:projects requestBody: content: application/ld+json: schema: $ref: "#/components/schemas/AdderCreate" responses: 201: description: The adder was created successfully. content: application/ld+json: schema: $ref: '#/components/schemas/Adder' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested project could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /adders/{adderId}: parameters: - name: adderId description: The unique reference identifier of the adder. in: path required: true schema: type: string format: uuid example: 5e40985a-51e7-3099-8c2c-dbc97159297c get: summary: Get a specific project adder description: |- Retrieves detailed information about a specific project adder by its unique identifier. **Business Context:** Adders represent additional upgrades, equipment, or work items beyond the base solar installation. Use this endpoint to get complete details about a specific adder, including its name, pricing, and reference information. **Common Adder Types:** - **Electrical Upgrades**: Panel upgrades, sub-panels, electrical work - **Structural Work**: Roof repairs, reinforcement, re-roofing - **Additional Equipment**: EV chargers, energy storage, monitoring systems - **Site Preparation**: Tree removal, trenching, access improvements - **Permits and Fees**: Additional permit costs, utility fees **Response Information:** - Complete adder details (name, reference ID, subtotal) - Pricing and cost breakdown - Integration context and relationships **Common Use Cases:** - Displaying adder details in project management interfaces - Cost breakdown and pricing analysis - Integration with billing and invoicing systems - Project estimation and proposal generation security: - ApiKey: - view:projects - OAuth: - view:projects responses: 200: description: The requested adder. content: application/ld+json: schema: $ref: '#/components/schemas/Adder' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested adder could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' patch: summary: Update a project adder description: |- Updates specific fields of an existing project adder. **Business Context:** Use this endpoint to modify adder details such as name, quantity, or pricing as project requirements change or during the estimation and approval process. **What Can Be Updated:** - **Name**: Description or title of the adder - **Quantity**: Number of units or items - **Subtotal**: Total cost for the adder - **Metadata**: Additional properties and specifications **Update Triggers:** - **Pricing Changes**: Updated vendor quotes or material costs - **Scope Modifications**: Changes in project requirements - **Customer Requests**: Additions or modifications to upgrade requests - **Engineering Review**: Refined specifications or requirements - **Permit Requirements**: Changes due to local code requirements **Business Rules:** - Adders attached to finalized projects may have update restrictions - Significant cost changes may require customer approval - Updates may affect project total pricing and financing calculations security: - ApiKey: - update:projects - OAuth: - update:projects requestBody: content: application/merge-patch+json: schema: $ref: "#/components/schemas/AdderUpdate" responses: 200: description: The updated adder. content: application/ld+json: schema: $ref: '#/components/schemas/Adder' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested adder could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' delete: summary: Delete a project adder description: |- Removes a specific adder from a project permanently. **Business Context:** Use this endpoint to remove adders that are no longer needed, were added in error, or when project scope changes eliminate the need for specific upgrades or equipment. **Common Deletion Scenarios:** - **Scope Reduction**: Customer decides against certain upgrades - **Budget Constraints**: Removing optional items to meet budget - **Engineering Changes**: Alternative solutions eliminate need for adder - **Permit Issues**: Items that cannot be approved by local authorities - **Data Cleanup**: Removing duplicate or erroneous entries **Important Considerations:** - **Permanent Action**: Deletion cannot be undone - **Project Impact**: Removal may affect total project cost and financing - **Dependencies**: Check for related items or dependencies before deletion - **Approval Requirements**: Some deletions may require customer or manager approval **Business Rules:** - Cannot delete adders from finalized or completed projects - Deletion may trigger project total recalculation - Associated attachments and comments may also be removed - Audit logs will maintain record of deletion for compliance **Alternative Actions:** - Consider updating quantity to 0 instead of deletion for audit trail - Use project status changes to temporarily exclude adders security: - ApiKey: - delete:projects - OAuth: - delete:projects responses: 204: description: The adder was deleted successfully. 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested adder could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 409: description: The adder cannot be deleted due to project status or dependencies. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /applications: get: summary: Get all qualification applications description: | Retrieves all solar financing qualification applications associated with your partner account. Applications represent the first step in the solar financing workflow where customers submit their personal information to determine their qualification for solar financing. **Business Context:** - Use this endpoint to list applications for reporting, status monitoring, or administration - Applications are automatically filtered by your partner account access - Results are paginated using Hydra collection format **Application Lifecycle:** 1. `open` - Application created, can be edited 2. `submitted` - Application locked for editing, ready for qualification 3. `in_progress` - Qualification checks running 4. `approved/declined` - Final qualification result security: - ApiKey: - view:applications - OAuth: - view:applications responses: 200: description: All qualification applications assigned to your account. content: application/ld+json: schema: $ref: '#/components/schemas/ApplicationCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' post: summary: Create a new qualification application description: | Creates a new solar financing qualification application for a customer. **Business Context:** This is the first step in the solar financing workflow. The application collects customer demographic and contact information needed for credit qualification. **Required Information:** - Primary applicant details (name, address, contact, SSN last 4 digits) - Product and agreement type for the solar installation - Sales team assignment (dealer, installer, sales rep) - Customer consents for credit checks and terms **Optional Information:** - Co-applicant details (joint applications for better qualification) - External identifiers for integration with your systems - Reference ID (e.g., proposal or quote ID) **Next Steps:** After creation, applications start in `open` status. You must call the submit endpoint before running qualification checks. security: - ApiKey: - create:applications - OAuth: - create:applications requestBody: content: application/ld+json: schema: $ref: "#/components/schemas/ApplicationCreate" responses: 201: description: The qualification application was created successfully. content: application/ld+json: schema: $ref: '#/components/schemas/Application' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /applications/{applicationId}: parameters: - name: applicationId description: | The unique reference identifier of the qualification application. This is the UUID returned when creating an application. in: path required: true schema: type: string format: uuid example: 550e8400-e29b-41d4-a716-446655440000 get: summary: Get qualification application details description: | Retrieves complete information about a specific qualification application, including applicant details, status, team assignment, and credit qualification results. **Business Context:** Use this endpoint to: - Check application status and progress - Retrieve applicant information for customer service - Get credit qualification tier results - Review team assignments **Response Information:** - Full applicant demographics (SSN is masked for security) - Current application status and progression - Credit report tier (if qualification is complete) - Assigned dealer, installer, and sales representative - External identifiers and reference IDs **Status Guide:** - `open`: Application can still be edited - `submitted`: Application locked, ready for qualification - `in_progress`: Credit checks and qualification running - `approved`: Customer qualified for financing - `declined`: Customer did not qualify - `onhold`: Manual review required - `cancelled`: Application cancelled security: - ApiKey: - view:applications - OAuth: - view:applications responses: 200: description: The requested qualification application. content: application/ld+json: schema: $ref: '#/components/schemas/Application' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested application could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' patch: summary: Update a qualification application description: |- Updates specific fields of an existing qualification application. **Business Context:** Use this endpoint to modify application details such as applicant information, team assignments, or application metadata without requiring full application recreation. **What Can Be Updated:** **Primary Applicant Information:** - Personal details (name, email, phone, date of birth) - Contact information and current address - SSN and identification details **Co-Applicant Information:** - All co-applicant personal and contact details - Co-applicant address information - Co-applicant identification **Team Assignments:** - Sales representative assignment (userId/user) - Dealer assignment (dealerId/dealer) - Installer assignment (installerId/installer) **Application Metadata:** - Agreement and product types - Reference IDs and external identifiers **Business Rules:** - Applications in `submitted` or later status may have restricted update permissions - Team changes may trigger workflow notifications - Primary applicant changes may require re-qualification **Common Use Cases:** - Correcting applicant information before submission - Adding or updating co-applicant details - Reassigning applications to different team members - Updating contact information for communication security: - ApiKey: - update:applications - OAuth: - update:applications requestBody: content: application/merge-patch+json: schema: $ref: "#/components/schemas/ApplicationUpdate" responses: 200: description: The updated application. content: application/ld+json: schema: $ref: '#/components/schemas/Application' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested application could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /applications/{applicationId}/ach: parameters: - name: applicationId description: | The unique reference identifier of the qualification application. The application must be in `approved` status to access ACH authorization. in: path required: true schema: type: string format: uuid example: 550e8400-e29b-41d4-a716-446655440000 get: summary: Get ACH authorization status and options description: | Retrieves the ACH (Automated Clearing House) authorization status and available completion methods for an approved qualification application. **Business Context:** ACH authorization is required for customers to set up automatic payments for their solar financing. This step comes after successful credit qualification. **Prerequisites:** - Application must have `approved` status from qualification - Customer must be ready to authorize bank account access **Authorization Methods:** 1. **API Integration (Recommended):** Use the returned `plaidLinkToken` to initialize Plaid Link in your application for seamless bank account connection 2. **Web Redirect:** Forward the customer to `achAuthorizationUrl` for a hosted authorization experience **Response Fields:** - `achAuthorizationStatus`: `complete` or `incomplete` - `plaidLinkToken`: Token for Plaid Link initialization (expires in 30 minutes) - `achAuthorizationUrl`: Direct link for web-based authorization - `achAuthorizationConsentHtml/Markdown`: Legal consent text to display **Next Steps:** After ACH authorization is complete, the customer can proceed to project creation and contract execution. security: - ApiKey: - view:applications - OAuth: - view:applications responses: 200: description: The requested qualification application. content: application/ld+json: schema: $ref: '#/components/schemas/ApplicationAch' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested application could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' post: summary: Complete ACH authorization with Plaid description: | Completes the ACH authorization process using Plaid Link integration. **Business Context:** This endpoint processes the Plaid Link results after the customer has successfully connected their bank account through the Plaid interface. **Prerequisites:** - Application must be in `approved` status - Customer must have completed Plaid Link flow with valid public token - Required customer information must be provided **Integration Flow:** 1. Get ACH authorization details from GET endpoint 2. Initialize Plaid Link with the provided token 3. Customer completes bank account selection in Plaid interface 4. Plaid returns a public token 5. Submit the public token and customer details to this endpoint **Required Information:** - Customer's full legal name (must match bank account) - Contact email and phone number - Plaid public token from successful Link session **Security Notes:** - Plaid tokens expire after 30 minutes - Customer information is validated against application data - Bank account information is securely stored and encrypted security: - ApiKey: - update:applications - OAuth: - update:applications requestBody: content: application/ld+json: schema: $ref: "#/components/schemas/AchAuthorizationCreate" responses: 201: description: The ACH authorization was created successfully. content: application/ld+json: schema: $ref: '#/components/schemas/AchAuthorization' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested application could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /applications/{applicationId}/external-identifiers: parameters: - name: applicationId description: | The unique reference identifier of the qualification application. in: path required: true schema: type: string format: uuid example: 550e8400-e29b-41d4-a716-446655440000 get: summary: Get external identifiers for an application description: | Retrieves all external identifiers associated with a specific application. **Business Context:** External identifiers allow partners to maintain references between their systems and Elios Fund applications. This enables seamless integration and tracking across multiple platforms. **Common Use Cases:** - Track applications in your CRM system - Maintain references to third-party tools - Support multi-system workflows - Enable data synchronization between platforms - Audit trail and relationship mapping **Response Information:** - Key-value pairs of external system identifiers - Creation timestamps and source tracking - Support for multiple identifier types per application security: - ApiKey: - view:applications - OAuth: - view:applications responses: 200: description: The external identifiers for the application. content: application/ld+json: schema: allOf: - $ref: '#/components/schemas/ExternalIdentifierCollection' - type: object properties: "@id": example: "/applications/550e8400-e29b-41d4-a716-446655440000/external-identifiers" 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested application could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' post: summary: Create or update an external identifier for an application description: | Creates a new external identifier for the application or updates an existing one if the key already exists. **Business Context:** This endpoint supports integration workflows by allowing partners to establish and maintain cross-references between their systems and Elios Fund applications. **Update Behavior:** - If an external identifier with the same key exists, it will be updated - If the key is new, a new external identifier will be created - This allows for idempotent operations and easy data synchronization **Common Integration Patterns:** - Store your CRM opportunity/lead ID when creating applications - Link to third-party project management and workflow systems - Connect customer portal and tracking system references - Maintain audit trails across multiple systems - Support multi-platform data synchronization **Security:** - Requires `update:applications` scope - External identifiers are scoped to your partner account - Values should not contain sensitive customer information security: - ApiKey: - update:applications - OAuth: - update:applications requestBody: required: true content: application/ld+json: schema: $ref: "#/components/schemas/ExternalIdentifierCreate" examples: crm_integration: summary: CRM Integration description: Link application to CRM opportunity value: externalId: key: "salesforce.opportunity" value: "006XX000004TMXLYA4" design_tool: summary: Design Tool Reference description: Link to external design platform value: externalId: key: "aurora.project" value: "proj_abc123xyz" responses: 201: description: The external identifier was created successfully. content: application/ld+json: schema: $ref: '#/components/schemas/ExternalIdentifier' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested application could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /applications/{applicationId}/open: parameters: - name: applicationId description: | The unique reference identifier of the qualification application to reopen. in: path required: true schema: type: string format: uuid example: 550e8400-e29b-41d4-a716-446655440000 patch: summary: Reopen a qualification application for editing description: | Reopens a qualification application to allow editing of applicant information. **Business Context:** Use this endpoint when you need to modify application details after submission, such as correcting customer information or updating product selections. **Valid Source Statuses:** - `submitted`: Application was submitted but not yet qualified - `approved`: Qualified application that needs modifications - `declined`: Declined application with correctable issues **Status Transition:** `submitted/approved/declined` → `open` **After Reopening:** - Application status becomes `open` - All fields become editable again - Previous qualification results are cleared - Application must be resubmitted before running qualification again **Common Use Cases:** - Correcting customer address or contact information - Adding or removing a co-applicant - Updating product type or agreement terms - Fixing data entry errors discovered after submission **Important Notes:** - Reopening clears previous credit qualification results - Customer will need to be re-qualified after resubmission - Any ACH authorization remains valid and doesn't need to be redone security: - ApiKey: - update:applications - OAuth: - update:applications responses: 200: description: The current qualification application status. content: application/ld+json: schema: $ref: '#/components/schemas/ApplicationOpen' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested application could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /applications/{applicationId}/qualify: parameters: - name: applicationId description: | The unique reference identifier of the qualification application to qualify. The application must be in `submitted` status. in: path required: true schema: type: string format: uuid example: 550e8400-e29b-41d4-a716-446655440000 get: summary: Start credit qualification process description: | Initiates the credit qualification process for a submitted application. **Business Context:** This endpoint triggers the automated credit assessment that determines if the customer qualifies for solar financing and at what tier level. **Prerequisites:** - Application must be in `submitted` status - Cannot run qualification on applications that are already qualified - All required applicant information must be complete and validated **Qualification Process:** 1. Credit bureau reports are pulled for all applicants 2. Automated underwriting rules are applied 3. Credit tier is assigned based on qualification results 4. Final approval or decline decision is made **Status Transitions:** - `submitted` → `in_progress` (immediately) - `in_progress` → `approved` or `declined` (within 1-3 minutes) - Some applications may go to `onhold` for manual review **Credit Tiers (best to worst):** - `diamond`: Excellent credit, best rates - `platinum`: Very good credit - `gold`: Good credit - `silver`: Fair credit - `bronze`: Below average credit - `mercury`: Poor credit, limited options - `declined`: Does not qualify for financing **Monitoring Results:** - **Recommended**: Subscribe to `application.approved` and `application.declined` webhooks - **Alternative**: Poll the GET `/applications/{applicationId}` endpoint every 30 seconds - Results typically available within 60 seconds security: - ApiKey: - qualify:applications - OAuth: - qualify:applications responses: 200: description: The current qualification application status. content: application/ld+json: schema: $ref: '#/components/schemas/ApplicationQualify' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested application could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /applications/{applicationId}/submit: parameters: - name: applicationId description: | The unique reference identifier of the qualification application to submit. The application must be in `open` status. in: path required: true schema: type: string format: uuid example: 550e8400-e29b-41d4-a716-446655440000 patch: summary: Submit application for qualification description: | Locks an application for editing and prepares it for credit qualification. **Business Context:** This endpoint finalizes the application data and moves it into the qualification pipeline. After submission, the application cannot be edited without reopening it first. **Prerequisites:** - Application must be in `open` status - All required fields must be completed and valid - Customer consents must be obtained (consent1, consent2, consent3) **Status Transition:** `open` → `submitted` **Validation Performed:** - All required applicant information is complete - Contact information is properly formatted - Address information is valid and complete - Team assignment (dealer, installer, sales rep) is specified - Product and agreement types are selected - Customer consents are acknowledged **After Submission:** - Application becomes read-only - Ready for qualification process - Must use `/qualify` endpoint to start credit checks - Can be reopened if changes are needed **Next Steps:** 1. Call `/applications/{applicationId}/qualify` to start credit assessment 2. Monitor status via webhooks or polling 3. Proceed to ACH authorization once approved security: - ApiKey: - update:applications - OAuth: - update:applications responses: 200: description: The current qualification application status. content: application/ld+json: schema: $ref: '#/components/schemas/ApplicationSubmit' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested application could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /dealers: get: summary: Get all dealers description: Returns all available dealers. security: - ApiKey: - view:dealers - OAuth: - view:dealers responses: 200: description: All dealers assigned to your account. content: application/ld+json: schema: $ref: '#/components/schemas/DealerCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /dealers/{dealerId}: parameters: - name: dealerId description: The unique reference identifier of the dealer. in: path required: true schema: type: string format: uuid get: summary: Get a dealer description: Returns all available information about a single dealer. security: - ApiKey: - view:dealers - OAuth: - view:dealers responses: 200: description: The requested dealer. content: application/ld+json: schema: $ref: '#/components/schemas/Dealer' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested resource was not found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /designs: post: summary: Create a new solar system design description: |- Creates a new solar system design for a project with specifications and performance data. **Business Context:** Solar designs define the technical specifications and performance characteristics of the proposed solar installation, including system size, equipment selection, and energy production estimates. **Design Creation Process:** 1. **Layout Planning**: System size and equipment configuration 2. **Performance Modeling**: Energy production and shading analysis 3. **Equipment Selection**: Modules, inverters, racking, and storage 4. **Optimization**: Balancing cost, performance, and aesthetics **Required Design Data:** - **System Size**: Total DC capacity in kilowatts - **Performance Metrics**: Annual production and system offset - **Shading Analysis**: Annual Solar Access (ASA) percentage - **Design Identity**: Name and source system **Primary Design Logic:** - If `isPrimary=true`: Sets this as the active design (others become secondary) - If `isPrimary=false/null` and no primary exists: Becomes primary automatically - If `isPrimary=false/null` and primary exists: Becomes secondary design **Integration Sources:** - **Manual Entry**: Basic system specifications - **Design Software**: Aurora Solar, Helioscope, PV*SOL - **Site Analysis**: Scanifly, Sunobi integration - **API Import**: External design tools and platforms **Validation Requirements:** - System size must be realistic for project type - Production estimates should align with system size and location - ASA values must be within reasonable ranges (0-100%) - System offset should match customer energy needs **Common Use Cases:** - Initial system sizing and layout - Design import from engineering software - Alternative design scenarios - System optimization iterations - Customer presentation materials security: - ApiKey: - create:designs - OAuth: - create:designs requestBody: content: application/ld+json: schema: $ref: "#/components/schemas/DesignCreate" responses: 201: description: The design was created successfully. content: application/ld+json: schema: $ref: '#/components/schemas/Design' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested project could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /designs/{designId}: parameters: - name: designId description: The unique reference identifier of the design. in: path required: true schema: type: string format: uuid get: summary: Get specific solar system design description: |- Retrieves detailed information about a specific solar system design. **Business Context:** Individual designs contain comprehensive technical specifications, performance data, and equipment details needed for system installation and financing calculations. **Design Information Includes:** - **System Specifications**: Size, offset, production estimates - **Performance Data**: Annual Solar Access, energy production - **Equipment Details**: Modules, inverters, racking, storage - **Design Metadata**: Source, creation date, primary status - **Segment Information**: Array layouts and equipment breakdowns **Common Use Cases:** - Engineering review and approval - Customer presentation and approval - Equipment procurement and ordering - Installation planning and coordination - Performance monitoring setup - Financing calculation verification **Design Status:** - **Primary**: Active design for installation and financing - **Secondary**: Alternative or archived design versions security: - ApiKey: - view:designs - OAuth: - view:designs responses: 200: description: The requested design. content: application/ld+json: schema: $ref: '#/components/schemas/Design' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested design could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' patch: summary: Update a solar system design description: |- Updates specific fields of an existing solar system design. **Business Context:** Design updates are common throughout the project lifecycle as systems are refined through engineering review, customer feedback, equipment availability, and performance optimization. **What Can Be Updated:** **Design Specifications:** - System size and performance metrics - Annual production and offset calculations - Annual Solar Access (ASA) shading analysis - Design name and version tracking **Design Status:** - Primary/secondary design designation - Design source and origin tracking **Update Triggers:** - **Engineering Review**: Refined calculations and specifications - **Equipment Changes**: Updated product availability or selection - **Site Conditions**: Revised shading or structural analysis - **Customer Requests**: Size or aesthetic modifications - **Utility Requirements**: Interconnection size restrictions **Primary Design Changes:** - Setting `isPrimary=true` promotes design to active status - Previous primary design automatically becomes secondary - Primary changes may trigger financing recalculation - Customer approval may be required for significant changes **Business Rules:** - Designs attached to submitted projects may have update restrictions - Primary design changes may require customer approval - Equipment updates may affect procurement and scheduling - Projects must be in "new" status to allow design updates - If a project is already "in_progress" or later, create a new design instead **Common Use Cases:** - Design version control and iteration tracking - Performance optimization and refinement - Equipment substitution and availability updates - Customer-requested modifications - Engineering review and approval workflow security: - ApiKey: - update:designs - OAuth: - update:designs requestBody: content: application/merge-patch+json: schema: $ref: "#/components/schemas/DesignUpdate" responses: 200: description: The updated design. content: application/ld+json: schema: $ref: '#/components/schemas/Design' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested design could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' delete: summary: Delete a solar system design description: |- Permanently removes a specific solar system design from a project. **Business Context:** Use this endpoint to delete designs that are no longer needed, were created in error, or when project requirements have changed to eliminate specific design versions. **Common Deletion Scenarios:** - **Design Iterations**: Removing outdated or superseded design versions - **Error Correction**: Deleting designs created with incorrect data - **Project Changes**: Removing designs that no longer meet requirements - **Storage Management**: Cleaning up unused or duplicate designs - **Workflow Cleanup**: Removing draft designs that won't be developed **Important Considerations:** - **Permanent Action**: Design deletion cannot be undone - **Primary Design Protection**: Cannot delete the primary/active design - **Project Impact**: Deletion may affect project documentation and history - **Dependencies**: Check for related attachments or references before deletion - **Approval Requirements**: Some deletions may require manager approval **Business Rules:** - Cannot delete primary designs (must promote another design to primary first) - Cannot delete designs from finalized or completed projects - Associated external identifiers and metadata are also removed - Audit logs maintain record of deletion for compliance **Alternative Actions:** - Consider updating design status instead of deletion for audit trail - Use design versioning to track evolution rather than deleting old versions - Mark designs as inactive rather than permanent deletion security: - ApiKey: - delete:designs - OAuth: - delete:designs responses: 204: description: The design was deleted successfully. 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested design could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 409: description: The design cannot be deleted due to project status, primary design status, or dependencies. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /designs/{designId}/external-identifiers: parameters: - name: designId description: | The unique reference identifier of the design. in: path required: true schema: type: string format: uuid example: 550e8400-e29b-41d4-a716-446655440000 get: summary: Get external identifiers for a design description: | Retrieves all external identifiers associated with a specific design. **Business Context:** External identifiers allow partners to maintain references between their systems and Elios Fund designs. This enables seamless integration and tracking across multiple platforms. **Common Use Cases:** - Track designs in your CRM system - Maintain references to third-party design tools - Support multi-system workflows - Enable data synchronization between platforms - Audit trail and relationship mapping **Response Information:** - Key-value pairs of external system identifiers - Creation timestamps and source tracking - Support for multiple identifier types per design security: - ApiKey: - view:designs - OAuth: - view:designs responses: 200: description: The external identifiers for the design. content: application/ld+json: schema: allOf: - $ref: '#/components/schemas/ExternalIdentifierCollection' - type: object properties: "@id": example: "/designs/550e8400-e29b-41d4-a716-446655440000/external-identifiers" 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested design could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' post: summary: Create or update an external identifier for a design description: | Creates a new external identifier for the design or updates an existing one if the key already exists. **Business Context:** This endpoint supports integration workflows by allowing partners to establish and maintain cross-references between their systems and Elios Fund designs. **Update Behavior:** - If an external identifier with the same key exists, it will be updated - If the key is new, a new external identifier will be created - This allows for idempotent operations and easy data synchronization **Common Integration Patterns:** - Store your CRM project/design ID when creating designs - Link to third-party design tools and their project references - Connect workflow management system task IDs - Maintain audit trails across multiple systems - Support customer portal cross-references **Security:** - Requires `update:designs` scope - External identifiers are scoped to your partner account - Values should not contain sensitive customer information security: - ApiKey: - update:designs - OAuth: - update:designs requestBody: required: true content: application/ld+json: schema: $ref: "#/components/schemas/ExternalIdentifierCreate" examples: crm_integration: summary: CRM Integration description: Link design to CRM project value: externalId: key: "salesforce.project" value: "006XX000004TMXLYA4" design_tool: summary: Design Tool Reference description: Link to external design platform value: externalId: key: "aurora.project" value: "proj_abc123xyz" helioscope: summary: Helioscope Integration description: Link to Helioscope design value: externalId: key: "helioscope.design" value: "hs_design_789" responses: 201: description: The external identifier was created successfully. content: application/ld+json: schema: $ref: '#/components/schemas/ExternalIdentifier' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested design could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /designs/products/batteries: post: summary: Add a battery to a design description: |- Adds a battery product to a specific solar system design. **Business Context:** Battery storage systems are increasingly important components of solar installations, providing energy storage, backup power, and grid services capabilities. This endpoint allows partners to specify battery equipment for solar designs. **Battery Integration:** - **Energy Storage**: Store excess solar production for later use - **Backup Power**: Provide power during grid outages - **Load Shifting**: Use stored energy during peak rate periods - **Grid Services**: Support grid stability and demand response **Optional Configuration:** - **Monitoring Location**: Physical location for monitoring equipment - **Monitoring ID**: Identifier for monitoring system integration security: - ApiKey: - update:designs - OAuth: - update:designs requestBody: content: application/ld+json: schema: $ref: "#/components/schemas/DesignStorageCreate" responses: 201: description: The battery was added to the design successfully. content: application/ld+json: schema: $ref: '#/components/schemas/DesignStorageProduct' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /designs/products/batteries/{itemId}: parameters: - name: itemId description: The unique reference identifier of the battery item. in: path required: true schema: type: string format: uuid example: "2608684b-74ab-4cef-898c-acdaf88d92b1" get: summary: Get specific battery from a design description: |- Retrieves detailed information about a specific battery attached to a design. **Business Context:** Use this endpoint to get complete details about a battery component that has been added to a solar design, including specifications, quantities, and configuration details. **Response Information:** - Battery reference ID and type information - Quantity and size specifications - Cost and pricing details (if available) - Monitoring configuration and location - Integration context and relationships **Common Use Cases:** - Reviewing battery specifications for engineering approval - Displaying equipment details in customer proposals - Verifying battery configuration for installation planning - Accessing equipment data for procurement and ordering - Integration with monitoring and control systems security: - ApiKey: - view:designs - OAuth: - view:designs responses: 200: description: The requested battery item. content: application/ld+json: schema: $ref: '#/components/schemas/DesignStorageProduct' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' delete: summary: Remove a battery from a design description: |- Permanently removes a specific battery from a solar system design. **Business Context:** Use this endpoint to remove battery storage components that are no longer needed, were added in error, or when design requirements have changed to eliminate battery storage from the installation. **Common Removal Scenarios:** - **Budget Constraints**: Customer removes battery to reduce system cost - **Design Changes**: Alternative storage solution or no storage needed - **Equipment Availability**: Specified battery not available, removing until replacement found - **Site Limitations**: Installation constraints prevent battery installation - **Regulatory Issues**: Local codes or utility requirements prohibit storage **Business Rules:** - Cannot remove batteries from finalized or in-progress projects - Removal may trigger system performance recalculations - Associated monitoring configuration is also removed - Audit logs maintain record of removal for compliance security: - ApiKey: - update:designs - OAuth: - update:designs responses: 204: description: The battery was removed successfully. 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested battery item could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 409: description: The battery cannot be removed due to project status or dependencies. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /designs/products/inverters: post: summary: Add an inverter to a design description: |- Adds an inverter product to a specific solar system design. **Business Context:** Inverters are a critical component of solar installations, converting DC electricity from solar panels into usable AC electricity. This endpoint enables partners to specify inverter equipment for solar designs. **Inverter Integration:** - **DC to AC Conversion**: Enables energy from solar panels to power household or grid systems - **Monitoring**: Tracks energy production and inverter status - **String Configuration**: Support for multiple MPPTs or string layouts - **Smart Grid Features**: Volt/VAR control, frequency ride-through **Optional Configuration:** - **Monitoring Location**: Physical location for monitoring equipment - **Monitoring ID**: Identifier for monitoring system integration security: - ApiKey: - update:designs - OAuth: - update:designs requestBody: content: application/ld+json: schema: $ref: "#/components/schemas/DesignInverterCreate" responses: 201: description: The inverter was added to the design successfully. content: application/ld+json: schema: $ref: '#/components/schemas/DesignInverterProduct' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /designs/products/inverters/{itemId}: parameters: - name: itemId description: The unique reference identifier of the inverter item. in: path required: true schema: type: string format: uuid example: "9b8e2a3e-b4f7-4c3c-92a2-61fcaab57f19" get: summary: Get specific inverter from a design description: |- Retrieves detailed information about a specific inverter attached to a design. **Business Context:** Use this endpoint to get complete details about an inverter component that has been added to a solar design, including specifications, quantities, and configuration details. **Response Information:** - Inverter reference ID and type information - Quantity and size specifications - Cost and pricing details (if available) - Monitoring configuration and location - Integration context and relationships **Common Use Cases:** - Reviewing inverter specifications for engineering approval - Displaying equipment details in customer proposals - Verifying inverter configuration for installation planning - Accessing equipment data for procurement and ordering - Integration with monitoring and control systems security: - ApiKey: - view:designs - OAuth: - view:designs responses: 200: description: The requested inverter item. content: application/ld+json: schema: $ref: '#/components/schemas/DesignInverterProduct' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' delete: summary: Remove an inverter from a design description: |- Permanently removes a specific inverter from a solar system design. **Business Context:** Use this endpoint to remove inverter components that are no longer needed, were added in error, or when design requirements have changed. **Common Removal Scenarios:** - **Design Changes**: Switching inverter types or removing due to redesign - **Equipment Availability**: Inverter model discontinued or backordered - **Site Limitations**: Inverter installation impractical due to location or size - **Regulatory Issues**: Inverter model not approved for interconnection **Business Rules:** - Cannot remove inverters from finalized or in-progress projects - Removal may trigger system performance recalculations - Associated monitoring configuration is also removed - Audit logs maintain record of removal for compliance security: - ApiKey: - update:designs - OAuth: - update:designs responses: 204: description: The inverter was removed successfully. 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested inverter item could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 409: description: The inverter cannot be removed due to project status or dependencies. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /designs/products/racking: post: summary: Add a racking system to a design description: |- Adds a racking product to a specific solar system design. **Business Context:** Racking systems provide the structural foundation for solar panel installations. This endpoint allows partners to specify racking solutions suited to the project's site conditions and design requirements. **Racking Integration:** - **Mounting Structure**: Secure solar modules to roofs or ground - **Tilt and Orientation**: Optimize panel angle for sun exposure - **Structural Compliance**: Ensure adherence to local building codes - **Wind and Snow Load Ratings**: Critical for durability and safety **Optional Configuration:** - **Monitoring Location**: Physical location for monitoring equipment - **Monitoring ID**: Identifier for monitoring system integration security: - ApiKey: - update:designs - OAuth: - update:designs requestBody: content: application/ld+json: schema: $ref: "#/components/schemas/DesignRackingCreate" responses: 201: description: The racking was added to the design successfully. content: application/ld+json: schema: $ref: '#/components/schemas/DesignRackingProduct' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /designs/products/racking/{itemId}: parameters: - name: itemId description: The unique reference identifier of the racking item. in: path required: true schema: type: string format: uuid example: "36b19b79-88aa-4d61-91c5-7c70f7b89e11" get: summary: Get specific racking from a design description: |- Retrieves detailed information about a specific racking system attached to a design. **Business Context:** Use this endpoint to get complete details about a racking component that has been added to a solar design, including specifications, quantities, and configuration details. **Response Information:** - Racking reference ID and type information - Mounting type and material specifications - Cost and pricing details (if available) - Installation method and layout - Compatibility and integration with other components **Common Use Cases:** - Engineering validation of racking compatibility - Planning for roof or ground-mount installations - Generating bill of materials and cost estimates - Procurement and supplier coordination - Compliance and permitting review security: - ApiKey: - view:designs - OAuth: - view:designs responses: 200: description: The requested racking item. content: application/ld+json: schema: $ref: '#/components/schemas/DesignRackingProduct' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' delete: summary: Remove racking from a design description: |- Permanently removes a specific racking system from a solar system design. **Business Context:** Use this endpoint to remove racking components that are no longer needed, incompatible, or when project constraints have changed. **Common Removal Scenarios:** - **Structural Limitations**: Racking system not compatible with site - **Change in Mount Type**: Switching from roof to ground mount (or vice versa) - **Design Simplification**: Reducing complexity for smaller installations - **Supplier Substitution**: Switching to alternate racking vendor **Business Rules:** - Cannot remove racking from finalized or in-progress projects - Removal may affect panel layout or installation method - Audit logs maintain record of removal for compliance security: - ApiKey: - update:designs - OAuth: - update:designs responses: 204: description: The racking was removed successfully. 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested racking item could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 409: description: The racking cannot be removed due to project status or dependencies. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /designs/segments: post: summary: Create a design segment description: | Creates a new design segment (solar array) within an existing design. A design segment represents a grouping of solar modules configured with specific parameters such as azimuth, tilt, and shading characteristics. **Business Context:** Design segments are used to define different arrays within a single solar installation. Each segment can have different orientations, tilt angles, and shading conditions, allowing for accurate modeling of complex roof structures and optimized energy production calculations. **Important:** The associated design's project must be in "NEW" status to create segments. Projects in progress require creating a new primary design to update specifications. security: - ApiKey: - update:designs - OAuth: - update:designs requestBody: required: true content: application/ld+json: schema: $ref: '#/components/schemas/DesignSegmentCreate' responses: 201: description: The design segment was created successfully. content: application/ld+json: schema: $ref: '#/components/schemas/DesignSegment' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The specified design could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: The request body contained invalid or missing data, or the project status prevents segment creation. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /designs/segments/{itemId}: parameters: - name: itemId description: The unique reference identifier of the design segment. in: path required: true schema: type: string format: uuid get: summary: Get a design segment description: | Retrieves detailed information about a specific design segment (solar array) by its unique identifier. **Business Context:** Design segments represent individual solar arrays within a larger solar installation. Each segment contains specific configuration parameters including module quantities, orientations, tilt angles, and shading characteristics that are crucial for accurate energy production modeling and system performance calculations. **Use Cases:** - Retrieving segment specifications for proposal generation - Accessing array configuration for installation planning - Reviewing segment parameters for performance analysis - Validating design configurations before project approval security: - ApiKey: - view:designs - OAuth: - view:designs responses: 200: description: The design segment details. content: application/ld+json: schema: $ref: '#/components/schemas/DesignSegment' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The design segment could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' delete: summary: Delete a design segment description: | Deletes a specific design segment (solar array) from a design. This action permanently removes the segment and all its configuration data. **Business Context:** Removing design segments is typically done during the design refinement process when arrays need to be reconfigured, consolidated, or removed due to site constraints, customer preferences, or engineering optimizations. **Important:** The associated design's project must be in "NEW" status to delete segments. Projects in progress require creating a new primary design to update specifications. **Use Cases:** - Removing arrays that are no longer viable due to site constraints - Consolidating multiple segments into larger arrays - Correcting design errors during the planning phase - Responding to customer change requests security: - ApiKey: - update:designs - OAuth: - update:designs responses: 204: description: The design segment was deleted successfully. 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The design segment could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: The design segment cannot be deleted due to business rules (e.g., project status is not "NEW"). content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /distributors: get: summary: Get all distributors description: Returns all available distributors. security: - ApiKey: - view:distributors - OAuth: - view:distributors responses: 200: description: All distributors assigned to your account. content: application/ld+json: schema: $ref: '#/components/schemas/DistributorCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /distributors/{distributorId}: parameters: - name: distributorId description: The unique reference identifier of the distributor. in: path required: true schema: type: string format: uuid get: summary: Get a distributor description: Returns all available information about a single distributor. security: - ApiKey: - view:distributors - OAuth: - view:distributors responses: 200: description: The requested distributor. content: application/ld+json: schema: $ref: '#/components/schemas/Distributor' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested resource was not found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /installers: get: summary: Get all installers description: Returns all available installers. security: - ApiKey: - view:installers - OAuth: - view:installers responses: 200: description: All installers assigned to your account. content: application/ld+json: schema: $ref: '#/components/schemas/InstallerCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /installers/{installerId}: parameters: - name: installerId description: The unique reference identifier of the installer. in: path required: true schema: type: string format: uuid get: summary: Get an installer description: Returns all available information about a single installer. security: - ApiKey: - view:installers - OAuth: - view:installers responses: 200: description: The requested installer. content: application/ld+json: schema: $ref: '#/components/schemas/Installer' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested resource was not found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /partners: get: summary: Get all partners description: Returns all available partners. security: - ApiKey: - view:partners - OAuth: - view:partners responses: 200: description: All partners assigned to your account. content: application/ld+json: schema: $ref: '#/components/schemas/PartnerCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /partners/{partnerId}: parameters: - name: partnerId description: The unique reference identifier of the partner. in: path required: true schema: type: string format: uuid get: summary: Get a partner description: Returns all available information about a single partner. security: - ApiKey: - view:partners - OAuth: - view:partners responses: 200: description: The requested partner. content: application/ld+json: schema: $ref: '#/components/schemas/Partner' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested resource was not found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /products/{productId}: parameters: - name: productId description: The unique reference identifier of the product. in: path required: true schema: type: string format: uuid get: summary: Get a specific product description: |- Retrieves detailed information about a specific product by its unique identifier. **Business Context:** Use this endpoint to get complete details about a specific product, including its specifications, manufacturer information, pricing, and availability status. **Response Information:** - Complete product details (name, model, type, specifications) - Manufacturer information and part numbers - Technical specifications and performance data - Pricing and availability status - Product category and classification - Warranty and certification details **Common Use Cases:** - Displaying product details in design interfaces - Equipment selection and comparison - Retrieving specifications for proposals - Validating product availability for projects - Accessing technical data for engineering review **Product Categories:** - **Modules**: Solar panels with wattage and efficiency ratings - **Inverters**: String, power optimizers, and microinverters - **Batteries**: Energy storage systems with capacity specifications - **Racking**: Mounting systems for various installation types security: - ApiKey: - view:products - OAuth: - view:products responses: 200: description: The requested product. content: application/ld+json: schema: $ref: '#/components/schemas/Product' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested product could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /products/avl: get: summary: Get all products description: Returns all available product options. security: - ApiKey: - view:products - OAuth: - view:products responses: 200: description: All available products. content: application/ld+json: schema: $ref: '#/components/schemas/ProductCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /products/avl/batteries: get: summary: Get all battery products description: Returns all available battery options. security: - ApiKey: - view:products - OAuth: - view:products responses: 200: description: All battery products. content: application/ld+json: schema: $ref: '#/components/schemas/ProductCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /products/avl/inverters: get: summary: Get all inverter products description: Returns all available inverter options. security: - ApiKey: - view:products - OAuth: - view:products responses: 200: description: All inverter products. content: application/ld+json: schema: $ref: '#/components/schemas/ProductCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /products/avl/modules: get: summary: Get all module products description: Returns all available module options. security: - ApiKey: - view:products - OAuth: - view:products responses: 200: description: All module products. content: application/ld+json: schema: $ref: '#/components/schemas/ProductCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /products/avl/racking: get: summary: Get all racking products description: Returns all available racking options. security: - ApiKey: - view:products - OAuth: - view:products responses: 200: description: All racking products. content: application/ld+json: schema: $ref: '#/components/schemas/ProductCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /projects: get: summary: Get all solar installation projects description: Returns all available projects. security: - ApiKey: - view:projects - OAuth: - view:projects responses: 200: description: All projects assigned to your account. content: application/ld+json: schema: $ref: '#/components/schemas/ProjectCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' post: summary: Create a new solar installation project description: |- Creates a new solar installation project from an approved qualification application. **Business Context:** This endpoint converts a qualified customer into an active solar installation project with complete financial terms, equipment specifications, and project management setup. **Prerequisites:** - Must reference an existing, approved qualification application - Customer must have completed ACH authorization (if required) - All financial terms must be finalized and agreed upon **Required Information:** **Customer & Installation Details:** - Customer demographics (from application, but can be updated) - Installation address (where solar system will be installed) - Project team assignment (dealer, installer, sales rep, optional distributor) **Financial Structure:** - Agreement type (`ppa`, `lease`, or `loan`) with type-specific terms - Total contract value and amount being financed - Down payment and payment structure - Interest rates, escalators, and fee structures **Project Details:** - Product type (solar only, solar + storage, etc.) - Optional proposal information and external references - Equipment add-ons and customizations **Agreement Type Requirements:** **Loan Projects:** Must include `introductoryTerm`, `introductoryPayment`, `dealerFee`, `interestRate` **PPA Projects:** Must include `contractRate`, `escalator` **Lease Projects:** Similar to PPA's with different rate structures **After Creation:** - Project starts in `new` status - Initial milestone tracking begins - Project team is notified to begin work - Customer contracts and agreements are prepared security: - ApiKey: - create:projects - OAuth: - create:projects requestBody: content: application/ld+json: schema: $ref: "#/components/schemas/ProjectCreate" responses: 201: description: The project was created successfully. content: application/ld+json: schema: $ref: '#/components/schemas/Project' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /projects/{projectId}: parameters: - name: projectId description: The unique reference identifier of the project. in: path required: true schema: type: string format: uuid get: summary: Get a solar installation project description: Returns all available information about a single project. security: - ApiKey: - view:projects - OAuth: - view:projects responses: 200: description: The requested project. content: application/ld+json: schema: $ref: '#/components/schemas/Project' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested resource was not found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' patch: summary: Update a solar installation project description: |- Updates specific fields of an existing solar installation project. **Business Context:** Use this endpoint to modify project details such as financial terms, team assignments, or project specifications without requiring a full project recreation. **What Can Be Updated:** **Financial Terms:** - Agreement type and product type - Contract values and financing amounts - Interest rates, escalators, and payment terms - Down payment and term length **Team Assignments:** - Sales representative assignment (userId/user) - Dealer assignment (dealerId/dealer) - Installer assignment (installerId/installer) **Project Details:** - Proposal information and external references - Project timeline and dates **Business Rules:** - Projects in certain statuses may have restricted update permissions - Team changes may trigger workflow notifications - Financial changes may require additional approvals - Projects must be in "new" status to allow major updates - If a project is already "in_progress" or later, consider creating a new design instead **Common Use Cases:** - Updating pricing based on final equipment selection - Reassigning projects to different team members - Correcting proposal information or external references - Adjusting payment terms after customer negotiation security: - ApiKey: - update:projects - OAuth: - update:projects requestBody: content: application/merge-patch+json: schema: $ref: "#/components/schemas/ProjectUpdate" responses: 200: description: The updated project. content: application/ld+json: schema: $ref: '#/components/schemas/Project' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested project could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /projects/{projectId}/action-items: parameters: - name: projectId description: The unique reference identifier of the project. in: path required: true schema: type: string format: uuid get: summary: Get a project's action items description: Returns all the current project action items. security: - ApiKey: - view:action::items - OAuth: - view:action::items responses: 200: description: The project action items. content: application/ld+json: schema: $ref: '#/components/schemas/ActionItemCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested application could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /projects/{projectId}/adders: parameters: - name: projectId description: The unique reference identifier of the project. in: path required: true schema: type: string format: uuid get: summary: Get project adders description: |- Retrieves all adders associated with a specific project. **Business Context:** Adders represent additional upgrades, equipment, or work items beyond the base solar installation. Use this endpoint to get complete details about all adders assigned to a project, including pricing, specifications, and reference information. **Common Adder Types:** - **Electrical Upgrades**: Panel upgrades, sub-panels, electrical work - **Structural Work**: Roof repairs, reinforcement, re-roofing - **Additional Equipment**: EV chargers, energy storage, monitoring systems - **Site Preparation**: Tree removal, trenching, access improvements - **Permits and Fees**: Additional permit costs, utility fees **Response Information:** - Complete adder details (name, reference ID, subtotal) - Pricing and cost breakdown - Integration context and relationships - Project association and scope **Common Use Cases:** - Displaying project cost breakdown in interfaces - Cost analysis and pricing calculations - Integration with billing and invoicing systems - Project estimation and proposal generation - Tracking project scope and add-on items security: - ApiKey: - view:projects - OAuth: - view:projects responses: 200: description: All adders for the project. content: application/ld+json: schema: $ref: '#/components/schemas/AdderCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested project could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /projects/{projectId}/attachments: parameters: - name: projectId description: The unique reference identifier of the project. in: path required: true schema: type: string format: uuid get: summary: Get a project's attachments description: Returns all the current project attachments. security: - ApiKey: - view:attachments - OAuth: - view:attachments responses: 200: description: The project attachments. content: application/ld+json: schema: $ref: '#/components/schemas/AttachmentCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested application could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' post: summary: Upload project documents and attachments description: | Uploads new documents, photos, or files to a solar installation project. **Business Context:** Use this endpoint to add important project documentation at any stage of the installation lifecycle. Proper document management is critical for compliance, quality assurance, and successful project completion. **Upload Process:** 1. Prepare files with appropriate names and types 2. Categorize each file with the correct attachment type 3. Upload multiple files in a single request 4. Files are automatically processed and organized **File Requirements:** - **Maximum Size**: 10MB per file - **Supported Formats**: JPG, PNG, PDF, DOCX - **Naming**: Descriptive filenames help with organization **Required for Each File:** - `name`: Descriptive name for the document - `type`: Categorization using AttachmentType enum - `file`: The binary file data **When to Upload Documents:** **Project Initiation:** - Signed contracts and agreements - Initial site photos and surveys - Customer identification and property documents **Design & Permitting:** - Final system designs and layouts - Permit applications and approvals - Engineering calculations and reports **Installation Phase:** - Equipment delivery photos and receipts - Installation progress documentation - Safety inspection photos **Completion & Testing:** - Final installation photos - System testing and commissioning results - Inspection certificates and approvals **Post-Installation:** - Utility PTO documentation - System monitoring setup proof - Customer handover materials **Best Practices:** - Upload documents promptly to maintain project timeline - Use clear, descriptive names for easy identification - Organize files by milestone or project phase - Include date information in filenames when relevant - Verify file completeness before milestone approvals **Automation Integration:** Many document types can be automatically generated and uploaded through integrations with design platforms, inspection tools, and utility systems. security: - ApiKey: - create:attachments - OAuth: - create:attachments requestBody: content: multipart/form-data: schema: $ref: "#/components/schemas/AttachmentCreate" responses: 201: description: The attachment was created successfully. content: application/ld+json: schema: $ref: '#/components/schemas/AttachmentCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested application could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /projects/{projectId}/comments: parameters: - name: projectId description: The unique reference identifier of the project. in: path required: true schema: type: string format: uuid get: summary: Get a project's comments description: Returns all the current project comments. security: - ApiKey: - view:comments - OAuth: - view:comments responses: 200: description: The project comments. content: application/ld+json: schema: $ref: '#/components/schemas/CommentCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested application could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' post: summary: Create a new comment for a project description: |- Creates a new comment for the specified solar installation project. **Business Context:** Comments provide a communication channel for project stakeholders including customers, sales representatives, installers, dealers, and project managers to discuss project progress, coordinate activities, and document important information. **Common Use Cases:** - Customer feedback and requests - Installation progress updates - Design change discussions - Issue reporting and resolution - Milestone completion notes - Communication between project team members **After Creation:** - Comment is immediately visible to all users with access to the project - Comment creation is logged in the project's activity timeline - Relevant stakeholders may receive notifications (depending on system configuration) - Comments contribute to the project's communication audit trail security: - ApiKey: - create:comments - OAuth: - create:comments requestBody: content: application/ld+json: schema: $ref: "#/components/schemas/CommentCreate" responses: 201: description: The comment was created successfully. content: application/ld+json: schema: $ref: '#/components/schemas/Comment' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested project could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /projects/{projectId}/designs: parameters: - name: projectId description: The unique reference identifier of the project. in: path required: true schema: type: string format: uuid get: summary: Get a project's solar system designs description: |- Retrieves all solar system designs associated with a specific project. **Business Context:** Projects typically have multiple design iterations as the solar system layout is refined through engineering review, customer feedback, and optimization processes. **Design Types:** - **Primary Design**: The active design used for financing and installation - **Secondary Designs**: Alternative layouts, revisions, or archived versions **Common Use Cases:** - Review design iteration history - Compare different layout options - Access equipment specifications for procurement - Generate customer presentation materials - Track design approval status **Response Information:** - Design specifications (size, production, shading analysis) - Equipment details (modules, inverters, racking, storage) - Design source and creation metadata - Primary/secondary design status security: - ApiKey: - view:designs - OAuth: - view:designs responses: 200: description: The project designs. content: application/ld+json: schema: $ref: '#/components/schemas/DesignCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested project could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /projects/{projectId}/designs/primary: parameters: - name: projectId description: The unique reference identifier of the project. in: path required: true schema: type: string format: uuid get: summary: Get the primary solar system design for a project description: |- Retrieves the primary (active) solar system design for a project. **Business Context:** Each project has one primary design that serves as the official system specification for financing, installation, and customer documentation. The primary design is the "source of truth" for all project calculations. **Primary Design Purpose:** - **Financing Calculations**: Used for loan sizing and payment calculations - **Customer Proposals**: Appears in all customer-facing documents - **Installation Planning**: Equipment procurement and installation specs - **Performance Monitoring**: Baseline for system performance tracking - **Utility Applications**: Submitted for interconnection approvals **Primary Design Rules:** - Only one design per project can be primary at any time - If no primary design exists, returns 404 - Primary status is automatically managed when designs are created/updated - Primary design changes may trigger financial recalculations **When Primary Design Changes:** - New design created with `isPrimary=true` - Existing design updated with `isPrimary=true` - Previous primary automatically becomes secondary **Response Information:** - Complete design specifications and performance data - All equipment details (modules, inverters, racking, storage) - System sizing and energy production estimates - Design source and creation metadata **Common Use Cases:** - Generate customer proposals and contracts - Calculate financing terms and payments - Prepare equipment procurement orders - Submit utility interconnection applications - Set up performance monitoring systems - Validate system specifications before installation **Integration Patterns:** - **Proposal Generation**: Fetch primary design for customer documents - **Financial Calculations**: Use primary design for loan calculations - **Equipment Ordering**: Source procurement specs from primary design - **Monitoring Setup**: Configure performance tracking from primary specs security: - ApiKey: - view:designs - OAuth: - view:designs responses: 200: description: The primary design for the project. content: application/ld+json: schema: $ref: '#/components/schemas/Design' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested project could not be found or has no primary design. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /projects/{projectId}/external-identifiers: parameters: - name: projectId description: The unique reference identifier of the project. in: path required: true schema: type: string format: uuid get: summary: Get external identifiers for a project description: |- Retrieves all external identifiers associated with a project. **Business Context:** External identifiers allow Elios Fund projects to be linked with records in external systems, enabling seamless data synchronization and cross-platform integrations. Each project can have multiple external identifiers for different systems and purposes. **External Identifier Purpose:** - **CRM Integration**: Link projects with CRM system records - **ERP Systems**: Connect with enterprise resource planning platforms - **Solar Design Tools**: Associate with design software project IDs - **Utility Systems**: Map to utility company tracking numbers - **Partner Platforms**: Reference partner system project identifiers - **Third-party APIs**: Enable integration with external service providers **External Identifier Structure:** - **Key**: Identifies the external system or purpose (e.g., "salesforce_id", "sunobi_project") - **Value**: The actual identifier used in the external system - **Source**: How the identifier was created (API, manual entry, import) **Common External Identifier Keys:** - `salesforce_id`: Salesforce CRM project record ID - `sunobi_project`: Sunobi design platform project identifier - `utility_application`: Utility interconnection application number - `partner_system_id`: Partner's internal project tracking ID - `legacy_project_id`: Previous system project identifier for migrations **Response Information:** - Complete list of all external identifiers for the project - Key-value pairs showing external system mappings - Creation source and timestamps for audit trails - Reference IDs for API operations **Integration Patterns:** - **Data Synchronization**: Use external IDs to sync project data across systems - **Webhook Processing**: Match incoming webhook data using external identifiers - **Migration Support**: Maintain references to legacy system identifiers - **Partner Integration**: Enable partners to reference their own project IDs - **Cross-system Lookup**: Find Elios projects using external system identifiers **Use Cases:** - Sync project status updates from partner systems - Match utility interconnection applications with projects - Maintain cross-references during data migrations - Enable partner platforms to reference Elios projects - Link with design tools and equipment procurement systems security: - ApiKey: - view:projects - OAuth: - view:projects responses: 200: description: A collection of external identifiers for the project. content: application/ld+json: schema: $ref: '#/components/schemas/ExternalIdentifierCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested project could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' post: summary: Create or update an external identifier for a project description: |- Creates a new external identifier for a project or updates an existing one if the key matches. This endpoint implements upsert behavior based on the external identifier key. **Business Context:** External identifiers enable Elios Fund projects to maintain references to records in external systems. This endpoint allows API consumers to establish or update these cross-system links programmatically. **Upsert Behavior:** - **New Key**: Creates a new external identifier with the provided key-value pair - **Existing Key**: Updates the existing identifier's value for the matching key - **Key Matching**: Exact string match on the external identifier key field - **Atomic Operation**: Update or create happens in a single database transaction **Request Structure:** The request body must contain an `externalId` object with: - **key**: String identifier for the external system (e.g., "salesforce_id") - **value**: The actual external identifier value (e.g., "SF001234") **Common Use Cases:** - **CRM Integration**: Store Salesforce or HubSpot project record IDs - **Design Tool Sync**: Link with Sunobi, Scanifly, or Aurora project IDs - **Utility Integration**: Store utility application or interconnection numbers - **Partner System Links**: Reference partner's internal project identifiers - **Migration Support**: Maintain legacy system project references - **Webhook Processing**: Store external system IDs from incoming webhooks **Example External Identifier Keys:** - `salesforce_project_id`: CRM project record identifier - `sunobi_project_uuid`: Solar design platform project ID - `utility_app_number`: Utility interconnection application number - `partner_ref_id`: Partner system's project reference - `legacy_system_id`: Previous platform project identifier **Response Information:** - Complete external identifier record including generated reference ID - Confirmation of key-value pair storage - Creation/update timestamps for audit purposes - Source attribution showing API creation **Integration Patterns:** - **Webhook Handlers**: Store external IDs from incoming webhook payloads - **Data Sync Jobs**: Maintain cross-system references during sync operations - **Migration Scripts**: Preserve legacy system identifiers during platform migrations - **Partner Integrations**: Allow partners to maintain their own project references - **External API Calls**: Store response IDs from external system API calls security: - ApiKey: - update:projects - OAuth: - update:projects requestBody: required: true content: application/ld+json: schema: $ref: "#/components/schemas/ExternalIdentifierCreate" examples: crm_integration: summary: CRM System Integration description: Link project with Salesforce CRM record value: externalId: key: "salesforce_project_id" value: "SF001234567" design_tool: summary: Solar Design Platform description: Connect with Sunobi design project value: externalId: key: "sunobi_project_uuid" value: "proj_abc123def456" partner_system: summary: Partner Integration description: Store partner's internal project reference value: externalId: key: "partner_project_ref" value: "PART-2024-001" responses: 201: description: The external identifier was created successfully. content: application/ld+json: schema: $ref: '#/components/schemas/ExternalIdentifier' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested project could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: Validation error in request data. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /projects/{projectId}/pricing: parameters: - name: projectId description: The unique reference identifier of the project. in: path required: true schema: type: string format: uuid get: summary: Get project pricing over contract term description: |- Retrieves the customer pricing over the full contract term for a specific project. **Business Context:** This endpoint provides comprehensive pricing information for the entire duration of a solar financing contract, typically 25 years. The pricing data includes photovoltaic (PV) and energy storage production values, electricity rates, and payment calculations for each year of the contract. **Pricing Structure:** - **PV Production**: Annual kilowatt-hour (kWh) generation from solar panels - **Storage Production**: Annual kWh generation from battery storage systems - **Electricity Rates**: Rate per kWh for each contract year - **Payment Calculations**: Monthly and annual payment amounts **Use Cases:** - Contract review and customer communication - Financial analysis and payment projections - Performance tracking over contract duration - Payment schedule planning and budgeting - Customer service and account management **Response Information:** - Collection of pricing data for each year (1-25) of the contract - Production forecasts accounting for system degradation - Escalating electricity rates based on market projections - Calculated payment amounts reflecting financing terms **Integration Patterns:** - **Customer Portals**: Display long-term savings projections - **Payment Processing**: Reference for billing calculations - **Performance Monitoring**: Compare actual vs. projected production - **Contract Management**: Support contract amendments and reviews security: - ApiKey: - view:projects - OAuth: - view:projects responses: 200: description: A collection of pricing data for each year of the contract term. content: application/ld+json: schema: $ref: '#/components/schemas/SystemPricingFactorYearCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested project could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /projects/{projectId}/pricing/{year}: parameters: - name: projectId description: The unique reference identifier of the project. in: path required: true schema: type: string format: uuid - name: year description: The contract year (1-25) for which to retrieve pricing data. in: path required: true schema: type: integer minimum: 1 maximum: 25 example: 1 get: summary: Get project pricing for specific year description: |- Retrieves the customer pricing for a specific year of the contract term. **Business Context:** This endpoint provides detailed pricing information for a single year within a solar financing contract. This is useful for year-over-year analysis, payment verification, and specific year calculations. **Pricing Details for Year:** - **PV Production**: Expected kWh generation from solar panels for the year - **Storage Production**: Expected kWh generation from battery storage for the year - **Electricity Rate**: Rate per kWh applicable for the specific year - **Monthly Payment**: Fixed monthly payment amount for the year - **Annual Payment**: Total payment amount for the full year **Year Calculation:** - Year 1 represents the first year of the contract after installation - Production values account for system degradation over time - Electricity rates typically escalate annually based on market projections - Payment amounts may vary based on contract structure **Use Cases:** - Annual payment verification and customer inquiries - Year-over-year performance analysis - Budget planning for specific contract years - Customer service support for billing questions - Financial analysis and reporting **Response Information:** - Single pricing record for the requested contract year - Production forecasts specific to that year - Applicable electricity rate for the year - Calculated payment amounts for monthly and annual periods security: - ApiKey: - view:projects - OAuth: - view:projects responses: 200: description: Pricing data for the requested contract year. content: application/ld+json: schema: $ref: '#/components/schemas/SystemPricingFactorYear' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested project or year could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /users: get: summary: Get all users description: |- Retrieves all users associated with your partner account. **Business Context:** Users represent sales representatives, project managers, and other team members who are involved in the solar financing and installation process. This endpoint provides access to user information for team management, assignment, and communication. **Use Cases:** - Team member selection for application and project assignment - User management and directory services - Communication and contact information lookup - Reporting and analytics on team performance - Integration with CRM and project management systems **Response Information:** - User profile details (name, email, phone, role) **Filtering and Organization:** Users are automatically filtered by your partner account access. Results include only users from your organization and associated teams. security: - ApiKey: - view:users - OAuth: - view:users responses: 200: description: All users assigned to your account. content: application/ld+json: schema: $ref: '#/components/schemas/UserCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /users/{userId}: parameters: - name: userId description: The unique reference identifier of the user. in: path required: true schema: type: string format: uuid get: summary: Get a specific user description: |- Retrieves detailed information about a specific user by their unique identifier. **Business Context:** Use this endpoint to get complete details about a specific team member, including their contact information, role assignments, and current status. **Response Information:** - Complete user profile (name, email, phone, role) **Common Use Cases:** - Displaying user details in team management interfaces - Retrieving contact information for communication - Checking user availability for project assignments - Accessing user data for reporting and analytics - User profile management and updates security: - ApiKey: - view:users - OAuth: - view:users responses: 200: description: The requested user. content: application/ld+json: schema: $ref: '#/components/schemas/User' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested user could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /webhooks: get: summary: Get all webhooks description: |- Retrieves a paginated list of all webhook configurations associated with your partner account. **Business Context:** Webhooks enable real-time event notifications for critical business events in the solar financing workflow. This endpoint provides a comprehensive overview of all configured integrations and their current status. **Webhook Overview:** Webhooks are HTTP callbacks that automatically notify your systems when important events occur in the Elios Fund platform, enabling seamless integration and workflow automation. **Event Categories:** - **Application Events**: Customer qualification status changes - **Project Events**: Solar project lifecycle updates - **User Events**: Account and profile modifications - **Status Changes**: Phase transitions and approval workflows **Response Information:** - **Configuration Details**: Endpoint URLs, HTTP methods, and event filters - **Status Information**: Enabled/disabled state and delivery health - **Security Settings**: Authentication and SSL configuration overview - **Metadata**: Creation dates, descriptions, and partner assignments - **Event Subscriptions**: Which events each webhook is listening for **Common Use Cases:** - **Integration Audit**: Review all configured webhook endpoints - **Health Monitoring**: Check status of all webhook integrations - **Configuration Management**: Backup and document webhook settings - **Troubleshooting**: Identify webhooks that may be causing issues - **Onboarding**: Understand existing integrations during system setup **Webhook Management Workflow:** 1. **Discovery**: Use this endpoint to see all current webhooks 2. **Configuration**: Create new webhooks for additional integrations 3. **Monitoring**: Regularly check webhook status and delivery success 4. **Maintenance**: Update or disable webhooks as systems evolve **Integration Patterns:** - **Event-Driven Architecture**: Webhooks trigger downstream processing - **Real-Time Sync**: Keep external systems updated with Elios data - **Workflow Automation**: Trigger business processes on status changes - **Notification Systems**: Alert teams of important events - **Data Pipeline**: Feed events into analytics and reporting systems **Filtering and Monitoring:** - All webhooks are scoped to your partner account automatically - Includes both active and disabled webhook configurations - Results are paginated using Hydra collection format - Each webhook shows its event subscription details **Best Practices:** - **Regular Audits**: Review webhook configurations monthly - **Status Monitoring**: Check for disabled or failing webhooks - **Documentation**: Maintain records of webhook purposes and owners - **Testing**: Validate webhook endpoints before production deployment - **Security**: Ensure webhook URLs use HTTPS and proper authentication security: - ApiKey: - manage:webhooks - OAuth: - manage:webhooks responses: 200: description: All webhooks assigned to your account. content: application/ld+json: schema: $ref: '#/components/schemas/WebhookCollection' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' post: summary: Create a new webhook description: |- Creates a new webhook endpoint to receive real-time event notifications from the Elios Fund platform. **Business Context:** Webhooks enable seamless integration between Elios Fund and your business systems by automatically notifying your applications when important events occur. **Integration Benefits:** - **Real-Time Updates**: Immediate notification of status changes - **Automated Workflows**: Trigger business processes on events - **Data Synchronization**: Keep external systems in sync - **Customer Communications**: Enable timely customer notifications - **Business Intelligence**: Feed events into analytics systems **Required Configuration:** - **Endpoint URL**: Your HTTPS endpoint that will receive webhook calls - **HTTP Method**: POST or PUT for webhook delivery method - **Event Subscriptions**: Specific events you want to receive - **Description**: Human-readable description for management **Supported Events:** - **Application Events**: application.approved, application.declined, application.submitted - **Project Events**: project.created, project.updated, project.completed - **User Events**: user.created, user.updated - **Action Item Events**: action_item.created, action_item.completed **Security Options:** - **Webhook Secret**: Shared secret for HMAC signature validation - **SSL Configuration**: Custom CA, client certificates for enhanced security - **Authentication**: Bearer tokens, API keys, or custom headers **Webhook Payload Format:** All webhooks send JSON payloads with event metadata including: - Event type and timestamp - Resource identifiers and current status - Related entity information - Partner context and scope **Best Practices:** - **HTTPS Only**: All webhook URLs must use HTTPS for security - **Idempotency**: Design endpoints to handle duplicate deliveries - **Response Codes**: Return 2xx status codes for successful processing - **Timeouts**: Respond within 10 seconds to avoid retries - **Error Handling**: Log failures and implement retry logic **Webhook Delivery:** - **Retry Logic**: Failed deliveries are retried with exponential backoff - **Status Monitoring**: Track delivery success rates and failures - **Filtering**: Only subscribed events are delivered to each webhook - **Rate Limiting**: Respect webhook endpoint rate limits **Testing Integration:** - **Development**: Test with sandbox events before production - **Validation**: Verify signature validation and payload parsing - **Error Scenarios**: Test failure handling and retry logic - **Load Testing**: Ensure endpoints handle expected event volumes security: - ApiKey: - manage:webhooks - OAuth: - manage:webhooks requestBody: content: application/ld+json: schema: $ref: "#/components/schemas/WebhookCreate" responses: 201: description: The webhook was created successfully. content: application/ld+json: schema: $ref: '#/components/schemas/Webhook' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' /webhooks/{webhookId}: parameters: - name: webhookId description: The unique reference identifier of the webhook. in: path required: true schema: type: string format: uuid get: summary: Get specific webhook details description: |- Retrieves detailed information about a specific webhook configuration. **Business Context:** Individual webhooks contain the complete configuration needed for event notifications, including endpoint URLs, authentication, event filters, and delivery settings. **Webhook Information Includes:** - **Endpoint Configuration**: Target URL and HTTP method - **Event Filters**: Specific events that trigger notifications - **Security Settings**: Authentication and SSL certificate configuration - **Status Information**: Enabled/disabled state and delivery history - **Metadata**: Description, creation date, and partner assignment **Common Use Cases:** - Verify webhook configuration before deployment - Troubleshoot webhook delivery issues - Review event filtering and routing settings - Audit webhook security configurations - Monitor webhook status and performance **Integration Patterns:** - **Configuration Management**: Retrieve settings for backup or migration - **Monitoring**: Check webhook health and delivery status - **Debugging**: Analyze webhook configuration during troubleshooting - **Documentation**: Generate webhook configuration documentation security: - ApiKey: - manage:webhooks - OAuth: - manage:webhooks responses: 200: description: The requested webhook configuration. content: application/ld+json: schema: $ref: '#/components/schemas/Webhook' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested webhook could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' patch: summary: Update a webhook configuration description: |- Updates specific fields of an existing webhook configuration. **Business Context:** Use this endpoint to modify webhook settings such as endpoint URLs, event subscriptions, security configurations, or enable/disable status without requiring webhook recreation. **What Can Be Updated:** **Endpoint Configuration:** - Target URL and HTTP method - Description and documentation - Enable/disable status **Event Subscriptions:** - Add or remove event types - Modify event filtering - Update subscription scope **Security Settings:** - Webhook secret for signature validation - SSL certificate configuration (CA, client certs) - Authentication headers and tokens **Operational Settings:** - Enable or disable webhook delivery - Retry configuration and timeouts - Rate limiting parameters **Business Rules:** - URL changes take effect immediately for new events - Event subscription changes apply to future events only - Disabled webhooks stop receiving all events - Security changes require webhook endpoint updates **Common Use Cases:** - Updating webhook URLs during infrastructure changes - Adding or removing event subscriptions - Enabling/disabling webhooks for maintenance - Updating security secrets during key rotation - Modifying descriptions for better documentation **Impact Assessment:** - **URL Changes**: Test new endpoint before updating - **Event Changes**: Review downstream systems for compatibility - **Security Updates**: Coordinate with webhook endpoint maintainers - **Status Changes**: Monitor integration health after changes **Best Practices:** - **Gradual Updates**: Test changes in development first - **Monitoring**: Watch delivery metrics after configuration changes - **Documentation**: Update integration documentation after changes - **Backup**: Record previous configuration before major updates - **Coordination**: Notify webhook endpoint owners of changes security: - ApiKey: - manage:webhooks - OAuth: - manage:webhooks requestBody: content: application/merge-patch+json: schema: $ref: "#/components/schemas/WebhookUpdate" responses: 200: description: The updated webhook. content: application/ld+json: schema: $ref: '#/components/schemas/Webhook' 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested webhook could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 422: description: There was a validation error with the payload sent. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' delete: summary: Delete a webhook description: |- Permanently removes a webhook from the system, stopping all future event notifications. **Business Context:** Webhook deletion is typically performed when integrations are being decommissioned, endpoints are no longer valid, or webhook configurations need to be completely rebuilt. **Deletion Impact:** - **Immediate Effect**: Webhook stops receiving events immediately - **Permanent Action**: Cannot be undone - webhook must be recreated if needed - **Event History**: Past webhook deliveries remain in logs for audit purposes - **No Notifications**: No events will be sent to the deleted webhook URL **When to Delete Webhooks:** - **Integration Decommission**: Removing old or unused integrations - **Endpoint Changes**: When webhook URLs are permanently changing - **Security Incidents**: Compromised endpoints requiring immediate removal - **Configuration Errors**: Starting over with clean webhook setup - **Partner Offboarding**: Removing webhooks for departed partners **Alternative Actions:** - **Disable Instead**: Use PATCH to set `enabled: false` for temporary suspension - **Update Configuration**: Use PATCH to modify URL, events, or settings - **Event Filtering**: Modify event subscriptions without deletion **Best Practices:** - **Backup Configuration**: Record webhook settings before deletion - **Gradual Migration**: Disable before deleting when migrating endpoints - **Monitor Impact**: Verify downstream systems handle the removal properly - **Documentation**: Update integration documentation after deletion **Common Use Cases:** - Cleaning up test or development webhooks - Removing webhooks for decommissioned services - Resolving webhook delivery failures permanently - Consolidating multiple webhooks into single endpoints - Partner relationship termination cleanup **Integration Cleanup:** After deletion, ensure downstream systems are updated to remove dependencies on webhook notifications from this endpoint. security: - ApiKey: - manage:webhooks - OAuth: - manage:webhooks responses: 204: description: The webhook was successfully deleted. 401: description: There was no API key provided with the request or the API key was invalid. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 403: description: The API key provided does not contain the proper scopes for the current request. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 404: description: The requested webhook could not be found. content: application/ld+json: schema: $ref: '#/components/schemas/Error' 500: description: There was an unexpected server error. content: application/ld+json: schema: $ref: '#/components/schemas/Error' components: schemas: AchAuthorization: type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/AchAuthorization" "@id": $ref: '#/components/schemas/AchAuthorizationIri' "@type": type: string description: The JSON-LD resource type. example: AchAuthorization referenceId: type: string format: uuid description: The unique reference identifier. fullName: type: string description: The customer's full name. email: type: string format: email description: The customer's email address. phoneNumber: type: string format: tel description: The customer's phone number. status: readOnly: true $ref: '#/components/schemas/ApplicationAchStatus' AchAuthorizationCreate: type: object required: - fullName - email - phoneNumber - plaidPublicToken properties: fullName: type: string description: The customer's full name. maxLength: 255 email: type: string format: email description: The customer's email address. maxLength: 255 phoneNumber: type: string format: tel description: The customer's phone number. plaidPublicToken: type: string description: The Plaid public token. maxLength: 255 AchAuthorizationIri: description: The unique JSON-LD IRI reference to the ACH authorization. type: string format: iri-reference example: '/ach-authorizations/550e8400-e29b-41d4-a716-446655440001' ActionItem: type: object properties: "@id": $ref: '#/components/schemas/ActionItemIri' "@type": type: string description: The JSON-LD resource type. example: ActionItem referenceId: type: string format: uuid description: The unique reference identifier. title: type: string description: The action item title. description: type: string description: The action item description. priority: description: The action item priority level. type: string enum: - low - medium - high - critical status: description: The action item status. type: string enum: - open - in_review - needs_corrections - hold - complete dueAt: description: The action item due date. type: string format: date-time createdAt: description: The creation timestamp. type: string format: date-time updatedAt: description: The last update timestamp. type: string format: date-time actionable: description: The resource that this action item is about. type: object properties: "@id": type: string format: iri-reference description: The JSON-LD IRI reference to the actionable resource. example: "/projects/550e8400-e29b-41d4-a716-446655440017" "@type": type: string description: The JSON-LD resource type of the actionable resource. enum: - Project - Application - Customer - Dealer - Installer - Partner example: "Project" required: - "@id" - "@type" attachments: type: array items: $ref: '#/components/schemas/AttachmentIri' comments: type: array items: $ref: '#/components/schemas/CommentIri' ActionItemCollection: type: object allOf: - $ref: '#/components/schemas/HydraCollectionMetadata' - type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/ActionItem" "@id": example: "/action-items" totalItems: type: integer description: The total number of action items. example: 5 member: type: array description: A list of action items. items: $ref: '#/components/schemas/ActionItem' view: allOf: - $ref: '#/components/schemas/HydraView' - type: object properties: "@id": description: The identifier of the paginated view. example: "/action-items?page=1" first: description: The first page of the collection. example: "/action-items?page=1" last: description: The last page of the collection. example: "/action-items?page=5" next: description: The next page of the collection (if available). example: "/action-items?page=2" ActionItemIri: description: The unique JSON-LD IRI reference to the action item. type: string format: iri-reference example: '/action-items/550e8400-e29b-41d4-a716-446655440002' Adder: type: object properties: "@id": $ref: '#/components/schemas/AdderIri' "@type": type: string description: The JSON-LD resource type. example: Adder referenceId: type: string format: uuid description: The unique reference ID for this resource. name: type: string description: The adder name. quantity: type: integer description: The adder quantity. subtotal: type: number format: float description: The adder subtotal. AdderCollection: type: object allOf: - $ref: '#/components/schemas/HydraCollectionMetadata' - type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/Adder" "@id": example: "/adders" totalItems: type: integer description: The total number of adders. example: 3 member: type: array description: A list of adders. items: $ref: '#/components/schemas/Adder' view: allOf: - $ref: '#/components/schemas/HydraView' - type: object properties: "@id": description: The identifier of the paginated view. example: "/adders?page=1" first: description: The first page of the collection. example: "/adders?page=1" last: description: The last page of the collection. example: "/adders?page=2" next: description: The next page of the collection (if available). example: "/adders?page=2" AdderCreate: type: object description: Schema for creating a new project adder required: - projectId - name - quantity - subtotal properties: projectId: type: string format: uuid description: The unique reference ID of the project this adder belongs to. example: "550e8400-e29b-41d4-a716-446655440000" name: type: string description: The adder name or description. maxLength: 255 example: "Electrical Panel Upgrade" quantity: type: integer description: The adder quantity. minimum: 1 example: 1 subtotal: type: number format: float description: The adder total cost. example: 4145.96 additionalProperties: false AdderIri: description: The unique JSON-LD IRI reference to the adder. type: string format: iri-reference example: '/adders/550e8400-e29b-41d4-a716-446655440003' AdderUpdate: type: object description: Schema for updating an existing adder properties: name: type: string description: The adder name or description. maxLength: 255 example: "Electrical Panel Upgrade" quantity: type: integer description: The adder quantity. minimum: 1 example: 1 subtotal: type: number format: float description: The adder total cost. example: 4145.96 additionalProperties: false Address: type: object properties: "@id": $ref: '#/components/schemas/AddressIri' "@type": type: string description: The JSON-LD resource type. example: Address referenceId: type: string format: uuid description: The unique reference ID for this resource. street: type: string description: The street address. streetExtra: type: string description: Additional street address information. city: type: string description: The city name. state: type: string description: The state or province. postCode: type: number description: The postal code. address: description: A formatted address string. type: string lat: description: The address latitude coordinate. type: number lng: description: The address longitude coordinates. type: number AddressCreate: type: object required: - streetNumber - streetName - city - state - postCode - country properties: streetNumber: type: string description: The street number. streetName: type: string description: The street name. maxLength: 255 city: type: string description: The city name. maxLength: 60 minLength: 3 state: type: string description: The state abbreviation. maxLength: 2 minLength: 2 postCode: type: number description: The postal code. minimum: 5 maximum: 5 country: type: string description: The country code. default: USA maxLength: 3 minLength: 3 AddressIri: description: The unique JSON-LD IRI reference to the address. type: string format: iri-reference example: '/addresses/550e8400-e29b-41d4-a716-446655440004' Application: type: object allOf: - $ref: '#/components/schemas/ApplicationDetails' properties: "@context": type: string description: The JSON-LD context. example: "/contexts/Application" "@id": $ref: '#/components/schemas/ApplicationIri' "@type": type: string description: The JSON-LD resource type. example: Application referenceId: type: string format: uuid description: The unique reference ID for this resource. primaryApplicant: $ref: '#/components/schemas/ApplicationApplicant' coApplicant: $ref: '#/components/schemas/ApplicationApplicant' creditReportTier: description: The highest credit report tier between both applicants. type: string enum: - declined - diamond - platinum - gold - silver - bronze - mercury status: $ref: '#/components/schemas/ApplicationStatus' team: type: object description: The team handling the proposed project. properties: dealer: description: The dealer handling the application. $ref: '#/components/schemas/Dealer' installer: description: The installer handling the application. $ref: '#/components/schemas/Installer' user: description: The sales rep handling the application. $ref: '#/components/schemas/SalesRep' externalIdentifiers: type: array description: External identifiers for the application. items: $ref: '#/components/schemas/ExternalIdentifier' ApplicationAch: type: object properties: "@id": $ref: '#/components/schemas/ApplicationIri' "@type": type: string description: The JSON-LD resource type. example: Application referenceId: type: string format: uuid description: The unique reference ID for this resource. achAuthorizationStatus: $ref: '#/components/schemas/ApplicationAchStatus' achAuthorizationUrl: type: string format: uri description: The ACH authorization URL. plaidLinkToken: type: string description: The Plaid Link token. achAuthorizationConsentHtml: type: string description: The ACH authorization consent in HTML format. achAuthorizationConsentMarkdown: type: string description: The ACH authorization consent in markdown format. ApplicationAchStatus: description: The ACH authorization status. type: string enum: - complete - incomplete ApplicationAddress: type: object properties: streetNumber: type: string format: numeric description: The street number. streetName: type: string description: The street name. maxLength: 255 city: type: string description: The city name. minLength: 3 maxLength: 60 state: type: string description: The state abbreviation. minLength: 2 maxLength: 2 postCode: type: number description: The postal code. minimum: 5 maximum: 5 country: type: string format: numeric description: The country code. minLength: 3 maxLength: 3 ApplicationAgreementType: description: The type of agreement being used. type: string enum: - ppa - lease - loan ApplicationApplicant: description: Complete demographic and contact information for an applicant. type: object required: - firstName - lastName - email - dateOfBirth - ssn - mobilePhone - currentAddress properties: firstName: description: The applicant's first name. type: string maxLength: 255 example: "John" middleName: description: The applicant's middle name. type: string maxLength: 255 nullable: true example: "Michael" lastName: description: The applicant's last name. type: string maxLength: 255 example: "Smith" email: description: The applicant's email address. type: string format: email maxLength: 255 example: "john.smith@email.com" dateOfBirth: description: The applicant's date of birth. type: string format: date example: "1985-06-15" ssn: description: The applicant's last four of their social secutiy number. type: string minLength: 4 maxLength: 4 example: "1234" writeOnly: true mobilePhone: description: The applicant's mobile phone number. type: string pattern: '^\d{10}$' minLength: 10 maxLength: 10 example: "5551234567" homePhone: description: The applicant's home phone number. type: string pattern: '^\d{10}$' minLength: 10 maxLength: 10 nullable: true example: "5559876543" currentAddress: description: The applicant's current residential address. $ref: '#/components/schemas/ApplicationAddress' previousAddress: description: The applicant's previous residential address. $ref: '#/components/schemas/ApplicationAddress' nullable: true ApplicationCollection: type: object allOf: - $ref: '#/components/schemas/HydraCollectionMetadata' - type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/Application" "@id": example: "/applications" totalItems: type: integer description: The total number of qualification applications. example: 5 member: type: array description: A list of qualification applications. items: $ref: '#/components/schemas/Application' view: allOf: - $ref: '#/components/schemas/HydraView' - type: object properties: "@id": description: The identifier of the paginated view. example: "/applications?page=1" first: description: The first page of the collection. example: "/applications?page=1" last: description: The last page of the collection. example: "/applications?page=5" next: description: The next page of the collection (if available). example: "/applications?page=2" ApplicationCreate: type: object description: Schema for creating a new solar financing qualification application. allOf: - $ref: '#/components/schemas/ApplicationDetails' - type: object required: - primaryApplicant - agreementType - productType - consent1 - consent2 - consent3 properties: primaryApplicant: $ref: "#/components/schemas/ApplicationApplicant" description: Primary applicant information for the solar financing. coApplicant: $ref: "#/components/schemas/ApplicationApplicant" description: Optional co-applicant for joint applications. nullable: true dealer: description: Create a new dealer record for this application. allOf: - $ref: "#/components/schemas/DealerCreate" nullable: true dealerId: description: Reference to an existing dealer by ID. type: string format: uuid nullable: true example: "550e8400-e29b-41d4-a716-446655440021" installer: description: Create a new installer record for this application. allOf: - $ref: "#/components/schemas/InstallerCreate" nullable: true installerId: description: Reference to an existing installer by ID. type: string format: uuid nullable: true example: "550e8400-e29b-41d4-a716-446655440022" user: description: Create a new sales representative record for this application. allOf: - $ref: "#/components/schemas/UserCreate" nullable: true userId: description: Reference to an existing sales representative by ID. type: integer minimum: 1 nullable: true example: "550e8400-e29b-41d4-a716-446655440026" consent1: description: Customer consent for credit report authorization. type: boolean enum: [true] consent2: description: Customer consent for terms and conditions. type: boolean enum: [true] consent3: description: Customer consent for marketing communications. type: boolean enum: [true] externalId: description: Optional external identifiers for integration with your systems. type: array items: $ref: "#/components/schemas/ExternalIdentifierCreate" example: - key: "crm_lead_id" value: "LEAD-12345" - key: "proposal_number" value: "PROP-2024-001" example: agreementType: "ppa" productType: "solar_storage" primaryApplicant: firstName: "John" lastName: "Smith" email: "john.smith@email.com" dateOfBirth: "1985-06-15" ssn: "1234" mobilePhone: "5551234567" currentAddress: streetNumber: "123" streetName: "Main Street" city: "Phoenix" state: "AZ" postCode: "85001" country: "USA" dealerId: "550e8400-e29b-41d4-a716-446655440021" installerId: "550e8400-e29b-41d4-a716-446655440022" userId: "550e8400-e29b-41d4-a716-446655440035" consent1: true consent2: true consent3: true ApplicationDetails: type: object properties: referenceId: description: An optional application reference ID such as the proposal ID. type: string nullable: true agreementType: $ref: '#/components/schemas/ApplicationAgreementType' productType: $ref: '#/components/schemas/ApplicationProductType' ApplicationIri: description: The unique JSON-LD IRI reference to the qualification application. type: string format: iri-reference example: '/applications/550e8400-e29b-41d4-a716-446655440005' ApplicationOpen: type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/Application" "@id": $ref: '#/components/schemas/ApplicationIri' "@type": type: string description: The JSON-LD resource type. example: Application referenceId: type: string format: uuid description: The unique reference ID for this resource. status: $ref: "#/components/schemas/ApplicationStatus" default: open ApplicationProductType: description: The type of product the customer is receiving. type: string enum: - solar - solar_storage - solar_storage_other - solar_other - storage ApplicationQualify: type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/Application" "@id": $ref: '#/components/schemas/ApplicationIri' "@type": type: string description: The JSON-LD resource type. example: Application referenceId: type: string format: uuid description: The unique reference ID for this resource. status: $ref: "#/components/schemas/ApplicationStatus" default: in_progress ApplicationStatus: description: The customer qualification application status. type: string enum: - open - in_progress - submitted - approved - declined - none - onhold - cancelled ApplicationSubmit: type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/Application" "@id": $ref: '#/components/schemas/ApplicationIri' "@type": type: string description: The JSON-LD resource type. example: Application referenceId: type: string format: uuid description: The unique reference ID for this resource. status: $ref: "#/components/schemas/ApplicationStatus" ApplicationUpdate: type: object description: Schema for updating an existing application. properties: primaryApplicant: type: object description: Primary applicant information. properties: firstName: description: The first name. type: string maxLength: 255 middleName: description: The middle name. type: string maxLength: 255 nullable: true lastName: description: The last name. type: string maxLength: 255 email: description: The email address. type: string format: email maxLength: 255 dateOfBirth: description: The date of birth. type: string format: date ssn: description: The last 4 digits of SSN. type: string pattern: '^\d{4}$' mobilePhone: description: The mobile phone number. type: string pattern: '^\d{10}$' minLength: 10 maxLength: 10 homePhone: description: The home phone number. type: string pattern: '^\d{10}$' minLength: 10 maxLength: 10 nullable: true currentAddress: type: object description: The current residential address. properties: streetNumber: description: The street number. type: number streetName: description: The street name. type: string maxLength: 255 city: description: The city name. type: string minLength: 3 maxLength: 60 state: description: The state abbreviation. type: string minLength: 2 maxLength: 2 postCode: description: The ZIP code. type: string pattern: '^\d{5}$' country: description: The country code. type: string minLength: 3 maxLength: 3 coApplicant: type: object description: Co-applicant information. nullable: true properties: firstName: description: Co-applicant first name. type: string maxLength: 255 nullable: true middleName: description: Co-applicant middle name. type: string maxLength: 255 nullable: true lastName: description: Co-applicant last name. type: string maxLength: 255 email: description: Co-applicant email address. type: string format: email maxLength: 255 dateOfBirth: description: Co-applicant date of birth. type: string format: date ssn: description: Co-applicant last 4 digits of SSN. type: string pattern: '^\d{4}$' mobilePhone: description: Co-applicant mobile phone number (10 digits only). type: string pattern: '^\d{10}$' minLength: 10 maxLength: 10 homePhone: description: Co-applicant home phone number (10 digits only). type: string pattern: '^\d{10}$' minLength: 10 maxLength: 10 nullable: true currentAddress: type: object description: Co-applicant current residential address. properties: streetNumber: description: Street number. type: number streetName: description: Street name. type: string maxLength: 255 city: description: City name. type: string minLength: 3 maxLength: 60 state: description: State abbreviation (2 characters). type: string minLength: 2 maxLength: 2 postCode: description: ZIP code (5 digits). type: string pattern: '^\d{5}$' country: description: Country code (3 characters). type: string minLength: 3 maxLength: 3 referenceId: description: Partner reference identifier for the application. type: string nullable: true agreementType: $ref: '#/components/schemas/ApplicationAgreementType' productType: $ref: '#/components/schemas/ApplicationProductType' userId: description: Existing user ID to assign as sales representative. type: integer user: type: object description: New user information for sales representative assignment. properties: firstName: description: Sales representative first name. type: string maxLength: 255 lastName: description: Sales representative last name. type: string maxLength: 255 email: description: Sales representative email address. type: string format: email maxLength: 255 externalId: type: array description: External identifiers for the user. nullable: true items: type: object properties: key: description: External identifier key. type: string value: description: External identifier value. type: string dealerId: description: Existing dealer ID to assign to this application. type: integer dealer: type: object description: New dealer information for assignment. properties: name: description: Dealer company name. type: string maxLength: 255 email: description: Dealer email address. type: string format: email maxLength: 255 externalId: type: array description: External identifiers for the dealer. nullable: true items: type: object properties: key: description: External identifier key. type: string value: description: External identifier value. type: string installerId: description: Existing installer ID to assign to this application. type: integer installer: type: object description: New installer information for assignment. properties: name: description: Installer company name. type: string maxLength: 255 email: description: Installer email address. type: string format: email maxLength: 255 externalId: type: array description: External identifiers for the installer. nullable: true items: type: object properties: key: description: External identifier key. type: string value: description: External identifier value. type: string Attachment: type: object properties: "@id": $ref: '#/components/schemas/AttachmentIri' "@type": type: string description: The JSON-LD resource type. example: Attachment referenceId: type: string format: uuid description: The unique reference ID for this resource. name: type: string description: The name of the attachment. type: type: string description: The type of attachment. $ref: "#/components/schemas/AttachmentType" mime: type: string description: The attachment mime type. size: type: number description: The size of the attachment in bytes. url: type: string format: uri description: The attachment download URL. source: type: string description: The attachment source. $ref: "#/components/schemas/AttachmentSource" AttachmentCollection: type: object allOf: - $ref: '#/components/schemas/HydraCollectionMetadata' - type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/Attachment" "@id": example: "/attachments" totalItems: type: integer description: The total number of attachments. example: 5 member: type: array description: A list of attachments. items: $ref: '#/components/schemas/Attachment' view: allOf: - $ref: '#/components/schemas/HydraView' - type: object properties: "@id": description: The identifier of the paginated view. example: "/attachments?page=1" first: description: The first page of the collection. example: "/attachments?page=1" last: description: The last page of the collection. example: "/attachments?page=5" next: description: The next page of the collection (if available). example: "/attachments?page=2" AttachmentCreate: type: object required: - name - type - file properties: name: type: string maxLength: 255 description: The name of the attachment. type: $ref: '#/components/schemas/AttachmentType' file: type: string format: binary description: The file to upload. description: Schema for creating a new attachment. AttachmentIri: description: The unique JSON-LD IRI reference to the attachment. type: string format: iri-reference example: '/attachments/550e8400-e29b-41d4-a716-446655440006' AttachmentSource: description: The location the attachment was provided from. type: string enum: - api - scanifly - sunobi - smithai - manual AttachmentType: description: The type of attachment. type: string enum: - ach_authorization - bom - contract - cpuc - credit_report - design - electrical_panel - final_inspection - install - interconnection - m1_verification_form - m2_verification_form - m3_verification_form - m4_verification_form - miscellaneous - monitoring - nem - other - permit - plan_set - procurement - production_report - property_document - pto - shading_report - site_survey_photo - title_verification - true_up - ucc_filing - unknown - utility_bill - verification_call Comment: type: object properties: "@id": $ref: '#/components/schemas/CommentIri' "@type": type: string description: The JSON-LD resource type. example: Comment referenceId: type: string format: uuid description: The unique reference ID for this resource. comment: description: The main comment content. type: string user: description: The comment's author. type: object allOf: - $ref: '#/components/schemas/Customer' CommentCollection: type: object allOf: - $ref: '#/components/schemas/HydraCollectionMetadata' - type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/Comment" "@id": example: "/comments" totalItems: type: integer description: The total number of comments. example: 5 member: type: array description: A list of comments. items: $ref: '#/components/schemas/Comment' view: allOf: - $ref: '#/components/schemas/HydraView' - type: object properties: "@id": description: The identifier of the paginated view. example: "/comments?page=1" first: description: The first page of the collection. example: "/comments?page=1" last: description: The last page of the collection. example: "/comments?page=5" next: description: The next page of the collection (if available). example: "/comments?page=2" CommentCreate: type: object required: - comment properties: comment: type: string description: The main comment content. maxLength: 65535 example: "Initial site inspection completed. All electrical connections verified and system is ready for commissioning." description: Create a new comment by providing the comment text content. CommentIri: description: The unique JSON-LD IRI reference to the comment. type: string format: iri-reference example: '/comments/550e8400-e29b-41d4-a716-446655440007' Customer: type: object properties: "@id": $ref: '#/components/schemas/UserIri' "@type": type: string description: The JSON-LD resource type. example: User referenceId: type: string format: uuid description: The unique reference ID for this resource. firstName: description: The customer's first name. type: string lastName: description: The customer's last name. type: string email: description: The customer's email. type: string format: email name: description: The customer's full name. type: string CustomerCreate: type: object required: - firstName - lastName - email - ssn - dateOfBirth - mobilePhone properties: firstName: description: The customer's first name. type: string maxLength: 255 lastName: description: The customer's last name. type: string maxLength: 255 middleName: description: The customer's middle name. nullable: true type: string email: description: The customer's email. type: string format: email maxLength: 255 ssn: description: The customer's last four of their SSN. type: string format: numeric minimum: 4 maximum: 4 dateOfBirth: description: The customer's date of birth. type: string format: date mobilePhone: description: The customer's mobile phone number. type: string format: tel homePhone: description: The customer's home phone number. nullable: true type: string format: tel externalId: description: Optional external identifiers to add to the customer. type: array items: $ref: '#/components/schemas/ExternalIdentifierCreate' example: - key: "crm_lead_id" value: "LEAD-12345" CustomerIri: description: The unique JSON-LD IRI reference to the customer. type: string format: iri-reference example: '/customers/550e8400-e29b-41d4-a716-446655440008' Dealer: type: object properties: "@id": $ref: '#/components/schemas/DealerIri' "@type": type: string description: The JSON-LD resource type. example: Dealer referenceId: type: string format: uuid description: The unique reference ID for this resource. name: description: The name of the dealer. type: string email: description: A contact email for the dealer. type: string format: email website: description: The dealer's website. type: string format: uri nullable: true logoUrl: description: The dealer's logo. type: string format: uri nullable: true DealerCollection: type: object allOf: - $ref: '#/components/schemas/HydraCollectionMetadata' - type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/Dealer" "@id": example: "/dealers" totalItems: type: integer description: The total number of dealers. example: 5 member: type: array description: A list of dealers. items: $ref: '#/components/schemas/Dealer' view: allOf: - $ref: '#/components/schemas/HydraView' - type: object properties: "@id": description: The identifier of the paginated view. example: "/dealers?page=1" first: description: The first page of the collection. example: "/dealers?page=1" last: description: The last page of the collection. example: "/dealers?page=5" next: description: The next page of the collection (if available). example: "/dealers?page=2" DealerCreate: type: object required: - name - email properties: name: description: The name of the dealer. type: string maxLength: 255 email: description: A contact email for the dealer. type: string format: email maxLength: 255 externalId: description: Optional external identifiers to add to the dealer. type: array items: $ref: '#/components/schemas/ExternalIdentifierCreate' DealerIri: description: The unique JSON-LD IRI reference to the dealer. type: string format: iri-reference example: '/dealers/550e8400-e29b-41d4-a716-446655440009' Design: type: object properties: "@id": $ref: '#/components/schemas/DesignIri' "@type": type: string description: The JSON-LD resource type. example: Design referenceId: type: string format: uuid description: The unique reference ID for this resource. name: description: The name of the design. type: string systemSize: description: The system size in kW. type: number systemOffset: description: The system offset percentage. type: number asa: description: The system annular solar access. type: number annualProduction: description: The annual production in kWh. type: number isPrimary: description: Whether this design is the primary design. type: boolean batteries: description: The design batteries. type: array items: $ref: '#/components/schemas/Product' inverters: description: The design inverters. type: array items: $ref: '#/components/schemas/Product' racking: description: The design racking. type: array items: $ref: '#/components/schemas/Product' segments: description: The design segments and module arrays. type: array items: $ref: '#/components/schemas/Segment' DesignArrayType: description: The supported design array types. type: string enum: - Fixed - Ground Mounted - Fixed - Roof Mounted - Fixed - Roof and Ground Mounted - Unkown DesignCollection: type: object allOf: - $ref: '#/components/schemas/HydraCollectionMetadata' - type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/Design" "@id": example: "/designs" totalItems: type: integer description: The total number of designs. example: 5 member: type: array description: A list of design. items: $ref: '#/components/schemas/Design' view: allOf: - $ref: '#/components/schemas/HydraView' - type: object properties: "@id": description: The identifier of the paginated view. example: "/designs?page=1" first: description: The first page of the collection. example: "/designs?page=1" last: description: The last page of the collection. example: "/designs?page=5" next: description: The next page of the collection (if available). example: "/designs?page=2" DesignCreate: type: object description: Schema for creating a new solar system design for a project. required: - projectId - name - systemSize - systemOffset - asa - annualProduction properties: projectId: description: The unique identifier of the project this design belongs to. type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440017" name: description: Human-readable name for this design version. type: string maxLength: 255 example: "Customer Approved Final Design" source: description: The source system or tool used to create this design. allOf: - $ref: '#/components/schemas/DesignSource' nullable: true systemSize: description: Total system size in kilowatts. type: number format: float minimum: 1 example: 8.32 systemOffset: description: Percentage of customer's annual energy usage that this system will offset. type: number format: float minimum: 1 example: 95.5 asa: description: Annual Solar Access percentage representing shading analysis results. type: number format: float minimum: 1 example: 87.3 annualProduction: description: Estimated annual energy production in kilowatt-hours (kWh). type: number format: float minimum: 1 example: 12450.75 isPrimary: description: Whether this design should be set as the primary/active design for the project. type: boolean example: true batteries: description: Optional battery storage systems to be included with this design. type: array items: allOf: - $ref: '#/components/schemas/DesignStorageCreate' - type: object properties: designId: readOnly: true inverters: description: Inverter systems to convert DC solar power to AC electricity. type: array items: allOf: - $ref: '#/components/schemas/DesignInverterCreate' - type: object properties: designId: readOnly: true racking: description: Mounting and racking systems to secure solar panels. type: array items: allOf: - $ref: '#/components/schemas/DesignRackingCreate' - type: object properties: designId: readOnly: true segments: description: The solar module arrays. type: array items: allOf: - $ref: '#/components/schemas/DesignSegmentCreate' - type: object properties: designId: readOnly: true externalId: description: External identifiers to link this design with other systems. type: array items: $ref: "#/components/schemas/ExternalIdentifierCreate" example: - key: "design_id" value: "DESIGN-12345" DesignInverter: type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/DesignInverter" "@id": type: string example: "/designs/products/inverters/2608684b-74ab-4cef-898c-acdaf88d92b1" "@type": type: string example: "DesignInverter" referenceId: type: string format: uuid description: The unique reference identifier. example: "e4e19ea0-1e80-4e22-b12c-775e086fab66" quantity: type: integer description: The inverter quantity. minimum: 1 example: 1 subtotal: type: number format: float description: The inverter subtotal. example: 1500 monitoringLocation: type: string description: The monitoring location. maxLength: 255 nullable: true example: null monitoringId: type: string description: The monitoring identifier. nullable: true example: null DesignInverterCreate: type: object required: - designId - productId - quantity properties: designId: description: The unique identifier of the design this inverter belongs to. type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440010" productId: description: The unique identifier of the inverter product. type: string format: uuid example: "d7f94f29-aec9-3d49-8337-23895cd5ecb0" quantity: description: The inverter quantity. type: integer minimum: 1 example: 1 monitoringLocation: type: string description: The monitoring location. nullable: true example: null monitoringId: type: string description: The monitoring identifier. nullable: true example: null DesignInverterProduct: type: object allOf: - $ref: '#/components/schemas/DesignInverter' - type: object properties: product: $ref: '#/components/schemas/Product' DesignIri: description: The unique JSON-LD IRI reference to the design. type: string format: iri-reference example: '/designs/550e8400-e29b-41d4-a716-446655440010' DesignRacking: type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/DesignRacking" "@id": $ref: '#/components/schemas/DesignRackingIri' "@type": type: string example: "DesignRacking" referenceId: type: string format: uuid description: The unique reference identifier. example: "2608684b-74ab-4cef-898c-acdaf88d92b1" quantity: type: integer description: The racking quantity. example: 1 minimum: 1 subtotal: type: number format: float description: The racking subtotal. example: 5000 DesignRackingIri: description: The unique JSON-LD IRI reference to the design racking information. type: string format: iri-reference example: '/designs/products/racking/550e8400-e29b-41d4-a716-446655440010' DesignRackingCreate: type: object required: - designId - productId - quantity properties: designId: description: The unique identifier of the design this racking item belongs to. type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440010" productId: description: The unique identifier of the racking product. type: string format: uuid example: "d7f94f29-aec9-3d49-8337-23895cd5ecb0" quantity: description: The racking quantity. type: integer minimum: 1 example: 1 DesignRackingProduct: type: object allOf: - $ref: '#/components/schemas/DesignRacking' - type: object properties: product: $ref: '#/components/schemas/Product' DesignSegment: type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/DesignSegment" "@id": $ref: '#/components/schemas/DesignSegmentIri' "@type": type: string description: The JSON-LD resource type. example: DesignSegment referenceId: type: string format: uuid description: The unique reference ID for this resource. segment: $ref: '#/components/schemas/Segment' DesignSegmentCreate: type: object description: Schema for creating a new design segment (solar array) for a design. required: - designId - productId - name - moduleQuantity - arrayType - azimuth - tilt - shading properties: designId: description: The unique identifier of the design this segment belongs to. type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440010" productId: description: The unique identifier of the module product for this segment. type: string format: uuid example: "d7f94f29-aec9-3d49-8337-23895cd5ecb0" name: description: Human-readable name for this segment. type: string maxLength: 255 example: "Segment 2" moduleQuantity: description: The number of modules in this segment. type: integer minimum: 1 example: 5 arrayType: $ref: '#/components/schemas/DesignArrayType' azimuth: description: The array azimuth in degrees. type: number format: float minimum: 0 maximum: 360 example: 10 tilt: description: The array tilt in degrees. type: number format: float minimum: 0 maximum: 90 example: 10 shading: description: The array shading percentage. type: number format: float minimum: 0 maximum: 100 example: 10 DesignSegmentIri: description: The unique JSON-LD IRI reference to the design segment. type: string format: iri-reference example: '/designs/segments/550e8400-e29b-41d4-a716-446655440019' DesignSource: description: The source system or tool used to create the design. type: string enum: - api - aurora - sunobi - scanifly - sub_contractor_hub - other - manual default: api example: "Fixed - Roof Mounted" DesignStorage: type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/DesignStorage" "@id": type: string example: "/designs/products/batteries/2608684b-74ab-4cef-898c-acdaf88d92b1" "@type": type: string example: "DesignStorage" referenceId: type: string format: uuid description: The unique reference identifier. example: "2608684b-74ab-4cef-898c-acdaf88d92b1" quantity: type: integer description: The battery quantity. example: 1 minimum: 1 size: type: number format: float description: The battery size. example: 123451234 subtotal: type: number format: float description: The battery subtotal. example: 500 monitoringLocation: type: string description: The monitoring location. nullable: true example: null monitoringId: type: string description: The monitoring identifier. nullable: true example: null DesignStorageCreate: type: object required: - designId - productId - quantity - size properties: designId: description: The unique identifier of the design this battery belongs to. type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440010" productId: description: The unique identifier of the battery product. type: string format: uuid example: "d7f94f29-aec9-3d49-8337-23895cd5ecb0" quantity: description: The battery quantity. type: integer minimum: 1 example: 1 size: type: number format: float minimum: 1 description: The battery size. example: 123451234 monitoringLocation: type: string description: The monitoring location. nullable: true example: null maxLength: 255 monitoringId: type: string description: The monitoring identifier. nullable: true example: null DesignStorageProduct: type: object allOf: - $ref: '#/components/schemas/DesignStorage' - type: object properties: product: $ref: '#/components/schemas/Product' DesignUpdate: type: object description: Schema for updating an existing design. properties: name: description: Updated human-readable name for this design version. type: string maxLength: 255 example: "Customer Approved Final Design v2" source: description: Updated design source if design was re-imported or modified. allOf: - $ref: '#/components/schemas/DesignSource' nullable: true systemSize: description: Updated total system size in kilowatts (kW) DC rating. type: number format: float minimum: 0.01 example: 9.28 systemOffset: description: Updated percentage of customer's annual energy usage offset. type: number format: float minimum: 0 maximum: 200 example: 105.2 asa: description: Updated Annual Solar Access percentage from refined shading analysis. type: number format: float minimum: 0 maximum: 100 example: 91.7 annualProduction: description: Updated estimated annual energy production in kWh. type: number format: float minimum: 0 example: 13825.50 isPrimary: description: Whether to promote this design to primary status. type: boolean example: false Distributor: type: object properties: "@id": $ref: '#/components/schemas/DistributorIri' "@type": type: string description: The JSON-LD resource type. example: Distributor referenceId: type: string format: uuid description: The unique reference ID for this resource. name: description: The name of the distributor. type: string email: description: A contact email for the distributor. type: string format: email website: description: The distributor's website. type: string format: uri nullable: true logoUrl: description: The distributor's logo. type: string format: uri nullable: true DistributorCollection: type: object allOf: - $ref: '#/components/schemas/HydraCollectionMetadata' - type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/Distributor" "@id": example: "/distributors" totalItems: type: integer description: The total number of distributors. example: 5 member: type: array description: A list of distributors. items: $ref: '#/components/schemas/Distributor' view: allOf: - $ref: '#/components/schemas/HydraView' - type: object properties: "@id": description: The identifier of the paginated view. example: "/distributors?page=1" first: description: The first page of the collection. example: "/distributors?page=1" last: description: The last page of the collection. example: "/distributors?page=5" next: description: The next page of the collection (if available). example: "/distributors?page=2" DistributorCreate: type: object required: - name - email properties: name: description: The name of the distributor. type: string maxLength: 255 email: description: A contact email for the distributor. type: string format: email maxLength: 255 externalId: description: Optional external identifiers to add to the distributor. type: array items: $ref: '#/components/schemas/ExternalIdentifierCreate' DistributorIri: description: The unique JSON-LD IRI reference to the distributor. type: string format: iri-reference example: '/distributors/550e8400-e29b-41d4-a716-446655440011' Error: type: object properties: type: description: The IRI reference. type: string format: iri-reference example: '/errors/401' title: description: A human readable error message. type: string status: description: The HTTP status code. type: number detail: description: More detailed error information. type: string ExternalIdentifier: type: object allOf: - $ref: '#/components/schemas/ExternalIdentifierDetails' properties: "@id": $ref: '#/components/schemas/ExternalIdentifierIri' "@type": type: string description: The JSON-LD resource type. example: ExternalIdentifier referenceId: type: string format: uuid description: The unique reference ID for this resource. ExternalIdentifierCreate: type: object allOf: - $ref: '#/components/schemas/ExternalIdentifierDetails' required: - key - value ExternalIdentifierCollection: type: object allOf: - $ref: '#/components/schemas/HydraCollectionMetadata' - type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/ExternalIdentifier" "@id": example: "/external-identifiers" totalItems: type: integer description: The total number of external identifiers. example: 3 member: type: array description: A list of external identifiers. items: $ref: '#/components/schemas/ExternalIdentifier' view: allOf: - $ref: '#/components/schemas/HydraView' - type: object properties: "@id": description: The identifier of the paginated view. example: "/external-identifiers?page=1" first: description: The first page of the collection. example: "/external-identifiers?page=1" last: description: The last page of the collection. example: "/external-identifiers?page=5" next: description: The next page of the collection (if available). example: "/external-identifiers?page=2" ExternalIdentifierDetails: type: object properties: key: type: string description: The key of the external identifier. maxLength: 255 value: type: string description: The value of the external identifier. maxLength: 255 ExternalIdentifierIri: description: The unique JSON-LD IRI reference to the external identifier. type: string format: iri-reference example: '/external-identifiers/550e8400-e29b-41d4-a716-446655440012' HydraCollectionMetadata: type: object properties: "@context": type: string description: The JSON-LD context. "@id": type: string description: The JSON-LD unique IRI for the collection. "@type": type: string description: The JSON-LD type of the collection. example: Collection HydraView: type: object properties: "@id": type: string description: The identifier of the paginated view. "@type": type: string description: The JSON-LD type of the view. example: "PartialCollectionView" first: type: string description: The first page of the collection. last: type: string description: The last page of the collection. next: type: string description: The next page of the collection (if available). Installer: type: object properties: "@id": $ref: '#/components/schemas/InstallerIri' "@type": type: string description: The JSON-LD resource type. example: Installer name: description: The name of the installer. type: string email: description: A contact email for the installer. type: string format: email referenceId: type: string format: uuid description: The unique reference ID for this resource. website: description: The installer's website. type: string format: uri nullable: true logoUrl: description: The installer's logo. type: string format: uri nullable: true InstallerCollection: type: object allOf: - $ref: '#/components/schemas/HydraCollectionMetadata' - type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/Installer" "@id": example: "/installers" totalItems: type: integer description: The total number of installers. example: 5 member: type: array description: A list of installers. items: $ref: '#/components/schemas/Installer' view: allOf: - $ref: '#/components/schemas/HydraView' - type: object properties: "@id": description: The identifier of the paginated view. example: "/installers?page=1" first: description: The first page of the collection. example: "/installers?page=1" last: description: The last page of the collection. example: "/installers?page=5" next: description: The next page of the collection (if available). example: "/installers?page=2" InstallerCreate: type: object required: - name - email properties: name: description: The name of the installer. type: string maxLength: 255 email: description: A contact email for the installer. type: string format: email maxLength: 255 externalId: description: Optional external identifiers to add to the installer. type: array items: $ref: '#/components/schemas/ExternalIdentifierCreate' InstallerIri: description: The unique JSON-LD IRI reference to the installer. type: string format: iri-reference example: '/installers/550e8400-e29b-41d4-a716-446655440013' Manufacturer: type: object properties: "@id": $ref: '#/components/schemas/ManufacturerIri' "@type": type: string description: The JSON-LD resource type. example: ProductManufacturer referenceId: type: string format: uuid description: The unique reference ID for this resource. name: description: The name of the manufacturer. type: string ManufacturerIri: description: The unique JSON-LD IRI reference to the manufacturer. type: string format: iri-reference example: '/product-manufacturers/550e8400-e29b-41d4-a716-446655440014' Partner: type: object properties: "@id": $ref: '#/components/schemas/PartnerIri' "@type": type: string description: The JSON-LD resource type. example: Partner referenceId: type: string format: uuid description: The unique reference ID for this resource. name: description: The name of the partner. type: string email: description: A contact email for the partner. type: string format: email website: description: The partner's website. type: string format: uri nullable: true PartnerCollection: type: object allOf: - $ref: '#/components/schemas/HydraCollectionMetadata' - type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/Partner" "@id": example: "/partners" totalItems: type: integer description: The total number of partners. example: 5 member: type: array description: A list of partners. items: $ref: '#/components/schemas/Partner' view: allOf: - $ref: '#/components/schemas/HydraView' - type: object properties: "@id": description: The identifier of the paginated view. example: "/partners?page=1" first: description: The first page of the collection. example: "/partners?page=1" last: description: The last page of the collection. example: "/partners?page=5" next: description: The next page of the collection (if available). example: "/partners?page=2" PartnerIri: description: The unique JSON-LD IRI reference to the partner. type: string format: iri-reference example: '/partners/550e8400-e29b-41d4-a716-446655440015' Product: type: object properties: "@id": $ref: '#/components/schemas/ProductIri' "@type": type: string description: The JSON-LD resource type. example: Product referenceId: type: string format: uuid description: The unique reference ID for this resource. type: description: The type of product. type: string enum: - battery - inverter - miscellaneous - module - other - racking - roofing name: description: The name of the product. type: string description: description: A description of the product. type: string sku: description: The product SKU. type: string model: description: The product model number or identifier. type: string distributors: description: The distributors who offer this product. type: array items: $ref: "#/components/schemas/Distributor" manufacturer: description: The product manufacturer. type: object allOf: - $ref: '#/components/schemas/Manufacturer' ProductCollection: type: object allOf: - $ref: '#/components/schemas/HydraCollectionMetadata' - type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/Product" "@id": example: "/products" totalItems: type: integer description: The total number of products. example: 5 member: type: array description: A list of products. items: $ref: '#/components/schemas/Product' view: allOf: - $ref: '#/components/schemas/HydraView' - type: object properties: "@id": description: The identifier of the paginated view. example: "/products?page=1" first: description: The first page of the collection. example: "/products?page=1" last: description: The last page of the collection. example: "/products?page=5" next: description: The next page of the collection (if available). example: "/products?page=2" search: type: object description: Search parameters for filtering the product collection. properties: "@type": type: string example: "IriTemplate" template: type: string example: "/products/avl{?name,type}" variableRepresentation: type: string example: "BasicRepresentation" mapping: type: array items: type: object properties: "@type": type: string example: "IriTemplateMapping" variable: type: string property: type: string ProductIri: description: The unique JSON-LD IRI reference to the product. type: string format: iri-reference example: '/products/550e8400-e29b-41d4-a716-446655440016' Project: type: object properties: "@id": $ref: '#/components/schemas/ProjectIri' "@type": type: string description: The JSON-LD resource type. example: Project referenceId: type: string format: uuid description: The unique reference ID for this resource. proposalId: type: string description: The optional identifier of the proposal used for the project. status: $ref: '#/components/schemas/ProjectStatus' phase: $ref: '#/components/schemas/ProjectPhase' milestone: $ref: '#/components/schemas/ProjectMilestone' applicationStatus: $ref: '#/components/schemas/ApplicationStatus' productType: $ref: '#/components/schemas/ApplicationProductType' financials: description: The project financials. type: object properties: agreementType: $ref: '#/components/schemas/ApplicationAgreementType' totalContractValue: description: The total contract price. type: number totalPvValue: description: The total price of the PV system. type: number totalStorageValue: description: The total price of the storage system. type: number totalAdderValue: description: The total price of all adders. type: number amountFinanced: description: The amount financed by the customer. type: number monthlyPayment: description: The first year monthly payment for PV. type: number monthlyStoragePayment: description: The first year monthly payment for storage. type: number monthlyTotalPayment: description: The first year total monthly payment. type: number m2PaymentAmount: description: The M2 payment amount. type: number m3PaymentAmount: description: The M3 payment amount. type: number downPayment: description: The down payment required. type: number introductoryTerm: description: Only applicable if the agreement type is a loan. type: number introductoryPayment: description: Only applicable if the agreement type is a loan. type: number dealerFee: description: Only applicable if the agreement type is a loan. type: number apr: description: The escalator if a PPA or lease. The interest rate if a loan. type: number term: description: The agreement term length. type: number contractRate: description: The first year $/kWh price. type: number basePpw: description: The price per watt of the PV system. type: number adderPpw: description: The price per watt of just the project adders. type: number grossPpw: description: The sum of the base, storage and adder PPW values. type: number storagePpw: description: The price per watt of just the storage system. type: number federalRebate: type: number stateRebase: type: number utilityRebate: type: number milestones: description: The project milestones. type: object properties: m1: type: object properties: m1ReviewedAt: type: string format: date m1ApprovedAt: type: string format: date initialReviewStartedAt: type: string format: date initialReviewApprovedAt: type: string format: date agreementSignedAt: type: string format: date changeOrderAt: type: string format: date siteSurveyCompletedAt: type: string format: date ntpStartedAt: type: string format: date ntpCompletedAt: type: string format: date procurementApprovedAt: type: string format: date procurementPaymentSentAt: type: string format: date procurementShippedAt: type: string format: date procurementDeliveredAt: type: string format: date uccFiledAt: type: string format: date permitSubmittedAt: type: string format: date permitApprovedAt: type: string format: date m2: type: object properties: m2ReviewedAt: type: string format: date m2ApprovedAt: type: string format: date m2PaymentReady: type: boolean m2PaymentSentAt: type: string format: date installScheduledAt: type: string format: date installCompletedAt: type: string format: date m3: type: object properties: m3ReviewedAt: type: string format: date m3ApprovedAt: type: string format: date m3PaymentReady: type: boolean m3PaymentSentAt: type: string format: date finalInspectionScheduledAt: type: string format: date finalInspectionCompletedAt: type: string format: date ptoAt: type: string format: date startBillingAt: type: string format: date proposalLink: description: The link to the project proposal. type: string proposalDate: description: The date the proposal was generated. type: string format: date createdAt: description: The date the project was created. type: string format: date-time updatedAt: description: The date the project was last updated. type: string format: date-time address: description: The project address. type: object allOf: - $ref: '#/components/schemas/Address' design: description: The project's current primary design. type: object allOf: - $ref: '#/components/schemas/Design' customer: description: The project's customer. type: object allOf: - $ref: '#/components/schemas/Customer' dealer: description: The project's dealer. type: object allOf: - $ref: '#/components/schemas/Dealer' distributor: description: The project's distributor. type: object allOf: - $ref: '#/components/schemas/Distributor' installer: description: The project's distributor. type: object allOf: - $ref: '#/components/schemas/Installer' user: description: The project's sales rep. type: object allOf: - $ref: '#/components/schemas/SalesRep' actionItems: type: array description: The action items related to the project. items: $ref: '#/components/schemas/ActionItemIri' attachments: type: array description: The attachments related to the project. items: $ref: '#/components/schemas/AttachmentIri' comments: type: array description: The comments related to the project. items: $ref: '#/components/schemas/CommentIri' adders: type: array description: A list of adders for the project. items: $ref: '#/components/schemas/Adder' externalIdentifiers: type: array description: A list of external identifiers for the project. items: $ref: '#/components/schemas/ExternalIdentifier' ProjectCollection: type: object allOf: - $ref: '#/components/schemas/HydraCollectionMetadata' - type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/Project" "@id": example: "/projects" totalItems: type: integer description: The total number of projects. example: 5 member: type: array description: A list of projects. items: $ref: '#/components/schemas/Project' search: type: object description: Search parameters for filtering the project collection. properties: "@type": type: string example: "IriTemplate" template: type: string example: "/projects{?proposalId,status,phase,dealer,installer,user,customer,createdAt,updatedAt}" variableRepresentation: type: string example: "BasicRepresentation" mapping: type: array items: type: object properties: "@type": type: string example: "IriTemplateMapping" variable: type: string property: type: string example: - { "@type": "IriTemplateMapping", "variable": "proposalId", "property": "proposal_id" } - { "@type": "IriTemplateMapping", "variable": "status", "property": "status" } - { "@type": "IriTemplateMapping", "variable": "phase", "property": "phase" } - { "@type": "IriTemplateMapping", "variable": "dealer", "property": "dealer" } - { "@type": "IriTemplateMapping", "variable": "distributor", "property": "distributor" } - { "@type": "IriTemplateMapping", "variable": "installer", "property": "installer" } - { "@type": "IriTemplateMapping", "variable": "user", "property": "user" } - { "@type": "IriTemplateMapping", "variable": "customer", "property": "customer" } - { "@type": "IriTemplateMapping", "variable": "agreementType", "property": "agreementType" } - { "@type": "IriTemplateMapping", "variable": "productType", "property": "productType" } - { "@type": "IriTemplateMapping", "variable": "createdAt", "property": "created_at" } - { "@type": "IriTemplateMapping", "variable": "updatedAt", "property": "updated_at" } view: allOf: - $ref: '#/components/schemas/HydraView' - type: object properties: "@id": description: The identifier of the paginated view. example: "/projects?page=1" first: description: The first page of the collection. example: "/projects?page=1" last: description: The last page of the collection. example: "/projects?page=5" next: description: The next page of the collection (if available). example: "/projects?page=2" ProjectCreate: type: object description: Schema for creating a new solar installation project with complete financial terms, team assignments, and project specifications. allOf: - type: object required: - applicationId - address - customer - agreementType - productType - totalContractValue - amountFinanced - downPayment - term - proposalDate properties: applicationId: description: Reference to the approved qualification application this project is based on. type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440000" address: description: Physical address where the solar system will be installed. allOf: - $ref: "#/components/schemas/AddressCreate" customer: description: Customer information for the solar installation project. allOf: - $ref: "#/components/schemas/CustomerCreate" dealer: description: Solar dealer/sales company responsible for the project. allOf: - $ref: "#/components/schemas/DealerCreate" nullable: true dealerId: description: Reference to existing dealer by ID for established partnerships. type: string format: uuid nullable: true example: "550e8400-e29b-41d4-a716-446655440027" installer: description: Solar installation company responsible for the physical installation. allOf: - $ref: "#/components/schemas/InstallerCreate" nullable: true installerId: description: Reference to existing installer by ID for established partnerships. type: string format: uuid nullable: true example: "550e8400-e29b-41d4-a716-446655440028" distributor: description: Optional equipment distributor for specialized procurement needs. allOf: - $ref: "#/components/schemas/DistributorCreate" nullable: true distributorId: description: Reference to existing equipment distributor by ID. type: string format: uuid nullable: true example: "550e8400-e29b-41d4-a716-446655440023" user: description: Sales representative responsible for the customer relationship. allOf: - $ref: "#/components/schemas/UserCreate" nullable: true userId: description: Reference to existing sales representative by ID. type: string format: uuid nullable: true example: "550e8400-e29b-41d4-a716-446655440024" externalId: description: Optional external system identifiers for integration and tracking. type: array items: $ref: "#/components/schemas/ExternalIdentifierCreate" example: - key: "crm_project_id" value: "PROJ-2024-001" - key: "proposal_id" value: "PROP-12345" agreementType: description: Type of solar financing agreement for this project. allOf: - $ref: '#/components/schemas/ApplicationAgreementType' productType: description: Type of solar energy system being installed. allOf: - $ref: '#/components/schemas/ApplicationProductType' totalContractValue: description: Total dollar value of the solar installation contract. type: number format: float minimum: 0 example: 25000.00 amountFinanced: description: Dollar amount being financed through Elios Fund. type: number format: float minimum: 0 example: 25000.00 downPayment: description: Customer down payment amount paid at contract signing. type: number format: float minimum: 0 example: 0 dealerFee: description: Dealer fee percentage for loan agreements (decimal format). type: number format: float minimum: 0 maximum: 1 example: 0 interestRate: description: Annual interest rate for loan agreements (decimal format). type: number format: float minimum: 0 maximum: 1 example: 0 contractRate: description: First-year energy rate for PPA products ($/kWh in decimal format). type: number format: float minimum: 0 maximum: 1 example: 0.1667 escalator: description: Annual rate increase percentage for PPA/lease products (decimal format). type: number format: float minimum: 0 maximum: 1 example: 0.0299 term: description: Agreement length in years. type: integer minimum: 1 maximum: 25 example: 25 proposalId: description: Optional reference to the original sales proposal. type: number minimum: 0 nullable: true example: "1234567890" proposalDate: description: Date when the proposal was presented to the customer. type: string format: date example: "1234567890" proposalLink: description: Optional URL link to the customer proposal document. type: string format: uri nullable: true example: "https://portal.example.com/proposals/12345" introductoryTerm: description: Length of introductory/promotional payment period in months. type: integer minimum: 0 maximum: 60 example: 0 introductoryPayment: description: Monthly payment amount during introductory period. type: number format: float minimum: 0 example: 0 adders: description: Optional equipment add-ons and upgrades beyond the base solar system. type: array items: type: object required: - name - quantity - subtotal properties: name: description: Name/description of the equipment add-on type: string example: "Electrical Panel Upgrade" quantity: description: Number of units being installed type: integer minimum: 1 example: 1 subtotal: description: Total cost for this add-on (quantity × unit price) type: number format: float minimum: 0 example: 2500.00 example: applicationId: "550e8400-e29b-41d4-a716-446655440000" customer: firstName: "John" lastName: "Smith" email: "john.smith@email.com" dateOfBirth: "1985-06-15" ssn: "1234" mobilePhone: "5551234567" address: streetNumber: "789" streetName: "Solar Avenue" city: "Phoenix" state: "AZ" postCode: "85001" country: "USA" agreementType: "loan" productType: "solar_storage" totalContractValue: 35000.00 amountFinanced: 30000.00 downPayment: 5000.00 dealerFee: 0.055 interestRate: 0.0599 term: 20 introductoryTerm: 18 introductoryPayment: 149.00 proposalDate: "2024-03-15" proposalId: "1234567890" proposalLink: "https://portal.example.com/proposals/98765" dealerId: "550e8400-e29b-41d4-a716-446655440021" installerId: "550e8400-e29b-41d4-a716-446655440022" userId: "550e8400-e29b-41d4-a716-446655440024" externalId: - key: "crm_project_id" value: "PROJ-2024-001" - key: "design_tool_id" value: "AURORA-12345" adders: - name: "Electrical Panel Upgrade" quantity: 1 subtotal: 2500.00 - name: "Roof Reinforcement" quantity: 1 subtotal: 1500.00 ProjectIri: description: The unique JSON-LD IRI reference to the project. type: string format: iri-reference example: '/projects/550e8400-e29b-41d4-a716-446655440017' ProjectMilestone: description: The current project milestone. type: string enum: - m1 - m2 - m3 ProjectPhase: description: The current project phase. type: string enum: - commissioning - customer_survey - design - final_payment - first_payment - initial_review - inspection - install - install_qa - interconnection - ntp_approval - permitting - procurement - pto - rebates - sale - site_survey ProjectStatus: description: The current project status. type: string enum: - new - in_progress - on_hold - complete - cancelled - stale ProjectUpdate: type: object description: Schema for updating an existing solar installation project. properties: agreementType: description: Solar financing agreement type. allOf: - $ref: "#/components/schemas/ApplicationAgreementType" productType: description: Type of solar installation being financed. allOf: - $ref: "#/components/schemas/ApplicationProductType" totalContractValue: description: Total value of the solar installation contract including all equipment, installation, permits, and additional services. type: number format: float minimum: 0 example: 25000.00 amountFinanced: description: Portion of the total contract value that will be financed through Elios Fund. type: number format: float minimum: 0 example: 25000.00 downPayment: description: Customer's upfront payment toward the project. type: number format: float minimum: 0 example: 0 introductoryTerm: description: Duration in months for special introductory payment terms. type: integer minimum: 0 maximum: 60 example: 0 introductoryPayment: description: Monthly payment amount during the introductory period. type: number format: float minimum: 0 example: 0 dealerFee: description: Dealer commission as a percentage of the financed amount. type: number format: float minimum: 0 maximum: 1 example: 0 interestRate: description: Annual interest rate for loan agreements. type: number format: float minimum: 0 maximum: 1 example: 0 contractRate: description: Price per kWh for power purchased under PPA agreements. type: number format: float minimum: 0 maximum: 1 example: 0.1667 escalator: description: Annual rate increase for PPA/lease payments. type: number format: float minimum: 0 maximum: 1 example: 0.0299 term: description: Contract duration in years. type: integer minimum: 1 maximum: 25 example: 25 proposalId: description: Reference number from the solar design or proposal system. type: number minimum: 1 example: "1234567890" nullable: true proposalLink: description: Direct URL to the customer's solar proposal or design. type: string format: uri maxLength: 255 example: "https://share.aurorasolar.com/designs/abc123" nullable: true proposalDate: description: Date when the customer's solar proposal was presented or finalized. type: string format: date example: "2024-03-15" userId: description: Reference to existing sales representative by internal user ID. type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440031" nullable: true user: description: Create new sales representative record if not already in the system. allOf: - $ref: "#/components/schemas/UserCreate" nullable: true dealerId: description: Reference to existing dealer by ID for established partnerships. type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440032" nullable: true dealer: description: Create new dealer record if not already in the system. allOf: - $ref: "#/components/schemas/DealerCreate" nullable: true installerId: description: Reference to existing installer by ID for established partnerships. type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440033" nullable: true installer: description: Create new installer record if not already in the system. allOf: - $ref: "#/components/schemas/InstallerCreate" nullable: true distributorId: description: Reference to existing distributor by ID. type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440034" nullable: true distributor: description: Create new distributor record if not already in the system. allOf: - $ref: "#/components/schemas/DistributorCreate" nullable: true SalesRep: type: object properties: "@id": $ref: '#/components/schemas/UserIri' "@type": type: string description: The JSON-LD resource type. example: User referenceId: type: string format: uuid description: The unique reference ID for this resource. firstName: description: The sales rep's first name. type: string lastName: description: The sales rep's last name. type: string email: description: The sales rep's email. type: string format: email name: description: The sales rep's full name. type: string Segment: type: object properties: "@id": $ref: '#/components/schemas/SegmentIri' "@type": type: string description: The JSON-LD resource type. example: Segment referenceId: type: string format: uuid description: The unique reference ID for this resource. name: description: The name of the segment. type: string moduleQuantity: description: The number of modules in the segment. type: integer arrayType: $ref: '#/components/schemas/DesignArrayType' azimuth: description: The array azimuth. type: number tilt: description: The array tilt in degrees. type: number shading: description: The array shading. type: number products: description: The products the array is constructed from. type: array items: $ref: '#/components/schemas/Product' SegmentIri: description: The unique JSON-LD IRI reference to the segment. type: string format: iri-reference example: '/segments/550e8400-e29b-41d4-a716-446655440018' SystemPricingFactorYear: type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/SystemPricingFactorYear" "@id": type: string format: iri-reference description: The unique JSON-LD IRI reference. example: "/projects/20b336c2-90d3-36af-8a4f-8dbbba2794ed/pricing/1" "@type": type: string description: The JSON-LD resource type. example: SystemPricingFactorYear year: description: The pricing year (1-25). type: integer minimum: 1 maximum: 25 example: 1 pvProductionKWh: description: The annual PV system production for the year in kWh. type: number format: float example: 19070.81 storageProductionKWh: description: The annual storage system production for the year in kWh. type: number format: float example: 13.5 ratePerKWh: description: The electric rate per kWh for the year. type: number format: float example: 0.184 pvMonthlyPayment: description: The monthly payment for just the PV system. type: number format: float example: 292.42 storageMonthlyPayment: description: The monthly payment for just the storage system. type: number format: float example: 64 totalMonthlyPayment: description: The total combined monthly payment. type: number format: float example: 356.42 pvAnnualPayment: description: The annual cost for just the PV system. type: number format: float example: 3509.03 storageAnnualPayment: description: The annual cost for just the storage system. type: number format: float example: 768 totalAnnualPayment: description: The total combined annual cost. type: number format: float example: 4277.03 SystemPricingFactorYearCollection: type: object allOf: - $ref: '#/components/schemas/HydraCollectionMetadata' - type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/SystemPricingFactorYear" "@id": example: "/pricing" totalItems: type: integer description: The total number of years calculated. example: 25 member: type: array description: The pricing for a system over the duration of the contract. items: $ref: '#/components/schemas/SystemPricingFactorYear' User: type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/User" "@id": $ref: '#/components/schemas/UserIri' "@type": type: string description: The JSON-LD resource type. example: User referenceId: type: string format: uuid description: The unique reference ID for this resource. firstName: type: string description: The user's first name. lastName: type: string description: The user's last name. name: type: string description: The user's full name. email: type: string format: email description: The user's email address. type: type: array description: The user's account type. items: $ref: '#/components/schemas/UserType' UserCollection: type: object allOf: - $ref: '#/components/schemas/HydraCollectionMetadata' - type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/User" "@id": example: "/products" totalItems: type: integer description: The total number of users. example: 5 member: type: array description: A list of users. items: $ref: '#/components/schemas/User' view: allOf: - $ref: '#/components/schemas/HydraView' - type: object properties: "@id": description: The identifier of the paginated view. example: "/users?page=1" first: description: The first page of the collection. example: "/users?page=1" last: description: The last page of the collection. example: "/users?page=5" next: description: The next page of the collection (if available). example: "/users?page=2" UserCreate: type: object required: - firstName - lastName - email properties: firstName: description: The user's first name. type: string maxLength: 255 lastName: description: The user's last name. type: string maxLength: 255 email: description: The users's email. type: string format: email maxLength: 255 externalId: description: Optional external identifiers to add to the user. type: array items: $ref: '#/components/schemas/ExternalIdentifierCreate' UserIri: description: The unique JSON-LD IRI reference to the user. type: string format: iri-reference example: '/users/550e8400-e29b-41d4-a716-446655440019' UserType: type: string enum: - internal - customer - sales_rep - partner_admin - investor_admin - account_manager - user Webhook: type: object properties: "@id": $ref: '#/components/schemas/WebhookIri' "@type": type: string description: The JSON-LD resource type. example: Webhook referenceId: type: string format: uuid description: The unique reference ID for this resource. url: description: The URL the webhook request will be sent to. type: string format: uri enabled: description: Whether or not the webhook is enabled. type: boolean method: description: The HTTP method that will be used. type: string enum: - get - post events: description: The events that will trigger the webhook to send. type: array items: $ref: '#/components/schemas/WebhookEvent' description: description: A human-readable description of the webhook's purpose. type: string nullable: true secret: description: The webhook secret used for HMAC signature validation. type: string nullable: true caPath: description: The path to the CA certificate for SSL verification. type: string nullable: true keyPath: description: The path to the private key for client certificate authentication. type: string nullable: true certPath: description: The path to the client certificate for SSL authentication. type: string nullable: true WebhookCreate: type: object required: - url - method - events properties: url: description: The URL the webhook request will be sent to. Must be HTTPS. type: string format: uri maxLength: 255 example: "https://api.example.com/webhooks/elios" method: description: The HTTP method that will be used for webhook delivery. type: string enum: - get - post example: "post" events: description: The events that will trigger the webhook to send. type: array minItems: 1 items: $ref: '#/components/schemas/WebhookEvent' example: ["application.approved", "project.created"] description: description: A human-readable description of the webhook's purpose. type: string maxLength: 65535 example: "Webhook for application status updates" nullable: true secret: description: The webhook secret used for HMAC signature validation. type: string maxLength: 255 example: "your-webhook-secret-key" nullable: true caPath: description: The path to the CA certificate for SSL verification. type: string maxLength: 255 nullable: true keyPath: description: The path to the private key for client certificate authentication. type: string maxLength: 255 nullable: true certPath: description: The path to the client certificate for SSL authentication. type: string maxLength: 255 nullable: true WebhookCollection: type: object allOf: - $ref: '#/components/schemas/HydraCollectionMetadata' - type: object properties: "@context": type: string description: The JSON-LD context. example: "/contexts/Webhook" "@id": example: "/webhooks" totalItems: type: integer description: The total number of webhooks. example: 5 member: type: array description: A list of webhooks. items: $ref: '#/components/schemas/Webhook' view: allOf: - $ref: '#/components/schemas/HydraView' - type: object properties: "@id": description: The identifier of the paginated view. example: "/webhooks?page=1" first: description: The first page of the collection. example: "/webhooks?page=1" last: description: The last page of the collection. example: "/webhooks?page=5" next: description: The next page of the collection (if available). example: "/webhooks?page=2" WebhookEvent: description: The type of event that triggers the webhook. type: string enum: - application.created - application.updated - application.deleted - project.created - project.updated - project.deleted - project.phase.updated - project.status.updated - user.created - user.updated - user.deleted WebhookIri: description: The unique JSON-LD IRI reference to the webhook. type: string format: iri-reference example: '/webhooks/550e8400-e29b-41d4-a716-446655440020' WebhookUpdate: type: object properties: url: description: The URL the webhook request will be sent to. Must be HTTPS. type: string format: uri maxLength: 255 example: "https://api.example.com/webhooks/elios" method: description: The HTTP method that will be used for webhook delivery. type: string enum: - get - post example: "post" events: description: The events that will trigger the webhook to send. type: array minItems: 1 items: $ref: '#/components/schemas/WebhookEvent' example: ["application.approved", "project.created"] description: description: A human-readable description of the webhook's purpose. type: string maxLength: 65535 example: "Webhook for application status updates" nullable: true enabled: description: Whether or not the webhook is enabled. type: boolean example: true secret: description: The webhook secret used for HMAC signature validation. type: string maxLength: 255 example: "your-webhook-secret-key" nullable: true caPath: description: The path to the CA certificate for SSL verification. type: string maxLength: 255 nullable: true keyPath: description: The path to the private key for client certificate authentication. type: string maxLength: 255 nullable: true certPath: description: The path to the client certificate for SSL authentication. type: string maxLength: 255 nullable: true securitySchemes: ApiKey: type: http scheme: bearer bearerFormat: JWT OAuth: type: oauth2 flows: authorizationCode: authorizationUrl: https://partners.eliosfund.com/oauth/authorize tokenUrl: https://partners.eliosfund.com/oauth/token refreshUrl: https://partners.eliosfund.com/oauth/refresh scopes: create:applications: Can create a qualification application create:attachments: Can create attachments create:comments: Can create comments create:designs: Can create designs create:projects: Can create projects delete:designs: Can delete designs manage:webhooks: Can manage webhooks qualify:applications: Can submit an application for qualification update:applications: Can update a qualification application update:designs: Can update a design update:projects: Can update a project view:action::items: Can view action items view:addresses: Can view addresses view:applications: Can view applications view:attachments: Can view attachments view:comments: Can view comments view:dealers: Can view dealers view:designs: Can view designs view:distributors: Can view distributors view:installers: Can view installers view:partners: Can view partners view:products: Can view products view:projects: Can view projects view:users: Can view users clientCredentials: tokenUrl: https://partners.eliosfund.com/oauth/token scopes: create:applications: Can create a qualification application create:attachments: Can create attachments create:comments: Can create comments create:designs: Can create designs create:projects: Can create projects delete:designs: Can delete designs manage:webhooks: Can manage webhooks qualify:applications: Can submit an application for qualification update:applications: Can update a qualification application update:designs: Can update a design update:projects: Can update a project view:action::items: Can view action items view:addresses: Can view addresses view:applications: Can view applications view:attachments: Can view attachments view:comments: Can view comments view:dealers: Can view dealers view:designs: Can view designs view:distributors: Can view distributors view:installers: Can view installers view:partners: Can view partners view:products: Can view products view:projects: Can view projects view:users: Can view users security: - ApiKey: [] - OAuth: []