Solar Monkey API API Reference

In version 3 of the Solar Monkey API, multiple endpoints are made available to get information about your projects, or to create them. Quote details are included in the Project Detail endpoint.

Rate limits

Currently no rate limits are in place, but we might add them without notice if clients start to misbehave (In which case you will get an HTTP 429/Too Many Requests Response). Please use our endpoints responsibly.

Pagination

Pagination is done akin to the Github pagination, using a Link header, and with the addition of a X-Total-Count header that denotes the total amount of results. There may be next, prev, first and last parts that you can use to obtain the link for the page you want. The Python requests library will parse this automatically for you. Don't use the format of the urls to build your own, they may change unannounced!

API Endpoint
https://api.solarmonkey.nl/v3
Request Content-Types: application/json
Response Content-Types: application/json
Schemes: https
Version: v3

Authentication

Basic

Basic access is the authentication method used. Use your access key and secret key credentials.

type
basic

Address

Get possible addresses for the given address components.

GET /address/

In order to create a project, a valid address must be provided as input. This endpoint can be used to verify the validity of an address. If multiple addresses match the input (for example because of housenumber suffixes), they are all returned. If the address is not valid, no results are returned.

Besides country, either:

  • postcode & housenumber
  • or city, street & housenumber

are required.

200 OK

Valid addresses list

type
401 Unauthorized

Unauthorized

404 Not Found

Not Found

Response Example (200 OK)
[
  {
    "country": "string",
    "administrative_area_level_1": "string",
    "city": "string",
    "street": "string",
    "postcode": "string",
    "housenumber": "string"
  }
]
Response Headers (200 OK)
X-Rate-Limit-Limit

The number of allowed requests.

integer
Response Example (401 Unauthorized)
{
  "detail": "string"
}
Response Example (404 Not Found)
{
  "detail": "string"
}

batteries

Get info for specific battery for API.

GET /batteries/{id}/

As long as a user is authenticated they may look at any object, so the default DRF retrieve view is all we need.

id: integer
in path

A unique integer value identifying this Battery.

200 OK
Response Example (200 OK)
{
  "id": "integer",
  "manufacturer": "string",
  "model": "string",
  "usable_energy_kwh": "number"
}

Catalogue

GET /catalogue/elements/

Return a list of all accessible catalogue elements.

Catalogue elements

401 Unauthorized

Unauthorized

404 Not Found

Not Found

Response Example (200 OK)
[
  {
    "id": "integer",
    "sku": "string",
    "enabled": "boolean",
    "element_type": "string",
    "element_id": "integer",
    "element_url": "string (uri)",
    "names": "object",
    "descriptions": "object",
    "price": "string (decimal)"
  }
]
Response Headers (200 OK)
X-Rate-Limit-Limit

The number of allowed requests.

integer
Response Example (401 Unauthorized)
{
  "detail": "string"
}
Response Example (404 Not Found)
{
  "detail": "string"
}

GET /catalogue/packages/

Return a list of all accessible catalogue packages.

Catalogue packages

401 Unauthorized

Unauthorized

404 Not Found

Not Found

Response Example (200 OK)
[
  {
    "id": "integer",
    "name": "string",
    "panel_count": "integer",
    "price": "string (decimal)",
    "panel_id": "integer",
    "sku": "string",
    "descriptions": "object",
    "panel_url": "string",
    "inverter_id": "integer",
    "inverter_url": "string",
    "optimizer_id": "integer",
    "optimizer_url": "string"
  }
]
Response Headers (200 OK)
X-Rate-Limit-Limit

The number of allowed requests.

integer
Response Example (401 Unauthorized)
{
  "detail": "string"
}
Response Example (404 Not Found)
{
  "detail": "string"
}

Delayed Results

Return the status of a task, and when it's finished, the result.

GET /delayed-result/{task_id}/

There is no error response. In case you pass a non-existing id, the status will be PENDING.

task_id: string
in path

(no description)

Status and result

Response Example (200 OK)
{
  "status": "string",
  "result": "string"
}
Response Headers (200 OK)
X-Rate-Limit-Limit

The number of allowed requests.

integer

Inverters

GET /inverters/{id}/

Return the details of an inverter.

id: integer
in path

A unique integer value identifying this Inverter.

200 OK

Inverter details

401 Unauthorized

Unauthorized

404 Not Found

Not Found

Response Example (200 OK)
{
  "id": "integer",
  "model": "string",
  "manufacturer": "string",
  "specsheet": "string (uri)",
  "sort_key": "string",
  "efficiency": "string (decimal)",
  "remarks": "string",
  "watt_peak": "integer",
  "optimizers": "boolean",
  "micro_inverter": "boolean",
  "string_inputs": "integer",
  "nominal_dc_voltage": "integer",
  "start_voltage": "string (decimal)",
  "self_consumption_night": "string (decimal)",
  "min_voltage_in": "integer",
  "max_voltage_in": "integer",
  "max_power_in": "integer",
  "max_current_in": "string (decimal)",
  "mppt_min_voltage": "integer",
  "mppt_max_voltage": "integer",
  "undersizing": "string (decimal)",
  "oversizing": "string (decimal)"
}
Response Headers (200 OK)
X-Rate-Limit-Limit

The number of allowed requests.

integer
Response Example (401 Unauthorized)
{
  "detail": "string"
}
Response Example (404 Not Found)
{
  "detail": "string"
}

Optimizers

GET /optimizers/{id}/

Return the details of an optimizer.

id: integer
in path

A unique integer value identifying this Optimizer.

200 OK

Optimizer details

401 Unauthorized

Unauthorized

404 Not Found

Not Found

