API Endpoints

Name

Endpoints

Submit Job / List Jobs

/jobs

Retrieve Job

/jobs/<job_id>

Submit Job Files / Retrieve Job Files

/jobs/<job_id>/files

Retrieve Roof Evaluation Letter

/jobs/<job_id>/letter

Send Message

/jobs/<job_id>/message

Revise Job

/jobs/<job_id>/revision

Upload Panel Layout Image

/jobs/<job_id>/panel-layout-images

Upload Beam Spacing Image

/arrays/<array_id>/beam-spacing-images

Upload Beam Size Image

/arrays/<array_id>/beam-size-images

Upload Attic Image

/arrays/<array_id>/attic-images

List States

/states

List Beam Shape

/beam-shape

List Roof Material

/roof-materials

List Connection Types

/connection-types

List Racking Types

/racking-types

List Module Types

/module-types

List Optimizer Types

/optimizer-types

List Battery Types

/battery-types

Submit Job

Request

POST https://api.rightangleeng.com/jobs

Request Details

The foundation of this API surrounds the submission of a job to Right Angle Engineering. The request body for this endpoint consists of the following three parts:

  1. Client information, such as client name, address, etc.

  2. Services that are being requested for this job.

  3. Service specific information. See Submitting Service-Specific Information for submission requirements.

Below we outline all of the possible fields that can be included in the request body. Depending on the services that are being requested for a job will dictate which fields are being used. Fields are organized by Services below.

Note that there can be overlap between fields provided for each service. Such as the submission of Roof Structural Information for both jobs requesting Structural Engineering Letter and jobs requesting CAD Design.

Request Body

Basic Job Submission

The most basic job submission uses the fields ‘client_name’ and ‘client_street_address’. By default, this will add pv_structural_letter to the services_requested list, meaning we will assume that a Structural Evaluation Letter is being requested.

Request Body Example

Postman Example

{
    "client_name" : "Andrew Schwartz",
    "client_street_address" : "100 Test Way, Provo, UT, 84606"
}

If you would like to specify other services to be performed for your job, add a services_requested array using the service slugs listed below.

For example, to request both PV CAD Design (Unstamped) and a PV Structural Letter:

{
  "client_name" : "Andrew Schwartz",
  "client_street_address" : "100 Test Way, Provo, UT, 84606",
  "services_requested": ["pv_structural_letter", "pv_cad_design"]
}

Below we specify the fields that can be used for all jobs, including address fields, service specification, and any notes relevant to the job.

Request Body Example

{
  "client_name": "Andrew Schwartz",
  "client_street_address": "333 W 2230 N",
  "client_city": "Provo",
  "client_state": {
      "id": "8f33e5fd-1cbb-46ca-b43e-9a56688c421a"
  },
  "client_zip_code": "84604",
  "services_requested": ["pv_structural_letter", "pv_cad_design"],
  "notes": "The is an example note."
}

Structural Evaluation Letter

If you are requesting a Structural Evaluation Letter for your solar project, we require that structural information be submitted to us. We have two methods for users to submit information, Basic and Advanced. The Basic method utilizes a simpler request body to submit information to us. When using the Basic method, Right Angle Engineering will infer and confirm other structural information as needed.

If the Basic submission method does not sufficiently cover the details of the projects that you will be submitting, we suggest using the Advanced method to submit your project. The primary difference between each method is the ability to specify structural details for each Solar Panel Array. While the Basic Submission assumes the same structural information for the number of arrays specified, The Advanced Submission allows you to specify structural details for each individual array. We detail how to submit each method below.

Basic Submission

To submit a job using the Basic method the following fields should be included in the request body:

  • roof_material

  • roof_pitch

  • racking_type

  • connection_type

  • beam_shape

  • beam_spacing

  • array_count

Below we include details for each field.

Field

Data Type

Description

roof_material







Roof Material Object*







Material of the roof supporting the array
(ex. Asphalt Shingles).

Can be obtained from the List Roof Material
endpoint below.

See the Roof Material support page for
more information on the given options.
roof_pitch






Float






Angle/slope of the roof in degrees.

Min: 0
Max: 60

See the How to Determine Roof Pitch support
page for more information
racking_type


Racking Type Object*


The racking used for the project. Can be
obtained from the List Racking Types endpoint.

connection_type








Connection Type Object*








The type of attatchment/connection that is being
used to connect the solar panel array
to the roof.

Can be obtained from the List Connection Types
endpoint.

See the Connection Type support page for
more information.
beam_shape


Beam Shape Object*


Roof framing beam size. Options
consist of beam shape by different
sizes (2x4, 2x6, 2x8, etc.)
beam_spacing






Float






Beam spacing measured in inches.

Min: 6
Max: 480

See the How to Find Beam Spacing support page
for more information
array_count

Int

Number of Solar Panel Arrays for the project

Request Body Example

Postman Example

