Errors are returned as application/problem+json with type, title, status, detail, traceId, errorCode, and optionally issues[] and extensions
Branch on errorCode — it is the stable identifier. detail is human-readable text and may change; the HTTP status alone is often ambiguous (e.g. 409 has more than ten causes)
Keep the traceId of every failed request: support can find the request with it
401 for a missing or invalid API token and 429 (rate limit) come without a body
502 vendorCommunicationError is a temporary vendor-side failure — retry with increasing delays. 400/409/412/422 need a different request or a user action — retrying the same request does not help
Response shape
All errors raised by the Connect API use the same RFC 7807 problem-details shape (ConnectApiProblemDetails in the OpenAPI spec):
Code
{ "type": "validationFailed", "title": "Validation Failed", "status": 400, "detail": "One or more validation errors occurred. Please check the issues for details.", "traceId": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01", "errorCode": "validationError", "issues": [ { "field": "<field>", "message": "<rule that was violated>", "code": "<validator code>" } ]}
Field
Description
type
Problem category (camelCase string), e.g. validationFailed, accessDenied, conflict, vendorCommunicationError. Several error codes share one type.
title
Short summary of the problem.
status
HTTP status code, same as the response status.
detail
Explanation of this occurrence. For display and logs only — do not parse it.
traceId
Identifier of the request. Include it when you contact support.
Only for request validation errors: one entry per violated rule with field, message and validator code.
extensions
Optional additional values for specific errors, e.g. vendorErrorCode (the vendor's own error code) or vendorId. Tolerate unknown keys.
New error codes can be added within /v1/ (see API Versioning). Treat an unknown errorCode by its HTTP status: 4xx means the request cannot succeed as sent, 5xx means a server or vendor-side failure.
Request body errors (no errorCode)
If the request body of a capability PUT cannot be read at all — the capability name in the path is unknown, the body is empty, it contains unknown fields or a wrapper such as { "data": { ... } }, or a value has the wrong type or enum value — the request fails before it reaches the API logic. The response is a standard ASP.NET validation problem without errorCode:
Unknown route, or a method the route does not support — e.g. GET .../devices/{deviceId}/{capability} returns 405 (capabilities are read via the device GET).
The user must log in again or grant access at the vendor. A new vendor authorization is needed; resending the same request cannot succeed.
Vendor temporarily unavailable
vendorCommunicationError
Retry later with increasing delays (e.g. 30 s, 2 min, 10 min). The user does not need to change anything.
Access not configured
writeAccessNotEnabled, connectApiNotEnabledForApp
A configuration on the clever-PV side. Contact support.
Unexpected error
internalError with 500
Retry once later. If it persists, contact support with the traceId, the endpoint and the time.
Error code reference
The tables list every errorCode the Connect API returns, with the HTTP status it comes with.
Request and validation
errorCode
Status
Meaning
What to do
validationError
400
The request failed validation. issues[] lists field, message and rule where available; some checks only fill detail and leave issues empty. One issues[].code value is not a field rule: ACCESS_DENIED — the device does not belong to the user.
Fix the request. Validate against the capability's options before sending, see Capability options.
invalidTimezone
400
The X-Connect-TimeZone header is not a valid IANA time zone identifier.
Send an IANA id such as Europe/Berlin, or omit the header. See Home timezone.
operationFailed
400
A business rule prevented the operation and no more specific code applies.
Read detail; adapt the request.
Authentication and access
errorCode
Status
Meaning
What to do
authenticationFailed
401
The API token is valid, but no caller identity or app could be resolved from it.
Check that you use a token issued for your Connect API client. Contact support if it persists.
authenticationFailed
403
The vendor connection is invalid or has expired, or the vendor rejected clever-PV's access (vendor 401/403). Not related to your API token.
Let the user re-authenticate with the vendor via the connect capability (the device usually shows authentication-required).
accessDenied
403
Access to the resource is not allowed, e.g. an endpoint that is not available for end-user tokens.
The Connect API is not enabled for your partner or for the app whose customers you address.
Contact clever-PV.
routeUserMismatch
403
End-user token only: the {userId} in the path is not the user of the token.
Use the token user's own id.
userDeletionNotAvailable
403
Users of this app are managed in the whitelabel app and cannot be deleted through the API. See Deleting a User.
Delete the customer in the app.
paymentRequired
402
The home's subscription does not include the requested feature. The capability usually carries subscription-upgrade-required. Some capabilities used to return 400 instead, see Validation limits.
Upgrade the subscription, or hide the feature.
Users, homes and resources
errorCode
Status
Meaning
What to do
clientExternalUserNotFound
404
The {userId} does not resolve to a user you may access (unknown, not assigned to you, or not shared with you — the response does not say which).
A device with this externalId already exists — in this home or in another one.
See What available: false means. This includes devices connected in the clever-PV app or in another partner's app. A device bound to another account must be released there.
deviceTypeNotSupported
404
The device model is not supported.
Pick a supported model from the catalog.
deviceCreationFailed
400
The create-device request is invalid.
Read detail and fix the request.
capabilityNotSupported
422
The device does not have this capability, or the operation is not supported for it.
Only write capabilities that appear in the device's capabilities[].
interventionFound
422
An active intervention blocks the capability.
Read interventions[] on the device and resolve it. See Interventions.
measurementPurposeAlreadySet
409
The measurement purpose was already set and cannot be changed.
Keep the device's purpose, or re-onboard it.
carLinkedToWallbox
409
The car is linked to a wallbox controlled by clever-PV; charging control lives on the wallbox.
Write boost, on-off or target-charging on the wallbox, or unlink the car. See target-charging details.
wallboxAlreadyLinkedToCar
409
The wallbox is already linked to another car.
Unlink the other car first.
wallboxRequiredForLink
409
The home has no wallbox the car could be linked to.
Onboard a wallbox first.
teslaSdkRequired
412
The clever-PV virtual key is not installed on the Tesla.
Deleting a device: the vendor-side reset failed and the device was not deleted. extensions.vendorErrorCode is ConnectionExpired, DeviceUnreachable or ResetFailed.
See Delete Device; use force=true only after the user confirmed.
Vendor communication
errorCode
Status
Meaning
What to do
vendorCommunicationError
502
The vendor's system did not answer, timed out, answered with a server error or an unusable response, or throttled the request (a vendor 429 is reported as this 502). The request itself was valid.
Retry later with increasing delays. Do not ask the user to change credentials because of this error.
internalError
vendor status
The vendor answered with another unexpected HTTP status; the status is passed through.
Treat like vendorCommunicationError if it is a 5xx; otherwise contact support with the traceId.
Schedules
errorCode
Status
Meaning
What to do
invalidScheduleExecutionTime
400
executionTime is not on the five-minute grid or outside 00:00:00–23:55:00.
An unexpected error on the clever-PV side. Some out-of-range capability values also end up here instead of a 400 — e.g. amperages, charge limits or an unsupported automatic phase mode, see Validation limits.
Check the values against the capability's options. Otherwise retry once later; if it persists, contact support with the traceId, the endpoint and the time.
The PartnerErrorCode enum in the OpenAPI spec contains further values from shared components of the platform (e.g. invalidSubscription, invalidCouponCode, rateLimitExceeded, chargingLimitReached). They are not part of the documented Connect API behavior; if one appears, handle it by its HTTP status and contact support with the traceId.