Observability — dashboards, widgets, alerts, syslog, and report cards. Auto-generated from the platform OpenAPI schema so it matches the running API.
REST API for this feature — 107 operations across 62 resource paths, auto-generated from the platform's live OpenAPI schema (drf-spectacular).
Base URL
https://<your-versus-host>/api· AuthAuthorization: Bearer <JWT>(fromPOST /api/auth/token/) · 📄 Download the OpenAPI spec for Postman/Insomnia/Swagger · see the API overview for pagination, filtering, and errors.
GET /api/observe/alerting/contact-points/List contact points
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
ordering | query | no | string | Which field to use when ordering the results. |
search | query | no | string | A search term. |
Responses: 200 → ContactPoint[]
POST /api/observe/alerting/contact-points/Create contact point
Request body (application/json): ContactPointRequest
Responses: 201 → ContactPoint
GET /api/observe/alerting/contact-points/{uid}/Retrieve contact point
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 200 → ContactPoint
PUT /api/observe/alerting/contact-points/{uid}/Update contact point
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): ContactPointRequest
Responses: 200 → ContactPoint
PATCH /api/observe/alerting/contact-points/{uid}/Update contact point
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): PatchedContactPointRequest
Responses: 200 → ContactPoint
DELETE /api/observe/alerting/contact-points/{uid}/Delete contact point
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 204
POST /api/observe/alerting/contact-points/{uid}/test/Send a test notification to this contact point.
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): ContactPointRequest
Responses: 200 → ContactPoint
GET /api/observe/alerting/eval-groups/List eval groups
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
ordering | query | no | string | Which field to use when ordering the results. |
search | query | no | string | A search term. |
Responses: 200 → AlertEvalGroup[]
POST /api/observe/alerting/eval-groups/Create eval group
Request body (application/json): AlertEvalGroupRequest
Responses: 201 → AlertEvalGroup
GET /api/observe/alerting/eval-groups/{uid}/Retrieve eval group
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 200 → AlertEvalGroup
PUT /api/observe/alerting/eval-groups/{uid}/Update eval group
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): AlertEvalGroupRequest
Responses: 200 → AlertEvalGroup
PATCH /api/observe/alerting/eval-groups/{uid}/Update eval group
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): PatchedAlertEvalGroupRequest
Responses: 200 → AlertEvalGroup
DELETE /api/observe/alerting/eval-groups/{uid}/Delete eval group
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 204
GET /api/observe/alerting/eval-groups/{uid}/rules/Rules: eval group
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 200 → AlertEvalGroup
GET /api/observe/alerting/instances/List instances
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
ordering | query | no | string | Which field to use when ordering the results. |
search | query | no | string | A search term. |
Responses: 200 → AlertInstance[]
GET /api/observe/alerting/instances/{id}/Retrieve instance
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | integer | A unique integer value identifying this alert instance. |
Responses: 200 → AlertInstance
GET /api/observe/alerting/instances/{id}/history/History: instance
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | integer | A unique integer value identifying this alert instance. |
Responses: 200 → AlertInstance
POST /api/observe/alerting/instances/{id}/silence/Phase A silence: set state to Normal, record transition.
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | integer | A unique integer value identifying this alert instance. |
Responses: 200 → AlertInstance
GET /api/observe/alerting/rules/List rules
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
ordering | query | no | string | Which field to use when ordering the results. |
search | query | no | string | A search term. |
Responses: 200 → AlertRule[]
POST /api/observe/alerting/rules/Create rule
Request body (application/json): AlertRuleRequest
Responses: 201 → AlertRule
GET /api/observe/alerting/rules/{uid}/Retrieve rule
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 200 → AlertRule
PUT /api/observe/alerting/rules/{uid}/Update rule
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): AlertRuleRequest
Responses: 200 → AlertRule
PATCH /api/observe/alerting/rules/{uid}/Update rule
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): PatchedAlertRuleRequest
Responses: 200 → AlertRule
DELETE /api/observe/alerting/rules/{uid}/Delete rule
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 204
GET /api/observe/alerting/rules/{uid}/instances/Instances: rule
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 200 → AlertRule
POST /api/observe/alerting/rules/{uid}/pause/Pause: rule
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): AlertRuleRequest
Responses: 200 → AlertRule
POST /api/observe/alerting/rules/{uid}/test/Dry-run: run queries + expression DAG, return condition frames without updating state.
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): AlertRuleRequest
Responses: 200 → AlertRule
GET /api/alerts/List alerts
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
ordering | query | no | string | Which field to use when ordering the results. |
page | query | no | integer | A page number within the paginated result set. |
page_size | query | no | integer | Number of results to return per page. |
search | query | no | string | A search term. |
Responses: 200 → PaginatedAlertList
POST /api/alerts/Create alert
Request body (application/json): AlertRequest
Responses: 201 → Alert
POST /api/alerts/mark_all_read/Create mark all read
Request body (application/json): AlertRequest
Responses: 200 → Alert
GET /api/alerts/unread_count/List unread counts
Responses: 200 → Alert
GET /api/alerts/{id}/Retrieve alert
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | string |
Responses: 200 → Alert
PUT /api/alerts/{id}/Update alert
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | string |
Request body (application/json): AlertRequest
Responses: 200 → Alert
PATCH /api/alerts/{id}/Update alert
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | string |
Request body (application/json): PatchedAlertRequest
Responses: 200 → Alert
DELETE /api/alerts/{id}/Delete alert
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | string |
Responses: 204
GET /api/dashboard-widgets/List dashboard widgets
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
dashboard | query | no | integer | |
ordering | query | no | string | Which field to use when ordering the results. |
page | query | no | integer | A page number within the paginated result set. |
page_size | query | no | integer | Number of results to return per page. |
search | query | no | string | A search term. |
widget_type | query | no | string | * virtual_server - Virtual Server |
Responses: 200 → PaginatedDashboardWidgetList
POST /api/dashboard-widgets/Create dashboard widget
Request body (application/json): DashboardWidgetRequest
Responses: 201 → DashboardWidget
GET /api/dashboard-widgets/cert-expiry-data/List cert expiry datas
Responses: 200 → DashboardWidget
GET /api/dashboard-widgets/config-drift-data/List config drift datas
Responses: 200 → DashboardWidget
GET /api/dashboard-widgets/pool-health-data/List pool health datas
Responses: 200 → DashboardWidget
GET /api/dashboard-widgets/route-delta-data/List route delta datas
Responses: 200 → DashboardWidget
POST /api/dashboard-widgets/route-delta-snapshot/Create route delta snapshot
Request body (application/json): DashboardWidgetRequest
Responses: 200 → DashboardWidget
GET /api/dashboard-widgets/unauthorized-changes-data/List unauthorized changes datas
Responses: 200 → DashboardWidget
GET /api/dashboard-widgets/workflow-sla-data/List workflow sla datas
Responses: 200 → DashboardWidget
GET /api/dashboard-widgets/{id}/Retrieve dashboard widget
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | integer | A unique integer value identifying this dashboard widget. |
Responses: 200 → DashboardWidget
PUT /api/dashboard-widgets/{id}/Update dashboard widget
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | integer | A unique integer value identifying this dashboard widget. |
Request body (application/json): DashboardWidgetRequest
Responses: 200 → DashboardWidget
PATCH /api/dashboard-widgets/{id}/Update dashboard widget
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | integer | A unique integer value identifying this dashboard widget. |
Request body (application/json): PatchedDashboardWidgetRequest
Responses: 200 → DashboardWidget
DELETE /api/dashboard-widgets/{id}/Delete dashboard widget
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | integer | A unique integer value identifying this dashboard widget. |
Responses: 204
GET /api/dashboards/List dashboards
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
ordering | query | no | string | Which field to use when ordering the results. |
page | query | no | integer | A page number within the paginated result set. |
page_size | query | no | integer | Number of results to return per page. |
search | query | no | string | A search term. |
Responses: 200 → PaginatedDashboardList
POST /api/dashboards/Create dashboard
Request body (application/json): DashboardRequest
Responses: 201 → Dashboard
GET /api/dashboards/{id}/Retrieve dashboard
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | integer | A unique integer value identifying this dashboard. |
Responses: 200 → Dashboard
PUT /api/dashboards/{id}/Update dashboard
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | integer | A unique integer value identifying this dashboard. |
Request body (application/json): DashboardRequest
Responses: 200 → Dashboard
PATCH /api/dashboards/{id}/Update dashboard
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | integer | A unique integer value identifying this dashboard. |
Request body (application/json): PatchedDashboardRequest
Responses: 200 → Dashboard
DELETE /api/dashboards/{id}/Delete dashboard
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | integer | A unique integer value identifying this dashboard. |
Responses: 204
GET /api/observe/dashboards/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
ordering | query | no | string | Which field to use when ordering the results. |
search | query | no | string | A search term. |
Responses: 200 → ObserveDashboard[]
POST /api/observe/dashboards/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
Request body (application/json): ObserveDashboardRequest
Responses: 201 → ObserveDashboard
GET /api/observe/dashboards/{uid}/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 200 → ObserveDashboard
PUT /api/observe/dashboards/{uid}/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): ObserveDashboardRequest
Responses: 200 → ObserveDashboard
PATCH /api/observe/dashboards/{uid}/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): PatchedObserveDashboardRequest
Responses: 200 → ObserveDashboard
DELETE /api/observe/dashboards/{uid}/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 204
GET /api/observe/dashboards/{uid}/versions/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 200 → ObserveDashboard
GET /api/observe/datasources/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
ordering | query | no | string | Which field to use when ordering the results. |
search | query | no | string | A search term. |
Responses: 200 → ObserveDatasource[]
POST /api/observe/datasources/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
Request body (application/json): ObserveDatasourceRequest
Responses: 201 → ObserveDatasource
GET /api/observe/datasources/types/Return available provider types.
Responses: 200 → ObserveDatasource
GET /api/observe/datasources/{uid}/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 200 → ObserveDatasource
PUT /api/observe/datasources/{uid}/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): ObserveDatasourceRequest
Responses: 200 → ObserveDatasource
PATCH /api/observe/datasources/{uid}/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): PatchedObserveDatasourceRequest
Responses: 200 → ObserveDatasource
DELETE /api/observe/datasources/{uid}/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 204
POST /api/observe/datasources/{uid}/health/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): ObserveDatasourceRequest
Responses: 200 → ObserveDatasource
GET /api/observe/datasources/{uid}/resource/{resource_path}/Proxy label/metric autocomplete calls to the provider's callResource.
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
resource_path | path | yes | string | |
uid | path | yes | string |
Responses: 200 → ObserveDatasource
POST /api/observe/datasources/{uid}/resource/{resource_path}/Proxy label/metric autocomplete calls to the provider's callResource.
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
resource_path | path | yes | string | |
uid | path | yes | string |
Request body (application/json): ObserveDatasourceRequest
Responses: 200 → ObserveDatasource
GET /api/observe/folders/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
ordering | query | no | string | Which field to use when ordering the results. |
search | query | no | string | A search term. |
Responses: 200 → ObserveFolder[]
POST /api/observe/folders/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
Request body (application/json): ObserveFolderRequest
Responses: 201 → ObserveFolder
GET /api/observe/folders/{uid}/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 200 → ObserveFolder
PUT /api/observe/folders/{uid}/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): ObserveFolderRequest
Responses: 200 → ObserveFolder
PATCH /api/observe/folders/{uid}/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): PatchedObserveFolderRequest
Responses: 200 → ObserveFolder
DELETE /api/observe/folders/{uid}/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 204
POST /api/observe/provisioning/import/grafana/Minimal Grafana-compat import: convert Grafana provisioning shapes
Responses: 200
GET /api/observe/provisioning/sources/List sources
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
ordering | query | no | string | Which field to use when ordering the results. |
search | query | no | string | A search term. |
Responses: 200 → ProvisioningSource[]
POST /api/observe/provisioning/sources/Create source
Request body (application/json): ProvisioningSourceRequest
Responses: 201 → ProvisioningSource
GET /api/observe/provisioning/sources/{uid}/Retrieve source
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 200 → ProvisioningSource
PUT /api/observe/provisioning/sources/{uid}/Update source
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): ProvisioningSourceRequest
Responses: 200 → ProvisioningSource
PATCH /api/observe/provisioning/sources/{uid}/Update source
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): PatchedProvisioningSourceRequest
Responses: 200 → ProvisioningSource
DELETE /api/observe/provisioning/sources/{uid}/Delete source
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 204
POST /api/observe/provisioning/sources/{uid}/apply/Execute a plan.
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): ProvisioningSourceRequest
Responses: 200 → ProvisioningSource
GET /api/observe/provisioning/sources/{uid}/logs/Logs: source
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 200 → ProvisioningSource
POST /api/observe/provisioning/sources/{uid}/plan/Compute a plan from a YAML manifest stream.
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Request body (application/json): ProvisioningSourceRequest
Responses: 200 → ProvisioningSource
GET /api/observe/provisioning/sources/{uid}/resources/Resources: source
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
uid | path | yes | string |
Responses: 200 → ProvisioningSource
POST /api/observe/provisioning/sources/{uid}/resources/{res_kind}/{res_uid}/unlock/Manually unlock a provisioned resource to allow UI edits.
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
res_kind | path | yes | string | |
res_uid | path | yes | string | |
uid | path | yes | string |
Request body (application/json): ProvisioningSourceRequest
Responses: 200 → ProvisioningSource
POST /api/observe/queryPOST /api/observe/query
Responses: 200
GET /api/reportcards/GET /api/reportcards/?scope=fleet[&scope_ref_id=] — latest snapshot
Responses: 200
GET /api/reportcards/{card_type}/GET /api/reportcards/<card_type>/ — latest snapshot for one card.
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
card_type | path | yes | string |
Responses: 200
GET /api/reportcards/{card_type}/checks/{check_key}/GET /api/reportcards/<card_type>/checks/<check_key>/ — paginated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
card_type | path | yes | string | |
check_key | path | yes | string |
Responses: 200
GET /api/reportcards/{card_type}/history/GET /api/reportcards/<card_type>/history/?window=7d — score time
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
card_type | path | yes | string |
Responses: 200
GET /api/reports/Stateless report runner — no model, all results computed on demand.
Responses: 200
GET /api/reports/export/Stateless report runner — no model, all results computed on demand.
Responses: 200
POST /api/reports/run/Stateless report runner — no model, all results computed on demand.
Responses: 200
GET /api/syslog/Query stored syslog entries.
Responses: 200
GET /api/syslog/{id}/Query stored syslog entries.
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | integer | A unique integer value identifying this syslog entry. |
Responses: 200
GET /api/syslog-alert-rules/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
ordering | query | no | string | Which field to use when ordering the results. |
search | query | no | string | A search term. |
Responses: 200 → SyslogAlertRule[]
POST /api/syslog-alert-rules/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
Request body (application/json): SyslogAlertRuleRequest
Responses: 201 → SyslogAlertRule
GET /api/syslog-alert-rules/{id}/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | integer | A unique integer value identifying this syslog alert rule. |
Responses: 200 → SyslogAlertRule
PUT /api/syslog-alert-rules/{id}/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | integer | A unique integer value identifying this syslog alert rule. |
Request body (application/json): SyslogAlertRuleRequest
Responses: 200 → SyslogAlertRule
PATCH /api/syslog-alert-rules/{id}/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | integer | A unique integer value identifying this syslog alert rule. |
Request body (application/json): PatchedSyslogAlertRuleRequest
Responses: 200 → SyslogAlertRule
DELETE /api/syslog-alert-rules/{id}/Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
id | path | yes | integer | A unique integer value identifying this syslog alert rule. |
Responses: 204
POST /api/syslog-ingest/Receives syslog lines from the lab relay agent and stores them in the DB.
Responses: 201
GET /api/widgets/List widgets
Responses: 200
Auto-generated from drf-spectacular OpenAPI. Endpoint descriptions come from viewset docstrings/serializers; enriching those improves this page on the next generation.