Response Example (200 OK)
{
  "id": "integer",
  "manufacturer": "string",
  "model": "string",
  "specsheet": "string (uri)",
  "specsheet_language": "string",
  "specsheet_date": "string (date)",
  "is_verified": "boolean",
  "is_archived": "boolean",
  "efficiency": "string (decimal)",
  "max_power_in": "integer",
  "max_current_in": "string (decimal)",
  "max_voltage_in": "integer",
  "max_voltage_out": "integer",
  "max_current_out": "string (decimal)",
  "n_panels_in": "integer",
  "n_mppts_in": "integer",
  "mppt_min_voltage": "string (decimal)",
  "mppt_max_voltage": "string (decimal)",
  "min_string_length_1_phase": "integer",
  "max_string_length_1_phase": "integer",
  "min_string_length_3_phase": "integer",
  "max_string_length_3_phase": "integer",
  "min_compatible_1_phase_inverter": "integer",
  "min_compatible_3_phase_inverter": "integer",
  "special_case": "boolean",
  "remarks": "string"
}
Response Headers (200 OK)
X-Rate-Limit-Limit

The number of allowed requests.

integer
Response Example (401 Unauthorized)
{
  "detail": "string"
}
Response Example (404 Not Found)
{
  "detail": "string"
}

Panels

GET /panels/{id}/

Return the details of a panel.

id: integer
in path

A unique integer value identifying this Panel.

200 OK

Panel details

401 Unauthorized

Unauthorized

404 Not Found

Not Found

Response Example (200 OK)
{
  "id": "integer",
  "type": "string",
  "colour": "string",
  "length": "string",
  "width": "string",
  "watt_peak": "integer",
  "manufacturer": "string",
  "model": "string",
  "optimizer_builtin": "boolean",
  "specsheet": "string (uri)"
}
Response Headers (200 OK)
X-Rate-Limit-Limit

The number of allowed requests.

integer
Response Example (401 Unauthorized)
{
  "detail": "string"
}
Response Example (404 Not Found)
{
  "detail": "string"
}

Projects

GET /projects/

page: integer
in query

A page number within the paginated result set.

page_size: integer
in query

Number of results to return per page.

200 OK

Projects list

401 Unauthorized

Unauthorized

Response Example (200 OK)
[
  {
    "id": "integer",
    "app_link": "string",
    "first_name": "string",
    "infix": "string",
    "last_name": "string",
    "street": "string",
    "house_number": "string",
    "postcode": "string",
    "city": "string",
    "country": "string",
    "longitude": "string (decimal)",
    "latitude": "string (decimal)",
    "billing_address": "string",
    "language": "string",
    "is_b2b": "boolean",
    "custom_fields": "string",
    "email": "string (email)",
    "comments": "string",
    "created_at": "string",
    "last_modified": "string",
    "quotes_count": "integer",
    "owner": "integer"
  }
]
Response Headers (200 OK)
X-Rate-Limit-Limit

The number of allowed requests.

integer
X-Total-Count

The total amount of results.

integer
Response Example (401 Unauthorized)
{
  "detail": "string"
}

POST /projects/

Create a project.

Project details

Request Example
{
  "name": "string",
  "contact": {
    "first_name": "string",
    "insertion": "string",
    "last_name": "string",
    "email": "string (email)",
    "phone": "string"
  },
  "address": {
    "country": "string",
    "administrative_area_level_1": "string",
    "city": "string",
    "street": "string",
    "postcode": "string",
    "housenumber": "string"
  },
  "billing_address": "string",
  "custom_fields": "object",
  "is_b2b": "boolean",
  "language": "string",
  "network_phase": "string",
  "annual_power_consumption_kwh": "integer",
  "owner": "string (email)"
}
201 Created

Project created

401 Unauthorized

Unauthorized

Response Example (201 Created)
{
  "id": "integer"
}
Response Headers (201 Created)
X-Rate-Limit-Limit

The number of allowed requests.

integer
X-Total-Count

The total amount of results.

integer
Response Example (401 Unauthorized)
{
  "detail": "string"
}

GET /projects/{id}/

Return details of a specific project, including information about its systems.

id: string
in path

(no description)

Project details

401 Unauthorized

Unauthorized

404 Not Found

Not Found

Response Example (200 OK)
{
  "quotes": [
    {
      "id": "integer",
      "name": "string",
      "type": "string",
      "state": "string",
      "app_link": "string"
    }
  ],
  "name": "string",
  "id": "integer",
  "contact": {
    "first_name": "string",
    "insertion": "string",
    "last_name": "string",
    "email": "string (email)",
    "phone": "string"
  },
  "address": {
    "country": "string",
    "administrative_area_level_1": "string",
    "city": "string",
    "street": "string",
    "postcode": "string",
    "housenumber": "string"
  },
  "billing_address": "string",
  "comments": "string",
  "kwh_price": "string",
  "last_modified": "string",
  "created_at": "string",
  "custom_fields": "object",
  "is_b2b": "boolean",
  "language": "string",
  "annual_power_consumption_kwh": "integer",
  "owner": "string",
  "app_link": "string",
  "vat_tariff": "string (decimal)",
  "network_phase": "string",
  "online_offer_link": "string",
  "expected_global_irradiance": "integer"
}
Response Headers (200 OK)
X-Rate-Limit-Limit

The number of allowed requests.

integer
Response Example (401 Unauthorized)
{
  "detail": "string"
}
Response Example (404 Not Found)
{
  "detail": "string"
}

PATCH /projects/{id}/

Project details

id: string
in path

(no description)

Request Example
{
  "name": "string",
  "contact": {
    "first_name": "string",
    "insertion": "string",
    "last_name": "string",
    "email": "string (email)",
    "phone": "string"
  },
  "address": {
    "country": "string",
    "administrative_area_level_1": "string",
    "city": "string",
    "street": "string",
    "postcode": "string",
    "housenumber": "string"
  },
  "billing_address": "string",
  "custom_fields": "object",
  "is_b2b": "boolean",
  "language": "string",
  "network_phase": "string",
  "annual_power_consumption_kwh": "integer",
  "owner": "string (email)"
}
200 OK

Update result

401 Unauthorized

Unauthorized

404 Not Found

Not Found

Response Headers (200 OK)
X-Rate-Limit-Limit

The number of allowed requests.

integer
Response Example (401 Unauthorized)
{
  "detail": "string"
}
Response Example (404 Not Found)
{
  "detail": "string"
}

GET /projects/{integration}/

integration: string
in path

One of 'salesforce', 'zoho', 'pipedrive'.

page: integer
in query

A page number within the paginated result set.

page_size: integer
in query

Number of results to return per page.

