Aedifion · OpenAPI Overlay 1.0.0
API Evangelist enhancements for the aedifion HTTP API
7 actions
7 updates
update
extends
openapi/aedifion-openapi.yml
Generated by API Evangelist
Written by API Evangelist tooling for Aedifion's API. It is a proposal applied on top of the contract, not a document Aedifion publishes.
What the actions change
x-apievangelist-notex-agentic-accesstitleversioncontactexternalDocsx-apievangelist-discoveryx-apievangelist-recommended-flow
Targets 6
$.info
$.servers
$.components.securitySchemes.openIDConnect
$.components.securitySchemes.basicAuth
$.paths['/v2/datapoint/setpoint'].post
$.paths['/v2/controls/app/{controls_app_id}/run'].post
OpenAPI Overlay
overlay: 1.0.0
info:
title: API Evangelist enhancements for the aedifion HTTP API
version: 1.0.0
extends: openapi/aedifion-openapi.yml
x-generated: '2026-09-09'
x-method: generated
x-source: >-
Derived from the live spec at https://api.aedifion.io/openapi.json plus aedifion's published
documentation. This overlay records API Evangelist's enhancements without mutating the
harvested original at openapi/_original/aedifion-openapi.json.
actions:
- target: $.info
description: >-
The published spec's info block is nearly empty - title is the generic "API Docs", version
is an empty string, and there is no contact, licence or externalDocs. Fill it in.
update:
title: aedifion HTTP API
version: '2'
x-apievangelist-note: >-
info.title in the published spec is "API Docs" and info.version is an empty string. A
generated client would be named after the Swagger UI page rather than the product, and no
client can pin a version.
contact:
name: aedifion GmbH
url: https://www.aedifion.com/kontakt
email: contact@aedifion.com
externalDocs:
description: aedifion developer documentation
url: https://docs.aedifion.io/en/developers/http-api/
- target: $.servers
description: >-
THE SINGLE HIGHEST-VALUE FIX. The published spec declares servers as [{"url": ""}] - an
empty string. The Swagger UI at api.aedifion.io/ui/ works because the browser resolves the
empty URL relative to the page it is served from, but any client generated from the
downloaded document has no host to call and every generated SDK is dead on arrival. The
real hosts are documented at
https://docs.aedifion.io/en/developers/http-api/ and are supplied here.
update:
- url: https://api.aedifion.io
description: aedifion cloud platform
- url: https://api.{realm}.aedifion.io
description: Dedicated single-tenant instance
variables:
realm:
default: aedifion
description: The customer's dedicated realm name.
- target: $.components.securitySchemes.openIDConnect
description: >-
The spec models the Keycloak provider as an oauth2 scheme with only an implicit flow and
only the `openid` scope. The realm's own discovery document advertises authorizationCode,
clientCredentials and password grants, PKCE with S256, and 13 scopes. Implicit is
discouraged by OAuth 2.1; authorizationCode + PKCE is what a client should use.
update:
x-apievangelist-discovery: https://auth.aedifion.io/realms/aedifion/.well-known/openid-configuration
x-apievangelist-recommended-flow: authorizationCode with PKCE (S256)
x-apievangelist-available-grants:
- authorization_code
- client_credentials
- password
- refresh_token
x-apievangelist-note: >-
Declared flows in the spec (implicit only) are a subset of what the identity provider
actually supports. See scopes/aedifion-scopes.yml.
- target: $.components.securitySchemes.basicAuth
description: Record the provider's own statement that this scheme is legacy.
update:
x-apievangelist-status: legacy
x-apievangelist-note: >-
aedifion's documentation states "The aedifion HTTP API supports Basic Auth for legacy
reasons until further notice. HTTP Basic Auth may be deprecated in future." No Sunset
date is published.
- target: $.paths['/v2/datapoint/setpoint'].post
description: >-
Flag the highest-consequence operation on the API with an agentic execution contract. This
operation actuates physical building plant.
update:
x-agentic-access:
action-class: acting
consequence: physical
audit: required
human-in-the-loop: recommended
token-ttl-seconds: 300
dry-run:
supported: true
parameter: dryrun
reversal:
supported: true
how: re-issue with value='null' to reset the point to local building automation control
window: not stated
x-apievangelist-note: >-
aedifion describes this endpoint as "no-frills, non-acked, stateless, best-effort" and is
explicit that a 200 means the request was authorized and well-formed, NOT that the
building network applied the value. Callers must pass acked=true and redeem the returned
reference at get_datapoint_setpoint to confirm.
- target: $.paths['/v2/controls/app/{controls_app_id}/run'].post
description: Flag autonomous control deployment as a consequential action.
update:
x-agentic-access:
action-class: acting
consequence: physical
audit: required
human-in-the-loop: recommended
token-ttl-seconds: 300
x-apievangelist-note: This operation both starts and stops an autonomous control
application that operates HVAC plant without further human input.
- target: $.info
description: >-
Record the cross-cutting semantics an integrator needs that the spec does not state - error
format, rate-limit signalling and idempotency posture.
update:
x-apievangelist-conventions:
error_format: custom-json (not RFC 9457); single Error schema across all 269 error
responses
idempotency: partial - no Idempotency-Key header; two set-membership operations
documented as idempotent
rate_limit_headers: none declared
rate_limit_status_codes: [423, 429]
pagination: page/per_page with a PaginationMeta envelope, on 20 of 208 operations
conditional_requests: no ETag or If-Match support
request_tracing: no request-id header
x-apievangelist-artifacts:
conventions: conventions/aedifion-conventions.yml
errors: errors/aedifion-problem-types.yml
authentication: authentication/aedifion-authentication.yml
rate_limits: rate-limits/aedifion-rate-limits.yml
data_model: data-model/aedifion-data-model.yml
events: asyncapi/aedifion-event-surface.yml