Studio

User-uploaded energy consumption data from CSV imports or smart meters. Enables precise solar optimization based on actual historical usage. See Accuracy — Studio Profile.


GET/v1/studio-profiles

List studio profiles

List all studio profiles for the authenticated organization. Returns lightweight metadata (no hourly data). Uses organizationId query param or falls back to personal organization.

Query parameters

  • Name
    organizationId
    Type
    string
    Description

    Organization to list profiles for. Defaults to personal organization.

Response

Request

GET
/v1/studio-profiles
curl -G https://api.enhub.nl/v1/studio-profiles \
  -H "Authorization: Bearer {token}"

Response

[
  {
    "id": "cm5k2l3m4000008l8a1b2c3d4",
    "name": "Profiel 1",
    "baseProfileType": "template",
    "baseProfileName": "Alleenstaand",
    "totalKwh": 3200,
    "peakKw": 4.2,
    "totalExportKwh": 1500,
    "peakExportKw": 3.5,
    "layerCount": 3,
    "hasSolarLayer": false,
    "year": 2026,
    "updatedAt": "2025-01-15T10:30:00.000Z"
  }
]

POST/v1/studio-profiles

Create new studio profile

Create a new empty studio profile. The name defaults to "Profiel N" based on the number of existing profiles in the project.

Optional attributes

  • Name
    organizationId
    Type
    string
    Description

    Organization ID to associate the profile with

  • Name
    name
    Type
    string
    Description

    Display name for the profile

  • Name
    year
    Type
    number
    Description

    Profile year

Response

Request

POST
/v1/studio-profiles
curl -X POST https://api.enhub.nl/v1/studio-profiles \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
  "organizationId": "string",
  "name": "Profiel 1",
  "year": 2026
}'

Response (201 Created)

{
  "id": "cm5k2l3m4000008l8a1b2c3d4",
  "name": "Profiel 1",
  "baseProfileType": "template",
  "baseProfileName": "Alleenstaand",
  "totalKwh": 3200,
  "peakKw": 4.2,
  "totalExportKwh": 1500,
  "peakExportKw": 3.5,
  "layerCount": 3,
  "hasSolarLayer": false,
  "year": 2026,
  "userId": "string",
  "organizationId": "string",
  "createdAt": "2025-01-15T10:30:00.000Z",
  "updatedAt": "2025-01-15T10:30:00.000Z"
}

GET/v1/studio-profiles/:id

Fetch complete studio profile

Load a studio profile with its full editor state (base profile, layers, result).

Path parameters

  • Name
    id
    Type
    string
    Description

    No description available.

Query parameters

  • Name
    organizationId
    Type
    string
    Description

    Organization context. Defaults to personal organization.

Response

Request

GET
/v1/studio-profiles/:id
curl -G https://api.enhub.nl/v1/studio-profiles/{id} \
  -H "Authorization: Bearer {token}"

Response

{
  "id": "cm5k2l3m4000008l8a1b2c3d4",
  "name": "Profiel 1",
  "baseProfileType": "template",
  "baseProfileName": "Alleenstaand",
  "totalKwh": 3200,
  "peakKw": 4.2,
  "totalExportKwh": 1500,
  "peakExportKw": 3.5,
  "layerCount": 3,
  "hasSolarLayer": false,
  "year": 2026,
  "userId": "string",
  "organizationId": "string",
  "createdAt": "2025-01-15T10:30:00.000Z",
  "updatedAt": "2025-01-15T10:30:00.000Z",
  "studioState": null
}

POST/v1/studio-profiles/:id/duplicate

Duplicate studio profile

Create a copy of a studio profile, including its state file. The name defaults to "{original name} (kopie)".

Path parameters

  • Name
    id
    Type
    string
    Description

    No description available.

Optional attributes

  • Name
    name
    Type
    string
    Description

    Name for the duplicated profile

Query parameters

  • Name
    organizationId
    Type
    string
    Description

    No description available.

Response

Request

POST
/v1/studio-profiles/:id/duplicate
curl -X POST https://api.enhub.nl/v1/studio-profiles/{id}/duplicate \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Profiel 1 (kopie)"
}'

Response (201 Created)