{
  "client_name": "Client Name",
  "client_street_address": "1006 E 180 S",
  "client_city": "Provo",
  "client_state": {
      "id": "8f33e5fd-1cbb-46ca-b43e-9a56688c421a",
      "name": "Utah"
  },
  "client_zip_code": "84604",
  "services_requested": ["pv_structural_letter"],
  "roof_material": {
          "id": "00000000-0000-0000-0000-000000000001"
          "name": "Asphalt Shingles"
      },
      "roof_pitch": 20.0,
      "racking_type": {
          "id": "9ae82924-ab74-49c4-ba42-3720e268284f"
          "name": "Generic"
      },
      "connection_type": {
          "id": 36
          "name": "L-Foot"
      },
      "beam_shape": {
          "id": "00000000-0000-0000-0000-000000000002"
          "name": "2x4"
      },
      "beam_spacing": 24.0,
      "array_count": 2
}

Advanced Submission

This method requires the addition of Solar Panel Array objects through the ‘arrays’ field in the body of the request. We include details of the ‘arrays’ field and all of fields included for each Solar Panel Array object below, along with an example request.

Field

Data Type

Description

arrays



Array of Solar
Panel Array Objects


The Collection of Solar Panel Array objects
which constitutes the core of our analysis
for the job. See below for information
regarding the Solar Panel Array Object.

Each Solar Panel Array object will contain the following fields:

Field

Type

Description

name

String

Name given to identify the solar panel array.
ex. “Array 1”, “Array 2”, or “North”, “West”, etc.

panel_quantity

Int

Quantity of solar panels.

orientation





String (Choices)





Orientation of the solar panels in the array as
they lie on the roof.

Choices are:
* Portrait
* Landscape
num_panels_on_rafter







Int







Number of panels on a rafter (in most
cases the number of rows of panels).

Min: 1
Max: 25

for more information.
panel_to_eave




Float




Distance (in inches) from the roof eave to the
bottom of the first panel.

Min: 0
Max: 480
connection_type








Connection Type Object*








The type of attatchment/connection that is being
used to connect the solar panel array
to the roof.

Can be obtained from the List Connection Types
endpoint.

more information.
ballast_weight





Float





Required only if the connection_type
selected is Ballast. Weight in pounds
of the ballast system used.

Min: 0
Max: 100
roof_material







Roof Material Object*







Material of the roof supporting the array
(ex. Asphalt Shingles).

Can be obtained from the List Roof Material
endpoint below.

more information on the given options.
beam_shape


Beam Shape Object*


Roof framing beam size. Options
consist of beam shape by different
sizes (2x4, 2x6, 2x8, etc.)
frame_shape
















String (Choices)
















Choices are:
* Rafter
* Kingpost
* Simple Fink
* Queen
* Fink
* Howe
* Fan
* Modified Queen
* Double Fink
* Double Howe
* Attic
* Purlin
* Non-Standard

See the Truss Type support page for more
information
roof_pitch






Float






Angle/slope of the roof in degrees.

Min: 0
Max: 60

for more information
beam_span






Array of Floats
ex. [70.0, 70.0]





Size of beam span in inches for each member.

Min: 24
Max 1200

for more information
roof_overhang



Float



Size of roof overhang in inches

Min: 0
Max: 120
beam_spacing






Float






Beam spacing measured in inches.

Min: 6
Max: 480

for more information

Request Body Example

Postman Example

{
  "client_name": "Andrew Schwartz",
  "client_street_address": "333 W 2230 N",
  "client_city": "Provo",
  "client_state": {
      "id": "8f33e5fd-1cbb-46ca-b43e-9a56688c421a"
  },
  "client_zip_code": "84604",
  "services_requested": ["pv_structural_letter"],
  "arrays": [
      {
          "name": "Array 1",
          "panel_quantity": 10,
          "roof_material": {
              "id": "00000000-0000-0000-0000-000000000001"
          },
          "beam_spacing": 12.0,
          "num_panels_on_rafter": 2,
          "panel_to_eave": 12.0,
          "orientation": "Landscape",
          "beam_shape": {
              "id": "00000000-0000-0000-0000-000000000001"
          },
          "frame_shape": "Rafter",
          "roof_pitch": 24.0,
          "beam_span": [70.0, 70.0],
          "roof_overhang": 12.0,
          "connection_type": {
              "id": 1
          }
      },
      {
          "name": "Array 2",
          "panel_quantity": 6,
          "roof_material": {
              "id": "00000000-0000-0000-0000-000000000001"
          },
          "beam_spacing": 12.0,
          "num_panels_on_rafter": 2,
          "panel_to_eave": 0.0,
          "orientation": "Landscape",
          "beam_shape": {
              "id": "00000000-0000-0000-0000-000000000001"
          },
          "frame_shape": "Rafter",
          "roof_pitch": 20.0,
          "beam_span": [65.0, 65.0],
          "roof_overhang": 6.0,
          "connection_type": {
              "id": 1
          }
      },

  ]
}

CAD Design

CAD Design Requirements are submitted by including Electrical System Information, Structural Design Information, and Organization/Utility information through their relevant fields. These fields are detailed below.

Electrical System Information

Note that there are optional fields that may or may not be included depending on your project.

