[Canonical page](<https://docs.dhtmlx.com/planning-engine/net/api/project-load-profile/>)
[Full documentation index](<https://docs.dhtmlx.com/planning-engine/llms.txt>)


# Project.LoadProfile

Reads per-bucket load and capacity of resources on the solved baseline of a [`Project`](<https://docs.dhtmlx.com/planning-engine/net/api/core/project/project.md>). Read-only. For the load of hypothetical dates, use [`Preview`](<https://docs.dhtmlx.com/planning-engine/net/api/project-preview.md>) with a [`Profile`](<https://docs.dhtmlx.com/planning-engine/net/api/core/project/preview-options.md#profile>) query instead.

## Signature

```csharp
public LoadProfile LoadProfile(LoadProfileOptions options)
```

Synchronous and CPU-only. Reads the project without changing it. [`Project`](<https://docs.dhtmlx.com/planning-engine/net/api/core/project/project.md>) isn't thread-safe, so don't call `LoadProfile` on one instance from several threads at once.

## Parameters

| Name | Type | Description |
|---|---|---|
| `options` | [`LoadProfileOptions`](<https://docs.dhtmlx.com/planning-engine/net/api/core/resources/load-profile-options.md>) | Range, resources, basis, task lists and an optional baseline check. A [`ProfileQuery`](<https://docs.dhtmlx.com/planning-engine/net/api/core/resources/profile-query.md>) converts to it implicitly, so `project.LoadProfile(query)` works. |

## Returns

A [`LoadProfile`](<https://docs.dhtmlx.com/planning-engine/net/api/core/resources/load-profile.md>).

## Errors

| Error | When |
|---|---|
| [`ProjectException`](<https://docs.dhtmlx.com/planning-engine/net/api/core/errors/project-exception.md>) with `Code == ProjectError.NoBaseline` | The project is unsolved, including after `Apply` |
| `ProjectException` with `Code == ProjectError.StaleBaseline` | `options.BaselineId` doesn't name the current baseline |
| [`InputException`](<https://docs.dhtmlx.com/planning-engine/net/api/core/errors/input-exception.md>) | `To <= From`, or more than 100 000 buckets per resource (path `to`); an unknown resource (path `resources`) |
| `ArgumentNullException` | `options` is `null` |

## Example

Print the overloaded days of a resource that works on two tasks at once.

```csharp
using Plen;

static Moment Day(int day) =>
    Moment.FromYmdHm(2026, 1, day, 0, 0) ?? throw new InvalidOperationException("invalid date");

static AssignmentData Assign(string task) =>
    new() { Task = task, Resource = "dev", Value = 1.0 };

var data = new ProjectData
{
    Tasks =
    [
        new TaskData("a") { StartDate = Day(1), Duration = 2.0 },
        new TaskData("b") { StartDate = Day(2), Duration = 2.0 },
    ],
    Resources = [new ResourceData { Id = "dev" }],
    Assignments = [Assign("a"), Assign("b")],
};
data.Config.UseCalendars = false;

var project = new Project();
project.Solve(data, new SolveOptions());

var profile = project.LoadProfile(new ProfileQuery(Day(1), Day(5)));
foreach (var resource in profile.Resources)
    foreach (var bucket in resource.Buckets.Where(b => b.Load > b.Capacity))
        Console.WriteLine($"{resource.Resource} at {bucket.Start}: {bucket.Load} of {bucket.Capacity}");
// dev at 2026-01-02 00:00: 2 of 1
```

## Related

- [`LoadProfileOptions`](<https://docs.dhtmlx.com/planning-engine/net/api/core/resources/load-profile-options.md>) - the options
- [`ProfileQuery`](<https://docs.dhtmlx.com/planning-engine/net/api/core/resources/profile-query.md>) - a query that converts to the options
- [`LoadProfile`](<https://docs.dhtmlx.com/planning-engine/net/api/core/resources/load-profile.md>) - the returned profile
- [Resource load](<https://docs.dhtmlx.com/planning-engine/net/resources-and-assignment/resource-load.md>) - reading load and capacity per bucket
- [Split assignment work](<https://docs.dhtmlx.com/planning-engine/net/how-to/split-assignment-work.md>) - checking load after splitting an assignment