{
  "id": "cm5k2l3m4000008l8a1b2c3d4",
  "name": "Profiel 1",
  "baseProfileType": "template",
  "baseProfileName": "Alleenstaand",
  "totalKwh": 3200,
  "peakKw": 4.2,
  "totalExportKwh": 1500,
  "peakExportKw": 3.5,
  "layerCount": 3,
  "hasSolarLayer": false,
  "year": 2026,
  "userId": "string",
  "organizationId": "string",
  "createdAt": "2025-01-15T10:30:00.000Z",
  "updatedAt": "2025-01-15T10:30:00.000Z"
}

PUT/v1/studio-profiles/:id

Save studio profile

Full save of the studio profile editor state. Uploads the complete state (base profile, layers with configs + computed data, result array). Also updates DB summary stats and writes the result to the profile JSONB column for scan compatibility.

Path parameters

  • Name
    id
    Type
    string
    Description

    No description available.

Required attributes

  • Name
    studioState
    Type
    StudioStateDto

Optional attributes

  • Name
    year
    Type
    number
    Description

    Profile year

Query parameters

  • Name
    organizationId
    Type
    string
    Description

    No description available.

Response

Request

PUT
/v1/studio-profiles/:id
curl -X PUT https://api.enhub.nl/v1/studio-profiles/{id} \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
  "studioState": {
    "baseProfile": {
      "type": "template",
      "templateId": "string",
      "name": "Alleenstaand",
      "description": "string",
      "annualKwh": 2500,
      "data": [
        0
      ],
      "exportData": [
        0
      ],
      "originalData": [
        0
      ]
    },
    "layers": [
      {
        "id": "string",
        "type": "ev_charger",
        "name": "Elektrische auto",
        "enabled": true,
        "config": null,
        "data": [
          "..."
        ]
      }
    ],
    "result": [
      0
    ],
    "exportResult": [
      0
    ],
    "productionResult": [
      0
    ]
  },
  "year": 2026
}'

Response

{
  "id": "cm5k2l3m4000008l8a1b2c3d4",
  "name": "Profiel 1",
  "baseProfileType": "template",
  "baseProfileName": "Alleenstaand",
  "totalKwh": 3200,
  "peakKw": 4.2,
  "totalExportKwh": 1500,
  "peakExportKw": 3.5,
  "layerCount": 3,
  "hasSolarLayer": false,
  "year": 2026,
  "userId": "string",
  "organizationId": "string",
  "createdAt": "2025-01-15T10:30:00.000Z",
  "updatedAt": "2025-01-15T10:30:00.000Z"
}

PATCH/v1/studio-profiles/:id

Rename studio profile

Update the display name of a studio profile.

Path parameters

  • Name
    id
    Type
    string
    Description

    No description available.

Required attributes

  • Name
    name
    Type
    string
    Description

    Updated display name for the profile

Query parameters

  • Name
    organizationId
    Type
    string
    Description

    No description available.

Response

Request

PATCH
/v1/studio-profiles/:id
curl -X PATCH https://api.enhub.nl/v1/studio-profiles/{id} \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Mijn thuisprofiel"
}'

Response

{
  "id": "cm5k2l3m4000008l8a1b2c3d4",
  "name": "Profiel 1",
  "baseProfileType": "template",
  "baseProfileName": "Alleenstaand",
  "totalKwh": 3200,
  "peakKw": 4.2,
  "totalExportKwh": 1500,
  "peakExportKw": 3.5,
  "layerCount": 3,
  "hasSolarLayer": false,
  "year": 2026,
  "userId": "string",
  "organizationId": "string",
  "createdAt": "2025-01-15T10:30:00.000Z",
  "updatedAt": "2025-01-15T10:30:00.000Z"
}

DELETE/v1/studio-profiles/:id

Delete studio profile

Delete a studio profile and state file. If this profile is referenced by any scans, those references will be set to null.

Path parameters

  • Name
    id
    Type
    string
    Description

    No description available.

Query parameters

  • Name
    organizationId
    Type
    string
    Description

    No description available.

Response

Request

DELETE
/v1/studio-profiles/:id
curl -X DELETE https://api.enhub.nl/v1/studio-profiles/{id} \
  -H "Authorization: Bearer {token}"

Was this page helpful?