Field

Data Type

Description

module_type



Module Object*



Type of Module being used for the project.
Can be obtained from the List Module Types
endpoint.

module_count



Int



Total number of Solar Panel Modules.



inverter_type



Inverter Object*



Type of Inverter being used for the project.
Can be obtained from the List Inverter Types
endpoint.

inverter_count



Int



Total number of inverters.



production_meter_location





String (Choices)





Choices are:
* “Between Solar and Disconnect”
* “Between Disconnect and MSP”

If not applicable for this job,
exclude this field from your request
msp_rating



Int (Choices)



MSP Rating is generally attached to the door
of the main breaker panel. It will most likely
be a number from 100 to 225 in intervals of 25

breaker_rating



Int (Choices)



The Breaker Rating is generally attached to
the door of the main breaker panel. It must
be at least 25 and must also be less than or
equal to the MSP Rating in intervals of 25.
interconnection











































String (Choices)











































We allow for multiple interconnection options to be selected depending
on the needs for your project. We generally recommend selecting from the
following simple options:
* “Breaker Injection into MSP”
* “Line Side Tap”
* “Load Side Tap”

However if those do not fit your needs, available options are:
* “PV Breaker in Sub Panel (Breaker Fed)”
* “Load Side Tap in MSP (Breaker Fed Sub Panel)”
* “Load Side Tap in Sub Panel (Breaker Fed Sub Panel)”
* “PV Breaker in Sub Panel (Sum Of Breakers)”
* “PV Breaker in Sub Panel (Lug Fed)”
* “Load Side Tap in MSP (Lug Fed Sub Panel)”
* “Load Side Tap in Sub Panel (Lug Fed Sub Panel)”
* “Supply Side Breaker in MLO MSP”
* “PV Breaker in MSP”
* “Supply Side Tap in MSP (Neutral Tap)”
* “Supply Side Tap in Meter Can (Neutral Tap)”
* “Supply Side Tap in Tap Box (Neutral Tap)”
* “Meter Intercept (w/ Service Disconnect)”
* “Supply Side Tap in MSP (N-G Bond)”
* “PV Breaker in Split Bus MSP”
* “PV Breaker in Split Bus MSP (MLO)”
* “PV Breaker in Sub Panel (Split Bus MSP w/ Internal Busbar)”
* “PV Breaker in Sub Panel (Split Bus MSP w/o Internal Busbar)”
* “Load Side Tap in MSP (Split Bus MSP w Internal Busbar)”
* “Load Side Tap in MSP (Split Bus MSP w/o Internal Busbar)”
* “Supply Side Breaker in Split-Bus MSP (w/ Internal Busbar)”
* “Supply Side Breaker in Split-Bus MSP (w/o Internal Busbar)”
* “PV Breaker in Sub Panel (Re-Route)”
* “Supply Side Tap in MSP”
* “Supply Side Tap in Meter Can”
* “Supply Side Tap in Tap Box”
* “PV Breaker in MSP (Unrelated Sub | Lug Fed)”
* “PV Breaker in MSP (Unrelated Sub | Breaker Fed)”
* “Supply Side Tap in MSP (Main Breaker Only MSP | Interior Panel Not Shown)”
* “Supply Side Tap in MSP (Main Breaker Only MSP | Interior Panel Shown)”
* “Supply Side Tap in MSP (Existing PV System Breaker)”
* “Load Side Feed-Thru Intercept”
* “Meter Collar (Breaker)”
* “Meter Collar (No Breaker)”
* “Supply Side Tap in Automatic Transfer Switch”
* “Tesla Backup Switch With Meter”
optimizer_type
(Optional)


Optimizer Object*



Type of Optimizer being used for the project,
if applicable. Can be obtained from the

mpu_model_number
(Optional)


String



The MPU model number for the project, if
applicable.


battery_type
(Optional)


Battery Object*



Type of Battery being used for the project, if
applicable. Can be obtained from the

battery_count
(Optional)


Int



Total number of batteries.



battery_backup
(Optional)


String (Choices)



Choices are:
* Whole Home
* Partial Home

Organization/Utility Specific Information

Field

Data Type

Description

utility_name


String


Name of the Utility for the project.


contractor_license_number

String

The Contractor License for the project.

Roof Structural Information

Similar to submitting a project requesting a Structural Evaluation Letter, Structural Information for CAD Design can either be provided for using the Basic or Advanced submission method. We recommend using the Basic submission method if there are no major differences structurally for the placement of each Solar Panel Array on the project. Right Angle Engineering will infer and confirm other structural information as needed.

If there are major differences (such as different roof material or connections used per array), then we suggest using the Advanced method to submit Roof Structural Information. The primary difference between each method is the ability to specify structural details for each Solar Panel Array. While the Basic Submission assumes the same structural information for the number of arrays specified, The Advanced Submission allows you to specify structural details for each individual array. We detail how to submit using each method below.

Basic Submission

Field

Data Type

Description

roof_material







Roof Material Object*







Material of the roof supporting the array
(ex. Asphalt Shingles).

