Frontend API Manager (Cookie Auth) (1.0.0)
Download OpenAPI specification:
Entry OpenAPI document for manager controllers exposed through the /manager route group.
Authentication is cookie-based and role-gated:
- Cookie:
Authorization - Required role:
ROLE_ADMIN
Source layout note:
- Shared management operations, schemas, examples, and responses are authored in
docs/openapi/common/management.yaml. - Validation with kin-openapi checks references only and does not emit a bundled artifact.
Create API key
Creates a new API key for the authenticated user.
Authorizations:
Request Body schema: application/jsonrequired
| Role | string |
| ExpiresAt | string Go duration string |
Responses
Request samples
- Payload
{- "Role": "ROLE_USER",
- "ExpiresAt": "8760h0m0s"
}Response samples
- 201
- 400
- 401
- 500
{- "ID": "123e4567-e89b-12d3-a456-426614174010",
- "Key": "jp_live_example_key",
- "Role": "ROLE_USER",
- "ExpiresAt": "2027-04-14T00:00:00Z"
}Create ID tag
Creates an ID tag for the authenticated user.
Authorizations:
Request Body schema: application/jsonrequired
| ID | string |
| Name | string |
| Type required | string |
| Status | string |
| OrganizationID | string or null <uuid> |
| ExpiryDate | string <date-time> |
Responses
Request samples
- Payload
{- "ID": "TAG001",
- "Name": "Reception Tag",
- "Type": "RFID",
- "Status": "Accepted"
}Response samples
- 201
- 400
- 500
{- "ID": "TAG001",
- "Name": "Reception Tag",
- "Type": "RFID",
- "Status": "Accepted"
}Update ID tag
Updates an existing ID tag by ID.
Authorizations:
path Parameters
| id required | string ID tag identifier. |
Request Body schema: application/jsonrequired
| ID | string |
| Name | string |
| Type required | string |
| Status | string |
| OrganizationID | string or null <uuid> |
| ExpiryDate | string <date-time> |
Responses
Request samples
- Payload
{- "Name": "Updated Tag",
- "Type": "RFID",
- "Status": "Blocked"
}Response samples
- 200
- 400
- 500
{- "ID": "TAG001",
- "Name": "Main ID Tag",
- "Type": "RFID",
- "Status": "Accepted",
- "OrganizationID": "2d34b1c1-8109-40c1-88f9-fdcfb32ea178",
- "ExpiryDate": "2019-08-24T14:15:22Z"
}Create billing model
Creates a billing model for the authenticated user.
Authorizations:
Request Body schema: application/jsonrequired
| property name* additional property | any |
Responses
Request samples
- Payload
{- "Name": "Standard Plan",
- "DefaultKWHRate": 0.2,
- "DefaultTimeRate": 0.1
}Response samples
- 201
- 400
- 401
- 500
{ }Update billing model
Authorizations:
path Parameters
| modelId required | string <uuid> Billing model UUID. |
Request Body schema: application/jsonrequired
| property name* additional property | any |
Responses
Request samples
- Payload
{- "ID": "123e4567-e89b-12d3-a456-426614174020",
- "Name": "Updated Plan"
}Response samples
- 200
- 400
- 401
- 500
{ }List charge boxes
Returns charge boxes owned/visible to the authenticated user with optional filters.
Authorizations:
query Parameters
| ID | string |
| UUID | string <uuid> |
| Name | string |
| UserID | string <uuid> |
| ChargePointVendor | string |
| ChargePointModel | string |
| ProtocolVersion | string |
| AddressID | string <uuid> |
Responses
Response samples
- 200
- 400
- 401
- 500
[- {
- "ID": "CHARGEBOX001",
- "UUID": "123e4567-e89b-12d3-a456-426614174000",
- "Name": "Main Charger"
}
]Create charge box
Creates a charge box with a required billing model owned by the authenticated user.
Authorizations:
Request Body schema: application/jsonrequired
| ID required | string |
| Name | string |
| BillingModelID required | string <uuid> Required billing model assigned to the charge box. Must identify an existing billing model owned by the authenticated user. |
| OrganizationID | string or null <uuid> |
Responses
Request samples
- Payload
{- "ID": "CHARGEBOX001",
- "Name": "Main Charger",
- "BillingModelID": "123e4567-e89b-12d3-a456-426614174003"
}Response samples
- 201
- 400
- 401
- 500
{- "ID": "CHARGEBOX001",
- "UUID": "123e4567-e89b-12d3-a456-426614174000",
- "Name": "Main Charger",
- "UserID": "123e4567-e89b-12d3-a456-426614174099",
- "ChargePointVendor": "ACME",
- "ChargePointModel": "JPLUG-FAST",
- "ProtocolVersion": "OCPP 1.6",
- "Description": "Parking lot charger",
- "Timezone": "UTC",
- "BillingModelID": "123e4567-e89b-12d3-a456-426614174003"
}Get charge box by ID or name
Authorizations:
path Parameters
| chargeBoxIdOrName required | string Charge box ID or Name. |
Responses
Response samples
- 200
- 400
- 401
- 500
{- "ID": "CHARGEBOX001",
- "UUID": "123e4567-e89b-12d3-a456-426614174000",
- "Name": "Main Charger",
- "UserID": "123e4567-e89b-12d3-a456-426614174099",
- "ChargePointVendor": "ACME",
- "ChargePointModel": "JPLUG-FAST",
- "ProtocolVersion": "OCPP 1.6",
- "Description": "Parking lot charger",
- "Timezone": "UTC",
- "BillingModelID": "123e4567-e89b-12d3-a456-426614174003"
}Update charge box
Updates a charge box. The resulting charge box must have a billing model owned by the authenticated user.
Authorizations:
path Parameters
| chargeBoxIdOrName required | string Charge box ID or Name. |
Request Body schema: application/jsonrequired
| ID required | string |
| Name | string |
| Description | string |
| Timezone | string |
| BillingModelID | string <uuid> Billing model assigned to the charge box. Updates must leave the charge box with an existing billing model owned by the authenticated user. |
| AddressID | string <uuid> |
object | |
| MaxPower | number or null <double> Maximum charging power in watts. Set to null to disable the setting. |
Responses
Request samples
- Payload
{- "ID": "CHARGEBOX001",
- "Name": "Main Charger Updated",
- "Description": "Parking lot charger",
- "Timezone": "UTC",
- "BillingModelID": "123e4567-e89b-12d3-a456-426614174003"
}Response samples
- 200
- 400
- 401
- 500
{- "ID": "string",
- "UUID": "f50af7e0-0dd5-4361-ab96-2e04f7bc7e30",
- "Name": "string",
- "UserID": "08aac8e3-775d-4513-8aaa-658f6ba9bbcd",
- "OrganizationID": "2d34b1c1-8109-40c1-88f9-fdcfb32ea178",
- "ChargePointVendor": "string",
- "ChargePointModel": "string",
- "ProtocolVersion": "string",
- "MaxPower": 0.1,
- "Description": "string",
- "Timezone": "string",
- "BillingModelID": "d8cf3116-a720-430b-bdfc-68ec490fe2ed",
- "AddressID": "bfc25713-e79a-4614-a229-6a83766a0388"
}Send charging profile
Asks the broker to send a charging profile (SetChargingProfile) to the charge box. Without a request body the default charging profile is sent. With a body, the supplied OCPP 1.6 profile is validated (400 on failure) and sent instead. Waits for the charger's reply (up to CHARGER_COMMAND_TIMEOUT, default 5s) and returns its status.
Authorizations:
path Parameters
| chargeBoxIdOrName required | string Charge box ID or Name. |
Request Body schema: application/jsonoptional
| connectorId | integer >= 0 Default: 0 Target connector (0 = whole charge point). Must be 0 for ChargePointMaxProfile. |
required | object |
Responses
Request samples
- Payload
{- "connectorId": 0,
- "csChargingProfiles": {
- "chargingProfileId": 0,
- "transactionId": 0,
- "stackLevel": 0,
- "chargingProfilePurpose": "ChargePointMaxProfile",
- "chargingProfileKind": "Absolute",
- "recurrencyKind": "Daily",
- "validFrom": "2019-08-24T14:15:22Z",
- "validTo": "2019-08-24T14:15:22Z",
- "chargingSchedule": {
- "duration": 0,
- "startSchedule": "2019-08-24T14:15:22Z",
- "chargingRateUnit": "W",
- "minChargingRate": 0,
- "chargingSchedulePeriod": [
- {
- "startPeriod": 0,
- "limit": 0,
- "numberPhases": 1
}
]
}
}
}Response samples
- 200
- 400
- 401
- 500
{- "status": "Accepted"
}Clear charging profiles
Asks the broker to send a ClearChargingProfile (OCPP 1.6) to the charge box. Body fields are optional filters; an empty body clears every profile. Waits for the charger's reply (up to CHARGER_COMMAND_TIMEOUT, default 5s) and returns its status.
Authorizations:
path Parameters
| chargeBoxIdOrName required | string Charge box ID or Name. |
Request Body schema: application/jsonoptional
| id | integer >= 0 ID of the charging profile to clear. |
| connectorId | integer >= 0 |
| chargingProfilePurpose | string Enum: "ChargePointMaxProfile" "TxDefaultProfile" "TxProfile" |
| stackLevel | integer >= 0 |
Responses
Request samples
- Payload
{- "id": 0,
- "connectorId": 0,
- "chargingProfilePurpose": "ChargePointMaxProfile",
- "stackLevel": 0
}Response samples
- 200
- 400
- 401
- 500
{- "status": "Accepted"
}Request composite charging schedule
Asks the broker to send a GetCompositeSchedule (OCPP 1.6) to the charge box and waits for the reply (up to CHARGER_COMMAND_TIMEOUT, default 5s).
Authorizations:
path Parameters
| chargeBoxIdOrName required | string Charge box ID or Name. |
Request Body schema: application/jsonrequired
| connectorId required | integer >= 0 Connector to report on (0 = whole charge point). |
| duration required | integer >= 1 Length of the requested schedule in seconds. |
| chargingRateUnit | string Enum: "W" "A" |
Responses
Request samples
- Payload
{- "connectorId": 0,
- "duration": 1,
- "chargingRateUnit": "W"
}Response samples
- 200
- 400
- 401
- 500
{- "status": "Accepted",
- "connectorId": 0,
- "scheduleStart": "2019-08-24T14:15:22Z",
- "chargingSchedule": { }
}Get invoice by ID
Authorizations:
path Parameters
| invoiceId required | string <uuid> Invoice UUID. |
Responses
Response samples
- 200
- 400
- 401
- 404
{- "ID": "123e4567-e89b-12d3-a456-426614174060",
- "UserID": "123e4567-e89b-12d3-a456-426614174099",
- "Subtotal": 20,
- "Total": 22,
- "CurrencyCode": "CAD",
- "Metadata": {
- "charge_box_user_id": "123e4567-e89b-12d3-a456-426614174099"
}
}Get invoice summary
Returns invoice line item totals and quantities grouped by currency, then by line item type.
Authorizations:
query Parameters
| month | string^\d{4}-(0[1-9]|1[0-2])$ Restrict the summary to a month (YYYY-MM). |
Responses
Response samples
- 200
- 401
- 500
{- "InvoiceSummaries": [
- {
- "CurrencyCode": "USD",
- "Currency": {
- "Code": "USD",
- "Number": "840",
- "Name": "US Dollar",
- "Symbol": "$",
- "Decimals": 2
}, - "Amounts": {
- "KWH": 1200.5,
- "TAX": 210
}, - "Quantities": {
- "KWH": 7500.25,
- "TAX": 0
}, - "Total": 1410.5
}
]
}Create organization
Authorizations:
Request Body schema: application/jsonrequired
| Name required | string |
| Slug | string |
| Domain | string |
| Settings | string |
Responses
Request samples
- Payload
{- "Name": "Acme Charging",
- "Slug": "acme-charging",
- "Domain": "acme.example.com",
- "Settings": "{\"timezone\":\"UTC\"}"
}Response samples
- 201
- 400
- 401
- 409
- 500
{- "ID": "123e4567-e89b-12d3-a456-426614174030",
- "Name": "Acme Charging",
- "Slug": "acme-charging",
- "Domain": "acme.example.com",
- "IsActive": true,
- "Settings": "{\"timezone\":\"UTC\"}",
- "CreatedAt": "2026-04-14T10:00:00Z",
- "UpdatedAt": "2026-04-14T10:00:00Z"
}Get organization by ID
Authorizations:
path Parameters
| organizationId required | string <uuid> Organization UUID. |
Responses
Response samples
- 200
- 400
- 401
- 403
- 500
{- "ID": "123e4567-e89b-12d3-a456-426614174030",
- "Name": "Acme Charging",
- "Slug": "acme-charging",
- "Domain": "acme.example.com",
- "IsActive": true,
- "Settings": "{\"timezone\":\"UTC\"}",
- "CreatedAt": "2026-04-14T10:00:00Z",
- "UpdatedAt": "2026-04-14T10:00:00Z"
}Create a card setup intent
Manager-only operation requiring the Authorization cookie and ROLE_ADMIN. Gets or creates the authenticated user's Stripe customer and creates an off-session card setup intent. No request body is required. Use the ClientSecret with Stripe.js to collect card details directly with Stripe; do not send card numbers or CVCs to this API.
Authorizations:
Responses
Response samples
- 200
- 401
- 403
- 404
- 500
{- "ClientSecret": "seti_secret",
- "SetupIntentID": "seti_123"
}List saved payment methods
Manager-only operation requiring the Authorization cookie and ROLE_ADMIN. Returns saved card metadata for the authenticated user's Stripe customer, never full card numbers or CVCs. Returns an empty array when no Stripe customer ID exists. When exactly one card exists and the customer has no default payment method, the API attempts to set that card as the Stripe default; on success it is returned with IsDefault true, and if the update fails the cards are still returned with IsDefault false.
Authorizations:
Responses
Response samples
- 200
- 401
- 403
- 404
- 500
[- {
- "ID": "pm_123",
- "Brand": "visa",
- "Last4": "4242",
- "ExpiryMonth": 12,
- "ExpiryYear": 2030,
- "IsDefault": true
}
]Set the default payment method
Manager-only operation requiring the Authorization cookie and ROLE_ADMIN. Updates the authenticated user's Stripe customer invoice settings to use the supplied payment method.
Authorizations:
path Parameters
| paymentMethodId required | string Stripe payment method ID. |
Responses
Response samples
- 200
- 400
- 401
- 403
- 404
- 500
{- "Message": "Payment method set as default successfully"
}Delete a payment method
Manager-only operation requiring the Authorization cookie and ROLE_ADMIN. Detaches the supplied payment method from Stripe. Requires the authenticated user to have a Stripe customer ID. The current implementation does not verify that the supplied payment method belongs to that customer.
Authorizations:
path Parameters
| paymentMethodId required | string Stripe payment method ID. |
Responses
Response samples
- 200
- 400
- 401
- 403
- 404
- 500
{- "Message": "Payment method deleted successfully"
}Authorize a payment with a saved card
Manager-only operation requiring the Authorization cookie and ROLE_ADMIN. Creates and confirms an off-session Stripe payment intent with manual capture using the authenticated user's Stripe customer. Requires an existing Stripe customer ID. This endpoint authorizes only and does not capture funds.
Authorizations:
path Parameters
| paymentMethodId required | string Stripe payment method ID. |
Request Body schema: application/jsonrequired
| Currency required | string Supported currency code, such as CAD. Numeric currency identifiers are not accepted. |
| Amount required | number <double> Amount in major currency units. The converted minor-unit amount must be greater than 50. |
Responses
Request samples
- Payload
{- "Currency": "CAD",
- "Amount": 20
}Response samples
- 200
- 400
- 401
- 402
- 403
- 404
- 500
{- "PaymentIntentID": "pi_123"
}List themes
Returns themes belonging to organizations owned by the authenticated user.
Authorizations:
query Parameters
| domain | string |
| is_active | boolean |
Responses
Response samples
- 200
- 500
[- {
- "ID": "123e4567-e89b-12d3-a456-426614174040",
- "OrganizationID": "123e4567-e89b-12d3-a456-426614174030",
- "Domain": "app.example.com",
- "Name": "Example Theme",
- "IsActive": true
}
]Create theme
Creates a theme for an organization owned by the authenticated user and generates its immutable hostname.
Authorizations:
Request Body schema: application/jsonrequired
| OrganizationID required | string <uuid> Organization that will own the theme. The authenticated user must be an owner. |
| Name required | string |
| Description | string |
required | object (ThemeConfig) |
Responses
Request samples
- Payload
{- "OrganizationID": "123e4567-e89b-12d3-a456-426614174030",
- "Name": "Example Theme",
- "Description": "Theme for the Example charging network",
- "Config": {
- "themeKey": "default",
- "language": "en",
- "countryCallingCode": "CA +1",
- "email": "support@example.com",
- "logoAlt": "Example Charging",
- "title": "Charge with Example",
- "description": "Example charging network",
- "chargerNamePrefix": "EXAMPLE-",
- "og": {
- "title": "Example Charging",
- "description": "Example charging network",
}, - "designTokens": {
- "light": {
- "background": "#fff",
- "panel": "#f0f6ff",
- "foreground": "#18181b",
- "primary": "#19b5e5"
}, - "dark": {
- "background": "#101827",
- "panel": "#020817",
- "foreground": "#f4f8fb",
- "primary": "#19b5e5"
}
}
}
}Response samples
- 201
- 400
- 404
- 500
{- "ID": "123e4567-e89b-12d3-a456-426614174040",
- "OrganizationID": "123e4567-e89b-12d3-a456-426614174030",
- "Domain": "spark-cyan-harbor.jplug.app",
- "Name": "Example Theme",
- "Description": "Theme for the Example charging network",
- "IsActive": true,
- "Config": {
- "themeKey": "default",
- "language": "en",
- "countryCallingCode": "CA +1",
- "email": "support@example.com",
- "logoAlt": "Example Charging",
- "title": "Charge with Example",
- "description": "Example charging network",
- "chargerNamePrefix": "EXAMPLE-",
- "og": {
- "title": "Example Charging",
- "description": "Example charging network",
}, - "designTokens": {
- "light": {
- "background": "#fff",
- "panel": "#f0f6ff",
- "foreground": "#18181b",
- "primary": "#19b5e5"
}, - "dark": {
- "background": "#101827",
- "panel": "#020817",
- "foreground": "#f4f8fb",
- "primary": "#19b5e5"
}
}
}, - "CreatedAt": "2026-04-14T10:10:00Z",
- "UpdatedAt": "2026-04-14T10:10:00Z"
}Get theme by ID
Returns a theme only when the authenticated user owns its organization.
Authorizations:
path Parameters
| themeId required | string <uuid> Theme UUID. |
Responses
Response samples
- 200
- 400
- 404
- 500
{- "ID": "123e4567-e89b-12d3-a456-426614174040",
- "OrganizationID": "123e4567-e89b-12d3-a456-426614174030",
- "Domain": "spark-cyan-harbor.jplug.app",
- "Name": "Example Theme",
- "Description": "Theme for the Example charging network",
- "IsActive": true,
- "Config": {
- "themeKey": "default",
- "language": "en",
- "countryCallingCode": "CA +1",
- "email": "support@example.com",
- "logoAlt": "Example Charging",
- "title": "Charge with Example",
- "description": "Example charging network",
- "chargerNamePrefix": "EXAMPLE-",
- "og": {
- "title": "Example Charging",
- "description": "Example charging network",
}, - "designTokens": {
- "light": {
- "background": "#fff",
- "panel": "#f0f6ff",
- "foreground": "#18181b",
- "primary": "#19b5e5"
}, - "dark": {
- "background": "#101827",
- "panel": "#020817",
- "foreground": "#f4f8fb",
- "primary": "#19b5e5"
}
}
}, - "CreatedAt": "2026-04-14T10:10:00Z",
- "UpdatedAt": "2026-04-14T10:10:00Z"
}Update theme
Updates a theme only when the authenticated user owns its organization.
Authorizations:
path Parameters
| themeId required | string <uuid> Theme UUID. |
Request Body schema: application/jsonrequired
| Name | string |
| Description | string |
| IsActive | boolean |
object (ThemeConfig) |
Responses
Request samples
- Payload
{- "Name": "Updated Theme",
- "IsActive": true,
- "Config": {
- "themeKey": "default",
- "language": "en",
- "countryCallingCode": "CA +1",
- "email": "support@example.com",
- "logoAlt": "Example Charging",
- "title": "Updated Theme",
- "description": "Updated charging network",
- "chargerNamePrefix": "EXAMPLE-",
- "og": {
- "title": "Updated Theme",
- "description": "Updated charging network",
}, - "designTokens": {
- "light": {
- "background": "#fff",
- "panel": "#f0f6ff",
- "foreground": "#18181b",
- "primary": "#e11d48"
}, - "dark": {
- "background": "#101827",
- "panel": "#020817",
- "foreground": "#f4f8fb",
- "primary": "#e11d48"
}
}
}
}Response samples
- 200
- 400
- 404
- 500
{- "ID": "3892eb50-4697-4c72-aadc-32b766bce3c0",
- "OrganizationID": "2d34b1c1-8109-40c1-88f9-fdcfb32ea178",
- "Domain": "string",
- "Name": "string",
- "Description": "string",
- "IsActive": true,
- "Config": { },
- "CreatedAt": "2019-08-24T14:15:22Z",
- "UpdatedAt": "2019-08-24T14:15:22Z"
}Upload a theme asset
Uploads the multipart file field as a PNG or JPEG, up to 2 MiB, to one of four supported slots on a theme owned by the authenticated user. Returns the public asset URL without updating the theme configuration.
Authorizations:
path Parameters
| themeId required | string <uuid> |
| slot required | string Enum: "logo" "logo-dark" "favicon" "og-image" |
Request Body schema: multipart/form-datarequired
| file required | string <binary> <= 2097152 characters PNG or JPEG file no larger than 2 MiB. |
Responses
Response samples
- 200
- 400
- 401
- 403
- 404
- 413
- 500
{
}List transactions
Returns transactions with optional filters.
Authorizations:
query Parameters
| ChargeBoxID | string |
| idTag | string <= 20 characters |
| ConnectorID | integer |
| TimestampStart | string <date-time> |
| TimestampStop | string <date-time> |
Responses
Response samples
- 200
- 400
- 401
- 500
[- {
- "UUID": "123e4567-e89b-12d3-a456-426614174050",
- "ChargeBoxID": "CHARGEBOX001",
- "ConnectorID": 1,
- "IDTag": "TAG001"
}
]Start transaction
Authorizations:
Request Body schema: application/jsonrequired
| ChargeBoxID required | string |
| ConnectorID | integer |
| IDTag required | string <= 20 characters |
Responses
Request samples
- Payload
{- "ChargeBoxID": "CHARGEBOX001",
- "ConnectorID": 1,
- "IDTag": "TAG001"
}Response samples
- 200
- 400
- 401
- 500
{- "TransactionID": "123e4567-e89b-12d3-a456-426614174050"
}Get transaction by UUID
Authorizations:
path Parameters
| transactionUUID required | string <uuid> Transaction UUID. |
Responses
Response samples
- 200
- 400
- 401
- 404
- 500
{- "UUID": "123e4567-e89b-12d3-a456-426614174050",
- "ChargeBoxID": "CHARGEBOX001",
- "ConnectorID": 1,
- "IDTag": "TAG001",
- "TimestampStart": "2026-04-14T10:20:00Z",
- "TimestampStop": null,
- "MeterStart": 12345,
- "MeterStop": null
}