> ## Documentation Index
> Fetch the complete documentation index at: https://chargecloud.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Asset management

> Register and manage charging infrastructure — Locations, Controllers, Stations, Charging Points, Connectors, Meters, and Parking — via the Core API.

Register and manage charging infrastructure via the [**Asset endpoints**](/api/core-api). The Asset endpoints let CPOs and integration partners keep the charging infrastructure in the chargecloud OS in sync with their own systems, from locations and controllers down to connectors and meters. Every change made via the API is reflected immediately in the chargecloud OS, including OCPP broker routing, roaming visibility, and the Driver App.

***

## Asset hierarchy

The chargecloud OS models charging infrastructure as a **seven-level asset hierarchy** rooted at the Location. A child asset references its parent by the parent's numeric `id`, so parents must be created before their children.

The relationships form a tree — they are not a single straight line:

```text theme={null}
Location                         (root)
├─ Controller                    → location_id
├─ Charging Station              → location_id, controller_id
│  └─ Charging Point (EVSE)      → location_id, controller_id, station_id
│     ├─ Connector               → chargepoint_id
│     └─ Meter                   → chargepoint_id
└─ Parking (optional)            → location_id
```

<Note>
  In the API, the **Connector** asset type is the `plugs` resource (`/api/v1/assets/plugs`). The
  **Meter** attaches to the Charging Point (`chargepoint_id`), alongside the Connector rather than
  beneath it. **Parking** is optional and attaches directly to the Location.
</Note>

<Steps>
  <Step title="Location — POST /api/v1/assets/locations">
    The top-level asset. Defines the physical site: address, GPS coordinates, CPO identity (`operator_id`), and the `publish` flag that controls publication to OCPI roaming networks and EV maps.

    Returns `location.id`: required as `location_id` for the next steps.
  </Step>

  <Step title="Controller — POST /api/v1/assets/controllers">
    The OCPP hardware gateway. Links the physical device to a Location and registers manufacturer, software, and communication settings used for command routing.

    Requires `location_id`. Returns `controller.id`.
  </Step>

  <Step title="Charging Station — POST /api/v1/assets/stations">
    The physical charging station as it appears to the driver. Defines model, manufacturer, and the `export` flag that controls whether the station is published to roaming networks and EV maps.

    Requires `location_id` and `controller_id`. Returns `station.id`.
  </Step>

  <Step title="Charging Point (EVSE) — POST /api/v1/assets/chargepoints">
    A single EVSE with its own `evse_id`. Defines access type and roaming participation at outlet level. One charging station can have multiple charging points.

    Requires `location_id`, `controller_id`, and `station_id`. Returns `chargepoint.id` and `evse_id`.
  </Step>

  <Step title="Connector — POST /api/v1/assets/plugs">
    The physical plug. Sets plug type (`type_id`), phase, and electrical specifications (`ampere`, `voltage`, `max_power`). One charging point supports multiple connectors.

    Requires `chargepoint_id`. Returns `plug.id`.
  </Step>

  <Step title="Meter — POST /api/v1/assets/meters">
    The billing and energy measurement device, identified by serial number and meter type. The chargecloud OS uses Meter data for session rating and invoice generation.

    Requires `chargepoint_id`. Returns `meter.id`.
  </Step>

  <Step title="Parking (optional) — POST /api/v1/assets/parking">
    An optional parking bay associated with a Location. Use it to model parking restrictions, time limits, or vehicle constraints independently of the charging tariff. Not required for standard charging station setups.

    Requires `location_id`. Returns `parking.id`.
  </Step>
</Steps>

***

## Registration flow

Authenticate once against the **chargecloud IDP** to obtain a Bearer token, then register each asset, passing the parent's `id` into each child. Once all assets are registered, verify the setup with a `GET` to confirm EVSE IDs and roaming status before going live. For authentication details, see the [Authentication](/authentication) page.

```http title="1 · Authenticate" theme={null}
POST /api/v1/oauth/token
Content-Type: application/json

{ "username": "...", "password": "...", "tenant": "..." }
```

```http title="2 · Register Location" theme={null}
POST /api/v1/assets/locations
Authorization: Bearer <access_token>
Content-Type: application/json

{
  "name":         "Musterstrasse Depot",
  "street":       "Musterstrasse",
  "house_number": "1",
  "postal_code":  "50667",
  "city":         "Koeln",
  "country_code": "deu",
  "latitude":     50.9333,
  "longitude":    6.9500,
  "operator_id":  1,
  "publish":      true
}
```

```json title="201 Created" theme={null}
{ "location": { "id": 123, "name": "Musterstrasse Depot", "publish": true } }
```

```http title="3 · Register the remaining assets" theme={null}
POST /api/v1/assets/controllers  { "location_id": 123, ... }
POST /api/v1/assets/stations     { "location_id": 123, "controller_id": 456, ... }
POST /api/v1/assets/chargepoints { "location_id": 123, "controller_id": 456, "station_id": 789, ... }
POST /api/v1/assets/plugs        { "chargepoint_id": 321, "type_id": 2, ... }
POST /api/v1/assets/meters       { "chargepoint_id": 321, "meter_serial_number": "MTR-001", ... }
POST /api/v1/assets/parking      { "location_id": 123, ... }
```

```http title="4 · Verify setup" theme={null}
GET /api/v1/assets/chargepoints
Authorization: Bearer <access_token>
```


## Related topics

- [Introduction](/api/core-api/index.md)
- [Contract management](/contract-management.md)
- [Creates a parking](/api-reference/parking/creates-a-parking.md)