integration: string
in path

(no description)

200 OK

Projects list

401 Unauthorized

Unauthorized

Response Example (200 OK)
[
  {
    "id": "integer",
    "app_link": "string",
    "first_name": "string",
    "infix": "string",
    "last_name": "string",
    "street": "string",
    "house_number": "string",
    "postcode": "string",
    "city": "string",
    "country": "string",
    "longitude": "string (decimal)",
    "latitude": "string (decimal)",
    "billing_address": "string",
    "language": "string",
    "is_b2b": "boolean",
    "custom_fields": "string",
    "email": "string (email)",
    "comments": "string",
    "created_at": "string",
    "last_modified": "string",
    "quotes_count": "integer",
    "owner": "integer"
  }
]
Response Headers (200 OK)
X-Rate-Limit-Limit

The number of allowed requests.

integer
X-Total-Count

The total amount of results.

integer
Response Example (401 Unauthorized)
{
  "detail": "string"
}

POST /projects/{integration}/

Create a project.

Project details

integration: string
in path

One of 'salesforce', 'zoho', 'pipedrive'.

integration: string
in path

(no description)

Request Example
{
  "name": "string",
  "contact": {
    "first_name": "string",
    "insertion": "string",
    "last_name": "string",
    "email": "string (email)",
    "phone": "string"
  },
  "address": {
    "country": "string",
    "administrative_area_level_1": "string",
    "city": "string",
    "street": "string",
    "postcode": "string",
    "housenumber": "string"
  },
  "billing_address": "string",
  "custom_fields": "object",
  "is_b2b": "boolean",
  "language": "string",
  "network_phase": "string",
  "annual_power_consumption_kwh": "integer",
  "owner": "string (email)",
  "external_id": "string"
}
201 Created

Project created

401 Unauthorized

Unauthorized

Response Example (201 Created)
{
  "id": "integer"
}
Response Headers (201 Created)
X-Rate-Limit-Limit

The number of allowed requests.

integer
X-Total-Count

The total amount of results.

integer
Response Example (401 Unauthorized)
{
  "detail": "string"
}

GET /projects/{integration}/{external_id}/

Return details of a specific project, including information about its systems.

integration: string
in path

One of 'salesforce', 'zoho', 'pipedrive'.

external_id: string
in path

Id at integration

integration: string
in path

(no description)

external_id: string
in path

(no description)

Project details

401 Unauthorized

Unauthorized

404 Not Found

Not Found

Response Example (200 OK)
{
  "name": "string",
  "contact": {
    "first_name": "string",
    "insertion": "string",
    "last_name": "string",
    "email": "string (email)",
    "phone": "string"
  },
  "address": {
    "country": "string",
    "administrative_area_level_1": "string",
    "city": "string",
    "street": "string",
    "postcode": "string",
    "housenumber": "string"
  },
  "billing_address": "string",
  "custom_fields": "object",
  "is_b2b": "boolean",
  "language": "string",
  "network_phase": "string",
  "annual_power_consumption_kwh": "integer",
  "owner": "string (email)",
  "external_id": "string"
}
Response Headers (200 OK)
X-Rate-Limit-Limit

The number of allowed requests.

integer
Response Example (401 Unauthorized)
{
  "detail": "string"
}
Response Example (404 Not Found)
{
  "detail": "string"
}

PATCH /projects/{integration}/{external_id}/

integration: string
in path

One of 'salesforce', 'zoho', 'pipedrive'.

external_id: string
in path

Id at integration

integration: string
in path

(no description)

external_id: string
in path

(no description)

200 OK

Update result

401 Unauthorized

Unauthorized

404 Not Found

Not Found

Response Headers (200 OK)
X-Rate-Limit-Limit

The number of allowed requests.

integer
Response Example (401 Unauthorized)
{
  "detail": "string"
}
Response Example (404 Not Found)
{
  "detail": "string"
}

Quotes

POST /quotes/

Request Example
{
  "name": "string",
  "project_id": "integer",
  "copy_from": "integer",
  "type": "string"
}
201 Created

Quote created.

401 Unauthorized

Unauthorized

Response Example (201 Created)
{
  "name": "string",
  "project_id": "integer",
  "copy_from": "integer",
  "type": "string",
  "id": "integer"
}
Response Example (401 Unauthorized)
{
  "detail": "string"
}

GET /quotes/{id}/

id: string
in path

(no description)

200 OK

Quote details

401 Unauthorized

Unauthorized

404 Not Found

Not Found

Response Example (200 OK)
{
  "id": "integer",
  "name": "string",
  "name_suffix": "string",
  "project_id": "integer",
  "remarks": "string",
  "type": "string",
  "system_design": {
    "total_watt_peak": "integer",
    "panel_count": "string",
    "string_configuration": [
      {
        "inverter_id": "integer",
        "inverter_sku": "string",
        "connected_panel_count": "integer"
      }
    ],
    "yields": {
      "yield_year1": "number",
      "yields_per_month": "string"
    },
    "gutter_height": "number",
    "design_image_url": "string",
    "elevation_image_url": "string",
    "obstacle_image_url": "string",
    "ballast_image_url": "string",
    "grids": [
      {
        "panel_count": "integer",
        "panel_id": "integer",
        "inclination": "number",
        "orientation": "number",
        "panel_configuration": "object",
        "row_orientations": "object",
        "spacing": "number",
        "portrait": "boolean",
        "mounting_brand": "string"
      }
    ],
    "inverters": [
      {
        "id": "integer",
        "sku": "string",
        "panels_in_strings": [
          "integer"
        ]
      }
    ]
  },
  "pdfs": [
    {
      "generated_at": "string",
      "url": "string"
    }
  ],
  "financials": {
    "markup_percentage": "number",
    "subtotal_before_discount": "number",
    "loan": {
      "amount": "number",
      "duration": "number",
      "interest_rate": "number"
    },
    "discount": [
      {
        "type": "string",
        "description": "string",
        "value": "number"
      }
    ],
    "total_ex_vat": "number",
    "vat": "number",
    "vat_tariff": "number",
    "total": "number",
    "deposits": [
      {
        "amount": "number",
        "percentage": "number"
      }
    ],
    "payback_time": "number",
    "irr": "number",
    "total_cashflow_after_25_years": "number"
  },
  "state": "string",
  "package": {
    "id": "integer",
    "name": "string",
    "description": "string",
    "price": "number",
    "panel_id": "integer",
    "panel_count": "integer",
    "inverter_id": "integer",
    "optimizer_id": "integer",
    "sku": "string"
  },
  "simple": "boolean",
  "bill_of_materials": [
    {
      "id": "number",
      "count": "number",
      "name": "string",
      "names": {
        "nl": "string",
        "fr": "string",
        "en": "string",
        "es": "string"
      },
      "description": {
        "nl": "string",
        "fr": "string",
        "en": "string",
        "es": "string"
      },
      "type": "string",
      "price": "number",
      "sku": "string"
    }
  ],
  "created_at": "string",
  "last_updated": "string",
  "accepted_by": "string",
  "accepted_time": "string (date-time)",
  "expiration_date": "string (date-time)",
  "superseded_by": "integer"
}
Response Headers (200 OK)
X-Rate-Limit-Limit