Can be obtained from the List Roof Material
endpoint below.

See the Roof Material support page for
more information on the given options.
roof_pitch






Float






Angle/slope of the roof in degrees.

Min: 0
Max: 60

See the How to Determine Roof Pitch support
page for more information
racking_type


Racking Type Object*


The racking used for the project. Can be
obtained from the List Racking Types endpoint.

connection_type








Connection Type Object*








The type of attatchment/connection that is being
used to connect the solar panel array
to the roof.

Can be obtained from the List Connection Types
endpoint.

See the Connection Type support page for
more information.
beam_shape


Beam Shape Object*


Roof framing beam size. Options
consist of beam shape by different
sizes (2x4, 2x6, 2x8, etc.)
beam_spacing






Float






Beam spacing measured in inches.

Min: 6
Max: 480

See the How to Find Beam Spacing support page
for more information
array_count



Int



Number of arrays for the project

Only necessary if Solar Panel Array objects
are not included in the request body

Request Body Example

Postman Example

{
  "client_name": "Andrew Schwartz",
  "client_street_address": "333 W 2230 N",
  "client_city": "Provo",
  "client_state": {
      "id": "8f33e5fd-1cbb-46ca-b43e-9a56688c421a"
  },
  "client_zip_code": "84604",
  "services_requested": ["pv_cad_design"],
  "utility_name": "Test Utility",
  "contractor_license_num": 123453
  "module_type": {
      "id": "832378d1-da76-4337-b02e-415619b98e31"
  },
  "module_count": 20,
  "inverter_type": {
      "id": "d1094eb5-415e-4cff-b809-935a86f765b6"
  },
  "inverter_count": 10,
  "production_meter_location": "Between Solar and Disconnect",
  "optimizer_type": {
      "id": "44ecd73a-8569-4908-a9c5-c6aab2c428f0"
  },
  "battery_type": {
      "id": "05d15614-b88a-4e12-8a45-ad389cb9ac68"
  },
  "battery_count": 2,
  "battery_backup": "Whole Home",
  "mpu_model_number": "ABC-123",
  "msp_rating": 100,
  "breaker_rating": 75,
  "interconnection": "Line Side Tap",
  "roof_material": {
      "id": "00000000-0000-0000-0000-000000000001",
      "name": "Asphalt Shingles"
  },
  "beam_spacing": 12.0,
  "beam_shape": {
      "id": "00000000-0000-0000-0000-000000000001",
      "name": "2x4",
  },
  "roof_pitch": 24.0,
  "connection_type": {
      "id": 1
      "name": "L-Foot",
  }
  "racking_type": {
      "id": "5b2ae434-9ec1-4e72-915b-c39f1c09b478"
  }
  "array_count": 2
}

Advanced Submission

This method requires the addition of Solar Panel Array objects through the ‘arrays’ field in the body of the request. We include details of the ‘arrays’ field and all of fields included for each Solar Panel Array object below, along with an example request.

Field

Data Type

Description

arrays



Array of Solar
Panel Array Objects


The Collection of Solar Panel Array objects
which constitutes the core of our analysis
for the job. See below for information
regarding the Solar Panel Array Object.

Each Solar Panel Array object will contain the fields noted under Basic Submission. Below we give an example request body using th Advanced Submission method.

Postman Example

{
  "client_name": "Andrew Schwartz",
  "client_street_address": "333 W 2230 N",
  "client_city": "Provo",
  "client_state": {
      "id": "8f33e5fd-1cbb-46ca-b43e-9a56688c421a"
  },
  "client_zip_code": "84604",
  "services_requested": ["pv_cad_design"],
  "utility_name": "Test Utility",
  "contractor_license_num": 123453
  "module_type": {
      "id": "832378d1-da76-4337-b02e-415619b98e31"
  },
  "module_count": 20,
  "inverter_type": {
      "id": "d1094eb5-415e-4cff-b809-935a86f765b6"
  },
  "inverter_count": 10,
  "production_meter_location": "Between Solar and Disconnect",
  "optimizer_type": {
      "id": "44ecd73a-8569-4908-a9c5-c6aab2c428f0"
  },
  "battery_type": {
      "id": "05d15614-b88a-4e12-8a45-ad389cb9ac68"
  },
  "battery_count": 2,
  "battery_backup": "Whole Home",
  "mpu_model_number": "ABC-123",
  "msp_rating": 100,
  "breaker_rating": 75,
  "interconnection": "Line Side Tap",
  "arrays": [
      {
          "roof_material": {
              "id": "00000000-0000-0000-0000-000000000001",
              "name": "Asphalt Shingles"
          },
          "beam_spacing": 12.0,
          "beam_shape": {
              "id": "00000000-0000-0000-0000-000000000001",
              "name": "2x4",
          },
          "roof_pitch": 24.0,
          "connection_type": {
              "id": 1
              "name": "L-Foot",
          }
          "racking_type": {
              "id": "5b2ae434-9ec1-4e72-915b-c39f1c09b478"
          }
      },
       {
          "roof_material": {
              "id": "00000000-0000-0000-0000-000000000002",
              "name": "Corrugated Metal"
          },
          "beam_spacing": 12.0,
          "beam_shape": {
              "id": "00000000-0000-0000-0000-000000000002",
              "name": "2x6",
          },
          "roof_pitch": 24.0,
          "connection_type": {
              "id": 1
              "name": "L-Foot",
          }
          "racking_type": {
              "id": "5b2ae434-9ec1-4e72-915b-c39f1c09b478"
          }
      }

  ]
}

