> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.ocpplab.com/llms.txt.
> For full documentation content, see https://docs.ocpplab.com/llms-full.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.ocpplab.com/_mcp/server.

# Support

Most integration issues fall into one of four buckets: auth, tenant scoping, invalid request bodies, or wrong resource identifiers.

## Fast checks

* Call `GET /health` to verify the API is reachable
* Confirm `Authorization: Bearer <jwt>` is set and the token has not expired
* Reuse ids returned by previous API calls instead of guessing them
* Internal admin integrators: see [Authentication](/authentication) for the `X-Organization-Id` case

## Common error patterns

| Status | Usually means                                      | What to check                                                                |
| ------ | -------------------------------------------------- | ---------------------------------------------------------------------------- |
| `401`  | Missing or invalid bearer token                    | Verify the `Authorization` header and token lifetime                         |
| `403`  | Wrong role or missing tenant claim                 | Re-check token role; admin integrators see [Authentication](/authentication) |
| `404`  | Unknown location, charger, brand, or model id/slug | Confirm the id came from a previous successful response                      |
| `422`  | Request shape mismatch                             | Compare your request body against the schema shown in the reference          |
| `500`  | Unexpected server failure                          | Retry with the same request and capture the exact response body              |

## Retries, timeouts, and transient failures

The official SDKs retry automatically on `408`, `429`, and `5xx` responses with exponential backoff (two attempts by default). Default request timeout is 60 seconds.

If you are calling the API with raw HTTP, you should retry the same status codes:

| Status                     | Retryable? | Recommended wait before retry                            |
| -------------------------- | :--------: | -------------------------------------------------------- |
| `408` Request Timeout      |     yes    | 1s, 2s, 4s (exponential)                                 |
| `429` Too Many Requests    |     yes    | respect `Retry-After` if present, otherwise 1s / 2s / 4s |
| `500`, `502`, `503`, `504` |     yes    | 1s, 2s, 4s                                               |
| `4xx` other than the above |     no     | fix the request, do not retry                            |

Long-running operations (bulk provisioning, CPO bundle creation) can take longer than the default SDK timeout. Raise the per-request timeout when you know the call will be slow:

```python title="Python"
client.location_chargers.create(
    location_id=LOCATION_ID,
    request=[...],
    request_options={"timeout_in_seconds": 120},
)
```

```javascript title="Node.js"
await client.locationChargers.create(
  { location_id: LOCATION_ID, body: [...] },
  { timeoutInSeconds: 120 },
);
```

## Useful debugging endpoints

* `GET /health` checks API reachability without a token, run this first if nothing seems to work
* `GET /catalog/brands` checks basic authenticated reads
* `GET /locations` checks tenant-scoped list access
* `GET /chargers/{charger_id}/logs` helps confirm whether a command reached the simulator
* `POST /chargers/{charger_id}/proxy-message` is useful for low-level protocol debugging when you need to inspect raw action handling

## When commands appear to do nothing

1. Verify the charger exists in `GET /chargers`
2. Confirm the charger belongs to the location you are targeting
3. Re-run the command with the exact same ids from the list response
4. Inspect `GET /chargers/{charger_id}/logs` with an `event` filter such as `Authorize` or `BootNotification`

## Documentation issues

If the rendered docs and the API behavior diverge, the source of truth is the checked-in OpenAPI in the SDK repository. Regenerate the OpenAPI contract first, then sync the docs repo if needed.