Your first API call

Go from an API key to a list of your chargers, their outlets and their live status with nothing but curl, in about five minutes.

2 min readEdit this page
On this page

This walks from an API key down to a single connector: project, chargers, outlets, connectors. All you need is curl and a key. If you would rather have a charger to point at first, try a virtual charger and come back.

bash
export API=https://api.flowion.io/v1

1. Make a key

In the console, open Settings → API keys → Make a key. Choose:

  • Mode: Sandbox to work against virtual chargers, Live for real ones.

  • Reach: One project, and pick the project. This walk only reads one project's chargers, so it needs nothing wider.

Copy the secret when it is shown; it is shown once. Then copy the project's id from the project's Settings → General page.

bash
export TOKEN=flw_ak_test_...
export PROJECT=9a7c0e12-...

API keys and sign-in covers what each choice means.

2. List your chargers

GET/v1/projects/$PROJECT/charging-stationsbash
curl -s "$API/projects/$PROJECT/charging-stations" \
  -H "Authorization: Bearer $TOKEN" | jq
200Response
{
  "data": [
    {
      "id": "3f2a9b1c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
      "chargePointId": "garage-01",
      "name": "Guest bay left",
      "status": "online",
      "lastSeen": "2026-10-01T09:58:12Z"
    }
  ],
  "nextCursor": null
}

Each charger carries more fields than shown here. Two names are worth knowing. id is the UUID every other call uses. chargePointId is the name the charger itself connects with, the one you set when you connected it. status says whether it is connected right now.

Note the envelope, data and nextCursor: every list in the API pages this way, and nextCursor is null on the last page. See Errors, pagination and versioning.

bash
export CHARGER=3f2a9b1c-...

3. List its outlets

GET/v1/charging-stations/$CHARGER/evsesbash
curl -s "$API/charging-stations/$CHARGER/evses" \
  -H "Authorization: Bearer $TOKEN" | jq

An EVSE is one outlet a car can charge from. A single-outlet charger has one. Each carries id (a UUID) and evseId, the small number the charger counts its outlets by, which commands use.

bash
export EVSE=...

4. Down to a connector

GET/v1/evses/$EVSE/connectorsbash
curl -s "$API/evses/$EVSE/connectors" \
  -H "Authorization: Bearer $TOKEN" | jq

A connector is the plug itself. Its status (Available, Occupied, Reserved, Unavailable or Faulted) is what a driver would see walking up to it.

That is the whole shape the API is scoped by: project, charger, outlet, connector. Core concepts explains why it looks this way.

With an organization-wide key: find your projects

A key that holds the Admin policy at the organization can discover them, given the organization id from the organization's Settings → General page:

GET/v1/organizations/$ORG/projectsbash
curl -s "$API/organizations/$ORG/projects" \
  -H "Authorization: Bearer $TOKEN" | jq

Projects are listed oldest first, each with its name and slug; pick yours by name. A one-project key gets 404 here: it answers only inside its own project. See Permissions and policies.

Send JSON, get JSON

Send Content-Type: application/json with any request that has a body. Answers are JSON, and every error carries a stable error code to switch on.

Next: Try it in the browser, or send your first command to a charger.