Optional Recipient Address

As previously noted, we provision one API Key per organization. Jobs that require an engineering letter are assumed to be addressed to the organization that sent the job. Therefore the letter is addressed to that organization by default. However, a job may be sent to Right Angle Engineering on behalf of another organization with a different name and address. If this is the case, you may send additional recipient information that will be put in place of your organization’s information on the returned letter. Simply include these 5 fields in the body of the request to the Jobs Endpoint to override your organization’s information on the generated letter.

Field

Type

Description

recipient_name

String

Name of letter recipient

recipient_street_address

String

Street Address of letter recipient

recipient_city

String

City of letter recipient

recipient_state

String

State of letter recipient

recipient_zip_code

String

Zip code of letter recipient

Postman Example

{
  // ...Other Job Fields...
  "recipient_name": "Another Company",
  "recipient_street_address": "100 W 2000 N",
  "recipient_city": "Orem",
  "recipient_state": "Utah",
  "recipient_zip_code": "84604",
  // ...Other Job Fields...
  "arrays": [
        // ...Array Fields...
  ]
}

Response Details

Success Response

This request will return a 201 Created status and a newly created Job object, containing any relevant fields.

The newly created Job object in the response body will contain the same fields as noted above in the request body along with the following additional fields:

Field

Type

Description

id

Int

ID identifying the created Job instance

updated_at

DateTime

Date the job was last updated

created_at

DateTime

Date the job was created

status

String

Job status. Will initially be
“Submitted” when the Job is first created

notes

String/Null

Notes regarding the Job

If applicable, newly created Array object(s) will be included in the response body. Each will contain the same fields included in the request body, along with the following additional fields:

Field

Type

Description

id

UUID

ID identifying the created Array instance

Furthermore, all fields that are objects will return with at least an ‘id’ and ‘name’ field to identify the object.

Success Response Example

//HTTP/1.1 201 Created

{
  "id": 1234,
  "updated_at": "2021-09-03T21:58:27.189144Z",
  "created_at": "2021-09-03T21:58:27.157343Z",
  "status": "Submitted",
  "client_name": "Andrew Schwartz",
  "client_street_address": "333 W 2230 N",
  "client_city": "Provo",
  "client_state": {
      "id": "8f33e5fd-1cbb-46ca-b43e-9a56688c421a",
      "name": "Utah",
      "abbreviation": "UT"
  },
  "client_zip_code": "84604",
  "arrays": [
      {
          "id": "968dcc63-03e0-4a97-8184-be7924839bdb",
          "name": "Array 1",
          "panel_quantity": 10,
          "roof_material": {
              "id": "00000000-0000-0000-0000-000000000001",
              "name": "Asphalt Shingles"
          },
          "beam_spacing": 12.0,
          "num_panels_on_rafter": 2,
          "panel_to_eave": 12.0,
          "orientation": "Landscape",
          "beam_shape": {
              "id": "00000000-0000-0000-0000-000000000001",
              "name": "2x4"
          },
          "frame_shape": "Rafter",
          "roof_pitch": 24.0,
          "beam_span": [70.0, 70.0],
          "roof_overhang": 12.0,
          "connection_type": {
              "id": 1,
              "name": "S5 Protea Bracket"
          }
      }
  ]
  "notes": "This is an example job note",
}

Validation Error

If there was an error with one of the fields, you will receive a response with a 400 Bad Request status along with details regarding the error in the response body.

List Jobs

Request

GET https://api.rightangleeng.com/jobs

Postman Example

Query Parameters

The following query parameters can be used to filter the list of jobs:

Parameter

Data Type

Description

client_state

String

Filter by client state ID(s). Multiple values can be separated by commas.

services

String

Filter by service slug(s). Multiple values can be separated by commas. Legacy slug aliases (e.g. structural_letter) are accepted.

client_name

String

Filter by client name (case-insensitive partial match).

client_street_address

String

Filter by client street address (case-insensitive partial match).

city

String

Filter by client city (case-insensitive partial match).

ahj

String

Filter by AHJ display name (case-insensitive partial match).

utility

String

Filter by utility name (case-insensitive partial match).

submitted_start_date

String (ISO)

Filter by submission date range start. Must be used with submitted_end_date.

submitted_end_date

String (ISO)

Filter by submission date range end. Must be used with submitted_start_date.

Response Details

This request will return a 200 response and an array of Job objects. The response will be in JSON format.

The response for this endpoint will be the same as the response as the Submit Jobs endpoint. See the Success Response Example section under the Submit Job endpoint for an example.

Retrieve Job