The number of allowed requests.

integer
Response Example (401 Unauthorized)
{
  "detail": "string"
}
Response Example (404 Not Found)
{
  "detail": "string"
}

PATCH /quotes/{id}/

Quote

id: string
in path

(no description)

Request Example
{
  "name": "string",
  "name_suffix": "string",
  "remarks": "string",
  "state": "string"
}
200 OK

Quote updated

400 Bad Request

Bad data

401 Unauthorized

Unauthorized

Response Example (200 OK)
{
  "name": "string",
  "name_suffix": "string",
  "remarks": "string",
  "state": "string"
}
Response Example (400 Bad Request)
{
  "detail": "string"
}
Response Example (401 Unauthorized)
{
  "detail": "string"
}

GET /quotes/{id}/systemdesign/ballast_image/

id: string
in path

(no description)

Response Example (200 OK)
{
  "status": "string",
  "result": "string"
}

GET /quotes/{id}/systemdesign/design_image/

id: string
in path

(no description)

Response Example (200 OK)
{
  "status": "string",
  "result": "string"
}

GET /quotes/{id}/systemdesign/elevation_image/

id: string
in path

(no description)

Response Example (200 OK)
{
  "status": "string",
  "result": "string"
}

GET /quotes/{id}/systemdesign/obstacle_image/

id: string
in path

(no description)

Response Example (200 OK)
{
  "status": "string",
  "result": "string"
}

POST /quotes/{integration}/

integration: string
in path

One of 'salesforce', 'zoho', 'pipedrive'.

integration: string
in path

(no description)

Request Example
{
  "name": "string",
  "project_id": "integer",
  "copy_from": "integer",
  "type": "string",
  "external_id": "string"
}
201 Created

Quote created.

401 Unauthorized

Unauthorized

Response Example (201 Created)
{
  "name": "string",
  "project_id": "integer",
  "copy_from": "integer",
  "type": "string",
  "id": "integer"
}
Response Example (401 Unauthorized)
{
  "detail": "string"
}

GET /quotes/{integration}/{external_id}/

integration: string
in path

One of 'salesforce', 'zoho', 'pipedrive'.

external_id: string
in path

Id at integration

integration: string
in path

(no description)

external_id: string
in path

(no description)

200 OK

Quote details

401 Unauthorized

Unauthorized

404 Not Found

Not Found

Response Example (200 OK)
{
  "id": "integer",
  "name": "string",
  "name_suffix": "string",
  "project_id": "integer",
  "remarks": "string",
  "type": "string",
  "system_design": {
    "total_watt_peak": "integer",
    "panel_count": "string",
    "string_configuration": [
      {
        "inverter_id": "integer",
        "inverter_sku": "string",
        "connected_panel_count": "integer"
      }
    ],
    "yields": {
      "yield_year1": "number",
      "yields_per_month": "string"
    },
    "gutter_height": "number",
    "design_image_url": "string",
    "elevation_image_url": "string",
    "obstacle_image_url": "string",
    "ballast_image_url": "string",
    "grids": [
      {
        "panel_count": "integer",
        "panel_id": "integer",
        "inclination": "number",
        "orientation": "number",
        "panel_configuration": "object",
        "row_orientations": "object",
        "spacing": "number",
        "portrait": "boolean",
        "mounting_brand": "string"
      }
    ],
    "inverters": [
      {
        "id": "integer",
        "sku": "string",
        "panels_in_strings": [
          "integer"
        ]
      }
    ]
  },
  "pdfs": [
    {
      "generated_at": "string",
      "url": "string"
    }
  ],
  "financials": {
    "markup_percentage": "number",
    "subtotal_before_discount": "number",
    "loan": {
      "amount": "number",
      "duration": "number",
      "interest_rate": "number"
    },
    "discount": [
      {
        "type": "string",
        "description": "string",
        "value": "number"
      }
    ],
    "total_ex_vat": "number",
    "vat": "number",
    "vat_tariff": "number",
    "total": "number",
    "deposits": [
      {
        "amount": "number",
        "percentage": "number"
      }
    ],
    "payback_time": "number",
    "irr": "number",
    "total_cashflow_after_25_years": "number"
  },
  "state": "string",
  "package": {
    "id": "integer",
    "name": "string",
    "description": "string",
    "price": "number",
    "panel_id": "integer",
    "panel_count": "integer",
    "inverter_id": "integer",
    "optimizer_id": "integer",
    "sku": "string"
  },
  "simple": "boolean",
  "bill_of_materials": [
    {
      "id": "number",
      "count": "number",
      "name": "string",
      "names": {
        "nl": "string",
        "fr": "string",
        "en": "string",
        "es": "string"
      },
      "description": {
        "nl": "string",
        "fr": "string",
        "en": "string",
        "es": "string"
      },
      "type": "string",
      "price": "number",
      "sku": "string"
    }
  ],
  "created_at": "string",
  "last_updated": "string",
  "accepted_by": "string",
  "accepted_time": "string (date-time)",
  "expiration_date": "string (date-time)",
  "superseded_by": "integer"
}
Response Headers (200 OK)
X-Rate-Limit-Limit

