API reference
Onboarding
Bringing an asset onto the platform: onboarding workflows and the tasks assigned to you — gates, DPL rows, RfI fields, document upload and download, partner and asset owner access links, and prequalification submission.
GET/v1/onboarding-branding/{organization_id}
Get organization onboarding branding
onboarding.read
Returns branding for the caller's organization. EBX users may read branding for any organization.
Path parameters
- organization_idREQUIRED
- stringOrganization identifier the branding belongs to.
curl "https://api.ebx.energy/v1/onboarding-branding/your-org" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboarding-branding/your-org",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-branding/your-org", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"organization_id": "<string>",
"organization_name": "<string>",
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>",
"email_banner_url": "<string>",
"magic_link_default_language": "de",
"magic_link_email_templates": "<string>"
}
}PUT/v1/onboarding-branding/{organization_id}
Create or update organization onboarding branding
onboarding.write
Updates the caller's organization branding. EBX writers may update any organization.
Path parameters
- organization_idREQUIRED
- stringOrganization identifier the branding belongs to.
Request body · required
- display_nameREQUIRED
- string
- primary_colorREQUIRED
- stringHex color, e.g. #1f4fff
- support_emailREQUIRED
- string<email>
- magic_link_default_language
- enum
deen - magic_link_email_templates
- object
curl -X PUT "https://api.ebx.energy/v1/onboarding-branding/your-org" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"display_name":"<string>","primary_color":"<string>","support_email":"name@example.com","magic_link_default_language":"de","magic_link_email_templates":"<string>"}'import httpx
r = httpx.put(
"https://api.ebx.energy/v1/onboarding-branding/your-org",
headers={"Authorization": f"Bearer {token}"},
json={
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "name@example.com",
"magic_link_default_language": "de",
"magic_link_email_templates": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-branding/your-org", {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"display_name":"<string>","primary_color":"<string>","support_email":"name@example.com","magic_link_default_language":"de","magic_link_email_templates":"<string>"}),
});
const data = await res.json();{
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>",
"email_banner_url": "<string>",
"magic_link_default_language": "de",
"magic_link_email_templates": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PUT/v1/onboarding-branding/{organization_id}/email-banner
Upload an organization onboarding email banner
onboarding.write
Uploads the caller's organization-wide email banner as PNG, SVG, or JPEG (maximum 2 MB). EBX writers may upload for any organization.
Path parameters
- organization_idREQUIRED
- stringOrganization identifier the branding belongs to.
curl -X PUT "https://api.ebx.energy/v1/onboarding-branding/your-org/email-banner" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.put(
"https://api.ebx.energy/v1/onboarding-branding/your-org/email-banner",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-branding/your-org/email-banner", {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>",
"email_banner_url": "<string>",
"magic_link_default_language": "de",
"magic_link_email_templates": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 429rate limited
PUT/v1/onboarding-branding/{organization_id}/logo
Upload an organization onboarding logo
onboarding.write
Uploads the caller's organization logo as PNG, SVG, or JPEG (maximum 512 KB). EBX writers may upload for any organization.
Path parameters
- organization_idREQUIRED
- stringOrganization identifier the branding belongs to.
curl -X PUT "https://api.ebx.energy/v1/onboarding-branding/your-org/logo" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.put(
"https://api.ebx.energy/v1/onboarding-branding/your-org/logo",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-branding/your-org/logo", {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>",
"email_banner_url": "<string>",
"magic_link_default_language": "de",
"magic_link_email_templates": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 429rate limited
POST/v1/onboarding-magic/{token}/exchange
Exchange an onboarding magic link
Validates a reusable external onboarding magic link and returns Cognito tokens scoped to the assigned task principal.
Path parameters
- tokenREQUIRED
- stringRaw magic-link token from the external onboarding email.
curl -X POST "https://api.ebx.energy/v1/onboarding-magic/ml_9f2c4b8a1d3e/exchange" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboarding-magic/ml_9f2c4b8a1d3e/exchange",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-magic/ml_9f2c4b8a1d3e/exchange", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"access_token": "<string>",
"id_token": "<string>",
"refresh_token": "<string>",
"token_type": "Bearer",
"expires_at": 0,
"session_id": "<string>",
"onboarding_id": "<string>",
"role": "asset_owner",
"contact_name": "<string>",
"contact_email": "<string>",
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
}
}POST/v1/onboarding-magic/refresh
Refresh an onboarding magic-link session
Refreshes a Cognito access token for an active external onboarding magic-link session.
Request body · required
- session_idREQUIRED
- string
- refresh_tokenREQUIRED
- string
curl -X POST "https://api.ebx.energy/v1/onboarding-magic/refresh" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"session_id":"<string>","refresh_token":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboarding-magic/refresh",
headers={"Authorization": f"Bearer {token}"},
json={
"session_id": "<string>",
"refresh_token": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-magic/refresh", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"session_id":"<string>","refresh_token":"<string>"}),
});
const data = await res.json();{
"access_token": "<string>",
"id_token": "<string>",
"token_type": "Bearer",
"expires_at": 0
}GET/v1/onboarding-tasks
List assigned onboarding tasks
Returns the asset-owner, EPC, or EMS onboarding tasks assigned to the authenticated caller.
This endpoint takes no parameters.
curl "https://api.ebx.energy/v1/onboarding-tasks" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboarding-tasks",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"tasks": [
{
"onboarding_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"overall_status": "in_progress",
"role": "asset_owner",
"gate_definition_id": "mon_rfi",
"gate_title": "<string>",
"gate_status": "pending",
"deadline": "2026-01-01",
"ready": false,
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>"
}
]
}GET/v1/onboarding-tasks/{onboarding_id}
Get onboarding task detail
Returns the guided-task payload for an assigned onboarding without exposing the full control-center workspace.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by the task list.
Query parameters
- role
- enum
asset_ownerepcems_providerentrix_onboardingebxtsoAssigned task role to load when the caller has multiple roles on the same onboarding.
Header parameters
- X-Onboarding-Preview-Role
- enum
asset_ownerepcems_providerentrix_onboardingebxtsoEBX-internal view-as role. Requires onboarding.read for reads and onboarding.write for mutations.
curl "https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"onboarding_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"role": "asset_owner",
"viewer_contact_name": "<string>",
"task_gate_ids": [
"mon_rfi"
],
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>"
}DELETE/v1/onboarding-tasks/{onboarding_id}/documents/{document_id}
Remove a task-scoped uploaded document
Soft-deletes a document the caller uploaded through their onboarding task so it no longer appears on the task or receives download URLs. The S3 object is not deleted synchronously.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by the task list.
- document_idREQUIRED
- string<uuid>Document identifier returned by the presigned upload request.
Header parameters
- X-Onboarding-Preview-Role
- enum
asset_ownerepcems_providerentrix_onboardingebxtsoEBX-internal view-as role. Requires onboarding.read for reads and onboarding.write for mutations.
curl -X DELETE "https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.delete(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000", {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"onboarding_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"role": "asset_owner",
"viewer_contact_name": "<string>",
"task_gate_ids": [
"mon_rfi"
],
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>"
}GET/v1/onboarding-tasks/{onboarding_id}/documents/{document_id}/download
Download a task-scoped document
Returns a short-lived presigned S3 GET URL for a document the caller can access through their assigned onboarding task.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by the task list.
- document_idREQUIRED
- string<uuid>Document identifier returned by the presigned upload request.
Query parameters
- role
- enum
asset_ownerepcems_providerentrix_onboardingebxtsoAssigned task role to download as when the caller has multiple roles on the same onboarding.
Header parameters
- X-Onboarding-Preview-Role
- enum
asset_ownerepcems_providerentrix_onboardingebxtsoEBX-internal view-as role. Requires onboarding.read for reads and onboarding.write for mutations.
curl "https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000/download" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000/download",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000/download", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"download_url": "<string>",
"expires_at": "<string>"
}POST/v1/onboarding-tasks/{onboarding_id}/documents/{document_id}/finalize
Finalize a task-scoped uploaded document
Marks a pending task evidence upload as available after the client has uploaded bytes to S3.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by the task list.
- document_idREQUIRED
- string<uuid>Document identifier returned by the presigned upload request.
Header parameters
- X-Onboarding-Preview-Role
- enum
asset_ownerepcems_providerentrix_onboardingebxtsoEBX-internal view-as role. Requires onboarding.read for reads and onboarding.write for mutations.
curl -X POST "https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000/finalize" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000/finalize",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000/finalize", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"onboarding_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"role": "asset_owner",
"viewer_contact_name": "<string>",
"task_gate_ids": [
"mon_rfi"
],
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>"
}POST/v1/onboarding-tasks/{onboarding_id}/documents/presigned-upload
Create a task-scoped document upload URL
Creates pending document metadata for task-owned evidence and returns a short-lived presigned S3 PUT URL.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by the task list.
Header parameters
- X-Onboarding-Preview-Role
- enum
asset_ownerepcems_providerentrix_onboardingebxtsoEBX-internal view-as role. Requires onboarding.read for reads and onboarding.write for mutations.
Request body · required
- document_typeREQUIRED
- enum
installation_photo_mdeviceinstallation_photo_antennatest_results_signedbetriebsfahrt_datapq_frequency_analysispq_doublestroke_filepq_approvaleigentuemerbetreiberother - gate_definition_id
- enum
mon_rfimon_hwmon_swmon_valctl_rfictl_hwctl_swctl_mon_testctl_ctrl_testctl_pq_testctl_pq_submitctl_pq_approved - filenameREQUIRED
- string
- size_bytesREQUIRED
- integer
- content_typeREQUIRED
- string
curl -X POST "https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/documents/presigned-upload" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"document_type":"installation_photo_mdevice","gate_definition_id":"mon_rfi","filename":"<string>","size_bytes":0,"content_type":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/documents/presigned-upload",
headers={"Authorization": f"Bearer {token}"},
json={
"document_type": "installation_photo_mdevice",
"gate_definition_id": "mon_rfi",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/documents/presigned-upload", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"document_type":"installation_photo_mdevice","gate_definition_id":"mon_rfi","filename":"<string>","size_bytes":0,"content_type":"<string>"}),
});
const data = await res.json();{
"upload_url": "<string>",
"document_id": "<string>",
"expires_at": "<string>"
}- 400malformed request
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboarding-tasks/{onboarding_id}/dpl/rows/{row_id}
Update an EMS DPL task row
Updates externally editable implementation fields for one DPL row on the EMS software task.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by the task list.
- row_idREQUIRED
- stringDPL row identifier from the onboarding software task payload.
Header parameters
- X-Onboarding-Preview-Role
- enum
asset_ownerepcems_providerentrix_onboardingebxtsoEBX-internal view-as role. Requires onboarding.read for reads and onboarding.write for mutations.
Request body · required
- implementation_status
- enum
pendingimplementeddeviationnot_available - received_test_value
- number | integer
- excluded
- boolean
- asset_notes
- string
curl -X PATCH "https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/dpl/rows/dpl_row_014" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"implementation_status":"pending","received_test_value":0,"excluded":false,"asset_notes":"<string>"}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/dpl/rows/dpl_row_014",
headers={"Authorization": f"Bearer {token}"},
json={
"implementation_status": "pending",
"received_test_value": 0,
"excluded": False,
"asset_notes": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/dpl/rows/dpl_row_014", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"implementation_status":"pending","received_test_value":0,"excluded":false,"asset_notes":"<string>"}),
});
const data = await res.json();{
"onboarding_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"role": "asset_owner",
"viewer_contact_name": "<string>",
"task_gate_ids": [
"mon_rfi"
],
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>"
}- 400malformed request
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboarding-tasks/{onboarding_id}/dpl/rows/{row_id}/comments
Comment on an EMS DPL task row
Adds an EMS clarification comment to one DPL row and opens the row discussion.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by the task list.
- row_idREQUIRED
- stringDPL row identifier from the onboarding software task payload.
Header parameters
- X-Onboarding-Preview-Role
- enum
asset_ownerepcems_providerentrix_onboardingebxtsoEBX-internal view-as role. Requires onboarding.read for reads and onboarding.write for mutations.
Request body · required
- bodyREQUIRED
- string
curl -X POST "https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/dpl/rows/dpl_row_014/comments" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"body":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/dpl/rows/dpl_row_014/comments",
headers={"Authorization": f"Bearer {token}"},
json={
"body": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/dpl/rows/dpl_row_014/comments", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"body":"<string>"}),
});
const data = await res.json();{
"status": "open",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"last_comment_at": "<string>"
}- 400malformed request
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboarding-tasks/{onboarding_id}/dpl/rows/{row_id}/thread
Update an EMS DPL task row discussion status
Opens or resolves the discussion thread for a DPL row without changing the row implementation values.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by the task list.
- row_idREQUIRED
- stringDPL row identifier from the onboarding software task payload.
Header parameters
- X-Onboarding-Preview-Role
- enum
asset_ownerepcems_providerentrix_onboardingebxtsoEBX-internal view-as role. Requires onboarding.read for reads and onboarding.write for mutations.
Request body · required
- statusREQUIRED
- enum
openresolved
curl -X PATCH "https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/dpl/rows/dpl_row_014/thread" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status":"open"}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/dpl/rows/dpl_row_014/thread",
headers={"Authorization": f"Bearer {token}"},
json={
"status": "open",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/dpl/rows/dpl_row_014/thread", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"status":"open"}),
});
const data = await res.json();{
"onboarding_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"role": "asset_owner",
"viewer_contact_name": "<string>",
"task_gate_ids": [
"mon_rfi"
],
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>"
}- 400malformed request
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboarding-tasks/{onboarding_id}/gates/{gate_id}/auto-check
Run a task-scoped gate auto-check
Returns the current automated check result visible from the external working view.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by the task list.
- gate_idREQUIRED
- enum
mon_rfimon_hwmon_swmon_valctl_rfictl_hwctl_swctl_mon_testctl_ctrl_testctl_pq_testctl_pq_submitctl_pq_approvedExternally owned workflow gate identifier.
Header parameters
- X-Onboarding-Preview-Role
- enum
asset_ownerepcems_providerentrix_onboardingebxtsoEBX-internal view-as role. Requires onboarding.read for reads and onboarding.write for mutations.
curl "https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/gates/mon_rfi/auto-check" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/gates/mon_rfi/auto-check",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/gates/mon_rfi/auto-check", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"status": "pass",
"summary": "<string>",
"facts": [
{
"label": "<string>",
"value": "<string>",
"pass": false
}
],
"last_checked_at": "<string>",
"hardware_signal": {
"boxes": [
{
"device": 0,
"signal_strength_pct": 0,
"lan_connected": false,
"last_seen_at": "<string>"
}
]
}
}POST/v1/onboarding-tasks/{onboarding_id}/gates/{gate_id}/submit
Submit an external onboarding task for EBX confirmation
Validates task-owned evidence/progress and moves the canonical gate to awaiting_confirmation without passing it.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by the task list.
- gate_idREQUIRED
- enum
mon_rfimon_hwmon_swmon_valctl_rfictl_hwctl_swctl_mon_testctl_ctrl_testctl_pq_testctl_pq_submitctl_pq_approvedExternally owned workflow gate identifier.
Header parameters
- X-Onboarding-Preview-Role
- enum
asset_ownerepcems_providerentrix_onboardingebxtsoEBX-internal view-as role. Requires onboarding.read for reads and onboarding.write for mutations.
Request body · required
- note
- string
- hardware
- object
curl -X POST "https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/gates/mon_rfi/submit" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"note":"<string>","hardware":{"package_received_confirmed":false,"installation_confirmed":false,"notes":"<string>"}}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/gates/mon_rfi/submit",
headers={"Authorization": f"Bearer {token}"},
json={
"note": "<string>",
"hardware": {
"package_received_confirmed": False,
"installation_confirmed": False,
"notes": "<string>",
},
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/gates/mon_rfi/submit", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"note":"<string>","hardware":{"package_received_confirmed":false,"installation_confirmed":false,"notes":"<string>"}}),
});
const data = await res.json();{
"onboarding_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"role": "asset_owner",
"viewer_contact_name": "<string>",
"task_gate_ids": [
"mon_rfi"
],
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>"
}- 400malformed request
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboarding-tasks/{onboarding_id}/rfi
Update an asset-owner RfI task
Stores asset-owner RfI/site-readiness progress without passing the canonical onboarding gate.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by the task list.
Header parameters
- X-Onboarding-Preview-Role
- enum
asset_ownerepcems_providerentrix_onboardingebxtsoEBX-internal view-as role. Requires onboarding.read for reads and onboarding.write for mutations.
Request body · required
- rfiREQUIRED
- object
curl -X PATCH "https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/rfi" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"rfi":{"m_device":{"shipping_address":{"street":"<string>","postal_code":"<string>","city":"<string>","country":"<string>","attention":"<string>"},"site_contact":{"name":"<string>","email":"name@example.com","phone":"<string>"},"network_config":{"ems_server_ip":"","ebx_box_1_client_ip":"","ebx_box_2_client_ip":""},"planned_hw_installation_date":"<string>","delivery_mode":"loose_components","power_supply":"24v_dc","ethernet_available":false,"antenna_location_outdoors":false,"antenna_extension_cable":"none","notes":"<string>"},"control":{"ems_vendor":"<string>","ems_vendor_other":"<string>","ems_supports_modbus_tcp":false,"pq_submission_targeted":false,"ems_technical_contact":{"name":"<string>","email":"name@example.com","phone":"<string>"},"pq_data":"<string>","pq_documents":"<string>","notes":"<string>"},"field_meta":"<string>"}}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/rfi",
headers={"Authorization": f"Bearer {token}"},
json={
"rfi": {
"m_device": {
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>",
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>",
},
"network_config": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
},
"planned_hw_installation_date": "<string>",
"delivery_mode": "loose_components",
"power_supply": "24v_dc",
"ethernet_available": False,
"antenna_location_outdoors": False,
"antenna_extension_cable": "none",
"notes": "<string>",
},
"control": {
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": False,
"pq_submission_targeted": False,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>",
},
"pq_data": "<string>",
"pq_documents": "<string>",
"notes": "<string>",
},
"field_meta": "<string>",
},
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/rfi", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"rfi":{"m_device":{"shipping_address":{"street":"<string>","postal_code":"<string>","city":"<string>","country":"<string>","attention":"<string>"},"site_contact":{"name":"<string>","email":"name@example.com","phone":"<string>"},"network_config":{"ems_server_ip":"","ebx_box_1_client_ip":"","ebx_box_2_client_ip":""},"planned_hw_installation_date":"<string>","delivery_mode":"loose_components","power_supply":"24v_dc","ethernet_available":false,"antenna_location_outdoors":false,"antenna_extension_cable":"none","notes":"<string>"},"control":{"ems_vendor":"<string>","ems_vendor_other":"<string>","ems_supports_modbus_tcp":false,"pq_submission_targeted":false,"ems_technical_contact":{"name":"<string>","email":"name@example.com","phone":"<string>"},"pq_data":"<string>","pq_documents":"<string>","notes":"<string>"},"field_meta":"<string>"}}),
});
const data = await res.json();{
"onboarding_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"role": "asset_owner",
"viewer_contact_name": "<string>",
"task_gate_ids": [
"mon_rfi"
],
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>"
}- 400malformed request
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboarding-tasks/{onboarding_id}/rfi/fields/{field_key}/comments
Comment on an asset-owner RfI field
Adds a clarification comment to an RfI field on the asset-owner task and opens the field discussion thread.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by the task list.
- field_keyREQUIRED
- stringRfI field key from the RfI task field_meta payload, for example
m_device.shipping_address.
Header parameters
- X-Onboarding-Preview-Role
- enum
asset_ownerepcems_providerentrix_onboardingebxtsoEBX-internal view-as role. Requires onboarding.read for reads and onboarding.write for mutations.
Request body · required
- bodyREQUIRED
- string
curl -X POST "https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/rfi/fields/m_device.shipping_address/comments" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"body":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/rfi/fields/m_device.shipping_address/comments",
headers={"Authorization": f"Bearer {token}"},
json={
"body": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/rfi/fields/m_device.shipping_address/comments", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"body":"<string>"}),
});
const data = await res.json();{
"status": "open",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"last_comment_at": "<string>"
}- 400malformed request
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboarding-tasks/{onboarding_id}/rfi/fields/{field_key}/thread
Update an asset-owner RfI field discussion status
Opens or resolves the clarification thread for an RfI field without changing the field values.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by the task list.
- field_keyREQUIRED
- stringRfI field key from the RfI task field_meta payload, for example
m_device.shipping_address.
Header parameters
- X-Onboarding-Preview-Role
- enum
asset_ownerepcems_providerentrix_onboardingebxtsoEBX-internal view-as role. Requires onboarding.read for reads and onboarding.write for mutations.
Request body · required
- statusREQUIRED
- enum
openresolved
curl -X PATCH "https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/rfi/fields/m_device.shipping_address/thread" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status":"open"}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/rfi/fields/m_device.shipping_address/thread",
headers={"Authorization": f"Bearer {token}"},
json={
"status": "open",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/rfi/fields/m_device.shipping_address/thread", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"status":"open"}),
});
const data = await res.json();{
"status": "open",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"last_comment_at": "<string>"
}- 400malformed request
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboardings
List visible onboardings
onboarding.read
Returns onboardings the caller can read. EBX users see all onboardings. Asset-owner users see onboardings for their organization. Task-principal users are intentionally scoped to /onboarding-tasks.
Query parameters
- status
- enum
in_progressblockedcompletedabortedFilter by overall onboarding status. - integration_type
- enum
monitoring_onlyfull_controlFilter by integration path: monitoring-only or full-control. - attention_only
- booleandefault falseWhen true, return only blocked and in-progress onboardings.
curl "https://api.ebx.energy/v1/onboardings" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"onboardings": [
{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}
]
}POST/v1/onboardings
Create an onboarding workflow
onboarding.write
Creates a version-pinned onboarding workflow for a new asset. The service stores the selected process definition, creates all gates, starts the first gate, initializes gate payloads such as RFI/DPL data where applicable, and records the initial activity log entries. Organization writers create onboardings for their own organization; EBX writers may select any registered organization.
Request body · required
- asset_nameREQUIRED
- string
- locationREQUIRED
- string
- countryREQUIRED
- string
- tso
- stringControl area, canonical TSO short id (e.g. 50HZ)
- integration_typeREQUIRED
- enum
monitoring_onlyfull_control - target_hc_dateREQUIRED
- string<date>
- asset_owner_org_idREQUIRED
- string
- asset_owner_org_nameREQUIRED
- string
- asset_owner_contact
- object
- asset_id
- string
- register_asset
- booleandefault falseCreate and atomically link the onboarding stub asset. Mutually exclusive with asset_id.
- partners
- array[object]
- whitelabel
- booleandefault falseBrand the external onboarding surface with the owner org's branding. Requires branding to be configured for the org.
curl -X POST "https://api.ebx.energy/v1/onboardings" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"asset_name":"<string>","location":"<string>","country":"<string>","tso":"<string>","integration_type":"monitoring_only","target_hc_date":"2026-01-01","asset_owner_org_id":"<string>","asset_owner_org_name":"<string>","asset_owner_contact":{"contact_name":"<string>","contact_email":"name@example.com"},"asset_id":"<string>","register_asset":false,"partners":[{"role":"epc","org_name":"<string>","contact_name":"<string>","contact_email":"name@example.com"}],"whitelabel":false}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings",
headers={"Authorization": f"Bearer {token}"},
json={
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"asset_owner_contact": {
"contact_name": "<string>",
"contact_email": "name@example.com",
},
"asset_id": "<string>",
"register_asset": False,
"partners": [
{
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "name@example.com",
},
],
"whitelabel": False,
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"asset_name":"<string>","location":"<string>","country":"<string>","tso":"<string>","integration_type":"monitoring_only","target_hc_date":"2026-01-01","asset_owner_org_id":"<string>","asset_owner_org_name":"<string>","asset_owner_contact":{"contact_name":"<string>","contact_email":"name@example.com"},"asset_id":"<string>","register_asset":false,"partners":[{"role":"epc","org_name":"<string>","contact_name":"<string>","contact_email":"name@example.com"}],"whitelabel":false}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboardings/{onboarding_id}
Get onboarding details
onboarding.read
Returns the complete onboarding state for a visible onboarding, including the persisted process definition, current gate states, partner assignments, document metadata, activity log, DPL discussions, and synced asset profile when available.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}PATCH/v1/onboardings/{onboarding_id}
Update onboarding metadata
onboarding.write
Updates onboarding metadata within the caller's authorized organization. Changing the target HC date recalculates gate deadlines from the persisted process definition. Changing the asset id updates the synced asset profile identity when a profile already exists.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- target_hc_date
- string<date>
- asset_id
- string
curl -X PATCH "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"target_hc_date":"2026-01-01","asset_id":"<string>"}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000",
headers={"Authorization": f"Bearer {token}"},
json={
"target_hc_date": "2026-01-01",
"asset_id": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"target_hc_date":"2026-01-01","asset_id":"<string>"}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboardings/{onboarding_id}/asset-owner-contact
Set or edit the asset-owner contact
onboarding.write
Creates or updates the asset-owner contact without sending a magic link. Changing the contact email — or editing a previously revoked contact — resets external access to not_invited and invalidates outstanding magic links; a name-only edit keeps the current access state.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- contact_name
- string
- contact_email
- string<email>
curl -X PATCH "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/asset-owner-contact" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"contact_name":"<string>","contact_email":"name@example.com"}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/asset-owner-contact",
headers={"Authorization": f"Bearer {token}"},
json={
"contact_name": "<string>",
"contact_email": "name@example.com",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/asset-owner-contact", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"contact_name":"<string>","contact_email":"name@example.com"}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/asset-owner/access/revoke
Revoke asset-owner onboarding task access
onboarding.write
Revokes active links, refresh sessions, database access state, and the matching Cognito task-principal group for one asset-owner contact.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- contact_name
- string
- contact_email
- string<email>
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/asset-owner/access/revoke" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"contact_name":"<string>","contact_email":"name@example.com"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/asset-owner/access/revoke",
headers={"Authorization": f"Bearer {token}"},
json={
"contact_name": "<string>",
"contact_email": "name@example.com",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/asset-owner/access/revoke", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"contact_name":"<string>","contact_email":"name@example.com"}),
});
const data = await res.json();{
"onboarding": {
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
},
"revoked_link_count": 0,
"revoked_session_count": 0
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/asset-owner/magic-link
Send an asset-owner onboarding magic link
onboarding.write
Creates a six-month reusable magic link for the asset-owner site-readiness task and sends it to the contact email.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- language
- enum
deen - email_template
- object
- contact_name
- string
- contact_email
- string<email>
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/asset-owner/magic-link" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"language":"de","email_template":{"subject":"<string>","greeting":"<string>","body":"<string>","button_label":"<string>","fallback_text":"<string>","signature":"<string>","generated":"<string>"},"contact_name":"<string>","contact_email":"name@example.com"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/asset-owner/magic-link",
headers={"Authorization": f"Bearer {token}"},
json={
"language": "de",
"email_template": {
"subject": "<string>",
"greeting": "<string>",
"body": "<string>",
"button_label": "<string>",
"fallback_text": "<string>",
"signature": "<string>",
"generated": "<string>",
},
"contact_name": "<string>",
"contact_email": "name@example.com",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/asset-owner/magic-link", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"language":"de","email_template":{"subject":"<string>","greeting":"<string>","body":"<string>","button_label":"<string>","fallback_text":"<string>","signature":"<string>","generated":"<string>"},"contact_name":"<string>","contact_email":"name@example.com"}),
});
const data = await res.json();{
"onboarding": {
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
},
"dev_magic_link": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/asset-owner/magic-link/revoke
Revoke active asset-owner onboarding magic links
onboarding.write
Revokes active reusable magic links and refresh sessions for one asset-owner contact without revoking future access.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- contact_name
- string
- contact_email
- string<email>
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/asset-owner/magic-link/revoke" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"contact_name":"<string>","contact_email":"name@example.com"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/asset-owner/magic-link/revoke",
headers={"Authorization": f"Bearer {token}"},
json={
"contact_name": "<string>",
"contact_email": "name@example.com",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/asset-owner/magic-link/revoke", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"contact_name":"<string>","contact_email":"name@example.com"}),
});
const data = await res.json();{
"onboarding": {
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
},
"revoked_link_count": 0,
"revoked_session_count": 0
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboardings/{onboarding_id}/betriebsfahrt
Betriebsfahrt status of the onboarding
onboarding.read
The milestone's poll target: whether the automated Betriebsfahrt is available, which preconditions still fail, the plan defaults and the session being worked on.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier.
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"enabled": false,
"server_now": "2026-09-10T13:30:00Z",
"preconditions": [
{
"key": "<string>",
"label": "<string>",
"status": "ok",
"detail": "<string>"
}
],
"can_create_session": false,
"defaults": {
"first_direction": "positive",
"extended_stroke_minutes": 0,
"extended_stroke_min_minutes": 0,
"extended_stroke_max_minutes": 0,
"second_run_extended_stroke_minutes": 0,
"planned_start": "2026-09-10T13:30:00Z"
},
"session": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"status": "draft",
"execution_mode": "real",
"supersedes_session_id": "<string>",
"parameters": {
"first_direction": "positive",
"single_direction": false,
"extended_stroke_minutes": 0,
"extended_stroke_min_minutes": 0,
"extended_stroke_max_minutes": 0,
"second_run_extended_stroke_minutes": 0,
"capacity_mw": {
"positive": "<string>",
"negative": "<string>"
},
"products": {
"positive": [
"<string>"
],
"negative": [
"<string>"
]
},
"product_capacity_mw": "<string>",
"usable_energy_mwh": "<string>",
"energy_safety_margin": "<string>",
"energy_per_run_mwh": {
"positive": "<string>",
"negative": "<string>"
},
"ramp_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"fcr_ramp_required_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"measurement_point": "<string>",
"retention_minutes": 0,
"stroke_minutes": 0
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-09-10T13:30:00Z",
"planned_end": "2026-09-10T13:30:00Z",
"plan_sha256": "<string>",
"plan": "<string>",
"runs": [
{
"index": 0,
"direction": "positive",
"products": [
"<string>"
],
"requested_capacity_mw": "<string>",
"phases": [
{
"index": 0,
"kind": "retention",
"start": "2026-09-10T13:30:00Z",
"end": "2026-09-10T13:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-09-10T13:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-09-10T13:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-09-10T13:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z",
"confirmed_by_user_name": "<string>",
"confirmed_at": "2026-09-10T13:30:00Z",
"aborted_at": "2026-09-10T13:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-09-10T13:30:00Z",
"row_version": 0,
"created_at": "2026-09-10T13:30:00Z",
"updated_at": "2026-09-10T13:30:00Z"
},
"history_count": 0
}GET/v1/onboardings/{onboarding_id}/betriebsfahrt/sessions
Betriebsfahrt session history
onboarding.read
Every session of the onboarding, newest first, including superseded and ended ones.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier.
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();[
{
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"status": "draft",
"execution_mode": "real",
"supersedes_session_id": "<string>",
"parameters": {
"first_direction": "positive",
"single_direction": false,
"extended_stroke_minutes": 0,
"extended_stroke_min_minutes": 0,
"extended_stroke_max_minutes": 0,
"second_run_extended_stroke_minutes": 0,
"capacity_mw": {
"positive": "<string>",
"negative": "<string>"
},
"products": {
"positive": [
"<string>"
],
"negative": [
"<string>"
]
},
"product_capacity_mw": "<string>",
"usable_energy_mwh": "<string>",
"energy_safety_margin": "<string>",
"energy_per_run_mwh": {
"positive": "<string>",
"negative": "<string>"
},
"ramp_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"fcr_ramp_required_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"measurement_point": "<string>",
"retention_minutes": 0,
"stroke_minutes": 0
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-09-10T13:30:00Z",
"planned_end": "2026-09-10T13:30:00Z",
"plan_sha256": "<string>",
"plan": "<string>",
"runs": [
{
"index": 0,
"direction": "positive",
"products": [
"<string>"
],
"requested_capacity_mw": "<string>",
"phases": [
{
"index": 0,
"kind": "retention",
"start": "2026-09-10T13:30:00Z",
"end": "2026-09-10T13:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-09-10T13:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-09-10T13:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-09-10T13:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z",
"confirmed_by_user_name": "<string>",
"confirmed_at": "2026-09-10T13:30:00Z",
"aborted_at": "2026-09-10T13:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-09-10T13:30:00Z",
"row_version": 0,
"created_at": "2026-09-10T13:30:00Z",
"updated_at": "2026-09-10T13:30:00Z"
}
]POST/v1/onboardings/{onboarding_id}/betriebsfahrt/sessions
Plan a Betriebsfahrt session
onboarding.write
Generates a draft session from the RfI, the PQ profile and the asset: two runs back to back (one per direction), each with three retention phases, two 15-minute delivery strokes and an extended third stroke sized from the usable energy. Replaces an existing draft. Nothing is sent to the asset or the TSO portal until the session is confirmed.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier.
Request body · required
- first_direction
- enum
positivenegativeDirection of the first run: positive (discharge) needs a full battery, negative (charge) an empty one. Defaults to positive. - extended_stroke_minutes
- integerThe first run's third delivery stroke: a multiple of 15 min within the range the usable energy allows, default the longest. The second run's follows from the energy moved.
- planned_start
- string<date-time>UTC start of run 1 on a quarter hour; defaults to the next quarter hour after the submission lead time.
- single_direction
- booleandefault falseDrive the first direction alone (one run instead of two). FCR is symmetric and cannot be proven from a single direction; leave it false to drive both.
- execution_mode
- enum
realdry_run
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"first_direction":"positive","extended_stroke_minutes":0,"planned_start":"2026-09-10T13:30:00Z","single_direction":false,"execution_mode":"real"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions",
headers={"Authorization": f"Bearer {token}"},
json={
"first_direction": "positive",
"extended_stroke_minutes": 0,
"planned_start": "2026-09-10T13:30:00Z",
"single_direction": False,
"execution_mode": "real",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"first_direction":"positive","extended_stroke_minutes":0,"planned_start":"2026-09-10T13:30:00Z","single_direction":false,"execution_mode":"real"}),
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"status": "draft",
"execution_mode": "real",
"supersedes_session_id": "<string>",
"parameters": {
"first_direction": "positive",
"single_direction": false,
"extended_stroke_minutes": 0,
"extended_stroke_min_minutes": 0,
"extended_stroke_max_minutes": 0,
"second_run_extended_stroke_minutes": 0,
"capacity_mw": {
"positive": "<string>",
"negative": "<string>"
},
"products": {
"positive": [
"<string>"
],
"negative": [
"<string>"
]
},
"product_capacity_mw": "<string>",
"usable_energy_mwh": "<string>",
"energy_safety_margin": "<string>",
"energy_per_run_mwh": {
"positive": "<string>",
"negative": "<string>"
},
"ramp_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"fcr_ramp_required_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"measurement_point": "<string>",
"retention_minutes": 0,
"stroke_minutes": 0
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-09-10T13:30:00Z",
"planned_end": "2026-09-10T13:30:00Z",
"plan_sha256": "<string>",
"plan": "<string>",
"runs": [
{
"index": 0,
"direction": "positive",
"products": [
"<string>"
],
"requested_capacity_mw": "<string>",
"phases": [
{
"index": 0,
"kind": "retention",
"start": "2026-09-10T13:30:00Z",
"end": "2026-09-10T13:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-09-10T13:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-09-10T13:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-09-10T13:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z",
"confirmed_by_user_name": "<string>",
"confirmed_at": "2026-09-10T13:30:00Z",
"aborted_at": "2026-09-10T13:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-09-10T13:30:00Z",
"row_version": 0,
"created_at": "2026-09-10T13:30:00Z",
"updated_at": "2026-09-10T13:30:00Z"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboardings/{onboarding_id}/betriebsfahrt/sessions/{session_id}
Get one Betriebsfahrt session
onboarding.read
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier.
- session_idREQUIRED
- string<uuid>Betriebsfahrt session identifier from the status response.
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"status": "draft",
"execution_mode": "real",
"supersedes_session_id": "<string>",
"parameters": {
"first_direction": "positive",
"single_direction": false,
"extended_stroke_minutes": 0,
"extended_stroke_min_minutes": 0,
"extended_stroke_max_minutes": 0,
"second_run_extended_stroke_minutes": 0,
"capacity_mw": {
"positive": "<string>",
"negative": "<string>"
},
"products": {
"positive": [
"<string>"
],
"negative": [
"<string>"
]
},
"product_capacity_mw": "<string>",
"usable_energy_mwh": "<string>",
"energy_safety_margin": "<string>",
"energy_per_run_mwh": {
"positive": "<string>",
"negative": "<string>"
},
"ramp_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"fcr_ramp_required_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"measurement_point": "<string>",
"retention_minutes": 0,
"stroke_minutes": 0
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-09-10T13:30:00Z",
"planned_end": "2026-09-10T13:30:00Z",
"plan_sha256": "<string>",
"plan": "<string>",
"runs": [
{
"index": 0,
"direction": "positive",
"products": [
"<string>"
],
"requested_capacity_mw": "<string>",
"phases": [
{
"index": 0,
"kind": "retention",
"start": "2026-09-10T13:30:00Z",
"end": "2026-09-10T13:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-09-10T13:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-09-10T13:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-09-10T13:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z",
"confirmed_by_user_name": "<string>",
"confirmed_at": "2026-09-10T13:30:00Z",
"aborted_at": "2026-09-10T13:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-09-10T13:30:00Z",
"row_version": 0,
"created_at": "2026-09-10T13:30:00Z",
"updated_at": "2026-09-10T13:30:00Z"
}PATCH/v1/onboardings/{onboarding_id}/betriebsfahrt/sessions/{session_id}
Adjust a draft Betriebsfahrt session
onboarding.write
Regenerates the draft with the given parameters (first direction, extended stroke, start, execution mode). Only drafts can be adjusted.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier.
- session_idREQUIRED
- string<uuid>Betriebsfahrt session identifier from the status response.
Request body · required
- first_direction
- enum
positivenegative - extended_stroke_minutes
- integer
- planned_start
- string<date-time>
- execution_mode
- enum
realdry_run - single_direction
- booleanDrive the first direction alone (one run instead of two); FCR cannot be proven from it.
curl -X PATCH "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"first_direction":"positive","extended_stroke_minutes":0,"planned_start":"2026-09-10T13:30:00Z","execution_mode":"real","single_direction":false}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000",
headers={"Authorization": f"Bearer {token}"},
json={
"first_direction": "positive",
"extended_stroke_minutes": 0,
"planned_start": "2026-09-10T13:30:00Z",
"execution_mode": "real",
"single_direction": False,
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"first_direction":"positive","extended_stroke_minutes":0,"planned_start":"2026-09-10T13:30:00Z","execution_mode":"real","single_direction":false}),
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"status": "draft",
"execution_mode": "real",
"supersedes_session_id": "<string>",
"parameters": {
"first_direction": "positive",
"single_direction": false,
"extended_stroke_minutes": 0,
"extended_stroke_min_minutes": 0,
"extended_stroke_max_minutes": 0,
"second_run_extended_stroke_minutes": 0,
"capacity_mw": {
"positive": "<string>",
"negative": "<string>"
},
"products": {
"positive": [
"<string>"
],
"negative": [
"<string>"
]
},
"product_capacity_mw": "<string>",
"usable_energy_mwh": "<string>",
"energy_safety_margin": "<string>",
"energy_per_run_mwh": {
"positive": "<string>",
"negative": "<string>"
},
"ramp_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"fcr_ramp_required_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"measurement_point": "<string>",
"retention_minutes": 0,
"stroke_minutes": 0
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-09-10T13:30:00Z",
"planned_end": "2026-09-10T13:30:00Z",
"plan_sha256": "<string>",
"plan": "<string>",
"runs": [
{
"index": 0,
"direction": "positive",
"products": [
"<string>"
],
"requested_capacity_mw": "<string>",
"phases": [
{
"index": 0,
"kind": "retention",
"start": "2026-09-10T13:30:00Z",
"end": "2026-09-10T13:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-09-10T13:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-09-10T13:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-09-10T13:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z",
"confirmed_by_user_name": "<string>",
"confirmed_at": "2026-09-10T13:30:00Z",
"aborted_at": "2026-09-10T13:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-09-10T13:30:00Z",
"row_version": 0,
"created_at": "2026-09-10T13:30:00Z",
"updated_at": "2026-09-10T13:30:00Z"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/betriebsfahrt/sessions/{session_id}/abort
Abort a Betriebsfahrt session
onboarding.write
Ends the session and sends the driver's kill switch (zero every product on the asset; cancel the run when known). Aborting again resends the kill switch.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier.
- session_idREQUIRED
- string<uuid>Betriebsfahrt session identifier from the status response.
Request body · required
- reasonREQUIRED
- string
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000/abort" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"reason":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000/abort",
headers={"Authorization": f"Bearer {token}"},
json={
"reason": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000/abort", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"reason":"<string>"}),
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"status": "draft",
"execution_mode": "real",
"supersedes_session_id": "<string>",
"parameters": {
"first_direction": "positive",
"single_direction": false,
"extended_stroke_minutes": 0,
"extended_stroke_min_minutes": 0,
"extended_stroke_max_minutes": 0,
"second_run_extended_stroke_minutes": 0,
"capacity_mw": {
"positive": "<string>",
"negative": "<string>"
},
"products": {
"positive": [
"<string>"
],
"negative": [
"<string>"
]
},
"product_capacity_mw": "<string>",
"usable_energy_mwh": "<string>",
"energy_safety_margin": "<string>",
"energy_per_run_mwh": {
"positive": "<string>",
"negative": "<string>"
},
"ramp_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"fcr_ramp_required_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"measurement_point": "<string>",
"retention_minutes": 0,
"stroke_minutes": 0
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-09-10T13:30:00Z",
"planned_end": "2026-09-10T13:30:00Z",
"plan_sha256": "<string>",
"plan": "<string>",
"runs": [
{
"index": 0,
"direction": "positive",
"products": [
"<string>"
],
"requested_capacity_mw": "<string>",
"phases": [
{
"index": 0,
"kind": "retention",
"start": "2026-09-10T13:30:00Z",
"end": "2026-09-10T13:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-09-10T13:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-09-10T13:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-09-10T13:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z",
"confirmed_by_user_name": "<string>",
"confirmed_at": "2026-09-10T13:30:00Z",
"aborted_at": "2026-09-10T13:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-09-10T13:30:00Z",
"row_version": 0,
"created_at": "2026-09-10T13:30:00Z",
"updated_at": "2026-09-10T13:30:00Z"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/betriebsfahrt/sessions/{session_id}/confirm
Confirm a Betriebsfahrt session
onboarding.write
Freezes the plan and hands it to the control-test driver: the typed asset id must match, the plan must still be the reviewed one, the asset must be full (positive run first) or empty (negative run first) with telemetry arriving, and the TSO portal pre-flight must have created the technical unit, the reserve unit and the planned prequalifications. The drive starts at the planned quarter hour without further prompts; the plan is published to the driver ten minutes before.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier.
- session_idREQUIRED
- string<uuid>Betriebsfahrt session identifier from the status response.
Request body · required
- confirm_asset_idREQUIRED
- stringThe asset id typed by the operator; must equal the session's asset.
- row_versionREQUIRED
- integerThe row version of the draft the operator reviewed; any adjustment since (plan, start, mode) is refused.
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000/confirm" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"confirm_asset_id":"<string>","row_version":0}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000/confirm",
headers={"Authorization": f"Bearer {token}"},
json={
"confirm_asset_id": "<string>",
"row_version": 0,
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000/confirm", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"confirm_asset_id":"<string>","row_version":0}),
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"status": "draft",
"execution_mode": "real",
"supersedes_session_id": "<string>",
"parameters": {
"first_direction": "positive",
"single_direction": false,
"extended_stroke_minutes": 0,
"extended_stroke_min_minutes": 0,
"extended_stroke_max_minutes": 0,
"second_run_extended_stroke_minutes": 0,
"capacity_mw": {
"positive": "<string>",
"negative": "<string>"
},
"products": {
"positive": [
"<string>"
],
"negative": [
"<string>"
]
},
"product_capacity_mw": "<string>",
"usable_energy_mwh": "<string>",
"energy_safety_margin": "<string>",
"energy_per_run_mwh": {
"positive": "<string>",
"negative": "<string>"
},
"ramp_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"fcr_ramp_required_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"measurement_point": "<string>",
"retention_minutes": 0,
"stroke_minutes": 0
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-09-10T13:30:00Z",
"planned_end": "2026-09-10T13:30:00Z",
"plan_sha256": "<string>",
"plan": "<string>",
"runs": [
{
"index": 0,
"direction": "positive",
"products": [
"<string>"
],
"requested_capacity_mw": "<string>",
"phases": [
{
"index": 0,
"kind": "retention",
"start": "2026-09-10T13:30:00Z",
"end": "2026-09-10T13:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-09-10T13:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-09-10T13:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-09-10T13:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z",
"confirmed_by_user_name": "<string>",
"confirmed_at": "2026-09-10T13:30:00Z",
"aborted_at": "2026-09-10T13:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-09-10T13:30:00Z",
"row_version": 0,
"created_at": "2026-09-10T13:30:00Z",
"updated_at": "2026-09-10T13:30:00Z"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/betriebsfahrt/sessions/{session_id}/runs/{run_index}/validate
Validate a run again
onboarding.write
Re-runs the instant validation of one run for every product whose verdict is not PASS: the workbook is generated again from telemetry, uploaded to the planned prequalification when its bytes changed, and the portal's analysis is fetched and judged. For a recording the telemetry store received late, or a portal hiccup.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier.
- session_idREQUIRED
- string<uuid>Betriebsfahrt session identifier from the status response.
- run_indexREQUIRED
- integerRun index within the session: 0 = first run, 1 = second run.
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000/runs/0/validate" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000/runs/0/validate",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000/runs/0/validate", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"status": "draft",
"execution_mode": "real",
"supersedes_session_id": "<string>",
"parameters": {
"first_direction": "positive",
"single_direction": false,
"extended_stroke_minutes": 0,
"extended_stroke_min_minutes": 0,
"extended_stroke_max_minutes": 0,
"second_run_extended_stroke_minutes": 0,
"capacity_mw": {
"positive": "<string>",
"negative": "<string>"
},
"products": {
"positive": [
"<string>"
],
"negative": [
"<string>"
]
},
"product_capacity_mw": "<string>",
"usable_energy_mwh": "<string>",
"energy_safety_margin": "<string>",
"energy_per_run_mwh": {
"positive": "<string>",
"negative": "<string>"
},
"ramp_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"fcr_ramp_required_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"measurement_point": "<string>",
"retention_minutes": 0,
"stroke_minutes": 0
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-09-10T13:30:00Z",
"planned_end": "2026-09-10T13:30:00Z",
"plan_sha256": "<string>",
"plan": "<string>",
"runs": [
{
"index": 0,
"direction": "positive",
"products": [
"<string>"
],
"requested_capacity_mw": "<string>",
"phases": [
{
"index": 0,
"kind": "retention",
"start": "2026-09-10T13:30:00Z",
"end": "2026-09-10T13:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-09-10T13:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-09-10T13:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-09-10T13:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z",
"confirmed_by_user_name": "<string>",
"confirmed_at": "2026-09-10T13:30:00Z",
"aborted_at": "2026-09-10T13:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-09-10T13:30:00Z",
"row_version": 0,
"created_at": "2026-09-10T13:30:00Z",
"updated_at": "2026-09-10T13:30:00Z"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 429rate limited
POST/v1/onboardings/{onboarding_id}/betriebsfahrt/sessions/{session_id}/runs/{run_index}/verdict-override
Accept a REDO verdict with a reason
onboarding.write
An EBX admin accepts one product's REDO verdict on a run; the reason is recorded on the session, the gate and the activity log, and the sign-off counts the run as accepted.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier.
- session_idREQUIRED
- string<uuid>Betriebsfahrt session identifier from the status response.
- run_indexREQUIRED
- integerRun index within the session: 0 = first run, 1 = second run.
Request body · required
- productREQUIRED
- stringProduct slug of the run's verdict to accept, e.g. AutomaticFrequencyRestorationReserve/Positive.
- reasonREQUIRED
- string
- verdict_computed_atREQUIRED
- string<date-time>The
computed_atof the verdict the operator reviewed; a verdict computed since is refused.
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000/runs/0/verdict-override" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"product":"<string>","reason":"<string>","verdict_computed_at":"2026-09-10T13:30:00Z"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000/runs/0/verdict-override",
headers={"Authorization": f"Bearer {token}"},
json={
"product": "<string>",
"reason": "<string>",
"verdict_computed_at": "2026-09-10T13:30:00Z",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/betriebsfahrt/sessions/00000000-0000-0000-0000-000000000000/runs/0/verdict-override", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"product":"<string>","reason":"<string>","verdict_computed_at":"2026-09-10T13:30:00Z"}),
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"status": "draft",
"execution_mode": "real",
"supersedes_session_id": "<string>",
"parameters": {
"first_direction": "positive",
"single_direction": false,
"extended_stroke_minutes": 0,
"extended_stroke_min_minutes": 0,
"extended_stroke_max_minutes": 0,
"second_run_extended_stroke_minutes": 0,
"capacity_mw": {
"positive": "<string>",
"negative": "<string>"
},
"products": {
"positive": [
"<string>"
],
"negative": [
"<string>"
]
},
"product_capacity_mw": "<string>",
"usable_energy_mwh": "<string>",
"energy_safety_margin": "<string>",
"energy_per_run_mwh": {
"positive": "<string>",
"negative": "<string>"
},
"ramp_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"fcr_ramp_required_mw_per_s": {
"positive": "<string>",
"negative": "<string>"
},
"measurement_point": "<string>",
"retention_minutes": 0,
"stroke_minutes": 0
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-09-10T13:30:00Z",
"planned_end": "2026-09-10T13:30:00Z",
"plan_sha256": "<string>",
"plan": "<string>",
"runs": [
{
"index": 0,
"direction": "positive",
"products": [
"<string>"
],
"requested_capacity_mw": "<string>",
"phases": [
{
"index": 0,
"kind": "retention",
"start": "2026-09-10T13:30:00Z",
"end": "2026-09-10T13:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-09-10T13:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-09-10T13:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-09-10T13:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-09-10T13:30:00Z",
"actual_end": "2026-09-10T13:30:00Z",
"confirmed_by_user_name": "<string>",
"confirmed_at": "2026-09-10T13:30:00Z",
"aborted_at": "2026-09-10T13:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-09-10T13:30:00Z",
"row_version": 0,
"created_at": "2026-09-10T13:30:00Z",
"updated_at": "2026-09-10T13:30:00Z"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
DELETE/v1/onboardings/{onboarding_id}/documents/{document_id}
Remove a document from an onboarding
onboarding.write
Soft-deletes document metadata so the document no longer appears on the onboarding or receives download URLs. The stored S3 object is not synchronously deleted.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- document_idREQUIRED
- string<uuid>Document identifier returned by the presigned upload request.
curl -X DELETE "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.delete(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000", {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 429rate limited
GET/v1/onboardings/{onboarding_id}/documents/{document_id}/download
Create a document download URL
onboarding.read
Returns a short-lived presigned S3 GET URL for an available, non-deleted onboarding document. The API does not proxy document bytes.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- document_idREQUIRED
- string<uuid>Document identifier returned by the presigned upload request.
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000/download" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000/download",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000/download", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"download_url": "<string>",
"expires_at": "<string>"
}POST/v1/onboardings/{onboarding_id}/documents/{document_id}/finalize
Finalize an uploaded document
onboarding.write
Marks a pending document upload as available after the client has uploaded bytes to the presigned S3 URL and records document-upload activity.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- document_idREQUIRED
- string<uuid>Document identifier returned by the presigned upload request.
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000/finalize" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000/finalize",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000/finalize", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 429rate limited
POST/v1/onboardings/{onboarding_id}/documents/presigned-upload
Create a document upload URL
onboarding.write
Creates pending document metadata and returns a short-lived presigned S3 PUT URL. Clients upload the file bytes directly to S3, then call finalize to make the document available on the onboarding. Maximum accepted metadata size is 100 MiB.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- document_typeREQUIRED
- enum
installation_photo_mdeviceinstallation_photo_antennatest_results_signedbetriebsfahrt_datapq_frequency_analysispq_doublestroke_filepq_approvaleigentuemerbetreiberother - gate_definition_id
- enum
mon_rfimon_hwmon_swmon_valctl_rfictl_hwctl_swctl_mon_testctl_ctrl_testctl_pq_testctl_pq_submitctl_pq_approved - filenameREQUIRED
- string
- size_bytesREQUIRED
- integer
- content_typeREQUIRED
- string
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/presigned-upload" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"document_type":"installation_photo_mdevice","gate_definition_id":"mon_rfi","filename":"<string>","size_bytes":0,"content_type":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/presigned-upload",
headers={"Authorization": f"Bearer {token}"},
json={
"document_type": "installation_photo_mdevice",
"gate_definition_id": "mon_rfi",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/presigned-upload", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"document_type":"installation_photo_mdevice","gate_definition_id":"mon_rfi","filename":"<string>","size_bytes":0,"content_type":"<string>"}),
});
const data = await res.json();{
"upload_url": "<string>",
"document_id": "<string>",
"expires_at": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboardings/{onboarding_id}/dpl
Replace the onboarding DPL
onboarding.write
Replaces the software-gate DPL payload for an onboarding. The target software gate is selected from the DPL standard id: monitoring DPLs update the monitoring software gate, and control DPLs update the control software gate.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- dplREQUIRED
- object
curl -X PATCH "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/dpl" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"dpl":{"standard_id":"ebx_monitor","standard_version":"<string>","rows":[{"id":"<string>","standard_datapoint_id":"<string>","name":"<string>","unit":"<string>","data_type":"float","direction":"control","register":0,"register_type":"holding","short_description":"<string>","long_description":"<string>","implementation_status":"pending","received_test_value":0,"excluded":false,"asset_notes":"<string>","discussion":{"status":"open","comments":[{"id":"<string>","author_user_name":"<string>","author_org_name":"<string>","author_side":"ebx","created_at":"<string>","body":"<string>"}],"last_comment_at":"<string>"}}],"updated_at":"<string>"}}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/dpl",
headers={"Authorization": f"Bearer {token}"},
json={
"dpl": {
"standard_id": "ebx_monitor",
"standard_version": "<string>",
"rows": [
{
"id": "<string>",
"standard_datapoint_id": "<string>",
"name": "<string>",
"unit": "<string>",
"data_type": "float",
"direction": "control",
"register": 0,
"register_type": "holding",
"short_description": "<string>",
"long_description": "<string>",
"implementation_status": "pending",
"received_test_value": 0,
"excluded": False,
"asset_notes": "<string>",
"discussion": {
"status": "open",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>",
},
],
"last_comment_at": "<string>",
},
},
],
"updated_at": "<string>",
},
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/dpl", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"dpl":{"standard_id":"ebx_monitor","standard_version":"<string>","rows":[{"id":"<string>","standard_datapoint_id":"<string>","name":"<string>","unit":"<string>","data_type":"float","direction":"control","register":0,"register_type":"holding","short_description":"<string>","long_description":"<string>","implementation_status":"pending","received_test_value":0,"excluded":false,"asset_notes":"<string>","discussion":{"status":"open","comments":[{"id":"<string>","author_user_name":"<string>","author_org_name":"<string>","author_side":"ebx","created_at":"<string>","body":"<string>"}],"last_comment_at":"<string>"}}],"updated_at":"<string>"}}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/dpl/rows/{row_id}/comments
Comment on a DPL row
onboarding.write
Adds a discussion comment to a DPL row on the software gate, opens the row discussion thread, and records onboarding activity.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- row_idREQUIRED
- stringDPL row identifier from the onboarding software-gate DPL payload.
Request body · required
- bodyREQUIRED
- string
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/dpl/rows/dpl_row_014/comments" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"body":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/dpl/rows/dpl_row_014/comments",
headers={"Authorization": f"Bearer {token}"},
json={
"body": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/dpl/rows/dpl_row_014/comments", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"body":"<string>"}),
});
const data = await res.json();{
"status": "open",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"last_comment_at": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboardings/{onboarding_id}/dpl/rows/{row_id}/thread
Update a DPL row discussion status
onboarding.write
Opens or resolves the discussion thread for a DPL row without changing the row implementation values.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- row_idREQUIRED
- stringDPL row identifier from the onboarding software-gate DPL payload.
Request body · required
- statusREQUIRED
- enum
openresolved
curl -X PATCH "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/dpl/rows/dpl_row_014/thread" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status":"open"}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/dpl/rows/dpl_row_014/thread",
headers={"Authorization": f"Bearer {token}"},
json={
"status": "open",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/dpl/rows/dpl_row_014/thread", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"status":"open"}),
});
const data = await res.json();{
"status": "open",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"last_comment_at": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboardings/{onboarding_id}/gates/{gate_id}/auto-check
Run a gate auto-check
onboarding.read
Returns the current automated check result for a gate. RFI checks validate required stored fields. DPL checks summarize stored DPL implementation state only. Signal-strength, live telemetry, alarms, and plausibility checks are currently reported as pending until telemetry integration is added.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- gate_idREQUIRED
- enum
mon_rfimon_hwmon_swmon_valctl_rfictl_hwctl_swctl_mon_testctl_ctrl_testctl_pq_testctl_pq_submitctl_pq_approvedWorkflow gate identifier from the onboarding process definition.
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/auto-check" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/auto-check",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/auto-check", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"status": "pass",
"summary": "<string>",
"facts": [
{
"label": "<string>",
"value": "<string>",
"pass": false
}
],
"last_checked_at": "<string>",
"hardware_signal": {
"boxes": [
{
"device": 0,
"signal_strength_pct": 0,
"lan_connected": false,
"last_seen_at": "<string>"
}
]
}
}POST/v1/onboardings/{onboarding_id}/gates/{gate_id}/block
Block a workflow gate
onboarding.write
Marks an in-progress or awaiting-confirmation gate as blocked, stores the blocking reason, records activity, and sets the overall onboarding status to blocked.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- gate_idREQUIRED
- enum
mon_rfimon_hwmon_swmon_valctl_rfictl_hwctl_swctl_mon_testctl_ctrl_testctl_pq_testctl_pq_submitctl_pq_approvedWorkflow gate identifier from the onboarding process definition.
Request body · required
- reasonREQUIRED
- string
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/block" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"reason":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/block",
headers={"Authorization": f"Bearer {token}"},
json={
"reason": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/block", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"reason":"<string>"}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/gates/{gate_id}/note
Update a gate note
onboarding.write
Stores the latest operational note on a gate and records an activity entry. This does not change the gate status.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- gate_idREQUIRED
- enum
mon_rfimon_hwmon_swmon_valctl_rfictl_hwctl_swctl_mon_testctl_ctrl_testctl_pq_testctl_pq_submitctl_pq_approvedWorkflow gate identifier from the onboarding process definition.
Request body · required
- noteREQUIRED
- string
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/note" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"note":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/note",
headers={"Authorization": f"Bearer {token}"},
json={
"note": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/note", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"note":"<string>"}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/gates/{gate_id}/pass
Pass a workflow gate
onboarding.write
Signs off a gate and advances the workflow. The service validates prerequisites, validates any gate-specific structured data, records the sign-off, starts the next pending gate, and recomputes the overall onboarding status from the persisted process definition. Passing the configured RFI gate also syncs the asset profile.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- gate_idREQUIRED
- enum
mon_rfimon_hwmon_swmon_valctl_rfictl_hwctl_swctl_mon_testctl_ctrl_testctl_pq_testctl_pq_submitctl_pq_approvedWorkflow gate identifier from the onboarding process definition.
Request body · required
- note
- string
- structured_data
- object
- override_reason
- string
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/pass" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"note":"<string>","structured_data":"<string>","override_reason":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/pass",
headers={"Authorization": f"Bearer {token}"},
json={
"note": "<string>",
"structured_data": "<string>",
"override_reason": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/pass", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"note":"<string>","structured_data":"<string>","override_reason":"<string>"}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/gates/{gate_id}/reopen
Reopen a workflow gate
onboarding.write
Reopens a passed or blocked gate and resets all downstream gates to pending. Use this when a prior sign-off needs correction or new information invalidates later steps.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- gate_idREQUIRED
- enum
mon_rfimon_hwmon_swmon_valctl_rfictl_hwctl_swctl_mon_testctl_ctrl_testctl_pq_testctl_pq_submitctl_pq_approvedWorkflow gate identifier from the onboarding process definition.
Request body · required
- reasonREQUIRED
- string
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/reopen" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"reason":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/reopen",
headers={"Authorization": f"Bearer {token}"},
json={
"reason": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/reopen", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"reason":"<string>"}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboardings/{onboarding_id}/gates/{gate_id}/structured-data
Update gate structured data
onboarding.write
Persists the current structured payload for a gate without passing the gate. RFI, DPL, control-test, and Betriebsfahrt payloads are schema-validated. If the configured RFI gate has already passed, updating its payload also refreshes the synced asset profile.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- gate_idREQUIRED
- enum
mon_rfimon_hwmon_swmon_valctl_rfictl_hwctl_swctl_mon_testctl_ctrl_testctl_pq_testctl_pq_submitctl_pq_approvedWorkflow gate identifier from the onboarding process definition.
Request body · required
- structured_dataREQUIRED
- object
curl -X PATCH "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/structured-data" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"structured_data":"<string>"}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/structured-data",
headers={"Authorization": f"Bearer {token}"},
json={
"structured_data": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/structured-data", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"structured_data":"<string>"}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/internal-tracker/open-points
Add an internal tracker open point
onboarding.write
Adds an EBX-internal open point, optionally linked to a gate, RfI field, or DPL row, with an optional first comment.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- titleREQUIRED
- string
- ref
- OpenPointGateRef | OpenPointRfiFieldRef | OpenPointDplRowRef
- body
- string
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/internal-tracker/open-points" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title":"<string>","ref":{"kind":"<string>","gate_definition_id":"mon_rfi"},"body":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/internal-tracker/open-points",
headers={"Authorization": f"Bearer {token}"},
json={
"title": "<string>",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi",
},
"body": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/internal-tracker/open-points", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"title":"<string>","ref":{"kind":"<string>","gate_definition_id":"mon_rfi"},"body":"<string>"}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboardings/{onboarding_id}/internal-tracker/open-points/{point_id}
Resolve or reopen an internal tracker open point
onboarding.write
Sets an open point's status. Resolving records an internal activity entry.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- point_idREQUIRED
- stringInternal-tracker open-point identifier from the onboarding response.
Request body · required
- statusREQUIRED
- enum
openresolved
curl -X PATCH "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/internal-tracker/open-points/op-77" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status":"open"}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/internal-tracker/open-points/op-77",
headers={"Authorization": f"Bearer {token}"},
json={
"status": "open",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/internal-tracker/open-points/op-77", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"status":"open"}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/internal-tracker/open-points/{point_id}/comments
Comment on an internal tracker open point
onboarding.write
Appends an EBX-internal comment to an open point. Commenting on a resolved open point reopens it.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- point_idREQUIRED
- stringInternal-tracker open-point identifier from the onboarding response.
Request body · required
- bodyREQUIRED
- string
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/internal-tracker/open-points/op-77/comments" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"body":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/internal-tracker/open-points/op-77/comments",
headers={"Authorization": f"Bearer {token}"},
json={
"body": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/internal-tracker/open-points/op-77/comments", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"body":"<string>"}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/internal-tracker/tasks
Add an internal tracker task
onboarding.write
Adds an EBX-internal task to the onboarding's internal tracker. The tracker is EBX-only: it is never included in the external /onboarding-tasks responses and is redacted from onboarding responses for non-EBX readers.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- titleREQUIRED
- string
- description
- string
- category
- stringdefault general
- due_date
- string<date>
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/internal-tracker/tasks" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title":"<string>","description":"<string>","category":"general","due_date":"2026-01-01"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/internal-tracker/tasks",
headers={"Authorization": f"Bearer {token}"},
json={
"title": "<string>",
"description": "<string>",
"category": "general",
"due_date": "2026-01-01",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/internal-tracker/tasks", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"title":"<string>","description":"<string>","category":"general","due_date":"2026-01-01"}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboardings/{onboarding_id}/internal-tracker/tasks/{task_id}
Update an internal tracker task status
onboarding.write
Moves an internal task between open, in progress, and done. Completing a task records an internal activity entry.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- task_idREQUIRED
- stringInternal-tracker task identifier from the onboarding response.
Request body · required
- statusREQUIRED
- enum
openin_progressdone
curl -X PATCH "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/internal-tracker/tasks/trk-1042" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status":"open"}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/internal-tracker/tasks/trk-1042",
headers={"Authorization": f"Bearer {token}"},
json={
"status": "open",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/internal-tracker/tasks/trk-1042", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"status":"open"}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/partners
Add a partner assignment
onboarding.write
Adds an EPC or EMS partner assignment to an onboarding. This stores the partner organization/contact; EBX sends passwordless magic-link access separately.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- roleREQUIRED
- enum
epcems_provider - org_nameREQUIRED
- string
- contact_name
- string
- contact_email
- string<email>
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/partners" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"role":"epc","org_name":"<string>","contact_name":"<string>","contact_email":"name@example.com"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/partners",
headers={"Authorization": f"Bearer {token}"},
json={
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "name@example.com",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/partners", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"role":"epc","org_name":"<string>","contact_name":"<string>","contact_email":"name@example.com"}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboardings/{onboarding_id}/partners/{assignment_id}
Edit or replace a partner contact
onboarding.write
Updates a partner assignment's organization and contact. Changing the contact email — or editing a previously revoked partner — resets external access to not_invited and invalidates outstanding magic links, so the contact can be freshly invited; an org/name-only edit keeps the current access state.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- assignment_idREQUIRED
- string<uuid>Partner assignment identifier from the onboarding response.
Request body · required
- roleREQUIRED
- enum
epcems_provider - org_nameREQUIRED
- string
- contact_name
- string
- contact_email
- string<email>
curl -X PATCH "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/partners/00000000-0000-0000-0000-000000000000" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"role":"epc","org_name":"<string>","contact_name":"<string>","contact_email":"name@example.com"}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/partners/00000000-0000-0000-0000-000000000000",
headers={"Authorization": f"Bearer {token}"},
json={
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "name@example.com",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/partners/00000000-0000-0000-0000-000000000000", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"role":"epc","org_name":"<string>","contact_name":"<string>","contact_email":"name@example.com"}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/partners/{assignment_id}/access/revoke
Revoke partner onboarding task access
onboarding.write
Revokes active links, refresh sessions, database access state, and the matching Cognito task-principal group for an EPC or EMS assignment.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- assignment_idREQUIRED
- string<uuid>Partner assignment identifier from the onboarding response.
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/partners/00000000-0000-0000-0000-000000000000/access/revoke" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/partners/00000000-0000-0000-0000-000000000000/access/revoke",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/partners/00000000-0000-0000-0000-000000000000/access/revoke", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"onboarding": {
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
},
"revoked_link_count": 0,
"revoked_session_count": 0
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 429rate limited
POST/v1/onboardings/{onboarding_id}/partners/{assignment_id}/magic-link
Send a partner onboarding magic link
onboarding.write
Creates a six-month reusable magic link for an EPC or EMS assignment, stores only the token hash, and sends the link to the partner contact email.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- assignment_idREQUIRED
- string<uuid>Partner assignment identifier from the onboarding response.
Request body · optional
- language
- enum
deen - email_template
- object
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/partners/00000000-0000-0000-0000-000000000000/magic-link" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"language":"de","email_template":{"subject":"<string>","greeting":"<string>","body":"<string>","button_label":"<string>","fallback_text":"<string>","signature":"<string>","generated":"<string>"}}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/partners/00000000-0000-0000-0000-000000000000/magic-link",
headers={"Authorization": f"Bearer {token}"},
json={
"language": "de",
"email_template": {
"subject": "<string>",
"greeting": "<string>",
"body": "<string>",
"button_label": "<string>",
"fallback_text": "<string>",
"signature": "<string>",
"generated": "<string>",
},
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/partners/00000000-0000-0000-0000-000000000000/magic-link", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"language":"de","email_template":{"subject":"<string>","greeting":"<string>","body":"<string>","button_label":"<string>","fallback_text":"<string>","signature":"<string>","generated":"<string>"}}),
});
const data = await res.json();{
"onboarding": {
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
},
"dev_magic_link": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/partners/{assignment_id}/magic-link/revoke
Revoke active partner onboarding magic links
onboarding.write
Revokes active reusable magic links and refresh sessions for an EPC or EMS assignment without revoking the assignment itself.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- assignment_idREQUIRED
- string<uuid>Partner assignment identifier from the onboarding response.
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/partners/00000000-0000-0000-0000-000000000000/magic-link/revoke" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/partners/00000000-0000-0000-0000-000000000000/magic-link/revoke",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/partners/00000000-0000-0000-0000-000000000000/magic-link/revoke", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"onboarding": {
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
},
"revoked_link_count": 0,
"revoked_session_count": 0
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 429rate limited
POST/v1/onboardings/{onboarding_id}/pq-proofs
Generate the PQ Portal proof workbook for a Betriebsfahrt run
onboarding.write
Reads the asset's telemetry for the run window, writes the Doppelhubkurve workbook in the PQ Portal layout, stores it as a versioned onboarding document and records it on the run. An invalid result (gaps, missing signals) is stored and reported too.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- run_indexREQUIRED
- integerIndex of the run in the Betriebsfahrt gate's structured data.
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-proofs" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"run_index":0}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-proofs",
headers={"Authorization": f"Bearer {token}"},
json={
"run_index": 0,
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-proofs", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"run_index":0}),
});
const data = await res.json();{
"run_index": 0,
"run": {
"product": "fcr",
"direction": "positive",
"start": "2026-09-10T13:30:00Z",
"end": "2026-09-10T13:30:00Z",
"operating_point_mw": "0",
"requested_capacity_mw": "<string>",
"setpoint_schedule": [
{
"start": "2026-09-10T13:30:00Z",
"end": "2026-09-10T13:30:00Z",
"setpoint_mw": "<string>"
}
],
"notes": "<string>",
"proof": {
"document_id": "<string>",
"filename": "<string>",
"source": "generated",
"generated_at": "<string>",
"generator_version": "<string>",
"rows": 0,
"missing_seconds": 0,
"max_gap_seconds": 0,
"sha256": "<string>",
"valid": false,
"problems": [
"<string>"
],
"warnings": [
"<string>"
],
"run_fingerprint": "<string>",
"asset_id": "<string>",
"measurement_point": "<string>"
},
"source": "manual",
"session_id": "<string>",
"verdict_status": "pass",
"verdict_override_reason": "<string>"
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PUT/v1/onboardings/{onboarding_id}/pq-proofs
Attach an uploaded proof workbook to a Betriebsfahrt run
onboarding.write
Links a pq_doublestroke_file document uploaded into the Betriebsfahrt gate to one run, replacing a generated proof.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- run_indexREQUIRED
- integer
- document_idREQUIRED
- string<uuid>An available pq_doublestroke_file upload of this onboarding.
curl -X PUT "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-proofs" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"run_index":0,"document_id":"00000000-0000-0000-0000-000000000000"}'import httpx
r = httpx.put(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-proofs",
headers={"Authorization": f"Bearer {token}"},
json={
"run_index": 0,
"document_id": "00000000-0000-0000-0000-000000000000",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-proofs", {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"run_index":0,"document_id":"00000000-0000-0000-0000-000000000000"}),
});
const data = await res.json();{
"run_index": 0,
"run": {
"product": "fcr",
"direction": "positive",
"start": "2026-09-10T13:30:00Z",
"end": "2026-09-10T13:30:00Z",
"operating_point_mw": "0",
"requested_capacity_mw": "<string>",
"setpoint_schedule": [
{
"start": "2026-09-10T13:30:00Z",
"end": "2026-09-10T13:30:00Z",
"setpoint_mw": "<string>"
}
],
"notes": "<string>",
"proof": {
"document_id": "<string>",
"filename": "<string>",
"source": "generated",
"generated_at": "<string>",
"generator_version": "<string>",
"rows": 0,
"missing_seconds": 0,
"max_gap_seconds": 0,
"sha256": "<string>",
"valid": false,
"problems": [
"<string>"
],
"warnings": [
"<string>"
],
"run_fingerprint": "<string>",
"asset_id": "<string>",
"measurement_point": "<string>"
},
"source": "manual",
"session_id": "<string>",
"verdict_status": "pass",
"verdict_override_reason": "<string>"
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboardings/{onboarding_id}/pq-submission
Get PQ Portal submission status
onboarding.read
Returns the orchestration step timeline and the per-product prequalification states for this onboarding's PQ Portal submission.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"status": "<string>",
"portal_env": "<string>",
"run_kind": "<string>",
"current_step": "<string>",
"steps": [
{
"step": "<string>",
"status": "<string>",
"started_at": "<string>",
"finished_at": "<string>",
"error": "<string>"
}
],
"blockers": [
{
"key": "<string>",
"label": "<string>",
"detail": "<string>",
"source": "<string>"
}
],
"profile": {
"balance_group_responsible_name": "<string>",
"balance_group_eic_x": "<string>",
"contractor_name": "<string>",
"connection_type_control_system_name": "<string>",
"products": [
"<string>"
],
"power_caps_mw": "<string>"
},
"technical_unit_id": "<string>",
"reserve_unit_id": "<string>",
"dso_id": "<string>",
"contract_ids": "<string>",
"concept_ids": "<string>",
"last_error": "<string>",
"attempt_count": 0,
"triggered_by_user_name": "<string>",
"triggered_at": "<string>",
"review_snapshot": "<string>",
"review_snapshot_hash": "<string>",
"review_inputs_changed": false,
"reviewed_by_user_name": "<string>",
"reviewed_at": "<string>",
"review_note": "<string>",
"requested_at": "<string>",
"last_polled_at": "<string>",
"preflight_completed_at": "<string>",
"applications": [
{
"id": "<string>",
"reserve_type": "<string>",
"reserve_direction": "<string>",
"cycle": 0,
"reserve_id": "<string>",
"portal_prequalification_id": "<string>",
"portal_state": "<string>",
"portal_number": "<string>",
"valid_from": "<string>",
"valid_until": "<string>",
"proof": {
"document_id": "<string>",
"sha256": "<string>",
"portal_document_id": "<string>",
"portal_document_version_id": "<string>"
},
"performance_proof": "<string>",
"dso_confirmation": {
"id": "<string>",
"state": "<string>",
"power_mw": "<string>",
"gradient_mw_per_min": "<string>"
},
"requested_measurement": "<string>",
"requested_measurement_overrides": "<string>",
"confirmed_measurement": "<string>",
"calculated_measurement": "<string>",
"evaluation_status": "<string>",
"evaluation_details": [
"<string>"
],
"comments": [
{
"id": "<string>",
"text": "<string>",
"author_name": "<string>",
"created_at": "<string>",
"is_ebx": false
}
],
"unresolved_comment_count": 0,
"action_requested_at": "<string>"
}
]
}POST/v1/onboardings/{onboarding_id}/pq-submission/applications/{application_id}/comments
Reply to a TSO clarification request (Nachfrage)
onboarding.write
Posts a reply on the prequalification's portal comment thread and refreshes the local snapshot.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- application_idREQUIRED
- string<uuid>PQ application identifier from the submission status response.
Request body · required
- bodyREQUIRED
- string
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/applications/00000000-0000-0000-0000-000000000000/comments" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"body":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/applications/00000000-0000-0000-0000-000000000000/comments",
headers={"Authorization": f"Bearer {token}"},
json={
"body": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/applications/00000000-0000-0000-0000-000000000000/comments", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"body":"<string>"}),
});
const data = await res.json();{
"id": "<string>",
"reserve_type": "<string>",
"reserve_direction": "<string>",
"cycle": 0,
"reserve_id": "<string>",
"portal_prequalification_id": "<string>",
"portal_state": "<string>",
"portal_number": "<string>",
"valid_from": "<string>",
"valid_until": "<string>",
"proof": {
"document_id": "<string>",
"sha256": "<string>",
"portal_document_id": "<string>",
"portal_document_version_id": "<string>"
},
"performance_proof": "<string>",
"dso_confirmation": {
"id": "<string>",
"state": "<string>",
"power_mw": "<string>",
"gradient_mw_per_min": "<string>"
},
"requested_measurement": "<string>",
"requested_measurement_overrides": "<string>",
"confirmed_measurement": "<string>",
"calculated_measurement": "<string>",
"evaluation_status": "<string>",
"evaluation_details": [
"<string>"
],
"comments": [
{
"id": "<string>",
"text": "<string>",
"author_name": "<string>",
"created_at": "<string>",
"is_ebx": false
}
],
"unresolved_comment_count": 0,
"action_requested_at": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PUT/v1/onboardings/{onboarding_id}/pq-submission/applications/{application_id}/requested-measurement
Override requested values of one prequalification
onboarding.write
Records operator overrides (each with a reason) of the requested values computed from the RfI, the DSO confirmation and the portal's proof analysis. They apply on the next preparation run.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- application_idREQUIRED
- string<uuid>PQ application identifier from the case status response.
Request body · required
- overrides
- object
curl -X PUT "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/applications/00000000-0000-0000-0000-000000000000/requested-measurement" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"overrides":"<string>"}'import httpx
r = httpx.put(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/applications/00000000-0000-0000-0000-000000000000/requested-measurement",
headers={"Authorization": f"Bearer {token}"},
json={
"overrides": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/applications/00000000-0000-0000-0000-000000000000/requested-measurement", {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"overrides":"<string>"}),
});
const data = await res.json();{
"id": "<string>",
"reserve_type": "<string>",
"reserve_direction": "<string>",
"cycle": 0,
"reserve_id": "<string>",
"portal_prequalification_id": "<string>",
"portal_state": "<string>",
"portal_number": "<string>",
"valid_from": "<string>",
"valid_until": "<string>",
"proof": {
"document_id": "<string>",
"sha256": "<string>",
"portal_document_id": "<string>",
"portal_document_version_id": "<string>"
},
"performance_proof": "<string>",
"dso_confirmation": {
"id": "<string>",
"state": "<string>",
"power_mw": "<string>",
"gradient_mw_per_min": "<string>"
},
"requested_measurement": "<string>",
"requested_measurement_overrides": "<string>",
"confirmed_measurement": "<string>",
"calculated_measurement": "<string>",
"evaluation_status": "<string>",
"evaluation_details": [
"<string>"
],
"comments": [
{
"id": "<string>",
"text": "<string>",
"author_name": "<string>",
"created_at": "<string>",
"is_ebx": false
}
],
"unresolved_comment_count": 0,
"action_requested_at": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/pq-submission/preflight
Create the PQ Portal entities ahead of the Betriebsfahrt
onboarding.write
The pre-flight of an automated Betriebsfahrt: validates the collected data (the recording is not required yet), resolves the portal master data, creates or updates the technical unit and reserve unit, the reserves and the planned prequalifications the recording will be uploaded to. A missing framework contract or delivery concept is a warning here. Runs to its end before answering; a complete pre-flight leaves the case blocked on betriebsfahrt_required.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/preflight" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/preflight",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/preflight", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"status": "<string>",
"portal_env": "<string>",
"run_kind": "<string>",
"current_step": "<string>",
"steps": [
{
"step": "<string>",
"status": "<string>",
"started_at": "<string>",
"finished_at": "<string>",
"error": "<string>"
}
],
"blockers": [
{
"key": "<string>",
"label": "<string>",
"detail": "<string>",
"source": "<string>"
}
],
"profile": {
"balance_group_responsible_name": "<string>",
"balance_group_eic_x": "<string>",
"contractor_name": "<string>",
"connection_type_control_system_name": "<string>",
"products": [
"<string>"
],
"power_caps_mw": "<string>"
},
"technical_unit_id": "<string>",
"reserve_unit_id": "<string>",
"dso_id": "<string>",
"contract_ids": "<string>",
"concept_ids": "<string>",
"last_error": "<string>",
"attempt_count": 0,
"triggered_by_user_name": "<string>",
"triggered_at": "<string>",
"review_snapshot": "<string>",
"review_snapshot_hash": "<string>",
"review_inputs_changed": false,
"reviewed_by_user_name": "<string>",
"reviewed_at": "<string>",
"review_note": "<string>",
"requested_at": "<string>",
"last_polled_at": "<string>",
"preflight_completed_at": "<string>",
"applications": [
{
"id": "<string>",
"reserve_type": "<string>",
"reserve_direction": "<string>",
"cycle": 0,
"reserve_id": "<string>",
"portal_prequalification_id": "<string>",
"portal_state": "<string>",
"portal_number": "<string>",
"valid_from": "<string>",
"valid_until": "<string>",
"proof": {
"document_id": "<string>",
"sha256": "<string>",
"portal_document_id": "<string>",
"portal_document_version_id": "<string>"
},
"performance_proof": "<string>",
"dso_confirmation": {
"id": "<string>",
"state": "<string>",
"power_mw": "<string>",
"gradient_mw_per_min": "<string>"
},
"requested_measurement": "<string>",
"requested_measurement_overrides": "<string>",
"confirmed_measurement": "<string>",
"calculated_measurement": "<string>",
"evaluation_status": "<string>",
"evaluation_details": [
"<string>"
],
"comments": [
{
"id": "<string>",
"text": "<string>",
"author_name": "<string>",
"created_at": "<string>",
"is_ebx": false
}
],
"unresolved_comment_count": 0,
"action_requested_at": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 429rate limited
POST/v1/onboardings/{onboarding_id}/pq-submission/prepare
Prepare the PQ application in the PQ Portal
onboarding.write
Claims a preparation run and executes it in the background: validates the collected data, resolves the portal master data, creates or updates the technical unit, reserve unit, reserves, concept links and documents, requests the digital DSO confirmations, uploads the proof workbooks, waits for the portal's analysis, sets the requested values and reads the portal's evaluation. Nothing is requested from the TSO: the case ends blocked, waiting for the DSO or the analysis, or ready for review. Safe to repeat.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/prepare" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/prepare",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/prepare", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"status": "<string>",
"portal_env": "<string>",
"run_kind": "<string>",
"current_step": "<string>",
"steps": [
{
"step": "<string>",
"status": "<string>",
"started_at": "<string>",
"finished_at": "<string>",
"error": "<string>"
}
],
"blockers": [
{
"key": "<string>",
"label": "<string>",
"detail": "<string>",
"source": "<string>"
}
],
"profile": {
"balance_group_responsible_name": "<string>",
"balance_group_eic_x": "<string>",
"contractor_name": "<string>",
"connection_type_control_system_name": "<string>",
"products": [
"<string>"
],
"power_caps_mw": "<string>"
},
"technical_unit_id": "<string>",
"reserve_unit_id": "<string>",
"dso_id": "<string>",
"contract_ids": "<string>",
"concept_ids": "<string>",
"last_error": "<string>",
"attempt_count": 0,
"triggered_by_user_name": "<string>",
"triggered_at": "<string>",
"review_snapshot": "<string>",
"review_snapshot_hash": "<string>",
"review_inputs_changed": false,
"reviewed_by_user_name": "<string>",
"reviewed_at": "<string>",
"review_note": "<string>",
"requested_at": "<string>",
"last_polled_at": "<string>",
"preflight_completed_at": "<string>",
"applications": [
{
"id": "<string>",
"reserve_type": "<string>",
"reserve_direction": "<string>",
"cycle": 0,
"reserve_id": "<string>",
"portal_prequalification_id": "<string>",
"portal_state": "<string>",
"portal_number": "<string>",
"valid_from": "<string>",
"valid_until": "<string>",
"proof": {
"document_id": "<string>",
"sha256": "<string>",
"portal_document_id": "<string>",
"portal_document_version_id": "<string>"
},
"performance_proof": "<string>",
"dso_confirmation": {
"id": "<string>",
"state": "<string>",
"power_mw": "<string>",
"gradient_mw_per_min": "<string>"
},
"requested_measurement": "<string>",
"requested_measurement_overrides": "<string>",
"confirmed_measurement": "<string>",
"calculated_measurement": "<string>",
"evaluation_status": "<string>",
"evaluation_details": [
"<string>"
],
"comments": [
{
"id": "<string>",
"text": "<string>",
"author_name": "<string>",
"created_at": "<string>",
"is_ebx": false
}
],
"unresolved_comment_count": 0,
"action_requested_at": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 429rate limited
PUT/v1/onboardings/{onboarding_id}/pq-submission/profile
Update the EBX-maintained PQ profile
onboarding.write
Stores the balance-group responsible, balance group EIC, supplier, IT connection type, targeted products and power caps for this onboarding's PQ case. A prepared case must be prepared again afterwards.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- balance_group_responsible_name
- string
- balance_group_eic_x
- string
- contractor_name
- string
- connection_type_control_system_name
- string
- products
- array[string]
- power_caps_mw
- object
curl -X PUT "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/profile" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"balance_group_responsible_name":"<string>","balance_group_eic_x":"<string>","contractor_name":"<string>","connection_type_control_system_name":"<string>","products":["<string>"],"power_caps_mw":"<string>"}'import httpx
r = httpx.put(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/profile",
headers={"Authorization": f"Bearer {token}"},
json={
"balance_group_responsible_name": "<string>",
"balance_group_eic_x": "<string>",
"contractor_name": "<string>",
"connection_type_control_system_name": "<string>",
"products": [
"<string>",
],
"power_caps_mw": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/profile", {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"balance_group_responsible_name":"<string>","balance_group_eic_x":"<string>","contractor_name":"<string>","connection_type_control_system_name":"<string>","products":["<string>"],"power_caps_mw":"<string>"}),
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"status": "<string>",
"portal_env": "<string>",
"run_kind": "<string>",
"current_step": "<string>",
"steps": [
{
"step": "<string>",
"status": "<string>",
"started_at": "<string>",
"finished_at": "<string>",
"error": "<string>"
}
],
"blockers": [
{
"key": "<string>",
"label": "<string>",
"detail": "<string>",
"source": "<string>"
}
],
"profile": {
"balance_group_responsible_name": "<string>",
"balance_group_eic_x": "<string>",
"contractor_name": "<string>",
"connection_type_control_system_name": "<string>",
"products": [
"<string>"
],
"power_caps_mw": "<string>"
},
"technical_unit_id": "<string>",
"reserve_unit_id": "<string>",
"dso_id": "<string>",
"contract_ids": "<string>",
"concept_ids": "<string>",
"last_error": "<string>",
"attempt_count": 0,
"triggered_by_user_name": "<string>",
"triggered_at": "<string>",
"review_snapshot": "<string>",
"review_snapshot_hash": "<string>",
"review_inputs_changed": false,
"reviewed_by_user_name": "<string>",
"reviewed_at": "<string>",
"review_note": "<string>",
"requested_at": "<string>",
"last_polled_at": "<string>",
"preflight_completed_at": "<string>",
"applications": [
{
"id": "<string>",
"reserve_type": "<string>",
"reserve_direction": "<string>",
"cycle": 0,
"reserve_id": "<string>",
"portal_prequalification_id": "<string>",
"portal_state": "<string>",
"portal_number": "<string>",
"valid_from": "<string>",
"valid_until": "<string>",
"proof": {
"document_id": "<string>",
"sha256": "<string>",
"portal_document_id": "<string>",
"portal_document_version_id": "<string>"
},
"performance_proof": "<string>",
"dso_confirmation": {
"id": "<string>",
"state": "<string>",
"power_mw": "<string>",
"gradient_mw_per_min": "<string>"
},
"requested_measurement": "<string>",
"requested_measurement_overrides": "<string>",
"confirmed_measurement": "<string>",
"calculated_measurement": "<string>",
"evaluation_status": "<string>",
"evaluation_details": [
"<string>"
],
"comments": [
{
"id": "<string>",
"text": "<string>",
"author_name": "<string>",
"created_at": "<string>",
"is_ebx": false
}
],
"unresolved_comment_count": 0,
"action_requested_at": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboardings/{onboarding_id}/pq-submission/readiness
Check PQ Portal submission readiness
onboarding.read
Validates that all data and documents required for the automated PQ Portal submission are collected. With resolve=true the values are also resolved against the portal master data.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Query parameters
- resolve
- booleandefault falseAlso resolve collected values against PQ Portal master data and build the payload preview.
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/readiness" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/readiness",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/readiness", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"ready": false,
"integration_enabled": false,
"portal_env": "<string>",
"resolve_attempted": false,
"items": [
{
"key": "<string>",
"label": "<string>",
"status": "ok",
"detail": "<string>"
}
],
"derived_products": [
"<string>"
],
"payload_preview": {
"technical_unit": "<string>",
"reserve_unit": "<string>",
"requested_measurements": "<string>",
"documents": [
"<string>"
]
}
}- 401no valid token
- 403scope missing
- 404unknown or not visible
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/pq-submission/replan
Start a new PQ cycle after a TSO rejection
onboarding.write
Resets the rejected prequalifications for a new cycle; the next preparation creates new ones in the portal. Reopen the PQ Submission gate first if it was passed.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/replan" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/replan",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/replan", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"status": "<string>",
"portal_env": "<string>",
"run_kind": "<string>",
"current_step": "<string>",
"steps": [
{
"step": "<string>",
"status": "<string>",
"started_at": "<string>",
"finished_at": "<string>",
"error": "<string>"
}
],
"blockers": [
{
"key": "<string>",
"label": "<string>",
"detail": "<string>",
"source": "<string>"
}
],
"profile": {
"balance_group_responsible_name": "<string>",
"balance_group_eic_x": "<string>",
"contractor_name": "<string>",
"connection_type_control_system_name": "<string>",
"products": [
"<string>"
],
"power_caps_mw": "<string>"
},
"technical_unit_id": "<string>",
"reserve_unit_id": "<string>",
"dso_id": "<string>",
"contract_ids": "<string>",
"concept_ids": "<string>",
"last_error": "<string>",
"attempt_count": 0,
"triggered_by_user_name": "<string>",
"triggered_at": "<string>",
"review_snapshot": "<string>",
"review_snapshot_hash": "<string>",
"review_inputs_changed": false,
"reviewed_by_user_name": "<string>",
"reviewed_at": "<string>",
"review_note": "<string>",
"requested_at": "<string>",
"last_polled_at": "<string>",
"preflight_completed_at": "<string>",
"applications": [
{
"id": "<string>",
"reserve_type": "<string>",
"reserve_direction": "<string>",
"cycle": 0,
"reserve_id": "<string>",
"portal_prequalification_id": "<string>",
"portal_state": "<string>",
"portal_number": "<string>",
"valid_from": "<string>",
"valid_until": "<string>",
"proof": {
"document_id": "<string>",
"sha256": "<string>",
"portal_document_id": "<string>",
"portal_document_version_id": "<string>"
},
"performance_proof": "<string>",
"dso_confirmation": {
"id": "<string>",
"state": "<string>",
"power_mw": "<string>",
"gradient_mw_per_min": "<string>"
},
"requested_measurement": "<string>",
"requested_measurement_overrides": "<string>",
"confirmed_measurement": "<string>",
"calculated_measurement": "<string>",
"evaluation_status": "<string>",
"evaluation_details": [
"<string>"
],
"comments": [
{
"id": "<string>",
"text": "<string>",
"author_name": "<string>",
"created_at": "<string>",
"is_ebx": false
}
],
"unresolved_comment_count": 0,
"action_requested_at": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 429rate limited
POST/v1/onboardings/{onboarding_id}/pq-submission/request
Approve the prepared PQ application and request it from the TSO
onboarding.write
The human sign-off of the automated PQ submission. The approval is bound to the snapshot hash of the prepared state shown in the review; a stale hash is rejected with 409. The request run re-verifies the portal against the reviewed snapshot and sends the Request action per prequalification in the background. Poll the status endpoint for progress.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- snapshot_hashREQUIRED
- string
- note
- string
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/request" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"snapshot_hash":"<string>","note":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/request",
headers={"Authorization": f"Bearer {token}"},
json={
"snapshot_hash": "<string>",
"note": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/request", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"snapshot_hash":"<string>","note":"<string>"}),
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"status": "<string>",
"portal_env": "<string>",
"run_kind": "<string>",
"current_step": "<string>",
"steps": [
{
"step": "<string>",
"status": "<string>",
"started_at": "<string>",
"finished_at": "<string>",
"error": "<string>"
}
],
"blockers": [
{
"key": "<string>",
"label": "<string>",
"detail": "<string>",
"source": "<string>"
}
],
"profile": {
"balance_group_responsible_name": "<string>",
"balance_group_eic_x": "<string>",
"contractor_name": "<string>",
"connection_type_control_system_name": "<string>",
"products": [
"<string>"
],
"power_caps_mw": "<string>"
},
"technical_unit_id": "<string>",
"reserve_unit_id": "<string>",
"dso_id": "<string>",
"contract_ids": "<string>",
"concept_ids": "<string>",
"last_error": "<string>",
"attempt_count": 0,
"triggered_by_user_name": "<string>",
"triggered_at": "<string>",
"review_snapshot": "<string>",
"review_snapshot_hash": "<string>",
"review_inputs_changed": false,
"reviewed_by_user_name": "<string>",
"reviewed_at": "<string>",
"review_note": "<string>",
"requested_at": "<string>",
"last_polled_at": "<string>",
"preflight_completed_at": "<string>",
"applications": [
{
"id": "<string>",
"reserve_type": "<string>",
"reserve_direction": "<string>",
"cycle": 0,
"reserve_id": "<string>",
"portal_prequalification_id": "<string>",
"portal_state": "<string>",
"portal_number": "<string>",
"valid_from": "<string>",
"valid_until": "<string>",
"proof": {
"document_id": "<string>",
"sha256": "<string>",
"portal_document_id": "<string>",
"portal_document_version_id": "<string>"
},
"performance_proof": "<string>",
"dso_confirmation": {
"id": "<string>",
"state": "<string>",
"power_mw": "<string>",
"gradient_mw_per_min": "<string>"
},
"requested_measurement": "<string>",
"requested_measurement_overrides": "<string>",
"confirmed_measurement": "<string>",
"calculated_measurement": "<string>",
"evaluation_status": "<string>",
"evaluation_details": [
"<string>"
],
"comments": [
{
"id": "<string>",
"text": "<string>",
"author_name": "<string>",
"created_at": "<string>",
"is_ebx": false
}
],
"unresolved_comment_count": 0,
"action_requested_at": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/pq-submission/withdraw
Withdraw the requested PQ application from the TSO
onboarding.write
Sends the Withdraw action for every requested prequalification; the case must be prepared and reviewed again afterwards.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- note
- string
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/withdraw" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"note":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/withdraw",
headers={"Authorization": f"Bearer {token}"},
json={
"note": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-submission/withdraw", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"note":"<string>"}),
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"status": "<string>",
"portal_env": "<string>",
"run_kind": "<string>",
"current_step": "<string>",
"steps": [
{
"step": "<string>",
"status": "<string>",
"started_at": "<string>",
"finished_at": "<string>",
"error": "<string>"
}
],
"blockers": [
{
"key": "<string>",
"label": "<string>",
"detail": "<string>",
"source": "<string>"
}
],
"profile": {
"balance_group_responsible_name": "<string>",
"balance_group_eic_x": "<string>",
"contractor_name": "<string>",
"connection_type_control_system_name": "<string>",
"products": [
"<string>"
],
"power_caps_mw": "<string>"
},
"technical_unit_id": "<string>",
"reserve_unit_id": "<string>",
"dso_id": "<string>",
"contract_ids": "<string>",
"concept_ids": "<string>",
"last_error": "<string>",
"attempt_count": 0,
"triggered_by_user_name": "<string>",
"triggered_at": "<string>",
"review_snapshot": "<string>",
"review_snapshot_hash": "<string>",
"review_inputs_changed": false,
"reviewed_by_user_name": "<string>",
"reviewed_at": "<string>",
"review_note": "<string>",
"requested_at": "<string>",
"last_polled_at": "<string>",
"preflight_completed_at": "<string>",
"applications": [
{
"id": "<string>",
"reserve_type": "<string>",
"reserve_direction": "<string>",
"cycle": 0,
"reserve_id": "<string>",
"portal_prequalification_id": "<string>",
"portal_state": "<string>",
"portal_number": "<string>",
"valid_from": "<string>",
"valid_until": "<string>",
"proof": {
"document_id": "<string>",
"sha256": "<string>",
"portal_document_id": "<string>",
"portal_document_version_id": "<string>"
},
"performance_proof": "<string>",
"dso_confirmation": {
"id": "<string>",
"state": "<string>",
"power_mw": "<string>",
"gradient_mw_per_min": "<string>"
},
"requested_measurement": "<string>",
"requested_measurement_overrides": "<string>",
"confirmed_measurement": "<string>",
"calculated_measurement": "<string>",
"evaluation_status": "<string>",
"evaluation_details": [
"<string>"
],
"comments": [
{
"id": "<string>",
"text": "<string>",
"author_name": "<string>",
"created_at": "<string>",
"is_ebx": false
}
],
"unresolved_comment_count": 0,
"action_requested_at": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboardings/{onboarding_id}/rfi
Update the RfI on behalf of the asset owner
onboarding.write
Persists the RfI gate payload with EBX attribution so operators can fill or correct the form for the asset owner. Per-field change stamps are updated server-side and clarification threads are preserved. If the RFI gate has already passed, the synced asset profile is refreshed.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- rfiREQUIRED
- object
curl -X PATCH "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/rfi" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"rfi":{"m_device":{"shipping_address":{"street":"<string>","postal_code":"<string>","city":"<string>","country":"<string>","attention":"<string>"},"site_contact":{"name":"<string>","email":"name@example.com","phone":"<string>"},"network_config":{"ems_server_ip":"","ebx_box_1_client_ip":"","ebx_box_2_client_ip":""},"planned_hw_installation_date":"<string>","delivery_mode":"loose_components","power_supply":"24v_dc","ethernet_available":false,"antenna_location_outdoors":false,"antenna_extension_cable":"none","notes":"<string>"},"control":{"ems_vendor":"<string>","ems_vendor_other":"<string>","ems_supports_modbus_tcp":false,"pq_submission_targeted":false,"ems_technical_contact":{"name":"<string>","email":"name@example.com","phone":"<string>"},"pq_data":"<string>","pq_documents":"<string>","notes":"<string>"},"field_meta":"<string>"}}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/rfi",
headers={"Authorization": f"Bearer {token}"},
json={
"rfi": {
"m_device": {
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>",
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>",
},
"network_config": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
},
"planned_hw_installation_date": "<string>",
"delivery_mode": "loose_components",
"power_supply": "24v_dc",
"ethernet_available": False,
"antenna_location_outdoors": False,
"antenna_extension_cable": "none",
"notes": "<string>",
},
"control": {
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": False,
"pq_submission_targeted": False,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>",
},
"pq_data": "<string>",
"pq_documents": "<string>",
"notes": "<string>",
},
"field_meta": "<string>",
},
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/rfi", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"rfi":{"m_device":{"shipping_address":{"street":"<string>","postal_code":"<string>","city":"<string>","country":"<string>","attention":"<string>"},"site_contact":{"name":"<string>","email":"name@example.com","phone":"<string>"},"network_config":{"ems_server_ip":"","ebx_box_1_client_ip":"","ebx_box_2_client_ip":""},"planned_hw_installation_date":"<string>","delivery_mode":"loose_components","power_supply":"24v_dc","ethernet_available":false,"antenna_location_outdoors":false,"antenna_extension_cable":"none","notes":"<string>"},"control":{"ems_vendor":"<string>","ems_vendor_other":"<string>","ems_supports_modbus_tcp":false,"pq_submission_targeted":false,"ems_technical_contact":{"name":"<string>","email":"name@example.com","phone":"<string>"},"pq_data":"<string>","pq_documents":"<string>","notes":"<string>"},"field_meta":"<string>"}}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/rfi/fields/{field_key}/comments
Comment on an RfI field
onboarding.write
Adds a clarification comment to an RfI field on the RFI gate, opens the field discussion thread, and records onboarding activity.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- field_keyREQUIRED
- stringRfI field key from the RFI gate field_meta payload, for example
m_device.shipping_address.
Request body · required
- bodyREQUIRED
- string
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/rfi/fields/m_device.shipping_address/comments" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"body":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/rfi/fields/m_device.shipping_address/comments",
headers={"Authorization": f"Bearer {token}"},
json={
"body": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/rfi/fields/m_device.shipping_address/comments", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"body":"<string>"}),
});
const data = await res.json();{
"status": "open",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"last_comment_at": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboardings/{onboarding_id}/rfi/fields/{field_key}/thread
Update an RfI field discussion status
onboarding.write
Opens or resolves the clarification thread for an RfI field without changing the field values.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- field_keyREQUIRED
- stringRfI field key from the RFI gate field_meta payload, for example
m_device.shipping_address.
Request body · required
- statusREQUIRED
- enum
openresolved
curl -X PATCH "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/rfi/fields/m_device.shipping_address/thread" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status":"open"}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/rfi/fields/m_device.shipping_address/thread",
headers={"Authorization": f"Bearer {token}"},
json={
"status": "open",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/rfi/fields/m_device.shipping_address/thread", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"status":"open"}),
});
const data = await res.json();{
"status": "open",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"last_comment_at": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboardings/{onboarding_id}/whitelabel
Enable or disable whitelabel branding
onboarding.write
Toggles whether the external onboarding surface (magic-link views and emails) carries the asset owner org's branding instead of EBX's. Enabling requires branding to be configured for the owner org.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- whitelabelREQUIRED
- boolean
curl -X PATCH "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/whitelabel" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"whitelabel":false}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/whitelabel",
headers={"Authorization": f"Bearer {token}"},
json={
"whitelabel": False,
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/whitelabel", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"whitelabel":false}),
});
const data = await res.json();{
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"current_gate_definition_id": "mon_rfi",
"overall_status": "in_progress",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"whitelabel": false,
"process_definition": {
"id": "<string>",
"integration_type": "monitoring_only",
"version": "<string>",
"source_label": "<string>",
"gate_sequence": [
"mon_rfi"
],
"gate_definitions": "<string>",
"process_document_slots": [
{
"document_type": "installation_photo_mdevice",
"label": "<string>",
"description": "<string>",
"required": false,
"allow_multiple": false
}
],
"asset_profile_sync_gate_id": "mon_rfi",
"schema_version": 0
},
"gate_definitions": "<string>",
"asset_profile": {
"id": "<string>",
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"asset_owner_org_id": "<string>",
"asset_owner_org_name": "<string>",
"shipping_address": {
"street": "<string>",
"postal_code": "<string>",
"city": "<string>",
"country": "<string>",
"attention": "<string>"
},
"site_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"power_supply": "24v_dc",
"ethernet_available": false,
"antenna_location_outdoors": false,
"ems_vendor": "<string>",
"ems_vendor_other": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
},
"source_gate_definition_id": "mon_rfi",
"source_gate_passed_at": "<string>",
"source_gate_updated_at": "<string>",
"synced_at": "<string>",
"sync_reason": "<string>"
},
"asset_owner_contact": {
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
},
"asset_owner_contacts": [
{
"id": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"partners": [
{
"id": "<string>",
"role": "epc",
"org_name": "<string>",
"contact_name": "<string>",
"contact_email": "<string>",
"access": {
"status": "<string>"
}
}
],
"created_at": "<string>",
"updated_at": "<string>",
"gates": [
{
"id": "<string>",
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"last_note": "<string>",
"passed_at": "<string>",
"passed_by_user_name": "<string>",
"structured_data": "<string>"
}
],
"documents": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"document_type": "installation_photo_mdevice",
"filename": "<string>",
"size_bytes": 0,
"content_type": "<string>",
"uploaded_at": "<string>",
"uploaded_by_user_name": "<string>",
"version": 0
}
],
"activity": [
{
"id": "<string>",
"onboarding_id": "<string>",
"gate_definition_id": "mon_rfi",
"actor_user_name": "<string>",
"actor_org_name": "<string>",
"event_type": "onboarding_created",
"note": "<string>",
"created_at": "<string>"
}
],
"internal_tracker": {
"tasks": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"status": "open",
"category": "<string>",
"template_key": "<string>",
"due_date": "<string>",
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"completed_at": "<string>"
}
],
"open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"ref": {
"kind": "<string>",
"gate_definition_id": "mon_rfi"
},
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_by_user_name": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
],
"applied_templates": [
"<string>"
]
}
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboardings/standards/dpl
List standard DPL templates
onboarding.read
Returns the EBX-maintained standard Data Point List templates available for onboarding. Use these templates to initialize or compare the software-gate DPL for monitoring-only and full-control integrations.
This endpoint takes no parameters.
curl "https://api.ebx.energy/v1/onboardings/standards/dpl" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/standards/dpl",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/standards/dpl", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();[
{
"id": "ebx_monitor",
"label": "<string>",
"version": "<string>",
"published_at": "<string>",
"notes": "<string>",
"datapoints": [
{
"id": "<string>",
"name": "<string>",
"unit": "<string>",
"data_type": "float",
"direction": "control",
"register": 0,
"register_type": "holding",
"short_description": "<string>",
"long_description_en": "<string>",
"long_description_de": "<string>"
}
]
}
]GET/v1/onboardings/standards/dpl/{standard_id}
Get a standard DPL template
onboarding.read
Returns one EBX standard DPL template. The response includes the expected datapoints, Modbus register metadata, direction, data type, and customer-facing descriptions used to prepare the EMS implementation.
Path parameters
- standard_idREQUIRED
- stringStandard DPL identifier, for example
ebx_monitororebx_control.
curl "https://api.ebx.energy/v1/onboardings/standards/dpl/ebx_monitor" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/standards/dpl/ebx_monitor",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/standards/dpl/ebx_monitor", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"id": "ebx_monitor",
"label": "<string>",
"version": "<string>",
"published_at": "<string>",
"notes": "<string>",
"datapoints": [
{
"id": "<string>",
"name": "<string>",
"unit": "<string>",
"data_type": "float",
"direction": "control",
"register": 0,
"register_type": "holding",
"short_description": "<string>",
"long_description_en": "<string>",
"long_description_de": "<string>"
}
]
}GET/v1/public/onboarding-branding/{organization_id}/email-banner
Get a whitelabel onboarding email banner
Serves the organization's uploaded email banner for onboarding emails and previews.
Path parameters
- organization_idREQUIRED
- stringOrganization identifier the branding belongs to.
curl "https://api.ebx.energy/v1/public/onboarding-branding/your-org/email-banner" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/public/onboarding-branding/your-org/email-banner",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/public/onboarding-branding/your-org/email-banner", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{}GET/v1/public/onboarding-branding/{organization_id}/logo
Get a whitelabel onboarding logo
Serves the organization's uploaded whitelabel logo for external onboarding views and emails.
Path parameters
- organization_idREQUIRED
- stringOrganization identifier the branding belongs to.
curl "https://api.ebx.energy/v1/public/onboarding-branding/your-org/logo" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/public/onboarding-branding/your-org/logo",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/public/onboarding-branding/your-org/logo", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{}