Request

GET https://api.rightangleeng.com/jobs/<job_id>

Postman Example

Request Path Parameters

<job_id> - ID identifying the Job object.

Response Details

This request will return a 200 response and a Job object instance. The response will be in JSON format.

The response for this endpoint will be the same as the response as the Submit Jobs endpoint. See the Success Response Example section under the Submit Job endpoint for an example.

Submit Job Files

Request

POST https://api.rightangleeng.com/jobs/<job_id>/files

Postman Example

Request Path Parameters

<job_id> - ID identifying the Job object

Request Details

This request will submit a file to the specified job object and return the corresponding Job File

This request requires a Content-Type header of multipart/form-data. See these MDN Docs for more information. This request also requires that a file to be uploaded as a value in a key-value pair in the body of the request. The key in the request body should be labeled as ‘file’ or the files will not be processed. If multiple files are being uploaded in the same request, they should be uploaded with the value of same key.

The following file types are supported:
  • JPEG

  • PNG

  • HEIC

  • HEIF

  • PDF

  • DOC

  • DOCX

  • AVI

  • MPEG

  • MP4

  • MOV

Response Details

Success Response

This request will return a 201 response and the created . The response will be in JSON format.

Each File object will contain the following fields:

File Object

Field

Type

Description

id

UUID

ID identifying File Object

file

String

Link to file

job

int

ID identifying job associated with File Object

Retrieve Job Files

Request

GET https://api.rightangleeng.com/jobs/<job_id>/files

Postman Example

Request Path Parameters

<job_id> - ID identifying the Job object

Response Details

Depending on the services requested for the job, this endpoint returns other files provided by Right Angle Engineering.

Success Response

This request will return a 200 response and an array of Job File objects. The response will be in JSON format.

Each Job File object will contain the following fields:

Field

Type

Description

name

String

File name

file

String

Link to file

created_at

String

Date when the file was created

Success Response Example

//HTTP/1.1 201 Created

[
    {
        "id": "ba878cf6-870a-4dd5-a2dd-60617dcec809",
        "file": "https://right-angle images.s3.amazonaws.com/job-files/Doc_Sample.pdf",
        "job": "4629"
    }
]

Retrieve Roof Evaluation Letter

Request

GET https://api.rightangleeng.com/jobs/<job_id>/letter

Request Path Parameters

<job_id> - ID identifying the Job object

Response Details

This request will return a 200 response and the Roof Evaluation Letter pdf.

Note that this response is contingent of the corresponding job to have a status of ‘Approved’ The status of a job can be found in the response of the Retrieve Job or List Jobs endpoint.

Send Message

Request

POST https://api.rightangleeng.com/jobs/<job_id>/message

Request Path Parameters

<job_id> - ID identifying the Job object.

Request Body

The only field required in the request is message_body as show below.

Postman Example

{
  "message_body": "This is a test message.",
}

Response Details

This request will return a 200 response indicating that the message has been successfully sent. The response will be in JSON format.

A message history will be included in the the response of the Retrieve Job endpoint under the field, ‘messages.’

The messages field will be an array of messages with the following format:

{
    "body": "This is a test message.",
    "author": "Jane Doe",
    "date_created": "2021-09-03T21:58:27.157343Z"
}

Revise Job

Request

POST https://api.rightangleeng.com/jobs/<job_id>/revision

Request Path Parameters

<job_id> - ID identifying the Job object.

Request Body

The request body should contain, at a minimum, the revision notes and revision reason as shown below. You can also include other fields that you would like to update as are available in the Submit Job endpoint.

Field

Type

Description

revision_notes

String

Notes describing the details of the revision
and any additional context
revision_reason










String
(Choices)









The reason for the revision. Must be one of:
* ‘equipment_change’
* ‘electrical_change’
* ‘ahj_rejection’
* ‘utility_rejection’
* ‘company_preference’
* ‘right_angle_error’
* ‘layout_change’
* ‘additional_service’
* ‘as_built’
* ‘other’
{
  "revision_notes": "These are notes about the revision",
  "revision_reason": "equipment_change"
  // ...Other Job Fields as needed
}

Response Details

This request will return a 200 response indicating that the revision has been successfully submitted. The response will be in JSON format.

The response will include a new job ID. This new ID represents the revised version of the job and should be used for all future interactions with that job. The original job ID will no longer be tracked for updates or modifications.

{
  "id": 1235,
  // ...Other Job Fields...
}

Upload Panel Layout Image

Request

POST https://api.rightangleeng.com/jobs/<job_id>/panel-layout-images

Request Path Parameters

<job_id> - ID identifying the Job object

Request Details

This request will create a Panel Layout Image object

This request requires a Content-Type header of multipart/form-data. See these MDN Docs for more information. This request also requires that a file to be uploaded as a value in a key-value pair in the body of the request. The key in the request body should be labeled as ‘file’ or the files will not be processed. If multiple files are being uploaded in the same request, they should be uploaded with the value of same key.