The number of allowed requests.

integer
Response Example (401 Unauthorized)
{
  "detail": "string"
}
Response Example (404 Not Found)
{
  "detail": "string"
}

PATCH /quotes/{integration}/{external_id}/

integration: string
in path

One of 'salesforce', 'zoho', 'pipedrive'.

external_id: string
in path

Id at integration

integration: string
in path

(no description)

external_id: string
in path

(no description)

Request Example
{
  "name": "string",
  "name_suffix": "string",
  "remarks": "string",
  "state": "string",
  "external_id": "string"
}
200 OK

Quote updated

400 Bad Request

Bad data

401 Unauthorized

Unauthorized

Response Example (200 OK)
{
  "name": "string",
  "name_suffix": "string",
  "remarks": "string",
  "state": "string"
}
Response Example (400 Bad Request)
{
  "detail": "string"
}
Response Example (401 Unauthorized)
{
  "detail": "string"
}

GET /quotes/{integration}/{external_id}/systemdesign/ballast_image/

integration: string
in path

One of 'salesforce', 'zoho', 'pipedrive'.

external_id: string
in path

Id at integration

integration: string
in path

(no description)

external_id: string
in path

(no description)

Response Example (200 OK)
{
  "status": "string",
  "result": "string"
}

GET /quotes/{integration}/{external_id}/systemdesign/design_image/

integration: string
in path

One of 'salesforce', 'zoho', 'pipedrive'.

external_id: string
in path

Id at integration

integration: string
in path

(no description)

external_id: string
in path

(no description)

Response Example (200 OK)
{
  "status": "string",
  "result": "string"
}

GET /quotes/{integration}/{external_id}/systemdesign/elevation_image/

integration: string
in path

One of 'salesforce', 'zoho', 'pipedrive'.

external_id: string
in path

Id at integration

integration: string
in path

(no description)

external_id: string
in path

(no description)

Response Example (200 OK)
{
  "status": "string",
  "result": "string"
}

GET /quotes/{integration}/{external_id}/systemdesign/obstacle_image/

integration: string
in path

One of 'salesforce', 'zoho', 'pipedrive'.

external_id: string
in path

Id at integration

integration: string
in path

(no description)

external_id: string
in path

(no description)

Response Example (200 OK)
{
  "status": "string",
  "result": "string"
}

Schema Definitions

Address: object

Please provide 'postcode' + 'housenumber' or 'city' + 'street' + 'housenumber'.

country: string (2 chars)

2 letter ISO 3166-1 alpha-2 country code

administrative_area_level_1: string | null (1 to 3 chars)

Optional region for Belgium. One of 'VLG', 'WAL', 'BRU'

city: string (at least 1 chars)

City

street: string | null

Street

postcode: string | null

Postal Code

housenumber: string | null

House Number

Example
{
  "country": "string",
  "administrative_area_level_1": "string",
  "city": "string",
  "street": "string",
  "postcode": "string",
  "housenumber": "string"
}

Error Response: object

detail: string
Example
{
  "detail": "string"
}

Battery: object

id: integer
manufacturer: string (up to 50 chars)
model: string (up to 50 chars)
usable_energy_kwh: number
Example
{
  "id": "integer",
  "manufacturer": "string",
  "model": "string",
  "usable_energy_kwh": "number"
}

CatalogueElement: object

id: integer
sku: string (at least 1 chars)
enabled: boolean
element_type: string (at least 1 chars)
element_id: integer | null
element_url: string | null (uri) (at least 1 chars)
names: object
descriptions: object
price: string (decimal)
Example
{
  "id": "integer",
  "sku": "string",
  "enabled": "boolean",
  "element_type": "string",
  "element_id": "integer",
  "element_url": "string (uri)",
  "names": "object",
  "descriptions": "object",
  "price": "string (decimal)"
}

CataloguePackage: object

id: integer
name: string (at least 1 chars)
panel_count: integer
price: string (decimal)
panel_id: integer
sku: string
descriptions: object
panel_url: string
inverter_id: integer | null
inverter_url: string
optimizer_id: integer | null
optimizer_url: string
Example
{
  "id": "integer",
  "name": "string",
  "panel_count": "integer",
  "price": "string (decimal)",
  "panel_id": "integer",
  "sku": "string",
  "descriptions": "object",
  "panel_url": "string",
  "inverter_id": "integer",
  "inverter_url": "string",
  "optimizer_id": "integer",
  "optimizer_url": "string"
}

Delayed Result: object

status: string

One of PENDING, RECEIVED, STARTED, SUCCESS, REVOKED, FAILURE, RETRY. Where the last three are failure states, and the first three denote the task isn't done yet.

result: string

When status == SUCCESS, this is your result. In case of one of the failure states, it's the error message.

Example
{
  "status": "string",
  "result": "string"
}

Inverter: object

id: integer
model: string
manufacturer: string (up to 50 chars)
specsheet: string | null (uri)
sort_key: string (up to 25 chars)
efficiency: string (decimal)

Euro efficiency

remarks: string
watt_peak: integer 0 ≤ x ≤ 4294967295

rated AC power

optimizers: boolean

e.g. SolarEdge

micro_inverter: boolean
string_inputs: integer 0 ≤ x ≤ 65535

DC inputs with MPP trackers

nominal_dc_voltage: integer 0 ≤ x ≤ 65535
start_voltage: string (decimal)

DC start voltage

self_consumption_night: string (decimal)
min_voltage_in: integer 0 ≤ x ≤ 65535

DC voltage range

max_voltage_in: integer 0 ≤ x ≤ 65535

DC voltage range

max_power_in: integer 0 ≤ x ≤ 4294967295

DC power max

max_current_in: string (decimal)

Max DC current

mppt_min_voltage: integer 0 ≤ x ≤ 65535

MPP voltage range

mppt_max_voltage: integer 0 ≤ x ≤ 65535

MPP voltage range

undersizing: string (decimal)

Min inverter Wp / total panel Wp

oversizing: string (decimal)

Max inverter Wp / total panel Wp

