> ## Documentation Index
> Fetch the complete documentation index at: https://dynamo-csms.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Started Building a CPO Application with Dynamo

> Register in the Developer Portal, generate an API key, and make your first authenticated request to the Dynamo CSMS API in under five minutes.

This guide walks you through the minimum steps to go from zero to a working API call against the Dynamo CSMS platform. By the end you will have an API key, a verified request, and a clear path to exploring the full API surface.

<Note>
  This guide is for CPO developers building dashboards, mobile apps, or backend integrations. If you are a field installer commissioning hardware, follow the [Installer quickstart](/quickstart-installer) instead.
</Note>

## Prerequisites

* A browser and a terminal with `curl` installed.
* Optional: an API client such as Postman or Insomnia if you prefer a GUI over the command line.

<Steps>
  <Step title="Register in the Developer Portal">
    Open the [Dynamo CSMS Developer Portal](https://csms-staging-155982676532.europe-west1.run.app/developer) and create an account.

    During registration you will:

    1. Provide your name and email address.
    2. Create an **organisation** — this is the top-level container for your charge points, API keys, and billing data.
    3. Verify your email address.

    Once your organisation is active, you land on the organisation dashboard. All API keys and team members are managed from here.
  </Step>

  <Step title="Generate an API key">
    In the Developer Portal, navigate to **Settings → API Keys** and click **Create API key**.

    You can also create a key programmatically once you have an initial key:

    ```bash theme={null}
    curl -X POST https://api.dynamo-csms.com/api/v1/org/api-keys \
      -H "Authorization: Bearer YOUR_EXISTING_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "name": "production-dashboard",
        "scopes": ["read:charge_points", "write:charge_points", "read:sessions"]
      }'
    ```

    The response contains the key value. Copy it immediately — it is only shown once.

    ```json theme={null}
    {
      "id": "key_01hx2b3c4d5e6f7g8h9j",
      "name": "production-dashboard",
      "key": "dyn_live_abc123xyz789...",
      "scopes": ["read:charge_points", "write:charge_points", "read:sessions"],
      "created_at": "2026-05-01T09:00:00Z"
    }
    ```

    <Warning>
      Store your API key in a secrets manager or environment variable. Never commit it to source control or include it in client-side code.
    </Warning>
  </Step>

  <Step title="Make your first request">
    Call the fleet summary endpoint to verify your key and see an overview of your charge point fleet.

    <CodeGroup>
      ```bash cURL theme={null}
      curl -X GET https://api.dynamo-csms.com/api/v1/cpo/fleet/summary \
        -H "Authorization: Bearer YOUR_API_KEY"
      ```

      ```python Python theme={null}
      import requests

      response = requests.get(
          "https://api.dynamo-csms.com/api/v1/cpo/fleet/summary",
          headers={"Authorization": "Bearer YOUR_API_KEY"}
      )
      print(response.json())
      ```

      ```javascript Node.js theme={null}
      const response = await fetch(
        "https://api.dynamo-csms.com/api/v1/cpo/fleet/summary",
        {
          headers: { Authorization: "Bearer YOUR_API_KEY" }
        }
      );
      const data = await response.json();
      console.log(data);
      ```
    </CodeGroup>

    A successful response looks like this:

    ```json theme={null}
    {
      "organisation_id": "org_01hx2b3c4d",
      "total_charge_points": 42,
      "online": 38,
      "offline": 3,
      "faulted": 1,
      "active_sessions": 12,
      "energy_delivered_today_kwh": 847.3,
      "revenue_today_eur": 423.65
    }
    ```

    If you receive a `401 Unauthorized` response, double-check that you are passing the `Authorization` header and that the key has not been revoked. See [Authentication](/authentication) for full details on error codes.
  </Step>

  <Step title="Fetch a specific charge point status">
    Once you have a charge point ID — either from a registration step or from listing your fleet — you can query its real-time status:

    ```bash theme={null}
    curl -X GET https://api.dynamo-csms.com/api/v1/chargepoints/cp_01hx2b3c4d5e6f/status \
      -H "Authorization: Bearer YOUR_API_KEY"
    ```

    ```json theme={null}
    {
      "charge_point_id": "cp_01hx2b3c4d5e6f",
      "ocpp_status": "Available",
      "connectors": [
        {
          "connector_id": 1,
          "status": "Available",
          "type": "CCS2",
          "max_power_kw": 50
        },
        {
          "connector_id": 2,
          "status": "Charging",
          "type": "Type2",
          "max_power_kw": 22,
          "active_session_id": "sess_9f8e7d6c"
        }
      ],
      "last_heartbeat_at": "2026-05-01T09:14:32Z",
      "firmware_version": "2.1.4"
    }
    ```
  </Step>

  <Step title="Explore the full API">
    You now have a working API key and have made your first calls. The next steps depend on what you're building:

    <CardGroup cols={2}>
      <Card title="Manage billing and tariffs" icon="credit-card" href="/guides/managing-billing">
        Set up pricing rules, promotional codes, and session billing.
      </Card>

      <Card title="Set up webhooks" icon="webhook" href="/guides/webhooks">
        Receive real-time events for status changes, sessions, and alerts.
      </Card>

      <Card title="Smart charging" icon="leaf" href="/guides/smart-charging">
        Configure load limits and automatic capacity distribution.
      </Card>

      <Card title="API reference" icon="code" href="/api/charge-points">
        Browse every endpoint with request/response schemas and a live playground.
      </Card>
    </CardGroup>
  </Step>
</Steps>

## List your existing API keys

At any time you can list all API keys in your organisation:

```bash theme={null}
curl -X GET https://api.dynamo-csms.com/api/v1/org/api-keys \
  -H "Authorization: Bearer YOUR_API_KEY"
```

```json theme={null}
{
  "keys": [
    {
      "id": "key_01hx2b3c4d5e6f7g8h9j",
      "name": "production-dashboard",
      "scopes": ["read:charge_points", "write:charge_points", "read:sessions"],
      "last_used_at": "2026-05-01T09:14:05Z",
      "created_at": "2026-05-01T09:00:00Z"
    }
  ]
}
```

<Tip>
  Create separate API keys for each application or environment (development, staging, production). This lets you revoke a single key without affecting other integrations.
</Tip>
