Load Profiles

Load profiles represent the electricity consumption patterns throughout the year. Enhub provides standard profiles for common household types, and you can also upload custom profiles for more accurate optimization based on real consumption data.


Understanding Load Profiles

A load profile is an 8760-element array (one value per hour for a full year) representing the power consumption pattern in kilowatts (kW) for each hour. When you specify an annual consumption (e.g., 5000 kWh/year), the load profile is scaled to match that total while preserving the consumption pattern.

Standard Profiles

Enhub includes four built-in load profiles optimized for different household types:

  • Name
    standard
    Type
    string
    Description

    Default residential profile. Balanced consumption throughout the day with typical morning and evening peaks. Suitable for households with varied schedules.

  • Name
    coupleBothAtWork
    Type
    string
    Description

    Two-person household where both work outside the home during weekdays. Lower daytime consumption (9am-5pm), higher evening peaks. Weekend pattern shows more distributed usage.

  • Name
    couple1home1work
    Type
    string
    Description

    Two-person household where one person works from home. More consistent daytime consumption compared to coupleBothAtWork, with moderate peaks in morning and evening.

  • Name
    3kidsbothwork
    Type
    string
    Description

    Family with three children where both parents work. Higher overall consumption, strong morning peak (breakfast, school preparation), reduced midday usage, high evening peak (after school, dinner, activities).


POST/v1/load-profile

Create a custom load profile

Upload a custom load profile based on your actual energy consumption data. The profile must contain exactly 8760 hourly values (one year of data) representing power consumption in kilowatts (kW) for each hour.

Request Format

This endpoint accepts a multipart/form-data request with a CSV file upload.

  • Name
    csv
    Type
    file
    Required
    required
    Description

    CSV file containing exactly 8760 rows with a single column of numeric values. Each value represents the power consumption (kW) for that hour of the year.

    Requirements:

    • Must contain exactly 8760 rows (365 days × 24 hours)
    • Single column of numeric values (no headers)
    • Values represent instantaneous power in kW (not kWh)
    • First row = Jan 1, 12:00 AM - 1:00 AM
    • Last row = Dec 31, 11:00 PM - 12:00 AM

    CSV Format Example:

    0.234
    0.198
    0.187
    0.203
    ...
    (8760 rows total)
    

Response Fields

  • Name
    success
    Type
    boolean
    Description

    Whether the upload and processing succeeded.

  • Name
    record_id
    Type
    string
    Description

    Unique identifier for the created custom load profile. Use this ID as the load_profile parameter when creating a scan with use_custom_load_profile: true. See Create a scan for details.

  • Name
    filename
    Type
    string
    Description

    Original filename of the uploaded CSV file.

  • Name
    data_points
    Type
    number
    Description

    Number of hourly data points in the profile (should always be 8760).

  • Name
    total_kwh
    Type
    number
    Description

    Sum of all hourly power values, representing the total annual energy consumption implied by the profile. Note: This is the total of the uploaded values and will be scaled when used in a scan based on the yearly_kwh parameter you provide.

  • Name
    average_kw
    Type
    number
    Description

    Average power consumption across all hours (total_kwh / 8760).

  • Name
    hourly_data
    Type
    array
    Description

    Array of all 8760 hourly values that were uploaded. Can be used to verify the upload was processed correctly.

Request

POST
/v1/load-profile
curl -X POST https://api.enhub.nl/v1/load-profile \
  -H "Authorization: Bearer {token}" \
  -F "csv=@my_hourly_consumption.csv"

Response

200
success
{
  "success": true,
  "record_id": "abc123xyz789",
  "filename": "my_hourly_consumption.csv",
  "data_points": 8760,
  "total_kwh": 4832.45,
  "average_kw": 0.551,
  "hourly_data": [
    0.234,
    0.198,
    0.187,
    0.203,
    "... 8756 more values ..."
  ]
}

Response

400
validation error
{
  "error": "Failed to get uploaded file",
  "message": "csv file is required"
}   

Response

500
server error
{
  "error": "Failed to create profile record",
  "message": "<REASON OR MESSAGE>"
}   

GET/v1/load-profile

List custom load profiles

Retrieve a paginated list of all your custom load profiles. This endpoint returns metadata about each profile including statistics, allowing you to browse and select profiles without downloading the full 8760 hourly values.

Query Parameters

  • Name
    page
    Type
    number
    Optional
    optional
    Description

    Page number to retrieve (1-indexed). Use this to navigate through multiple pages of results.

    Default: 1

  • Name
    per_page
    Type
    number
    Optional
    optional
    Description

    Number of profiles to return per page. Maximum allowed is 100.

    Default: 20

