Connect to the EKX API
Use the EKX REST API to read project data, change a single-line diagram, run studies, and review or apply sizing proposals from your own scripts and agents.
> Note: To use EKX from Claude Code, Codex, or another MCP-capable agent, you do not need an API key. See Connect an AI agent to EKX.
Create an API key
- Open Settings > API Keys.
- Click Create Key.
- Enter a name that identifies the script or agent that will use the key.
- Select only the scopes it needs.
- Click Create.
- Copy the key and store it in your secret manager. EKX will not show it again.
> Warning: An API key acts as your user account. Do not paste it into source code, logs, chat messages, or project files. Revoke the key from Settings > API Keys if it may have been exposed.
The key retains your project permissions. A key cannot edit a project that you can only view. If you create it while working in an organization, it can access only projects in that organization.
Choose scopes
| Scope | Allows |
|---|---|
projects:read | Read projects, components, connections, settings, scenarios, results, and exports. Preview sizing. |
projects:write | Create projects, replace or patch project data, create and change scenarios, and archive projects. |
studies:run | Run power flow, short-circuit, and arc flash studies. Also requires projects:read. |
sizing:apply | Apply current sizing proposals. Also requires projects:read. |
catalog:read | Read your private catalogue-build status, issues, and curve-review images, and your organization's cable library. |
catalog:write | Create, process, revise, and cancel private catalogue builds. Create, change, and archive your organization's cable series. |
Create separate keys for separate tools. This makes a compromised key easier to revoke and limits what each tool can change. Scopes cannot be added to an existing key; create a new key when a tool needs more access.
Send your first request
Production requests use https://joinekx.com/api/v1. Send the key as a Bearer token:
curl "https://joinekx.com/api/v1/projects" \
-H "Authorization: Bearer $EKX_API_KEY"A successful response wraps its content in data and includes response metadata:
{
"data": [],
"meta": {
"timestamp": "2026-08-30T12:00:00.000Z",
"version": "1"
}
}An error uses a stable code and a readable message. Validation errors may also include details with the rejected path or value.
{
"error": {
"code": "FORBIDDEN",
"message": "Missing required scope: studies:run"
}
}Handle retries and limits
EKX limits authenticated API traffic to 100 requests per minute per user. A 429 response includes Retry-After; wait for that number of seconds before trying again.
Catalogue-build mutations, study runs, and sizing applies require an Idempotency-Key header. Generate a unique value for each intended operation, then reuse that value only when retrying the exact same request.
-H "Idempotency-Key: 6b20cfee-b995-43f3-8740-2f87c5893df2"For 24 hours after completion, EKX returns the stored result when the same API key repeats the same request. Idempotency-Replayed: true identifies a replay. Reusing the value with a different request returns 409 IDEMPOTENCY_CONFLICT. If the original operation is still running, EKX returns 409 IDEMPOTENCY_IN_PROGRESS with Retry-After.
Project create, replace, patch, and archive requests do not use this replay contract. Do not assume that resending one of those requests after a lost response is safe. Read the project state first and decide whether the change still needs to run.
Managed SLD create, proposal, revision, and cancellation requests also require an Idempotency-Key, but retain their replay result for 30 days. See the managed-build guide before using an agent to construct an SLD.
Common response codes
| Status | Meaning |
|---|---|
400 | The request, identifier, query, or Idempotency-Key is invalid. |
401 | The API key is missing, invalid, expired, or revoked. |
403 | The key lacks a scope, your project role is too limited, or the plan limit was reached. |
404 | The project or requested record is unavailable to this key. |
409 | The request conflicts with current project data or idempotency state. |
413 | The JSON body exceeds the endpoint limit. |
422 | A study ran but did not complete successfully. |
429 | The request rate is too high. Follow Retry-After. |
Transformer imports accept transformerConstruction as dry_type, other_than_dry_type, or null. Leave it unknown when the source does not establish construction; cooling type is not sufficient. See project imports for omission and patch behavior.