Example
{
  "id": "integer",
  "model": "string",
  "manufacturer": "string",
  "specsheet": "string (uri)",
  "sort_key": "string",
  "efficiency": "string (decimal)",
  "remarks": "string",
  "watt_peak": "integer",
  "optimizers": "boolean",
  "micro_inverter": "boolean",
  "string_inputs": "integer",
  "nominal_dc_voltage": "integer",
  "start_voltage": "string (decimal)",
  "self_consumption_night": "string (decimal)",
  "min_voltage_in": "integer",
  "max_voltage_in": "integer",
  "max_power_in": "integer",
  "max_current_in": "string (decimal)",
  "mppt_min_voltage": "integer",
  "mppt_max_voltage": "integer",
  "undersizing": "string (decimal)",
  "oversizing": "string (decimal)"
}

Optimizers: object

id: integer
manufacturer: string (up to 50 chars)
model: string (up to 50 chars)
specsheet: string | null (uri)
specsheet_language: string | null nl, en, es, fr, de
specsheet_date: string | null (date)
is_verified: boolean
is_archived: boolean
efficiency: string | null (decimal)

Weighted/euro efficiency

max_power_in: integer 0 ≤ x ≤ 65535

Rated DC input power

max_current_in: string (decimal)

Max continuous current in (Isc)

max_voltage_in: integer 0 ≤ x ≤ 65535

Absolute max input voltage (Voc @ min temp)

max_voltage_out: integer 0 ≤ x ≤ 65535
max_current_out: string (decimal)
n_panels_in: integer 0 ≤ x ≤ 65535

Number of panels in series per mmpt input

n_mppts_in: integer | null 0 ≤ x ≤ 65535

Number of inputs. MPPTs

mppt_min_voltage: string | null (decimal)

MPPT operating voltage range

mppt_max_voltage: string | null (decimal)

MPPT operating voltage range

min_string_length_1_phase: integer | null 0 ≤ x ≤ 65535

Number of optimizers.

max_string_length_1_phase: integer | null 0 ≤ x ≤ 65535

Number of optimizers

min_string_length_3_phase: integer | null 0 ≤ x ≤ 65535

Number of optimizers. Ignore 277/480 those are for Americans.

max_string_length_3_phase: integer | null 0 ≤ x ≤ 65535

Number of optimizers. Ignore 277/480 those are for Americans.

min_compatible_1_phase_inverter: integer | null 0 ≤ x ≤ 65535

The power in W. If compatible with all use 0. If not compatible leave blank.

min_compatible_3_phase_inverter: integer | null 0 ≤ x ≤ 65535

The power in W. If compatible with all use 0. If not compatible leave blank.

special_case: boolean | null

Is there any unique logic or rules that are different.If not sure mark as true.

remarks: string | null
Example
{
  "id": "integer",
  "manufacturer": "string",
  "model": "string",
  "specsheet": "string (uri)",
  "specsheet_language": "string",
  "specsheet_date": "string (date)",
  "is_verified": "boolean",
  "is_archived": "boolean",
  "efficiency": "string (decimal)",
  "max_power_in": "integer",
  "max_current_in": "string (decimal)",
  "max_voltage_in": "integer",
  "max_voltage_out": "integer",
  "max_current_out": "string (decimal)",
  "n_panels_in": "integer",
  "n_mppts_in": "integer",
  "mppt_min_voltage": "string (decimal)",
  "mppt_max_voltage": "string (decimal)",
  "min_string_length_1_phase": "integer",
  "max_string_length_1_phase": "integer",
  "min_string_length_3_phase": "integer",
  "max_string_length_3_phase": "integer",
  "min_compatible_1_phase_inverter": "integer",
  "min_compatible_3_phase_inverter": "integer",
  "special_case": "boolean",
  "remarks": "string"
}

Panel: object

id: integer
type: string mono, poly, thin_film
colour: string blue, black
length: string
width: string
watt_peak: integer 0 ≤ x ≤ 65535
manufacturer: string (up to 50 chars)
model: string
optimizer_builtin: boolean
specsheet: string | null (uri)
Example
{
  "id": "integer",
  "type": "string",
  "colour": "string",
  "length": "string",
  "width": "string",
  "watt_peak": "integer",
  "manufacturer": "string",
  "model": "string",
  "optimizer_builtin": "boolean",
  "specsheet": "string (uri)"
}

Project Item: object

id: integer
app_link: string
first_name: string (at least 1 chars)
infix: string (at least 1 chars)
last_name: string (at least 1 chars)
street: string (at least 1 chars)
house_number: string (at least 1 chars)
postcode: string | null (up to 10 chars)
city: string (at least 1 chars)
country: string BE, DE, LU, ES, NL, GB, FR, IT, AT
longitude: string | null (decimal)
latitude: string | null (decimal)
billing_address: string | null
language: string | null nl, en, es, fr, de
is_b2b: boolean
custom_fields: string | null
email: string (email) (up to 256 chars)
comments: string (at least 1 chars)
created_at: string (at least 1 chars)
last_modified: string (at least 1 chars)
quotes_count: integer
owner: integer | null
Example
{
  "id": "integer",
  "app_link": "string",
  "first_name": "string",
  "infix": "string",
  "last_name": "string",
  "street": "string",
  "house_number": "string",
  "postcode": "string",
  "city": "string",
  "country": "string",
  "longitude": "string (decimal)",
  "latitude": "string (decimal)",
  "billing_address": "string",
  "language": "string",
  "is_b2b": "boolean",
  "custom_fields": "string",
  "email": "string (email)",
  "comments": "string",
  "created_at": "string",
  "last_modified": "string",
  "quotes_count": "integer",
  "owner": "integer"
}

Contact Details: object

first_name: string (up to 100 chars)
insertion: string (up to 10 chars)
last_name: string (up to 100 chars)
email: string (email) (up to 256 chars)
phone: string (up to 20 chars)
Example
{
  "first_name": "string",
  "insertion": "string",
  "last_name": "string",
  "email": "string (email)",
  "phone": "string"
}

Project: object

name: string (up to 255 chars)
contact: Contact Details
address: Address
billing_address: string (up to 255 chars)
custom_fields: object | null [object Object]

JSON data mapping.