Response Fields

  • Name
    profiles
    Type
    array
    Description

    Array of custom load profile objects. Each profile contains:

    • Name
      record_id
      Type
      string
      Description

      Unique identifier for the profile. Use this as the load_profile parameter when creating a scan with use_custom_load_profile: true.

    • Name
      filename
      Type
      string
      Description

      Original filename of the uploaded CSV file.

    • Name
      total_kwh
      Type
      number
      Description

      Total annual energy consumption (kWh) represented by the profile. This is the sum of all 8760 hourly values.

    • Name
      average_kw
      Type
      number
      Description

      Average power consumption (kW) across all hours. Calculated as total_kwh / 8760.

    • Name
      created
      Type
      string
      Description

      ISO 8601 timestamp when the profile was created.

    • Name
      updated
      Type
      string
      Description

      ISO 8601 timestamp when the profile was last updated.

  • Name
    pagination
    Type
    object
    Description

    Pagination metadata for navigating through results.

    • Name
      page
      Type
      number
      Description

      Current page number.

    • Name
      per_page
      Type
      number
      Description

      Number of profiles per page.

    • Name
      total
      Type
      number
      Description

      Total number of profiles available.

    • Name
      total_pages
      Type
      number
      Description

      Total number of pages available.

    • Name
      has_next
      Type
      boolean
      Description

      Whether there is a next page available.

    • Name
      has_prev
      Type
      boolean
      Description

      Whether there is a previous page available.

Request

GET
/v1/load-profile
# Get first page (default)
curl -X GET 'https://api.enhub.nl/v1/load-profile' \
  -H "Authorization: Bearer {token}"

# Get specific page with custom page size
curl -X GET 'https://api.enhub.nl/v1/load-profile?page=2&per_page=10' \
  -H "Authorization: Bearer {token}"

Response

200
success
{
  "profiles": [
    {
      "record_id": "abc123xyz789",
      "filename": "my_house_2024.csv",
      "total_kwh": 4832.45,
      "average_kw": 0.551,
      "created": "2024-10-14T12:00:00Z",
      "updated": "2024-10-14T12:00:00Z"
    },
    {
      "record_id": "def456uvw012",
      "filename": "summer_consumption.csv",
      "total_kwh": 3245.78,
      "average_kw": 0.370,
      "created": "2024-09-20T08:30:00Z",
      "updated": "2024-09-20T08:30:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 20,
    "total": 2,
    "total_pages": 1,
    "has_next": false,
    "has_prev": false
  }
}

Response

200
empty list
{
  "profiles": [],
  "pagination": {
    "page": 1,
    "per_page": 20,
    "total": 0,
    "total_pages": 0,
    "has_next": false,
    "has_prev": false
  }
}

Response

401
unauthorized
{
  "error": "Authentication required",
  "message": null
}   

Response

500
server error
{
  "error": "Failed to fetch profiles",
  "message": "<REASON OR MESSAGE>"
}   

Using Custom Profiles in Scans

Once you've created a custom load profile, use the returned record_id when creating a scan. You can also retrieve the record_id of previously uploaded profiles using the List custom load profiles endpoint.

{
  "goal": "self-sufficiency",
  "yearly_kwh": 5000,
  "load_profile": "abc123xyz789",
  "use_custom_load_profile": true,
  // ... other parameters
}

The yearly_kwh parameter will scale your custom profile to match the specified annual consumption while preserving your consumption pattern. For example, if your uploaded profile totals 4832 kWh but you specify yearly_kwh: 5000, all hourly values will be scaled by a factor of ~1.035 (5000 / 4832).

See the Create a scan documentation for complete details on using custom load profiles in optimization scans.


Best Practices

Preparing Your CSV File

  1. Obtain hourly consumption data from your smart meter or energy provider
  2. Ensure exactly 8760 rows (one full non-leap year)
  3. Use power values (kW), not energy values (kWh per hour)
  4. Maintain chronological order starting from January 1st, 12:00 AM
  5. Remove headers - the CSV should contain only numeric values
  6. Use decimal points (not commas) for decimal values: 0.234 not 0,234

When to Use Custom Profiles

  • You have actual smart meter data from your home
  • Your consumption pattern differs significantly from standard profiles
  • You're analyzing commercial or industrial sites with unique usage patterns
  • You want the most accurate optimization results possible

When Standard Profiles Are Sufficient

  • You don't have historical consumption data
  • You're doing preliminary analysis or comparison
  • Your household matches one of the standard profile types
  • You're optimizing for a new building without usage history

Was this page helpful?