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
Required scopes: 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
Required scopes: 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
Required scopes: 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
Required scopes: 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
Authentication: none
Validates a reusable external onboarding magic link and returns authentication tokens granting access to the assigned onboarding task.
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
Authentication: none
Refreshes an 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
Required scopes: none (any authenticated caller)
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": [
{
"archived_at": "<string>",
"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
Required scopes: none (any authenticated caller)
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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"created_at": "<string>",
"project_schedule": [
{
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"passed_at": "<string>"
}
],
"hardware_requested_at": "<string>",
"hardware_submitted_at": "<string>",
"general_submitted_at": "<string>",
"ems_submitted_at": "<string>",
"hardware_ready": false,
"ems_information": {
"network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"provider_company": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
}
},
"responsible_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"support_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"is_transition": false,
"role": "asset_owner",
"ems_network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<string>"
}
],
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>",
"shared_notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}POST/v1/onboarding-tasks/{onboarding_id}/change-requests
Request Task Change
Required scopes: none (any authenticated caller)
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
- sectionREQUIRED
- enum
hardwaregeneralems - noteREQUIRED
- string
curl -X POST "https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/change-requests" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"section":"hardware","note":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/change-requests",
headers={"Authorization": f"Bearer {token}"},
json={
"section": "hardware",
"note": "<string>",
},
)
print(r.status_code)const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/change-requests", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"section":"hardware","note":"<string>"}),
});Returns 204 with no body.
- 400malformed request
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
DELETE/v1/onboarding-tasks/{onboarding_id}/documents/{document_id}
Remove a task-scoped uploaded document
Required scopes: none (any authenticated caller)
Soft-deletes a document the caller uploaded through their onboarding task so it no longer appears on the task or receives download URLs. The stored file is not deleted immediately.
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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"created_at": "<string>",
"project_schedule": [
{
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"passed_at": "<string>"
}
],
"hardware_requested_at": "<string>",
"hardware_submitted_at": "<string>",
"general_submitted_at": "<string>",
"ems_submitted_at": "<string>",
"hardware_ready": false,
"ems_information": {
"network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"provider_company": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
}
},
"responsible_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"support_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"is_transition": false,
"role": "asset_owner",
"ems_network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<string>"
}
],
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>",
"shared_notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}GET/v1/onboarding-tasks/{onboarding_id}/documents/{document_id}/download
Download a task-scoped document
Required scopes: none (any authenticated caller)
Returns a short-lived presigned HTTP GET download URL for a document the caller can access through their assigned onboarding task. The URL serves the document as an attachment under its original filename, or inline for preview with inline=true.
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. - inline
- booleandefault falseServe the document for in-browser preview instead of as an attachment. Only PDF, PNG, JPEG and WebP documents can be previewed; any other type returns 409.
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
Required scopes: none (any authenticated caller)
Marks a pending task evidence upload as available after the client has uploaded the file to the presigned upload URL.
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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"created_at": "<string>",
"project_schedule": [
{
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"passed_at": "<string>"
}
],
"hardware_requested_at": "<string>",
"hardware_submitted_at": "<string>",
"general_submitted_at": "<string>",
"ems_submitted_at": "<string>",
"hardware_ready": false,
"ems_information": {
"network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"provider_company": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
}
},
"responsible_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"support_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"is_transition": false,
"role": "asset_owner",
"ems_network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<string>"
}
],
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>",
"shared_notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}POST/v1/onboarding-tasks/{onboarding_id}/documents/presigned-upload
Create a task-scoped document upload URL
Required scopes: none (any authenticated caller)
Creates pending document metadata for task-owned evidence and returns a short-lived presigned upload URL for HTTP PUT.
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
- requirement_key
- stringThe requirement the file satisfies, e.g.
contractor_confirmation. The file is then filed under that requirement's gate whatevergate_definition_idsays. Without it the requirement is derived from the type and therfi-<key>__/pq-evidence-<slot>__filename prefix, or the file stays unassigned.
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>","requirement_key":"<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>",
"requirement_key": "<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>","requirement_key":"<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
Required scopes: none (any authenticated caller)
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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"created_at": "<string>",
"project_schedule": [
{
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"passed_at": "<string>"
}
],
"hardware_requested_at": "<string>",
"hardware_submitted_at": "<string>",
"general_submitted_at": "<string>",
"ems_submitted_at": "<string>",
"hardware_ready": false,
"ems_information": {
"network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"provider_company": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
}
},
"responsible_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"support_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"is_transition": false,
"role": "asset_owner",
"ems_network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<string>"
}
],
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>",
"shared_notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_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
Required scopes: none (any authenticated caller)
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
Required scopes: none (any authenticated caller)
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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"created_at": "<string>",
"project_schedule": [
{
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"passed_at": "<string>"
}
],
"hardware_requested_at": "<string>",
"hardware_submitted_at": "<string>",
"general_submitted_at": "<string>",
"ems_submitted_at": "<string>",
"hardware_ready": false,
"ems_information": {
"network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"provider_company": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
}
},
"responsible_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"support_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"is_transition": false,
"role": "asset_owner",
"ems_network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<string>"
}
],
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>",
"shared_notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}- 400malformed request
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboarding-tasks/{onboarding_id}/ems-information
Save or submit early EMS information
Required scopes: none (any authenticated caller)
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
- network
- object
- provider_company
- string
- ems_supports_modbus_tcp
- booleandefault false
- pq_submission_targeted
- boolean
- ems_technical_contact
- object
- submit
- booleandefault false
curl -X PATCH "https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/ems-information" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"network":{"ems_server_ip":"","ebx_box_1_client_ip":"","ebx_box_2_client_ip":"","subnet_mask":"","gateway":"","ems_mode":"client","ems_port":0,"ems_unit_id":0,"ems_byte_word_order":"ABCD","ems_poll_interval_ms":0,"ems_timeout_ms":0,"ems_batching":{"max_read_registers":125,"max_read_gap_registers":32,"max_write_registers":123,"max_write_gap_registers":0,"fill_write_gaps_from_shadow":false,"write_cache_ttl_seconds":2}},"provider_company":"<string>","ems_supports_modbus_tcp":false,"pq_submission_targeted":false,"ems_technical_contact":{"name":"<string>","email":"name@example.com","phone":"<string>"},"submit":false}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/ems-information",
headers={"Authorization": f"Bearer {token}"},
json={
"network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": False,
"write_cache_ttl_seconds": 2,
},
},
"provider_company": "<string>",
"ems_supports_modbus_tcp": False,
"pq_submission_targeted": False,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>",
},
"submit": False,
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/ems-information", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"network":{"ems_server_ip":"","ebx_box_1_client_ip":"","ebx_box_2_client_ip":"","subnet_mask":"","gateway":"","ems_mode":"client","ems_port":0,"ems_unit_id":0,"ems_byte_word_order":"ABCD","ems_poll_interval_ms":0,"ems_timeout_ms":0,"ems_batching":{"max_read_registers":125,"max_read_gap_registers":32,"max_write_registers":123,"max_write_gap_registers":0,"fill_write_gaps_from_shadow":false,"write_cache_ttl_seconds":2}},"provider_company":"<string>","ems_supports_modbus_tcp":false,"pq_submission_targeted":false,"ems_technical_contact":{"name":"<string>","email":"name@example.com","phone":"<string>"},"submit":false}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"created_at": "<string>",
"project_schedule": [
{
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"passed_at": "<string>"
}
],
"hardware_requested_at": "<string>",
"hardware_submitted_at": "<string>",
"general_submitted_at": "<string>",
"ems_submitted_at": "<string>",
"hardware_ready": false,
"ems_information": {
"network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"provider_company": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
}
},
"responsible_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"support_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"is_transition": false,
"role": "asset_owner",
"ems_network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<string>"
}
],
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>",
"shared_notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}- 400malformed request
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboarding-tasks/{onboarding_id}/ems-network
Update EMS connection fields
Required scopes: none (any authenticated caller)
Merges only supplied Modbus network fields into the canonical RfI, authorized by the EMS task rather than asset-owner access.
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
- ems_server_ip
- stringdefault EMS Modbus server IPv4 address; an optional redundant controller is stored as a second address separated by a semicolon.
- ebx_box_1_client_ip
- stringdefault
- ebx_box_2_client_ip
- stringdefault
- subnet_mask
- stringdefault
- gateway
- stringdefault
- ems_mode
- enum
clientserverPulse's terms: client = the boxes poll the EMS (the EMS is the Modbus server), server = the EMS connects to the boxes. - ems_port
- integer
- ems_unit_id
- integer
- ems_byte_word_order
- enum
ABCDCDABBADCDCBAEMS-side byte/word order; the EBX side always uses ABCD. - ems_poll_interval_ms
- integer
- ems_timeout_ms
- integer
- ems_batching
- object
curl -X PATCH "https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/ems-network" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"ems_server_ip":"","ebx_box_1_client_ip":"","ebx_box_2_client_ip":"","subnet_mask":"","gateway":"","ems_mode":"client","ems_port":0,"ems_unit_id":0,"ems_byte_word_order":"ABCD","ems_poll_interval_ms":0,"ems_timeout_ms":0,"ems_batching":{"max_read_registers":125,"max_read_gap_registers":32,"max_write_registers":123,"max_write_gap_registers":0,"fill_write_gaps_from_shadow":false,"write_cache_ttl_seconds":2}}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/ems-network",
headers={"Authorization": f"Bearer {token}"},
json={
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": False,
"write_cache_ttl_seconds": 2,
},
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/ems-network", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"ems_server_ip":"","ebx_box_1_client_ip":"","ebx_box_2_client_ip":"","subnet_mask":"","gateway":"","ems_mode":"client","ems_port":0,"ems_unit_id":0,"ems_byte_word_order":"ABCD","ems_poll_interval_ms":0,"ems_timeout_ms":0,"ems_batching":{"max_read_registers":125,"max_read_gap_registers":32,"max_write_registers":123,"max_write_gap_registers":0,"fill_write_gaps_from_shadow":false,"write_cache_ttl_seconds":2}}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"created_at": "<string>",
"project_schedule": [
{
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"passed_at": "<string>"
}
],
"hardware_requested_at": "<string>",
"hardware_submitted_at": "<string>",
"general_submitted_at": "<string>",
"ems_submitted_at": "<string>",
"hardware_ready": false,
"ems_information": {
"network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"provider_company": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
}
},
"responsible_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"support_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"is_transition": false,
"role": "asset_owner",
"ems_network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<string>"
}
],
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>",
"shared_notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_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
Required scopes: none (any authenticated caller)
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
Required scopes: none (any authenticated caller)
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
- rfi_submission
- enumdefault general
hardwaregeneral - 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 '{"rfi_submission":"hardware","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={
"rfi_submission": "hardware",
"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({"rfi_submission":"hardware","note":"<string>","hardware":{"package_received_confirmed":false,"installation_confirmed":false,"notes":"<string>"}}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"created_at": "<string>",
"project_schedule": [
{
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"passed_at": "<string>"
}
],
"hardware_requested_at": "<string>",
"hardware_submitted_at": "<string>",
"general_submitted_at": "<string>",
"ems_submitted_at": "<string>",
"hardware_ready": false,
"ems_information": {
"network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"provider_company": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
}
},
"responsible_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"support_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"is_transition": false,
"role": "asset_owner",
"ems_network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<string>"
}
],
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>",
"shared_notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_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
Required scopes: none (any authenticated caller)
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":{"planned_cod":"2026-01-01","partners":"<string>","network_revision":0,"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":"","subnet_mask":"","gateway":"","ems_mode":"client","ems_port":0,"ems_unit_id":0,"ems_byte_word_order":"ABCD","ems_poll_interval_ms":0,"ems_timeout_ms":0,"ems_batching":{"max_read_registers":125,"max_read_gap_registers":32,"max_write_registers":123,"max_write_gap_registers":0,"fill_write_gaps_from_shadow":false,"write_cache_ttl_seconds":2}},"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_input_mode":"owner","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_selections":"<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": {
"planned_cod": "2026-01-01",
"partners": "<string>",
"network_revision": 0,
"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": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": False,
"write_cache_ttl_seconds": 2,
},
},
"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_input_mode": "owner",
"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_selections": "<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":{"planned_cod":"2026-01-01","partners":"<string>","network_revision":0,"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":"","subnet_mask":"","gateway":"","ems_mode":"client","ems_port":0,"ems_unit_id":0,"ems_byte_word_order":"ABCD","ems_poll_interval_ms":0,"ems_timeout_ms":0,"ems_batching":{"max_read_registers":125,"max_read_gap_registers":32,"max_write_registers":123,"max_write_gap_registers":0,"fill_write_gaps_from_shadow":false,"write_cache_ttl_seconds":2}},"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_input_mode":"owner","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_selections":"<string>","pq_documents":"<string>","notes":"<string>"},"field_meta":"<string>"}}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"created_at": "<string>",
"project_schedule": [
{
"definition_id": "mon_rfi",
"status": "pending",
"deadline": "2026-01-01",
"passed_at": "<string>"
}
],
"hardware_requested_at": "<string>",
"hardware_submitted_at": "<string>",
"general_submitted_at": "<string>",
"ems_submitted_at": "<string>",
"hardware_ready": false,
"ems_information": {
"network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"provider_company": "<string>",
"ems_supports_modbus_tcp": false,
"pq_submission_targeted": false,
"ems_technical_contact": {
"name": "<string>",
"email": "name@example.com",
"phone": "<string>"
}
},
"responsible_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"support_contact": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>"
},
"onboarding_id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"is_transition": false,
"role": "asset_owner",
"ems_network": {
"ems_server_ip": "",
"ebx_box_1_client_ip": "",
"ebx_box_2_client_ip": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": false,
"write_cache_ttl_seconds": 2
}
},
"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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<string>"
}
],
"branding": {
"display_name": "<string>",
"primary_color": "<string>",
"support_email": "<string>",
"logo_url": "<string>"
},
"updated_at": "<string>",
"shared_notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}- 400malformed request
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboarding-tasks/{onboarding_id}/rfi-catalogues/{catalogue}
Read cached PQ choices for RfI
Required scopes: none (any authenticated caller)
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by the task list.
- catalogueREQUIRED
- enum
tsosdsosbalance_group_responsiblescontractorsbalance_groupsbalancing_areasenergy_sourcestechnologiestechnical_implementationsconnection_typespostal_cities
Query parameters
- query
- stringdefault
- dso
- stringdefault DSO selection id; marks its balancing areas as suggested
- tso
- stringdefault
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/rfi-catalogues/tsos" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/rfi-catalogues/tsos",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboarding-tasks/00000000-0000-0000-0000-000000000000/rfi-catalogues/tsos", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{}POST/v1/onboarding-tasks/{onboarding_id}/rfi/fields/{field_key}/comments
Comment on an asset-owner RfI field
Required scopes: none (any authenticated caller)
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
Required scopes: none (any authenticated caller)
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
Required scopes: 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": [
{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}
]
}POST/v1/onboardings
Create an onboarding workflow
onboarding.write
Required scopes: 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_date
- string<date>
- target_cod_date
- 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.
- is_transition
- booleandefault falseEBX only. Onboard an asset that is already live elsewhere (Transition Project) to produce its PQ application: links the existing asset_id (required, full_control only), skips the hardware, software and monitoring-test gates, and sends no invitations.
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","target_cod_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,"is_transition":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",
"target_cod_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,
"is_transition": 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","target_cod_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,"is_transition":false}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboardings/{onboarding_id}
Get onboarding details
onboarding.read
Required scopes: onboarding.read
Returns the complete onboarding state for a visible onboarding, including the persisted process definition, current gate states, partner assignments, document metadata, 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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}PATCH/v1/onboardings/{onboarding_id}
Update onboarding metadata
onboarding.write
Required scopes: 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
- original_cod_override_reason
- string
- asset_name
- string
- location
- string
- country
- string
- project_settings
- object
- 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 '{"original_cod_override_reason":"<string>","asset_name":"<string>","location":"<string>","country":"<string>","project_settings":{"deadline_overrides":"<string>","contacts":{"asset_owner":{"name":"<string>","email":"<string>","phone":"<string>","company":"<string>","notes":"<string>"},"epc":{"name":"<string>","email":"<string>","phone":"<string>","company":"<string>","notes":"<string>"},"ems_provider":{"name":"<string>","email":"<string>","phone":"<string>","company":"<string>","notes":"<string>"},"ebx":{"name":"<string>","email":"<string>","phone":"<string>","company":"<string>","notes":"<string>"},"partner":{"name":"<string>","email":"<string>","phone":"<string>","company":"<string>","notes":"<string>"}},"co_location":"<string>","start":"2026-01-01","original":"2026-01-01","estimatedOverride":"2026-01-01"},"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={
"original_cod_override_reason": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>",
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>",
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>",
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>",
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>",
},
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01",
},
"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({"original_cod_override_reason":"<string>","asset_name":"<string>","location":"<string>","country":"<string>","project_settings":{"deadline_overrides":"<string>","contacts":{"asset_owner":{"name":"<string>","email":"<string>","phone":"<string>","company":"<string>","notes":"<string>"},"epc":{"name":"<string>","email":"<string>","phone":"<string>","company":"<string>","notes":"<string>"},"ems_provider":{"name":"<string>","email":"<string>","phone":"<string>","company":"<string>","notes":"<string>"},"ebx":{"name":"<string>","email":"<string>","phone":"<string>","company":"<string>","notes":"<string>"},"partner":{"name":"<string>","email":"<string>","phone":"<string>","company":"<string>","notes":"<string>"}},"co_location":"<string>","start":"2026-01-01","original":"2026-01-01","estimatedOverride":"2026-01-01"},"target_hc_date":"2026-01-01","asset_id":"<string>"}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/abort
Abort an onboarding
onboarding.write
Required scopes: onboarding.write
EBX only. Stops the onboarding for good and records the reason (and optionally its category) in the activity log. Refused while a Betriebsfahrt session drives the asset or a PQ request is in flight, and for an onboarding that is already completed or aborted.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- reasonREQUIRED
- string
- category
- enum
grid_dsohardware_siteems_data_pointscommercial_contractpq_tsoother
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/abort" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"reason":"<string>","category":"grid_dso"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/abort",
headers={"Authorization": f"Bearer {token}"},
json={
"reason": "<string>",
"category": "grid_dso",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/abort", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"reason":"<string>","category":"grid_dso"}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboardings/{onboarding_id}/activity
List onboarding audit history
onboarding.read
Required scopes: onboarding.read
Returns audit entries newest first, independently of onboarding state. EBX admins can read any onboarding; other callers can read only onboardings owned by their organizations and cannot see internal tracker events. Follow next_cursor until null to retrieve the complete history. Audit entries are generated automatically by onboarding actions and cannot be edited through this endpoint.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Query parameters
- limit
- integerdefault 100
- cursor
- string
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/activity" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/activity",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/activity", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"items": [
{
"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>",
"changes": [
{
"field": "<string>",
"before": "<string>",
"after": "<string>"
}
],
"changes_total": 0,
"changed_sections": [
"<string>"
],
"acting_as_role": "<string>"
}
],
"next_cursor": "<string>"
}- 401no valid token
- 403scope missing
- 404unknown or not visible
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/archive
Archive Onboarding
onboarding.write
Required scopes: onboarding.write
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- asset_nameREQUIRED
- string
- confirmedREQUIRED
- boolean
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/archive" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"asset_name":"<string>","confirmed":false}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/archive",
headers={"Authorization": f"Bearer {token}"},
json={
"asset_name": "<string>",
"confirmed": False,
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/archive", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"asset_name":"<string>","confirmed":false}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: 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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: onboarding.write
Revokes active magic links, refresh sessions, and onboarding task access 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": {
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: 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": {
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: 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": {
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: 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-10-22T20:30:00Z",
"preconditions": [
{
"key": "<string>",
"label": "<string>",
"status": "ok",
"detail": "<string>"
}
],
"can_create_session": false,
"dry_run_allowed": 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-10-22T20:30:00Z"
},
"session": {
"id": "<string>",
"onboarding_id": "<string>",
"purpose": "onboarding",
"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>"
},
"soc_energy_margin": "0.05",
"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,
"stated_products": [
"<string>"
],
"stated_capacity_mw": "<string>"
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-10-22T20:30:00Z",
"planned_end": "2026-10-22T20: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-10-22T20:30:00Z",
"end": "2026-10-22T20:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-10-22T20:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"workbooks": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-10-22T20:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-10-22T20:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z",
"confirmed_by_user_name": "<string>",
"manual_zero_offered": false,
"manual_action_required": "<string>",
"handoff_at": "2026-10-22T20:30:00Z",
"alarms": [
{
"rule_id": "TELEMETRY-001",
"severity": "INFO",
"message": "<string>",
"opened_at": "2026-10-22T20:30:00Z",
"resolved_at": "2026-10-22T20:30:00Z"
}
],
"state_of_charge": {
"key": "<string>",
"label": "<string>",
"status": "ok",
"detail": "<string>"
},
"confirmed_at": "2026-10-22T20:30:00Z",
"aborted_at": "2026-10-22T20:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-10-22T20:30:00Z",
"row_version": 0,
"created_at": "2026-10-22T20:30:00Z",
"updated_at": "2026-10-22T20:30:00Z"
},
"history_count": 0
}GET/v1/onboardings/{onboarding_id}/betriebsfahrt/sessions
Betriebsfahrt session history
onboarding.read
Required scopes: onboarding.read
The onboarding's earlier sessions, newest first, superseded and ended ones included. The session at hand is not among them: it is the status document's.
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>",
"purpose": "onboarding",
"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>"
},
"soc_energy_margin": "0.05",
"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,
"stated_products": [
"<string>"
],
"stated_capacity_mw": "<string>"
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-10-22T20:30:00Z",
"planned_end": "2026-10-22T20: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-10-22T20:30:00Z",
"end": "2026-10-22T20:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-10-22T20:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"workbooks": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-10-22T20:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-10-22T20:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z",
"confirmed_by_user_name": "<string>",
"manual_zero_offered": false,
"manual_action_required": "<string>",
"handoff_at": "2026-10-22T20:30:00Z",
"alarms": [
{
"rule_id": "TELEMETRY-001",
"severity": "INFO",
"message": "<string>",
"opened_at": "2026-10-22T20:30:00Z",
"resolved_at": "2026-10-22T20:30:00Z"
}
],
"state_of_charge": {
"key": "<string>",
"label": "<string>",
"status": "ok",
"detail": "<string>"
},
"confirmed_at": "2026-10-22T20:30:00Z",
"aborted_at": "2026-10-22T20:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-10-22T20:30:00Z",
"row_version": 0,
"created_at": "2026-10-22T20:30:00Z",
"updated_at": "2026-10-22T20:30:00Z"
}
]POST/v1/onboardings/{onboarding_id}/betriebsfahrt/sessions
Plan a Betriebsfahrt session
onboarding.write
Required scopes: 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 the run's energy plus the margin in the battery, negative (charge) that much room. 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-10-22T20: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-10-22T20: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-10-22T20:30:00Z","single_direction":false,"execution_mode":"real"}),
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"purpose": "onboarding",
"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>"
},
"soc_energy_margin": "0.05",
"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,
"stated_products": [
"<string>"
],
"stated_capacity_mw": "<string>"
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-10-22T20:30:00Z",
"planned_end": "2026-10-22T20: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-10-22T20:30:00Z",
"end": "2026-10-22T20:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-10-22T20:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"workbooks": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-10-22T20:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-10-22T20:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z",
"confirmed_by_user_name": "<string>",
"manual_zero_offered": false,
"manual_action_required": "<string>",
"handoff_at": "2026-10-22T20:30:00Z",
"alarms": [
{
"rule_id": "TELEMETRY-001",
"severity": "INFO",
"message": "<string>",
"opened_at": "2026-10-22T20:30:00Z",
"resolved_at": "2026-10-22T20:30:00Z"
}
],
"state_of_charge": {
"key": "<string>",
"label": "<string>",
"status": "ok",
"detail": "<string>"
},
"confirmed_at": "2026-10-22T20:30:00Z",
"aborted_at": "2026-10-22T20:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-10-22T20:30:00Z",
"row_version": 0,
"created_at": "2026-10-22T20:30:00Z",
"updated_at": "2026-10-22T20: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
Required scopes: 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>",
"purpose": "onboarding",
"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>"
},
"soc_energy_margin": "0.05",
"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,
"stated_products": [
"<string>"
],
"stated_capacity_mw": "<string>"
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-10-22T20:30:00Z",
"planned_end": "2026-10-22T20: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-10-22T20:30:00Z",
"end": "2026-10-22T20:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-10-22T20:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"workbooks": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-10-22T20:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-10-22T20:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z",
"confirmed_by_user_name": "<string>",
"manual_zero_offered": false,
"manual_action_required": "<string>",
"handoff_at": "2026-10-22T20:30:00Z",
"alarms": [
{
"rule_id": "TELEMETRY-001",
"severity": "INFO",
"message": "<string>",
"opened_at": "2026-10-22T20:30:00Z",
"resolved_at": "2026-10-22T20:30:00Z"
}
],
"state_of_charge": {
"key": "<string>",
"label": "<string>",
"status": "ok",
"detail": "<string>"
},
"confirmed_at": "2026-10-22T20:30:00Z",
"aborted_at": "2026-10-22T20:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-10-22T20:30:00Z",
"row_version": 0,
"created_at": "2026-10-22T20:30:00Z",
"updated_at": "2026-10-22T20:30:00Z"
}PATCH/v1/onboardings/{onboarding_id}/betriebsfahrt/sessions/{session_id}
Adjust a draft Betriebsfahrt session
onboarding.write
Required scopes: 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-10-22T20: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-10-22T20: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-10-22T20:30:00Z","execution_mode":"real","single_direction":false}),
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"purpose": "onboarding",
"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>"
},
"soc_energy_margin": "0.05",
"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,
"stated_products": [
"<string>"
],
"stated_capacity_mw": "<string>"
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-10-22T20:30:00Z",
"planned_end": "2026-10-22T20: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-10-22T20:30:00Z",
"end": "2026-10-22T20:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-10-22T20:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"workbooks": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-10-22T20:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-10-22T20:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z",
"confirmed_by_user_name": "<string>",
"manual_zero_offered": false,
"manual_action_required": "<string>",
"handoff_at": "2026-10-22T20:30:00Z",
"alarms": [
{
"rule_id": "TELEMETRY-001",
"severity": "INFO",
"message": "<string>",
"opened_at": "2026-10-22T20:30:00Z",
"resolved_at": "2026-10-22T20:30:00Z"
}
],
"state_of_charge": {
"key": "<string>",
"label": "<string>",
"status": "ok",
"detail": "<string>"
},
"confirmed_at": "2026-10-22T20:30:00Z",
"aborted_at": "2026-10-22T20:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-10-22T20:30:00Z",
"row_version": 0,
"created_at": "2026-10-22T20:30:00Z",
"updated_at": "2026-10-22T20: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
Required scopes: 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>",
"purpose": "onboarding",
"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>"
},
"soc_energy_margin": "0.05",
"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,
"stated_products": [
"<string>"
],
"stated_capacity_mw": "<string>"
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-10-22T20:30:00Z",
"planned_end": "2026-10-22T20: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-10-22T20:30:00Z",
"end": "2026-10-22T20:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-10-22T20:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"workbooks": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-10-22T20:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-10-22T20:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z",
"confirmed_by_user_name": "<string>",
"manual_zero_offered": false,
"manual_action_required": "<string>",
"handoff_at": "2026-10-22T20:30:00Z",
"alarms": [
{
"rule_id": "TELEMETRY-001",
"severity": "INFO",
"message": "<string>",
"opened_at": "2026-10-22T20:30:00Z",
"resolved_at": "2026-10-22T20:30:00Z"
}
],
"state_of_charge": {
"key": "<string>",
"label": "<string>",
"status": "ok",
"detail": "<string>"
},
"confirmed_at": "2026-10-22T20:30:00Z",
"aborted_at": "2026-10-22T20:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-10-22T20:30:00Z",
"row_version": 0,
"created_at": "2026-10-22T20:30:00Z",
"updated_at": "2026-10-22T20: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
Required scopes: 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 battery must hold the first run's energy plus the margin (positive run first) or have that much room (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>",
"purpose": "onboarding",
"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>"
},
"soc_energy_margin": "0.05",
"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,
"stated_products": [
"<string>"
],
"stated_capacity_mw": "<string>"
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-10-22T20:30:00Z",
"planned_end": "2026-10-22T20: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-10-22T20:30:00Z",
"end": "2026-10-22T20:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-10-22T20:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"workbooks": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-10-22T20:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-10-22T20:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z",
"confirmed_by_user_name": "<string>",
"manual_zero_offered": false,
"manual_action_required": "<string>",
"handoff_at": "2026-10-22T20:30:00Z",
"alarms": [
{
"rule_id": "TELEMETRY-001",
"severity": "INFO",
"message": "<string>",
"opened_at": "2026-10-22T20:30:00Z",
"resolved_at": "2026-10-22T20:30:00Z"
}
],
"state_of_charge": {
"key": "<string>",
"label": "<string>",
"status": "ok",
"detail": "<string>"
},
"confirmed_at": "2026-10-22T20:30:00Z",
"aborted_at": "2026-10-22T20:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-10-22T20:30:00Z",
"row_version": 0,
"created_at": "2026-10-22T20:30:00Z",
"updated_at": "2026-10-22T20: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
Required scopes: 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>",
"purpose": "onboarding",
"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>"
},
"soc_energy_margin": "0.05",
"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,
"stated_products": [
"<string>"
],
"stated_capacity_mw": "<string>"
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-10-22T20:30:00Z",
"planned_end": "2026-10-22T20: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-10-22T20:30:00Z",
"end": "2026-10-22T20:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-10-22T20:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"workbooks": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-10-22T20:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-10-22T20:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z",
"confirmed_by_user_name": "<string>",
"manual_zero_offered": false,
"manual_action_required": "<string>",
"handoff_at": "2026-10-22T20:30:00Z",
"alarms": [
{
"rule_id": "TELEMETRY-001",
"severity": "INFO",
"message": "<string>",
"opened_at": "2026-10-22T20:30:00Z",
"resolved_at": "2026-10-22T20:30:00Z"
}
],
"state_of_charge": {
"key": "<string>",
"label": "<string>",
"status": "ok",
"detail": "<string>"
},
"confirmed_at": "2026-10-22T20:30:00Z",
"aborted_at": "2026-10-22T20:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-10-22T20:30:00Z",
"row_version": 0,
"created_at": "2026-10-22T20:30:00Z",
"updated_at": "2026-10-22T20: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
Required scopes: 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-10-22T20: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-10-22T20: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-10-22T20:30:00Z"}),
});
const data = await res.json();{
"id": "<string>",
"onboarding_id": "<string>",
"purpose": "onboarding",
"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>"
},
"soc_energy_margin": "0.05",
"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,
"stated_products": [
"<string>"
],
"stated_capacity_mw": "<string>"
},
"findings": [
{
"code": "<string>",
"severity": "blocker",
"message": "<string>"
}
],
"planned_start": "2026-10-22T20:30:00Z",
"planned_end": "2026-10-22T20: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-10-22T20:30:00Z",
"end": "2026-10-22T20:30:00Z",
"setpoint_mw": "<string>",
"window_id": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"status": "pending",
"follow_checks": [
{
"phase_index": 0,
"checked_at": "2026-10-22T20:30:00Z",
"expected_mw": "<string>",
"measured_mw": "<string>",
"passed": false,
"detail": "<string>"
}
],
"proofs": "<string>",
"workbooks": "<string>",
"uploads": "<string>",
"verdicts": "<string>",
"overrides": [
{
"product": "<string>",
"reason": "<string>",
"by_user_id": "<string>",
"by_user_name": "<string>",
"at": "2026-10-22T20:30:00Z"
}
],
"error": "<string>",
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z"
}
],
"driver": {
"request_id": "<string>",
"run_id": "<string>",
"status": "<string>",
"journal_written_at": "2026-10-22T20:30:00Z",
"tracking_source": "<string>",
"events": [
"<string>"
]
},
"progress": {
"current_run_index": 0,
"current_phase_index": 0,
"confidence": "confirmed",
"remaining_seconds": 0
},
"actual_start": "2026-10-22T20:30:00Z",
"actual_end": "2026-10-22T20:30:00Z",
"confirmed_by_user_name": "<string>",
"manual_zero_offered": false,
"manual_action_required": "<string>",
"handoff_at": "2026-10-22T20:30:00Z",
"alarms": [
{
"rule_id": "TELEMETRY-001",
"severity": "INFO",
"message": "<string>",
"opened_at": "2026-10-22T20:30:00Z",
"resolved_at": "2026-10-22T20:30:00Z"
}
],
"state_of_charge": {
"key": "<string>",
"label": "<string>",
"status": "ok",
"detail": "<string>"
},
"confirmed_at": "2026-10-22T20:30:00Z",
"aborted_at": "2026-10-22T20:30:00Z",
"abort_reason": "<string>",
"last_error": "<string>",
"last_error_at": "2026-10-22T20:30:00Z",
"row_version": 0,
"created_at": "2026-10-22T20:30:00Z",
"updated_at": "2026-10-22T20:30:00Z"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboardings/{onboarding_id}/documents/{document_id}
File a document under another requirement
onboarding.write
Required scopes: onboarding.write
Files an uploaded document under the requirement it satisfies, e.g. a supplier confirmation uploaded without its key, without uploading it again. Its type, gate and filename prefix follow the requirement and an earlier accept/reject verdict is withdrawn. It keeps its upload time: the newest upload of a requirement is the one that counts, so a re-filed older file counts once newer copies are rejected or removed. null unassigns it. EBX only; refused while the PQ application's inputs are frozen and for the proof workbook of a Betriebsfahrt run.
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.
Request body · required
- requirement_keyREQUIRED
- stringThe requirement to file the document under, or null to unassign it.
curl -X PATCH "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"requirement_key":"<string>"}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000",
headers={"Authorization": f"Bearer {token}"},
json={
"requirement_key": "<string>",
},
)
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: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"requirement_key":"<string>"}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}- 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
Required scopes: onboarding.write
Soft-deletes document metadata so the document no longer appears on the onboarding or receives download URLs. The stored file is not deleted immediately.
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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: onboarding.read
Returns a short-lived presigned HTTP GET download URL for an available, non-deleted onboarding document. The API does not proxy document bytes. The URL serves the document as an attachment under its original filename, or inline for preview with inline=true.
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.
Query parameters
- inline
- booleandefault falseServe the document for in-browser preview instead of as an attachment. Only PDF, PNG, JPEG and WebP documents can be previewed; any other type returns 409.
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>"
}- 401no valid token
- 403scope missing
- 404unknown or not visible
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/documents/{document_id}/finalize
Finalize an uploaded document
onboarding.write
Required scopes: onboarding.write
Marks a pending document upload as available after the client has uploaded bytes to the presigned upload 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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 429rate limited
POST/v1/onboardings/{onboarding_id}/documents/{document_id}/review
Accept or reject a document
onboarding.write
Required scopes: onboarding.write
Records EBX's verdict on one uploaded copy. A rejected copy no longer counts for its requirement anywhere: the Documents tab, the PQ readiness check and the PQ submission use the newest copy that is not rejected, or report the requirement as missing. An accepted copy can only be removed by EBX. A new upload starts unreviewed. status: null withdraws the verdict. A copy cannot be accepted while its upload link could still replace it (20 minutes after the upload started), and the last valid copy of a passed gate's required document cannot be rejected until the gate is reopened. EBX only.
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.
Request body · required
- statusREQUIRED
- enum
acceptedrejectedaccepted,rejected, or null to withdraw the verdict. - note
- stringWhy, e.g. what to fix; shown with a rejected document.
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000/review" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status":"accepted","note":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000/review",
headers={"Authorization": f"Bearer {token}"},
json={
"status": "accepted",
"note": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/documents/00000000-0000-0000-0000-000000000000/review", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"status":"accepted","note":"<string>"}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/documents/presigned-upload
Create a document upload URL
onboarding.write
Required scopes: onboarding.write
Creates pending document metadata and returns a short-lived presigned upload URL for HTTP PUT. Clients upload the file bytes directly to that URL, 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
- requirement_key
- stringThe requirement the file satisfies, e.g.
contractor_confirmation. The file is then filed under that requirement's gate whatevergate_definition_idsays. Without it the requirement is derived from the type and therfi-<key>__/pq-evidence-<slot>__filename prefix, or the file stays unassigned.
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>","requirement_key":"<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>",
"requirement_key": "<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>","requirement_key":"<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
Required scopes: 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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: 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
Required scopes: 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
Required scopes: 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
Required scopes: 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
- category
- enum
grid_dsohardware_siteems_data_pointscommercial_contractpq_tsoother - waiting_on
- enum
asset_ownerepcems_providerebxentrixtso
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>","category":"grid_dso","waiting_on":"asset_owner"}'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>",
"category": "grid_dso",
"waiting_on": "asset_owner",
},
)
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>","category":"grid_dso","waiting_on":"asset_owner"}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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}/confirm-in-place
Confirm a skipped gate is in place
onboarding.write
Required scopes: onboarding.write
EBX only. On a transition onboarding, records who confirmed that a gate skipped at creation (hardware, software, monitoring test) is already in place for the running asset, with an activity entry. The gate stays skipped; the workflow does not change. A gate is confirmed once.
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
- stringOptional note, e.g. what was checked.
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/gates/mon_rfi/confirm-in-place" \
-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/confirm-in-place",
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/confirm-in-place", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"note":"<string>"}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: 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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: 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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: 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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: 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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: onboarding.write
Adds an EBX-internal open point with the party that owns it, a topic category, and an optional due date. It can be linked to a gate, RfI field, or DPL row and carry a first comment.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- titleREQUIRED
- string
- ownerREQUIRED
- enum
asset_ownerepcems_providerebxentrixtsoThe party that has to act on an open point. A party, not a person: there is no per-user assignment. - categoryREQUIRED
- enum
grid_dsohardware_siteems_data_pointscommercial_contractpq_tsootherA fixed topic list, so recurring issues and how they were decided can be analysed across onboardings. - due_date
- string<date>
- 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>","owner":"asset_owner","category":"grid_dso","due_date":"2026-01-01","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>",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"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>","owner":"asset_owner","category":"grid_dso","due_date":"2026-01-01","ref":{"kind":"<string>","gate_definition_id":"mon_rfi"},"body":"<string>"}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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}
Update, resolve, or reopen an internal tracker open point
onboarding.write
Required scopes: onboarding.write
Partial update: only the fields in the body change. Resolving requires a one-line decision and records an internal activity entry; reopening clears the decision.
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
- status
- enum
openresolved - decision
- string
- title
- string
- owner
- enum
asset_ownerepcems_providerebxentrixtso - category
- enum
grid_dsohardware_siteems_data_pointscommercial_contractpq_tsoother - due_date
- string<date>
- visibility
- enum
internalshared
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","decision":"<string>","title":"<string>","owner":"asset_owner","category":"grid_dso","due_date":"2026-01-01","visibility":"internal"}'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",
"decision": "<string>",
"title": "<string>",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"visibility": "internal",
},
)
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","decision":"<string>","title":"<string>","owner":"asset_owner","category":"grid_dso","due_date":"2026-01-01","visibility":"internal"}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: onboarding.write
Appends an EBX comment to an open point. On a shared point the comment is part of the thread the asset owner reads and replies to. 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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: onboarding.write
Adds an EBX-internal task to the onboarding's internal tracker. Tasks are never shared: they are not included in the external /onboarding-tasks responses, and onboarding responses return internal_tracker to 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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: 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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/notes
Add a note to an onboarding
onboarding.write
Required scopes: onboarding.write
Appends a free-text note for information outside the standard process. Only EBX users can add notes, and each note starts internal. A note EBX shares appears to the asset owner in notes on onboarding responses and in shared_notes on their onboarding task detail.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- bodyREQUIRED
- string
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/notes" \
-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/notes",
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/notes", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"body":"<string>"}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/onboardings/{onboarding_id}/notes/{note_id}
Share a note with the asset owner, or take it back
onboarding.write
Required scopes: onboarding.write
Sets a note's visibility. A shared note appears on the asset owner's onboarding page and task page; the change is recorded in the activity log without the note text. EBX-only.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- note_idREQUIRED
- string<uuid>Note identifier from the onboarding response.
Request body · required
- visibilityREQUIRED
- enum
internalsharedWho reads a note or an open point:internalis read by EBX,sharedby EBX and the asset owner. Notes and open points startinternal, and EBX shares them individually.
curl -X PATCH "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/notes/00000000-0000-0000-0000-000000000000" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"visibility":"internal"}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/notes/00000000-0000-0000-0000-000000000000",
headers={"Authorization": f"Bearer {token}"},
json={
"visibility": "internal",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/notes/00000000-0000-0000-0000-000000000000", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"visibility":"internal"}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: 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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: 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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: onboarding.write
Revokes active magic links, refresh sessions, and onboarding task access 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": {
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: 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": {
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: 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": {
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
},
"revoked_link_count": 0,
"revoked_session_count": 0
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 429rate limited
GET/v1/onboardings/{onboarding_id}/pq-official/anb
Get Anb
onboarding.read
Required scopes: onboarding.read
Path parameters
- onboarding_idREQUIRED
- string<uuid>
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/anb" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/anb",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/anb", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{}POST/v1/onboardings/{onboarding_id}/pq-official/anb/{confirmation_id}/recall
Recall Anb
onboarding.write
Required scopes: onboarding.write
Path parameters
- onboarding_idREQUIRED
- string<uuid>
- confirmation_idREQUIRED
- string<uuid>
Request body · required
- confirm_recallREQUIRED
- boolean
- asset_name_confirmationREQUIRED
- string
- reasonREQUIRED
- string
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/anb/00000000-0000-0000-0000-000000000000/recall" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"confirm_recall":false,"asset_name_confirmation":"<string>","reason":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/anb/00000000-0000-0000-0000-000000000000/recall",
headers={"Authorization": f"Bearer {token}"},
json={
"confirm_recall": False,
"asset_name_confirmation": "<string>",
"reason": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/anb/00000000-0000-0000-0000-000000000000/recall", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"confirm_recall":false,"asset_name_confirmation":"<string>","reason":"<string>"}),
});
const data = await res.json();{}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboardings/{onboarding_id}/pq-official/connection
Get Connection
onboarding.read
Required scopes: onboarding.read
Path parameters
- onboarding_idREQUIRED
- string<uuid>
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/connection" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/connection",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/connection", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{}GET/v1/onboardings/{onboarding_id}/pq-official/contracts
Get Contracts
onboarding.read
Required scopes: onboarding.read
Path parameters
- onboarding_idREQUIRED
- string<uuid>
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/contracts" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/contracts",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/contracts", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"portal_env": "training",
"refreshed_at": "2026-01-01T00:00:00Z",
"reserve_unit_id": "<string>",
"requirements": [
{
"reserve_type": "FrequencyContainmentReserve",
"selected_contract_id": "<string>",
"options": [
{
"id": "<string>",
"number": "<string>",
"state": "Planned",
"selectable": false,
"portal_url": "<string>",
"proofs": [
{
"id": "<string>",
"name": "<string>",
"state": "Planned",
"version": 0
}
]
}
],
"status": "unselected",
"checked_at": "2026-01-01T00:00:00Z"
}
],
"error": "<string>"
}PUT/v1/onboardings/{onboarding_id}/pq-official/contracts/{reserve_type}
Select Contract
onboarding.write
Required scopes: onboarding.write
Path parameters
- onboarding_idREQUIRED
- string<uuid>
- reserve_typeREQUIRED
- enum
FrequencyContainmentReserveAutomaticFrequencyRestorationReserveManualFrequencyRestorationReserveInertiaReserve
Request body · required
- contract_idREQUIRED
- string<uuid>
curl -X PUT "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/contracts/FrequencyContainmentReserve" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"contract_id":"00000000-0000-0000-0000-000000000000"}'import httpx
r = httpx.put(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/contracts/FrequencyContainmentReserve",
headers={"Authorization": f"Bearer {token}"},
json={
"contract_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-official/contracts/FrequencyContainmentReserve", {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"contract_id":"00000000-0000-0000-0000-000000000000"}),
});
const data = await res.json();{
"portal_env": "training",
"refreshed_at": "2026-01-01T00:00:00Z",
"reserve_unit_id": "<string>",
"requirements": [
{
"reserve_type": "FrequencyContainmentReserve",
"selected_contract_id": "<string>",
"options": [
{
"id": "<string>",
"number": "<string>",
"state": "Planned",
"selectable": false,
"portal_url": "<string>",
"proofs": [
{
"id": "<string>",
"name": "<string>",
"state": "Planned",
"version": 0
}
]
}
],
"status": "unselected",
"checked_at": "2026-01-01T00:00:00Z"
}
],
"error": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/pq-official/contracts/refresh
Refresh Contracts
onboarding.write
Required scopes: onboarding.write
Path parameters
- onboarding_idREQUIRED
- string<uuid>
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/contracts/refresh" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/contracts/refresh",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/contracts/refresh", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"portal_env": "training",
"refreshed_at": "2026-01-01T00:00:00Z",
"reserve_unit_id": "<string>",
"requirements": [
{
"reserve_type": "FrequencyContainmentReserve",
"selected_contract_id": "<string>",
"options": [
{
"id": "<string>",
"number": "<string>",
"state": "Planned",
"selectable": false,
"portal_url": "<string>",
"proofs": [
{
"id": "<string>",
"name": "<string>",
"state": "Planned",
"version": 0
}
]
}
],
"status": "unselected",
"checked_at": "2026-01-01T00:00:00Z"
}
],
"error": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 429rate limited
GET/v1/onboardings/{onboarding_id}/pq-official/status
Get Application Status
onboarding.read
Required scopes: onboarding.read
Path parameters
- onboarding_idREQUIRED
- string<uuid>
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/status" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/status",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/status", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{}POST/v1/onboardings/{onboarding_id}/pq-official/sync
Sync Official
onboarding.write
Required scopes: onboarding.write
Path parameters
- onboarding_idREQUIRED
- string<uuid>
Request body · required
- review_idREQUIRED
- string<uuid>
- scopeREQUIRED
- enum
dataevidence - confirm_hierarchy_repair
- booleandefault false
- confirm_resource_recreation
- booleandefault false
- signoff_reason
- string
- confirm_anb_requests
- booleandefault false
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/sync" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"review_id":"00000000-0000-0000-0000-000000000000","scope":"data","confirm_hierarchy_repair":false,"confirm_resource_recreation":false,"signoff_reason":"<string>","confirm_anb_requests":false}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/sync",
headers={"Authorization": f"Bearer {token}"},
json={
"review_id": "00000000-0000-0000-0000-000000000000",
"scope": "data",
"confirm_hierarchy_repair": False,
"confirm_resource_recreation": False,
"signoff_reason": "<string>",
"confirm_anb_requests": False,
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/sync", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"review_id":"00000000-0000-0000-0000-000000000000","scope":"data","confirm_hierarchy_repair":false,"confirm_resource_recreation":false,"signoff_reason":"<string>","confirm_anb_requests":false}),
});
const data = await res.json();{
"input_issues": [
"<string>"
],
"id": "00000000-0000-0000-0000-000000000000",
"status": "queued",
"stage": "<string>",
"stale": false,
"evidence_current": false,
"started_at": "2026-01-01T00:00:00Z",
"finished_at": "2026-01-01T00:00:00Z",
"last_sync_requested_at": "2026-01-01T00:00:00Z",
"last_synced_at": "2026-01-01T00:00:00Z",
"slot": "<string>",
"document_id": "00000000-0000-0000-0000-000000000000",
"scope": "data",
"result": "<string>",
"error": "<string>",
"pending_curves": [
"<string>"
],
"curve_failures": [
"<string>"
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/pq-official/sync-review
Review Sync
onboarding.write
Required scopes: onboarding.write
Path parameters
- onboarding_idREQUIRED
- string<uuid>
Query parameters
- scope
- enumdefault evidence
dataevidenceThe official sync this comparison prepares; a data comparison does not read the evidence files.
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/sync-review" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/sync-review",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/sync-review", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"input_issues": [
"<string>"
],
"id": "00000000-0000-0000-0000-000000000000",
"status": "queued",
"result": {
"input_issues": [
"<string>"
],
"official_check": "<string>",
"training_check": "<string>",
"id": "00000000-0000-0000-0000-000000000000",
"first_sync": false,
"expires_at": "2026-01-01T00:00:00Z",
"changes": [
"<string>"
],
"blockers": [
"<string>"
],
"missing_fields": [
"<string>"
],
"manual_follow_ups": [
"<string>"
],
"hierarchy_repair": "reconnect",
"resource_recovery": {
"missing_resources": "<string>"
},
"dso": "<string>",
"anb": {
"will_request": false,
"dso_id": "<string>",
"dso_name": "<string>",
"previous_dso_name": "<string>",
"dso_changes": false,
"reserves": [
{
"product": "<string>",
"reserve_type": "<string>",
"reserve_direction": "<string>",
"state": "<string>",
"selected": true,
"will_request": false
}
]
}
},
"error": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboardings/{onboarding_id}/pq-official/sync-review/{job_id}
Get Review
onboarding.read
Required scopes: onboarding.read
Path parameters
- onboarding_idREQUIRED
- string<uuid>
- job_idREQUIRED
- string<uuid>
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/sync-review/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/pq-official/sync-review/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/pq-official/sync-review/00000000-0000-0000-0000-000000000000", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"input_issues": [
"<string>"
],
"id": "00000000-0000-0000-0000-000000000000",
"status": "queued",
"result": {
"input_issues": [
"<string>"
],
"official_check": "<string>",
"training_check": "<string>",
"id": "00000000-0000-0000-0000-000000000000",
"first_sync": false,
"expires_at": "2026-01-01T00:00:00Z",
"changes": [
"<string>"
],
"blockers": [
"<string>"
],
"missing_fields": [
"<string>"
],
"manual_follow_ups": [
"<string>"
],
"hierarchy_repair": "reconnect",
"resource_recovery": {
"missing_resources": "<string>"
},
"dso": "<string>",
"anb": {
"will_request": false,
"dso_id": "<string>",
"dso_name": "<string>",
"previous_dso_name": "<string>",
"dso_changes": false,
"reserves": [
{
"product": "<string>",
"reserve_type": "<string>",
"reserve_direction": "<string>",
"state": "<string>",
"selected": true,
"will_request": false
}
]
}
},
"error": "<string>"
}PUT/v1/onboardings/{onboarding_id}/pq-official/target
Set Target
onboarding.write
Required scopes: onboarding.write
Path parameters
- onboarding_idREQUIRED
- string<uuid>
Request body · required
- technical_unit_idREQUIRED
- string<uuid>
- reserve_unit_idREQUIRED
- string<uuid>
curl -X PUT "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/target" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"technical_unit_id":"00000000-0000-0000-0000-000000000000","reserve_unit_id":"00000000-0000-0000-0000-000000000000"}'import httpx
r = httpx.put(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/target",
headers={"Authorization": f"Bearer {token}"},
json={
"technical_unit_id": "00000000-0000-0000-0000-000000000000",
"reserve_unit_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-official/target", {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"technical_unit_id":"00000000-0000-0000-0000-000000000000","reserve_unit_id":"00000000-0000-0000-0000-000000000000"}),
});
const data = await res.json();{}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboardings/{onboarding_id}/pq-official/targets
Get Targets
onboarding.read
Required scopes: onboarding.read
Path parameters
- onboarding_idREQUIRED
- string<uuid>
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/targets" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/targets",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/targets", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{}GET/v1/onboardings/{onboarding_id}/pq-official/workspace
Get Workspace
onboarding.read
Required scopes: onboarding.read
Path parameters
- onboarding_idREQUIRED
- string<uuid>
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/workspace" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/workspace",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-official/workspace", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{}POST/v1/onboardings/{onboarding_id}/pq-proofs
Generate the PQ Portal proof workbook for a Betriebsfahrt run
onboarding.write
Required scopes: 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-10-22T20:30:00Z",
"end": "2026-10-22T20:30:00Z",
"operating_point_mw": "0",
"requested_capacity_mw": "<string>",
"setpoint_schedule": [
{
"start": "2026-10-22T20:30:00Z",
"end": "2026-10-22T20: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
Required scopes: 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-10-22T20:30:00Z",
"end": "2026-10-22T20:30:00Z",
"operating_point_mw": "0",
"requested_capacity_mw": "<string>",
"setpoint_schedule": [
{
"start": "2026-10-22T20:30:00Z",
"end": "2026-10-22T20: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
POST/v1/onboardings/{onboarding_id}/pq-proofs/import
Create a Betriebsfahrt run from an uploaded workbook
onboarding.write
Required scopes: onboarding.write
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
Request body · required
- document_idREQUIRED
- string<uuid>
- productREQUIRED
- enum
fcrafrrmfrr - direction
- enum
positivenegative
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-proofs/import" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"document_id":"00000000-0000-0000-0000-000000000000","product":"fcr","direction":"positive"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-proofs/import",
headers={"Authorization": f"Bearer {token}"},
json={
"document_id": "00000000-0000-0000-0000-000000000000",
"product": "fcr",
"direction": "positive",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-proofs/import", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"document_id":"00000000-0000-0000-0000-000000000000","product":"fcr","direction":"positive"}),
});
const data = await res.json();{
"run_index": 0,
"run": {
"product": "fcr",
"direction": "positive",
"start": "2026-10-22T20:30:00Z",
"end": "2026-10-22T20:30:00Z",
"operating_point_mw": "0",
"requested_capacity_mw": "<string>",
"setpoint_schedule": [
{
"start": "2026-10-22T20:30:00Z",
"end": "2026-10-22T20: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
Required scopes: 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>",
"reserve_unit_concept_name": "<string>",
"products": [
"<string>"
],
"power_caps_mw": "<string>",
"delivery_duration_caps_hours": "<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
Required scopes: 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
Required scopes: 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
Required scopes: 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>",
"reserve_unit_concept_name": "<string>",
"products": [
"<string>"
],
"power_caps_mw": "<string>",
"delivery_duration_caps_hours": "<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
Required scopes: 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, reads the digital DSO confirmations without requesting them, uploads the proof workbooks, waits for the portal's analysis, sets the requested values and reads the portal's evaluation. ANB requests require an explicit engineer action in the PQ portal. 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>",
"reserve_unit_concept_name": "<string>",
"products": [
"<string>"
],
"power_caps_mw": "<string>",
"delivery_duration_caps_hours": "<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
Required scopes: 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
- reserve_unit_concept_name
- string
- products
- array[string]
- power_caps_mw
- object
- delivery_duration_caps_hours
- 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>","reserve_unit_concept_name":"<string>","products":["<string>"],"power_caps_mw":"<string>","delivery_duration_caps_hours":"<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>",
"reserve_unit_concept_name": "<string>",
"products": [
"<string>",
],
"power_caps_mw": "<string>",
"delivery_duration_caps_hours": "<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>","reserve_unit_concept_name":"<string>","products":["<string>"],"power_caps_mw":"<string>","delivery_duration_caps_hours":"<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>",
"reserve_unit_concept_name": "<string>",
"products": [
"<string>"
],
"power_caps_mw": "<string>",
"delivery_duration_caps_hours": "<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
Required scopes: 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
Required scopes: 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>",
"reserve_unit_concept_name": "<string>",
"products": [
"<string>"
],
"power_caps_mw": "<string>",
"delivery_duration_caps_hours": "<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
Required scopes: 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>",
"reserve_unit_concept_name": "<string>",
"products": [
"<string>"
],
"power_caps_mw": "<string>",
"delivery_duration_caps_hours": "<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
Required scopes: 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>",
"reserve_unit_concept_name": "<string>",
"products": [
"<string>"
],
"power_caps_mw": "<string>",
"delivery_duration_caps_hours": "<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-training/connection
Get Connection
onboarding.read
Required scopes: onboarding.read
Path parameters
- onboarding_idREQUIRED
- string<uuid>
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/connection" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/connection",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/connection", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{}GET/v1/onboardings/{onboarding_id}/pq-training/contracts
Get Contracts
onboarding.read
Required scopes: onboarding.read
Path parameters
- onboarding_idREQUIRED
- string<uuid>
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/contracts" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/contracts",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/contracts", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"portal_env": "training",
"refreshed_at": "2026-01-01T00:00:00Z",
"reserve_unit_id": "<string>",
"requirements": [
{
"reserve_type": "FrequencyContainmentReserve",
"selected_contract_id": "<string>",
"options": [
{
"id": "<string>",
"number": "<string>",
"state": "Planned",
"selectable": false,
"portal_url": "<string>",
"proofs": [
{
"id": "<string>",
"name": "<string>",
"state": "Planned",
"version": 0
}
]
}
],
"status": "unselected",
"checked_at": "2026-01-01T00:00:00Z"
}
],
"error": "<string>"
}PUT/v1/onboardings/{onboarding_id}/pq-training/contracts/{reserve_type}
Select Contract
onboarding.write
Required scopes: onboarding.write
Path parameters
- onboarding_idREQUIRED
- string<uuid>
- reserve_typeREQUIRED
- enum
FrequencyContainmentReserveAutomaticFrequencyRestorationReserveManualFrequencyRestorationReserveInertiaReserve
Request body · required
- contract_idREQUIRED
- string<uuid>
curl -X PUT "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/contracts/FrequencyContainmentReserve" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"contract_id":"00000000-0000-0000-0000-000000000000"}'import httpx
r = httpx.put(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/contracts/FrequencyContainmentReserve",
headers={"Authorization": f"Bearer {token}"},
json={
"contract_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-training/contracts/FrequencyContainmentReserve", {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"contract_id":"00000000-0000-0000-0000-000000000000"}),
});
const data = await res.json();{
"portal_env": "training",
"refreshed_at": "2026-01-01T00:00:00Z",
"reserve_unit_id": "<string>",
"requirements": [
{
"reserve_type": "FrequencyContainmentReserve",
"selected_contract_id": "<string>",
"options": [
{
"id": "<string>",
"number": "<string>",
"state": "Planned",
"selectable": false,
"portal_url": "<string>",
"proofs": [
{
"id": "<string>",
"name": "<string>",
"state": "Planned",
"version": 0
}
]
}
],
"status": "unselected",
"checked_at": "2026-01-01T00:00:00Z"
}
],
"error": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/pq-training/contracts/refresh
Refresh Contracts
onboarding.write
Required scopes: onboarding.write
Path parameters
- onboarding_idREQUIRED
- string<uuid>
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/contracts/refresh" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/contracts/refresh",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/contracts/refresh", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"portal_env": "training",
"refreshed_at": "2026-01-01T00:00:00Z",
"reserve_unit_id": "<string>",
"requirements": [
{
"reserve_type": "FrequencyContainmentReserve",
"selected_contract_id": "<string>",
"options": [
{
"id": "<string>",
"number": "<string>",
"state": "Planned",
"selectable": false,
"portal_url": "<string>",
"proofs": [
{
"id": "<string>",
"name": "<string>",
"state": "Planned",
"version": 0
}
]
}
],
"status": "unselected",
"checked_at": "2026-01-01T00:00:00Z"
}
],
"error": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 429rate limited
GET/v1/onboardings/{onboarding_id}/pq-training/evidence/{slot}/analysis
Get Analysis
onboarding.read
Required scopes: onboarding.read
Path parameters
- onboarding_idREQUIRED
- string<uuid>
- slotREQUIRED
- string
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/evidence/fcr-positive/analysis" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/evidence/fcr-positive/analysis",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/evidence/fcr-positive/analysis", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"slot": "<string>",
"document_id": "00000000-0000-0000-0000-000000000000",
"portal_version_id": "<string>",
"analysis": "<string>",
"chart": "<string>",
"chart_error": "<string>"
}POST/v1/onboardings/{onboarding_id}/pq-training/evidence/{slot}/tests
Start Curve
onboarding.write
Required scopes: onboarding.write
Path parameters
- onboarding_idREQUIRED
- string<uuid>
- slotREQUIRED
- string
Query parameters
- document_idREQUIRED
- string<uuid>
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/evidence/fcr-positive/tests?document_id=00000000-0000-0000-0000-000000000000" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/evidence/fcr-positive/tests?document_id=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/pq-training/evidence/fcr-positive/tests?document_id=00000000-0000-0000-0000-000000000000", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"input_issues": [
"<string>"
],
"id": "00000000-0000-0000-0000-000000000000",
"status": "queued",
"stage": "<string>",
"stale": false,
"evidence_current": false,
"started_at": "2026-01-01T00:00:00Z",
"finished_at": "2026-01-01T00:00:00Z",
"last_sync_requested_at": "2026-01-01T00:00:00Z",
"last_synced_at": "2026-01-01T00:00:00Z",
"slot": "<string>",
"document_id": "00000000-0000-0000-0000-000000000000",
"scope": "data",
"result": "<string>",
"error": "<string>",
"pending_curves": [
"<string>"
],
"curve_failures": [
"<string>"
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/pq-training/sync-review
Review Sync
onboarding.write
Required scopes: onboarding.write
Path parameters
- onboarding_idREQUIRED
- string<uuid>
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/sync-review" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/sync-review",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/sync-review", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"input_issues": [
"<string>"
],
"id": "00000000-0000-0000-0000-000000000000",
"status": "queued",
"result": {
"input_issues": [
"<string>"
],
"official_check": "<string>",
"training_check": "<string>",
"id": "00000000-0000-0000-0000-000000000000",
"first_sync": false,
"expires_at": "2026-01-01T00:00:00Z",
"changes": [
"<string>"
],
"blockers": [
"<string>"
],
"missing_fields": [
"<string>"
],
"manual_follow_ups": [
"<string>"
],
"hierarchy_repair": "reconnect",
"resource_recovery": {
"missing_resources": "<string>"
},
"dso": "<string>",
"anb": {
"will_request": false,
"dso_id": "<string>",
"dso_name": "<string>",
"previous_dso_name": "<string>",
"dso_changes": false,
"reserves": [
{
"product": "<string>",
"reserve_type": "<string>",
"reserve_direction": "<string>",
"state": "<string>",
"selected": true,
"will_request": false
}
]
}
},
"error": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 429rate limited
GET/v1/onboardings/{onboarding_id}/pq-training/sync-review/{job_id}
Get Review
onboarding.read
Required scopes: onboarding.read
Path parameters
- onboarding_idREQUIRED
- string<uuid>
- job_idREQUIRED
- string<uuid>
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/sync-review/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/pq-training/sync-review/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/pq-training/sync-review/00000000-0000-0000-0000-000000000000", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"input_issues": [
"<string>"
],
"id": "00000000-0000-0000-0000-000000000000",
"status": "queued",
"result": {
"input_issues": [
"<string>"
],
"official_check": "<string>",
"training_check": "<string>",
"id": "00000000-0000-0000-0000-000000000000",
"first_sync": false,
"expires_at": "2026-01-01T00:00:00Z",
"changes": [
"<string>"
],
"blockers": [
"<string>"
],
"missing_fields": [
"<string>"
],
"manual_follow_ups": [
"<string>"
],
"hierarchy_repair": "reconnect",
"resource_recovery": {
"missing_resources": "<string>"
},
"dso": "<string>",
"anb": {
"will_request": false,
"dso_id": "<string>",
"dso_name": "<string>",
"previous_dso_name": "<string>",
"dso_changes": false,
"reserves": [
{
"product": "<string>",
"reserve_type": "<string>",
"reserve_direction": "<string>",
"state": "<string>",
"selected": true,
"will_request": false
}
]
}
},
"error": "<string>"
}PATCH/v1/onboardings/{onboarding_id}/pq-training/sync-review/{review_id}/inputs
Save Inputs
onboarding.write
Required scopes: onboarding.write
Path parameters
- onboarding_idREQUIRED
- string<uuid>
- review_idREQUIRED
- string<uuid>
Request body · required
- fieldsREQUIRED
- object
curl -X PATCH "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/sync-review/00000000-0000-0000-0000-000000000000/inputs" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"fields":"<string>"}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/sync-review/00000000-0000-0000-0000-000000000000/inputs",
headers={"Authorization": f"Bearer {token}"},
json={
"fields": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/sync-review/00000000-0000-0000-0000-000000000000/inputs", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"fields":"<string>"}),
});
const data = await res.json();{
"review": {
"input_issues": [
"<string>"
],
"official_check": "<string>",
"training_check": "<string>",
"id": "00000000-0000-0000-0000-000000000000",
"first_sync": false,
"expires_at": "2026-01-01T00:00:00Z",
"changes": [
"<string>"
],
"blockers": [
"<string>"
],
"missing_fields": [
"<string>"
],
"manual_follow_ups": [
"<string>"
],
"hierarchy_repair": "reconnect",
"resource_recovery": {
"missing_resources": "<string>"
},
"dso": "<string>",
"anb": {
"will_request": false,
"dso_id": "<string>",
"dso_name": "<string>",
"previous_dso_name": "<string>",
"dso_changes": false,
"reserves": [
{
"product": "<string>",
"reserve_type": "<string>",
"reserve_direction": "<string>",
"state": "<string>",
"selected": true,
"will_request": false
}
]
}
},
"onboarding": {
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_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-training/tests
Get Test
onboarding.read
Required scopes: onboarding.read
Path parameters
- onboarding_idREQUIRED
- string<uuid>
Query parameters
- refresh_evaluations
- booleandefault true
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/tests" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/tests",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/tests", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"input_issues": [
"<string>"
],
"id": "00000000-0000-0000-0000-000000000000",
"status": "queued",
"stage": "<string>",
"stale": false,
"evidence_current": false,
"started_at": "2026-01-01T00:00:00Z",
"finished_at": "2026-01-01T00:00:00Z",
"last_sync_requested_at": "2026-01-01T00:00:00Z",
"last_synced_at": "2026-01-01T00:00:00Z",
"slot": "<string>",
"document_id": "00000000-0000-0000-0000-000000000000",
"scope": "data",
"result": "<string>",
"error": "<string>",
"pending_curves": [
"<string>"
],
"curve_failures": [
"<string>"
]
}- 401no valid token
- 403scope missing
- 404unknown or not visible
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/pq-training/tests
Start Test
onboarding.write
Required scopes: onboarding.write
Path parameters
- onboarding_idREQUIRED
- string<uuid>
Query parameters
- review_idREQUIRED
- string<uuid>
- allow_hierarchy_repair
- booleandefault false
- allow_resource_recreation
- booleandefault false
curl -X POST "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/tests?review_id=00000000-0000-0000-0000-000000000000" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.post(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/tests?review_id=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/pq-training/tests?review_id=00000000-0000-0000-0000-000000000000", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"input_issues": [
"<string>"
],
"id": "00000000-0000-0000-0000-000000000000",
"status": "queued",
"stage": "<string>",
"stale": false,
"evidence_current": false,
"started_at": "2026-01-01T00:00:00Z",
"finished_at": "2026-01-01T00:00:00Z",
"last_sync_requested_at": "2026-01-01T00:00:00Z",
"last_synced_at": "2026-01-01T00:00:00Z",
"slot": "<string>",
"document_id": "00000000-0000-0000-0000-000000000000",
"scope": "data",
"result": "<string>",
"error": "<string>",
"pending_curves": [
"<string>"
],
"curve_failures": [
"<string>"
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboardings/{onboarding_id}/pq-training/workspace
Get Workspace
onboarding.read
Required scopes: onboarding.read
Path parameters
- onboarding_idREQUIRED
- string<uuid>
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/workspace" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/workspace",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/pq-training/workspace", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"profile": {
"balance_group_responsible_name": "<string>",
"balance_group_eic_x": "<string>",
"contractor_name": "<string>",
"connection_type_control_system_name": "<string>",
"reserve_unit_concept_name": "<string>",
"products": [
"<string>"
],
"power_caps_mw": "<string>",
"delivery_duration_caps_hours": "<string>"
},
"derived_products": [
"<string>"
],
"integration_enabled": false
}PATCH/v1/onboardings/{onboarding_id}/rfi
Update the RfI on behalf of the asset owner
onboarding.write
Required scopes: 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":{"planned_cod":"2026-01-01","partners":"<string>","network_revision":0,"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":"","subnet_mask":"","gateway":"","ems_mode":"client","ems_port":0,"ems_unit_id":0,"ems_byte_word_order":"ABCD","ems_poll_interval_ms":0,"ems_timeout_ms":0,"ems_batching":{"max_read_registers":125,"max_read_gap_registers":32,"max_write_registers":123,"max_write_gap_registers":0,"fill_write_gaps_from_shadow":false,"write_cache_ttl_seconds":2}},"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_input_mode":"owner","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_selections":"<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": {
"planned_cod": "2026-01-01",
"partners": "<string>",
"network_revision": 0,
"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": "",
"subnet_mask": "",
"gateway": "",
"ems_mode": "client",
"ems_port": 0,
"ems_unit_id": 0,
"ems_byte_word_order": "ABCD",
"ems_poll_interval_ms": 0,
"ems_timeout_ms": 0,
"ems_batching": {
"max_read_registers": 125,
"max_read_gap_registers": 32,
"max_write_registers": 123,
"max_write_gap_registers": 0,
"fill_write_gaps_from_shadow": False,
"write_cache_ttl_seconds": 2,
},
},
"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_input_mode": "owner",
"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_selections": "<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":{"planned_cod":"2026-01-01","partners":"<string>","network_revision":0,"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":"","subnet_mask":"","gateway":"","ems_mode":"client","ems_port":0,"ems_unit_id":0,"ems_byte_word_order":"ABCD","ems_poll_interval_ms":0,"ems_timeout_ms":0,"ems_batching":{"max_read_registers":125,"max_read_gap_registers":32,"max_write_registers":123,"max_write_gap_registers":0,"fill_write_gaps_from_shadow":false,"write_cache_ttl_seconds":2}},"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_input_mode":"owner","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_selections":"<string>","pq_documents":"<string>","notes":"<string>"},"field_meta":"<string>"}}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/onboardings/{onboarding_id}/rfi-catalogues/{catalogue}
Read cached PQ choices for RfI
onboarding.read
Required scopes: onboarding.read
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- catalogueREQUIRED
- enum
tsosdsosbalance_group_responsiblescontractorsbalance_groupsbalancing_areasenergy_sourcestechnologiestechnical_implementationsconnection_typespostal_cities
Query parameters
- query
- stringdefault
- dso
- stringdefault DSO selection id; marks its balancing areas as suggested
- tso
- stringdefault
curl "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/rfi-catalogues/tsos" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/rfi-catalogues/tsos",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/rfi-catalogues/tsos", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{}- 401no valid token
- 403scope missing
- 404unknown or not visible
- 422validation failed
- 429rate limited
POST/v1/onboardings/{onboarding_id}/rfi/fields/{field_key}/comments
Comment on an RfI field
onboarding.write
Required scopes: 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
Required scopes: 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}/rfi/pq-data/{field_key}
Update a single RfI PQ-workbook field
onboarding.write
Required scopes: onboarding.write
Sets one control.pq_data field on the RFI gate and leaves every other RfI value at its stored state. For surfaces that edit a single PQ field outside the RfI form, where sending the whole payload would revert concurrent form edits. Only the PQ fields a single-field surface registers are writable here; any other key is rejected with 422. Also 422 on monitoring-only onboardings, which have no control section, and 409 once the PQ application has frozen its inputs.
Path parameters
- onboarding_idREQUIRED
- string<uuid>Stable onboarding identifier returned by create and list operations.
- field_keyREQUIRED
- stringPQ-workbook field key inside the RfI control section, for example
planned_cod.
Request body · required
- valueREQUIRED
- stringNew value for the PQ-workbook field, or null to clear it.
curl -X PATCH "https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/rfi/pq-data/m_device.shipping_address" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"value":"<string>"}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/rfi/pq-data/m_device.shipping_address",
headers={"Authorization": f"Bearer {token}"},
json={
"value": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/00000000-0000-0000-0000-000000000000/rfi/pq-data/m_device.shipping_address", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"value":"<string>"}),
});
const data = await res.json();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_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
Required scopes: 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();{
"archived_at": "<string>",
"project_settings": {
"deadline_overrides": "<string>",
"contacts": {
"asset_owner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"epc": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ems_provider": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"ebx": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
},
"partner": {
"name": "<string>",
"email": "<string>",
"phone": "<string>",
"company": "<string>",
"notes": "<string>"
}
},
"co_location": "<string>",
"start": "2026-01-01",
"original": "2026-01-01",
"estimatedOverride": "2026-01-01"
},
"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,
"is_transition": 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,
"requirement_key": "<string>",
"review_status": "accepted",
"reviewed_at": "<string>",
"reviewed_by_user_name": "<string>",
"review_note": "<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>",
"owner": "asset_owner",
"due_date": "2026-01-01",
"category": "grid_dso",
"decision": "<string>",
"resolved_by_user_name": "<string>",
"visibility": "internal"
}
],
"applied_templates": [
"<string>"
]
},
"notes": [
{
"id": "<string>",
"body": "<string>",
"visibility": "internal",
"author_user_name": "<string>",
"created_at": "<string>"
}
],
"shared_open_points": [
{
"id": "<string>",
"title": "<string>",
"status": "open",
"owner": "asset_owner",
"category": "grid_dso",
"due_date": "2026-01-01",
"decision": "<string>",
"comments": [
{
"id": "<string>",
"author_user_name": "<string>",
"author_org_name": "<string>",
"author_side": "ebx",
"created_at": "<string>",
"body": "<string>"
}
],
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<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
Required scopes: 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
Required scopes: 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/onboardings/summaries
List visible onboardings as summaries
onboarding.read
Required scopes: onboarding.read
Returns the same onboardings as GET /onboardings, with the same filters and visibility, but only where each one stands: asset, overall status, current gate, and every gate's status and deadline in process order. Use it to find an onboarding, then fetch its full record by id.
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/summaries" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/onboardings/summaries",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/onboardings/summaries", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"onboardings": [
{
"archived_at": "<string>",
"id": "<string>",
"asset_id": "<string>",
"asset_name": "<string>",
"location": "<string>",
"country": "<string>",
"tso": "<string>",
"integration_type": "monitoring_only",
"target_hc_date": "2026-01-01",
"overall_status": "in_progress",
"current_gate_definition_id": "mon_rfi",
"asset_owner_org_name": "<string>",
"is_transition": false,
"gates": [
{
"definition_id": "mon_rfi",
"title": "<string>",
"status": "pending",
"deadline": "2026-01-01"
}
],
"updated_at": "2026-10-22T20:30:00Z"
}
]
}GET/v1/public/onboarding-branding/{organization_id}/email-banner
Get a whitelabel onboarding email banner
Authentication: none
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
Authentication: none
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();{}