E.g: {"company_name": "Acme bv", "company_nr": 123456}

is_b2b: boolean | null false
language: string | null (2 chars)
network_phase: string | null (1 to 3 chars)
annual_power_consumption_kwh: integer | null
owner: string (email) (up to 256 chars)
Example
{
  "name": "string",
  "contact": {
    "first_name": "string",
    "insertion": "string",
    "last_name": "string",
    "email": "string (email)",
    "phone": "string"
  },
  "address": {
    "country": "string",
    "administrative_area_level_1": "string",
    "city": "string",
    "street": "string",
    "postcode": "string",
    "housenumber": "string"
  },
  "billing_address": "string",
  "custom_fields": "object",
  "is_b2b": "boolean",
  "language": "string",
  "network_phase": "string",
  "annual_power_consumption_kwh": "integer",
  "owner": "string (email)"
}

Created Project: object

id: integer

ID of the created project.

Example
{
  "id": "integer"
}

Quote Item: object

id: integer
name: string (at least 1 chars)
type: string
state: string (at least 1 chars)
app_link: string
Example
{
  "id": "integer",
  "name": "string",
  "type": "string",
  "state": "string",
  "app_link": "string"
}

Project Detail: object

quotes: Quote Item
Quote Item
name: string (1 to 255 chars)
id: integer
contact: Contact Details
address: Address
billing_address: string (at least 1 chars)
comments: string (at least 1 chars)
kwh_price: string (at least 1 chars)
last_modified: string (at least 1 chars)
created_at: string (at least 1 chars)
custom_fields: object

JSON data mapping.

E.g: {"company_name": "Acme bv", "company_nr": 123456}

is_b2b: boolean | null false
language: string | null (2 chars)
annual_power_consumption_kwh: integer
owner: string
app_link: string
vat_tariff: string (decimal)
network_phase: string | null (2 to 3 chars)
online_offer_link: string | null (at least 1 chars)
expected_global_irradiance: integer | null
Example
{
  "quotes": [
    {
      "id": "integer",
      "name": "string",
      "type": "string",
      "state": "string",
      "app_link": "string"
    }
  ],
  "name": "string",
  "id": "integer",
  "contact": {
    "first_name": "string",
    "insertion": "string",
    "last_name": "string",
    "email": "string (email)",
    "phone": "string"
  },
  "address": {
    "country": "string",
    "administrative_area_level_1": "string",
    "city": "string",
    "street": "string",
    "postcode": "string",
    "housenumber": "string"
  },
  "billing_address": "string",
  "comments": "string",
  "kwh_price": "string",
  "last_modified": "string",
  "created_at": "string",
  "custom_fields": "object",
  "is_b2b": "boolean",
  "language": "string",
  "annual_power_consumption_kwh": "integer",
  "owner": "string",
  "app_link": "string",
  "vat_tariff": "string (decimal)",
  "network_phase": "string",
  "online_offer_link": "string",
  "expected_global_irradiance": "integer"
}

Project with integration: object

name: string (up to 255 chars)
contact: Contact Details
address: Address
billing_address: string (up to 255 chars)
custom_fields: object | null [object Object]

JSON data mapping.

E.g: {"company_name": "Acme bv", "company_nr": 123456}

is_b2b: boolean | null false
language: string | null (2 chars)
network_phase: string | null (1 to 3 chars)
annual_power_consumption_kwh: integer | null
owner: string (email) (up to 256 chars)
external_id: string (1 to 255 chars)
Example
{
  "name": "string",
  "contact": {
    "first_name": "string",
    "insertion": "string",
    "last_name": "string",
    "email": "string (email)",
    "phone": "string"
  },
  "address": {
    "country": "string",
    "administrative_area_level_1": "string",
    "city": "string",
    "street": "string",
    "postcode": "string",
    "housenumber": "string"
  },
  "billing_address": "string",
  "custom_fields": "object",
  "is_b2b": "boolean",
  "language": "string",
  "network_phase": "string",
  "annual_power_consumption_kwh": "integer",
  "owner": "string (email)",
  "external_id": "string"
}

Minimal quote details: object

name: string (1 to 255 chars)
project_id: integer
copy_from: integer
type: string (1 to 10 chars)
id: integer
Example
{
  "name": "string",
  "project_id": "integer",
  "copy_from": "integer",
  "type": "string",
  "id": "integer"
}

String Configuration: object

inverter_id: integer
inverter_sku: string (at least 1 chars)
connected_panel_count: integer
Example
{
  "inverter_id": "integer",
  "inverter_sku": "string",
  "connected_panel_count": "integer"
}

Yields: object

yield_year1: number
yields_per_month: string
Example
{
  "yield_year1": "number",
  "yields_per_month": "string"
}

GridSerializerExternal: object

panel_count: integer
panel_id: integer
inclination: number
orientation: number
panel_configuration: object
row_orientations: object
spacing: number

Gap between panel rows, in cm. In the case of east-west, it's the gap between 2 row combinations. When mounting is selected for this grid, then spacing will always be 0.

portrait: boolean
mounting_brand: string | null (at least 1 chars)
Example
{
  "panel_count": "integer",
  "panel_id": "integer",
  "inclination": "number",
  "orientation": "number",
  "panel_configuration": "object",
  "row_orientations": "object",
  "spacing": "number",
  "portrait": "boolean",
  "mounting_brand": "string"
}

InverterSerializerExternal: object

id: integer
sku: string (at least 1 chars)
panels_in_strings: integer[]
integer
Example
{
  "id": "integer",
  "sku": "string",
  "panels_in_strings": [
    "integer"
  ]
}

System Design: object

