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


# API reference

The .NET API of Planning Engine ships as two NuGet packages. `Plen.Core` schedules, edits, levels and scores projects. `Plen.Assign` is an optional skill layer that turns workers and skill requirements into slots for auto-assignment. Both target `net10.0`.

## How the API is organized

The first level of this reference is the package:

- [core](<https://docs.dhtmlx.com/planning-engine/net/api/core/overview.md>) - `Plen.Core`, namespace `Plen`. Every core type lives in this one namespace. The folders under `core` group the types by topic and aren't namespaces.
- [assign](<https://docs.dhtmlx.com/planning-engine/net/api/assign/overview.md>) - `Plen.Assign`, namespace `Plen.Assign`. It depends on `Plen.Core`. Its [`SkillLayer.Slots`](<https://docs.dhtmlx.com/planning-engine/net/api/skill-layer-slots.md>) method returns the slot list that [`Project.SuggestAssignments`](<https://docs.dhtmlx.com/planning-engine/net/api/project-suggest-assignments.md>) takes.

Each call has its own page at the top of `api/`: the methods of [`Project`](<https://docs.dhtmlx.com/planning-engine/net/api/core/project/project.md>) and the static methods [`Engine.Schedule`](<https://docs.dhtmlx.com/planning-engine/net/api/engine-schedule.md>) and [`SkillLayer.Slots`](<https://docs.dhtmlx.com/planning-engine/net/api/skill-layer-slots.md>).

```bash
dotnet add package Plen.Core
dotnet add package Plen.Assign
```

Add `Plen.Assign` only for skill-based auto-assignment. JSON input and output are in a separate package, `Plen.Wire`; see [Exchange JSON with a client](<https://docs.dhtmlx.com/planning-engine/net/how-to/exchange-json-with-a-client.md>).

```csharp
using Plen;
using Plen.Assign;
```

Every call in both packages is synchronous: there are no `Async` methods and no `CancellationToken` parameters. Nothing is `IDisposable`. A `Project` isn't thread-safe; see [Share a project between threads](<https://docs.dhtmlx.com/planning-engine/net/how-to/share-a-project-between-threads.md>).

Failures are exceptions. Invalid input throws [`InputException`](<https://docs.dhtmlx.com/planning-engine/net/api/core/errors/input-exception.md>), and a call that doesn't fit the project's state throws [`ProjectException`](<https://docs.dhtmlx.com/planning-engine/net/api/core/errors/project-exception.md>). Both derive from [`PlenException`](<https://docs.dhtmlx.com/planning-engine/net/api/core/errors/plen-exception.md>). A `null` argument that isn't declared nullable throws `ArgumentNullException`. Cycles, conflicts and rejected edits come back as data in the result. See [Error handling](<https://docs.dhtmlx.com/planning-engine/net/error-handling.md>) for which failures throw and which don't.

## Calls by task

| To | Call | Options | Returns |
|---|---|---|---|
| Load a live project or reschedule its edits | [`Project.Solve`](<https://docs.dhtmlx.com/planning-engine/net/api/project-solve.md>) | [`SolveOptions`](<https://docs.dhtmlx.com/planning-engine/net/api/core/project/solve-options.md>) | [`ScheduleResult`](<https://docs.dhtmlx.com/planning-engine/net/api/core/results/schedule-result.md>) |
| See what an edit would do | [`Project.Preview`](<https://docs.dhtmlx.com/planning-engine/net/api/project-preview.md>) | [`PreviewOptions`](<https://docs.dhtmlx.com/planning-engine/net/api/core/project/preview-options.md>) | [`ScheduleResult`](<https://docs.dhtmlx.com/planning-engine/net/api/core/results/schedule-result.md>) |
| Get critical path and slack without scheduling | [`Project.Analyze`](<https://docs.dhtmlx.com/planning-engine/net/api/project-analyze.md>) | [`AnalyzeOptions`](<https://docs.dhtmlx.com/planning-engine/net/api/core/project/analyze-options.md>) | [`ScheduleResult`](<https://docs.dhtmlx.com/planning-engine/net/api/core/results/schedule-result.md>) |
| Commit an edit | [`Project.Apply`](<https://docs.dhtmlx.com/planning-engine/net/api/project-apply.md>) | [`SchedulingChanges`](<https://docs.dhtmlx.com/planning-engine/net/api/core/changes/scheduling-changes.md>) | [`ApplyReport`](<https://docs.dhtmlx.com/planning-engine/net/api/core/changes/apply-report.md>) |
| Resolve resource overallocation | [`Project.Level`](<https://docs.dhtmlx.com/planning-engine/net/api/project-level.md>) | [`LevelingOptions`](<https://docs.dhtmlx.com/planning-engine/net/api/core/resources/leveling-options.md>) | [`LevelingResult`](<https://docs.dhtmlx.com/planning-engine/net/api/core/resources/leveling-result.md>) |
| Read resource load per day or hour | [`Project.LoadProfile`](<https://docs.dhtmlx.com/planning-engine/net/api/project-load-profile.md>) | [`LoadProfileOptions`](<https://docs.dhtmlx.com/planning-engine/net/api/core/resources/load-profile-options.md>) | [`LoadProfile`](<https://docs.dhtmlx.com/planning-engine/net/api/core/resources/load-profile.md>) |
| Compare alternative edits | [`Project.Evaluate`](<https://docs.dhtmlx.com/planning-engine/net/api/project-evaluate.md>) | [`EvaluateOptions`](<https://docs.dhtmlx.com/planning-engine/net/api/core/evaluate/evaluate-options.md>) | [`EvaluateResult`](<https://docs.dhtmlx.com/planning-engine/net/api/core/evaluate/evaluate-result.md>) |
| Compare alternative edits on several threads | [`Project.EvaluateWith`](<https://docs.dhtmlx.com/planning-engine/net/api/project-evaluate.md#evaluatewith>) | [`EvaluateOptions`](<https://docs.dhtmlx.com/planning-engine/net/api/core/evaluate/evaluate-options.md>), [`Execution`](<https://docs.dhtmlx.com/planning-engine/net/api/core/evaluate/execution.md>) | [`EvaluateResult`](<https://docs.dhtmlx.com/planning-engine/net/api/core/evaluate/evaluate-result.md>) |
| Pick resources for open positions | [`Project.SuggestAssignments`](<https://docs.dhtmlx.com/planning-engine/net/api/project-suggest-assignments.md>) | [`SuggestOptions`](<https://docs.dhtmlx.com/planning-engine/net/api/core/suggest/suggest-options.md>) | [`SuggestResult`](<https://docs.dhtmlx.com/planning-engine/net/api/core/suggest/suggest-result.md>) |
| Read tasks, resources and assignments for building slots | [`Project.Roster`](<https://docs.dhtmlx.com/planning-engine/net/api/project-roster.md>) | - | [`Roster`](<https://docs.dhtmlx.com/planning-engine/net/api/core/suggest/roster.md>) |
| Schedule a snapshot once | [`Engine.Schedule`](<https://docs.dhtmlx.com/planning-engine/net/api/engine-schedule.md>) | [`SolveOptions`](<https://docs.dhtmlx.com/planning-engine/net/api/core/project/solve-options.md>) | [`ScheduleResult`](<https://docs.dhtmlx.com/planning-engine/net/api/core/results/schedule-result.md>) |
| Build slots from skills and requirements | [`SkillLayer.Slots`](<https://docs.dhtmlx.com/planning-engine/net/api/skill-layer-slots.md>) | [`Pool`](<https://docs.dhtmlx.com/planning-engine/net/api/assign/pool.md>), [`Requirement`](<https://docs.dhtmlx.com/planning-engine/net/api/assign/requirement.md>) | `List<`[`Slot`](<https://docs.dhtmlx.com/planning-engine/net/api/core/suggest/slot.md>)`>` |

`Preview`, `LoadProfile`, `Evaluate`, `EvaluateWith`, `SuggestAssignments`, `Roster` and `SkillLayer.Slots` need a solved project. The constructor, `Clone()` and `ToString()` are on the [`Project`](<https://docs.dhtmlx.com/planning-engine/net/api/core/project/project.md>) page.