The following file types are supported:
  • JPEG

  • PNG

  • HEIC

  • HEIF

  • PDF

  • DOC

  • DOCX

  • AVI

  • MPEG

  • MP4

  • MOV

Postman Example

Response Details

Success Response

This request will return a 201 response and an array of Panel Layout Image objects. The response will be in JSON format.

Each Panel Layout Image object will contain the following fields:

Panel Layout Image Object

Field

Type

Description

id

UUID

ID identifying Panel Layout Image

file

String

Link to image

job

Int

ID identifying job associated with Panel Layout Image object

Success Response Example

//HTTP/1.1 201 Created
[
    {
        "id": "ba878cf6-870a-4dd5-a2dd-60617dcec809",
        "file": "https://right-angle images.s3.amazonaws.com/panel_layout_images/panellayout.jpg",
        "job": "4629"
    }
]

Upload Beam Spacing Image

Request

POST https://api.rightangleeng.com/arrays/<array_id>/beam-spacing-images

Request Path Parameters

<array_id> - ID identifying the Array object

Request Details

This request will create a Beam Spacing Image object

This request requires a Content-Type header of multipart/form-data. See these MDN Docs for more information. This request also requires that a file to be uploaded as a value in a key-value pair in the body of the request. The key in the request body should be labeled as ‘file’ or the files will not be processed. If multiple files are being uploaded in the same request, they should be uploaded with the value of same key.

The following file types are supported:
  • JPEG

  • PNG

  • HEIC

  • HEIF

  • PDF

  • DOC

  • DOCX

  • AVI

  • MPEG

  • MP4

  • MOV

Postman Example

Response Details

Success Response

This request will return a 201 response and an array of Beam Space Image objects. The response will be in JSON format.

Each Beam Space Image object will contain the following fields:

Beam Space Image Object

Field

Type

Description

id

UUID

ID identifying Beam Space Image

file

String

Link to image

array

Int

ID identifying the Solar Panel Array
object associated with Beam Space Image object

Success Response Example

//HTTP/1.1 201 Created

[
    {
        "id": "9c09afe1-d3b0-4b70-ab24-05d8f5ae440f",
        "file": "https://right-angle-images.s3.amazonaws.com/beam_space_images/beamspaceimage.jpg",
        "array": "968dcc63-03e0-4a97-8184-be7924839bdb"
    }
]

Upload Beam Size Image

Request

POST https://api.rightangleeng.com/arrays/<array_id>/beam-size-images

Request Path Parameters

<array_id> - ID identifying the Array object

Request Details

This request will create a Beam Size Image object

This request requires a Content-Type header of multipart/form-data. See these MDN Docs for more information. This request also requires that a file to be uploaded as a value in a key-value pair in the body of the request. The key in the request body should be labeled as ‘file’ or the files will not be processed. If multiple files are being uploaded in the same request, they should be uploaded with the value of same key.

The following file types are supported:
  • JPEG

  • PNG

  • HEIC

  • HEIF

  • PDF

  • DOC

  • DOCX

  • AVI

  • MPEG

  • MP4

  • MOV

Postman Example

Response Details

Success Response

This request will return a 201 response and an array of Beam Size Image objects. The response will be in JSON format.

Each Beam Size Image object will contain the following fields:

Beam Size Image Object

Field

Type

Description

id

UUID

ID identifying Beam Size Image

file

String

Link to image

array

Int

ID identifying the Solar Panel Array
object associated with Beam Size Image object

Success Response Example

//HTTP/1.1 201 Created

[
    {
        "id": "9c09afe1-d3b0-4b70-ab24-05d8f5ae440f",
        "file": "https://right-angle-images.s3.amazonaws.com/beam_size_images/beamsizeimage.jpg",
        "array": "968dcc63-03e0-4a97-8184-be7924839bdb"
    }
]

Upload Attic Image

Request

POST https://api.rightangleeng.com/arrays/<array_id>/attic-images

Request Path Parameters

<array_id> - ID identifying the Array object

Request Details

This request will create a Attic Image object

This request requires a Content-Type header of multipart/form-data. See these MDN Docs for more information. This request also requires that a file to be uploaded as a value in a key-value pair in the body of the request. The key in the request body should be labeled as ‘file’ or the files will not be processed. If multiple files are being uploaded in the same request, they should be uploaded with the value of same key.

The following file types are supported:
  • JPEG

  • PNG

  • HEIC

  • HEIF

  • PDF

  • DOC

  • DOCX

  • AVI

  • MPEG

  • MP4

  • MOV

Postman Example

Response Details

Success Response

This request will return a 201 response and an array of Attic Image objects. The response will be in JSON format.

Each Attic Image object will contain the following fields:

Attic Image Object

Field

Type

Description

id

UUID

ID identifying Attic Image

file

String

Link to image

array

Int

ID identifying the Solar Panel Array
object associated with Attic Image object
//HTTP/1.1 201 Created

[
    {
        "id": "9c09afe1-d3b0-4b70-ab24-05d8f5ae440f",
        "file": "https://right-angle-images.s3.amazonaws.com/attic_images/atticimage.jpg",
        "array": "968dcc63-03e0-4a97-8184-be7924839bdb"
    }
]