total_watt_peak: integer
panel_count: string
string_configuration: String Configuration
String Configuration
yields: Yields
gutter_height: number
design_image_url: string
elevation_image_url: string
obstacle_image_url: string
ballast_image_url: string
grids: GridSerializerExternal
GridSerializerExternal
inverters: InverterSerializerExternal
InverterSerializerExternal
Example
{
  "total_watt_peak": "integer",
  "panel_count": "string",
  "string_configuration": [
    {
      "inverter_id": "integer",
      "inverter_sku": "string",
      "connected_panel_count": "integer"
    }
  ],
  "yields": {
    "yield_year1": "number",
    "yields_per_month": "string"
  },
  "gutter_height": "number",
  "design_image_url": "string",
  "elevation_image_url": "string",
  "obstacle_image_url": "string",
  "ballast_image_url": "string",
  "grids": [
    {
      "panel_count": "integer",
      "panel_id": "integer",
      "inclination": "number",
      "orientation": "number",
      "panel_configuration": "object",
      "row_orientations": "object",
      "spacing": "number",
      "portrait": "boolean",
      "mounting_brand": "string"
    }
  ],
  "inverters": [
    {
      "id": "integer",
      "sku": "string",
      "panels_in_strings": [
        "integer"
      ]
    }
  ]
}

Generated Report: object

generated_at: string
url: string
Example
{
  "generated_at": "string",
  "url": "string"
}

PackageSerializerExternal: object

id: integer
name: string (at least 1 chars)
description: string
price: number
panel_id: integer
panel_count: integer
inverter_id: integer
optimizer_id: integer
sku: string (at least 1 chars)
Example
{
  "id": "integer",
  "name": "string",
  "description": "string",
  "price": "number",
  "panel_id": "integer",
  "panel_count": "integer",
  "inverter_id": "integer",
  "optimizer_id": "integer",
  "sku": "string"
}

Quote Detail: object

id: integer
name: string (at least 1 chars)
name_suffix: string (at least 1 chars)
project_id: integer
remarks: string (at least 1 chars)
type: string
system_design: System Design
pdfs: Generated Report
Generated Report
financials: object
markup_percentage: number
subtotal_before_discount: number
loan: object
amount: number
duration: number
interest_rate: number
discount: object[]
object
type: string
description: string
value: number
total_ex_vat: number
vat: number
vat_tariff: number
total: number
deposits: object[]
object
amount: number
percentage: number
payback_time: number
irr: number
total_cashflow_after_25_years: number
string | null
state: string
package: PackageSerializerExternal
simple: boolean false
bill_of_materials: object[]
object
id: number
count: number
name: string
names: object
nl: string
fr: string
en: string
es: string
description: object
nl: string
fr: string
en: string
es: string
type: string panel, inverter, optimizer, custom
price: number
sku: string
created_at: string (at least 1 chars)
last_updated: string (at least 1 chars)
accepted_by: string (at least 1 chars)
accepted_time: string (date-time)
expiration_date: string (date-time)
superseded_by: integer
Example
{
  "id": "integer",
  "name": "string",
  "name_suffix": "string",
  "project_id": "integer",
  "remarks": "string",
  "type": "string",
  "system_design": {
    "total_watt_peak": "integer",
    "panel_count": "string",
    "string_configuration": [
      {
        "inverter_id": "integer",
        "inverter_sku": "string",
        "connected_panel_count": "integer"
      }
    ],
    "yields": {
      "yield_year1": "number",
      "yields_per_month": "string"
    },
    "gutter_height": "number",
    "design_image_url": "string",
    "elevation_image_url": "string",
    "obstacle_image_url": "string",
    "ballast_image_url": "string",
    "grids": [
      {
        "panel_count": "integer",
        "panel_id": "integer",
        "inclination": "number",
        "orientation": "number",
        "panel_configuration": "object",
        "row_orientations": "object",
        "spacing": "number",
        "portrait": "boolean",
        "mounting_brand": "string"
      }
    ],
    "inverters": [
      {
        "id": "integer",
        "sku": "string",
        "panels_in_strings": [
          "integer"
        ]
      }
    ]
  },
  "pdfs": [
    {
      "generated_at": "string",
      "url": "string"
    }
  ],
  "financials": {
    "markup_percentage": "number",
    "subtotal_before_discount": "number",
    "loan": {
      "amount": "number",
      "duration": "number",
      "interest_rate": "number"
    },
    "discount": [
      {
        "type": "string",
        "description": "string",
        "value": "number"
      }
    ],
    "total_ex_vat": "number",
    "vat": "number",
    "vat_tariff": "number",
    "total": "number",
    "deposits": [
      {
        "amount": "number",
        "percentage": "number"
      }
    ],
    "payback_time": "number",
    "irr": "number",
    "total_cashflow_after_25_years": "number"
  },
  "state": "string",
  "package": {
    "id": "integer",
    "name": "string",
    "description": "string",
    "price": "number",
    "panel_id": "integer",
    "panel_count": "integer",
    "inverter_id": "integer",
    "optimizer_id": "integer",
    "sku": "string"
  },
  "simple": "boolean",
  "bill_of_materials": [
    {
      "id": "number",
      "count": "number",
      "name": "string",
      "names": {
        "nl": "string",
        "fr": "string",
        "en": "string",
        "es": "string"
      },
      "description": {
        "nl": "string",
        "fr": "string",
        "en": "string",
        "es": "string"
      },
      "type": "string",
      "price": "number",
      "sku": "string"
    }
  ],
  "created_at": "string",
  "last_updated": "string",
  "accepted_by": "string",
  "accepted_time": "string (date-time)",
  "expiration_date": "string (date-time)",
  "superseded_by": "integer"
}

Quote Update: object

name: string (at least 1 chars)
name_suffix: string (at least 1 chars)
remarks: string (at least 1 chars)
state: string (at least 1 chars)
Example
{
  "name": "string",
  "name_suffix": "string",
  "remarks": "string",
  "state": "string"
}

Quote with integration: object

name: string (1 to 255 chars)
project_id: integer
copy_from: integer
type: string (1 to 10 chars)
id: integer
external_id: string (at least 1 chars)
Example
{
  "name": "string",
  "project_id": "integer",
  "copy_from": "integer",
  "type": "string",
  "id": "integer",
  "external_id": "string"
}

Quote Update with integration: object

name: string (at least 1 chars)
name_suffix: string (at least 1 chars)
remarks: string (at least 1 chars)
state: string (at least 1 chars)
external_id: string (at least 1 chars)
Example
{
  "name": "string",
  "name_suffix": "string",
  "remarks": "string",
  "state": "string",
  "external_id": "string"
}