Landscapes

A landscape is the primary workspace in IcePanel. It holds a complete C4 architecture model including all objects, connections, diagrams, flows, and versions.


What a landscape contains

Each landscape is versioned. All models like objects, connections, diagrams, flows, and domains live inside a version of a landscape.

When you create a landscape, IcePanel automatically creates an initial latest version that you can modify immediately.

Create a landscape:

POST
/v1/organizations/:organizationId/landscapes
1import { IcePanelClient } from "@icepanel/sdk";
2
3async function main() {
4 const client = new IcePanelClient({
5 apiKey: "YOUR_API_KEY_HERE",
6 });
7 await client.organizations.landscapes.create("organizationId", {
8 name: "string",
9 });
10}
11main();

The response returns both the landscape and the initial version objects.

List all landscapes in your organization:

GET
/v1/organizations/:organizationId/landscapes
1import { IcePanelClient } from "@icepanel/sdk";
2
3async function main() {
4 const client = new IcePanelClient({
5 apiKey: "YOUR_API_KEY_HERE",
6 });
7 await client.organizations.landscapes.list("organizationId");
8}
9main();

URL patterns

Landscape endpoints are available in two forms.

Organization-scoped (includes org context, useful when you have the org ID in scope):

GET /organizations/{organizationId}/landscapes/{landscapeId}

Landscape-scoped (shorter, useful when you already know the landscape ID):

GET /landscapes/{landscapeId}

All version-scoped resources (model objects, diagrams, flows, etc.) use only the landscape-scoped pattern:

GET /landscapes/{landscapeId}/versions/{versionId}/model/objects

You can also specify latest as a shorthand for getting the latest version:

GET /landscapes/{landscapeId}/versions/latest/model/objects

Duplicate vs copy

IcePanel provides two operations for replicating a landscape:

OperationDescription
DuplicateCreates a full copy of the landscape within the same organization, including all versions and model content
CopyCopies the model content of a specific version into a different target landscape. This is useful for merging two models or seeding a new landscape from an existing one

Duplicate a landscape:

POST
/v1/landscapes/:landscapeId/duplicate
1import { IcePanelClient } from "@icepanel/sdk";
2
3async function main() {
4 const client = new IcePanelClient({
5 apiKey: "YOUR_API_KEY_HERE",
6 });
7 await client.landscapes.duplicate("landscapeId", {
8 body: {
9 name: "string",
10 },
11 });
12}
13main();

Copy to another landscape:

POST
/v1/landscapes/:landscapeId/copy
1import { IcePanelClient } from "@icepanel/sdk";
2
3async function main() {
4 const client = new IcePanelClient({
5 apiKey: "YOUR_API_KEY_HERE",
6 });
7 await client.landscapes.copy("landscapeId", {
8 targetLandscapeId: "targetLandscapeId",
9 });
10}
11main();