List States

Request

GET https://api.rightangleeng.com/states

Postman Example

Response Details

This request will return a 200 OK response, with an array of State objects in JSON format.

Each State object will contain the following fields:

Field

Type

Description

id

UUID

ID identifying the state

name

String

State name

abbreviation

String

State abbreviation

Example Response

//HTTP/1.1 201 Created

[
    //...
    {
        "id": "8f33e5fd-1cbb-46ca-b43e-9a56688c421a",
        "name": "Utah",
        "abbreviation": "UT"
    },
    //...
]

List Beam Shape

Request

GET https://api.rightangleeng.com/beam-shape

Postman Example

Response Details

This request will return a 200 response and an array of beam shape objects. The response will be in JSON format.

Field

Type

Description

id

UUID

ID identifying Beam Shape

name

String

Beam Shape name

Example Response

//HTTP/1.1 201 Created

[
    //...
    {
        "id": "00000000-0000-0000-0000-000000000001",
        "name": "2x4"
    },
    //...
]

List Roof Material

Request

GET https://api.rightangleeng.com/roof-materials

Postman Example

Response Details

This request will return a 200 response and an array of Roof Material objects. The response will be in JSON format. For more information regarding Roof Material objects, please see the Roof Material support page.

Each Roof Material object will contain the following fields:

Field

Type

Description

id

UUID

ID identifying the Roof Material

name

String

Roof Material name

Example Response

//HTTP/1.1 201 Created

[
    //...
    {
        "id": "00000000-0000-0000-0000-000000000001",
        "name": "Asphalt Shingles"
    },
    //...
]

List Connection Types

Request

GET https://api.rightangleeng.com/connection-types

Postman Example

Response Details

This request will return a 200 response and an array of Connection Type objects. The response will be in JSON format. For more information regarding Connection Type objects, please see the Connection Type support page.

Each Connection Type object will contain the following fields:

Field

Type

Description

id

Int

ID identifying Connection Type

name

String

Connection Type name

Example Response

//HTTP/1.1 201 Created

[
    //...
    {
        "id": 36,
        "name": "L-Foot"
    },
    //...
]

List Racking Types

Request

GET https://api.rightangleeng.com/racking-types

Postman Example

Response Details

This request will return a 200 response and an array of Racking Type objects. The response will be in JSON format.

Each Module Type object will contain the following fields:

Field

Type

Description

id

UUID

ID identifying Racking Type object

name

String

Racking Type object name

Example Response

//HTTP/1.1 201 Created

[
    //...
    {
        "id": "833cba79-ee77-4090-be3e-32f41f711327",
        "name": "SolarMount HD",
        "manufacture": "Unirac",
    },
    //...
]

List Module Types

Request

GET https://api.rightangleeng.com/module-types

Postman Example

Response Details

This request will return a 200 response and an array of Module Type objects. The response will be in JSON format.

Each Module Type object will contain the following fields:

Field

Type

Description

id

UUID

ID identifying Module Type

name

String

Module Type name

Example Response

//HTTP/1.1 201 Created

[
    //...
    {
        "id": "00000000-0000-0000-0000-000000000001",
        "name": "CS1H-315MS"
        "manufacture": "Canadian Solar"
    },
    //...
]

List Inverter Types

Request

GET https://api.rightangleeng.com/inverter-types

Postman Example

Response Details

This request will return a 200 response and an array of Inverter Type objects. The response will be in JSON format.

Each Inverter Type object will contain the following fields:

Field

Type

Description

id

UUID

ID identifying Inverter Type

name

String

Inverter Type name

Example Response

//HTTP/1.1 201 Created

[
    //...
    {
        "id": "00000000-0000-0000-0000-000000000001",
        "name": "PM1-290-01 (Single Phase)",
        "manufacture": "Generac",
    },
    //...
]

List Optimizer Types

Request

GET https://api.rightangleeng.com/optimizer-types

Postman Example

Response Details

This request will return a 200 response and an array of Optimizer Type objects. The response will be in JSON format.

Each Optimizer Type object will contain the following fields:

Field

Type

Description

id

UUID

ID identifying Optimizer Type

name

String

Optimizer Type name

Example Response

//HTTP/1.1 201 Created

[
    //...
    {
        "id": "00000000-0000-0000-0000-000000000001",
        "name": "PM1-290-01 (Single Phase)",
        "manufacture": "Generac",
    },
    //...
]

List Battery Types

Request

GET https://api.rightangleeng.com/battery-types

Postman Example

Response Details

This request will return a 200 response and an array of Optimizer Type objects. The response will be in JSON format.

Each Battery Type object will contain the following fields:

Field

Type

Description

id

UUID

ID identifying Battery Type

name

String

Battery Type name

Example Response

//HTTP/1.1 201 Created

[
    //...
    {
        "id": "00000000-0000-0000-0000-000000000001",
        "name": "IQ Battery ENCHARGE-10-1P-NA",
        "manufacture": "Enphase"
    },
    //...
]