API Endpoints
Name |
Endpoints |
|---|---|
/jobs |
|
/jobs/<job_id> |
|
/jobs/<job_id>/files |
|
/jobs/<job_id>/letter |
|
/jobs/<job_id>/message |
|
/jobs/<job_id>/revision |
|
/jobs/<job_id>/panel-layout-images |
|
/arrays/<array_id>/beam-spacing-images |
|
/arrays/<array_id>/beam-size-images |
|
/arrays/<array_id>/attic-images |
|
/states |
|
/beam-shape |
|
/roof-materials |
|
/connection-types |
|
/racking-types |
|
/module-types |
|
/optimizer-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:
Client information, such as client name, address, etc.
Services that are being requested for this job.
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
{
"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*
|
|
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
{
"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.
See the Connection Type support page for
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.
See the Roof Material support page for
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
{
"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*
|
|
module_count
|
Int
|
Total number of Solar Panel Modules.
|
inverter_type
|
Inverter Object*
|
|
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
List Optimizer Types endpoint.
|
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
List Battery Types endpoint.
|
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*
|
|
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
{
"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.
{
"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 |
{
// ...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
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>
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
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
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.
{
"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
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
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
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
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
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
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
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
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
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
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
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
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
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"
},
//...
]