Cloud Foundry · AsyncAPI Specification
Cloud Foundry Event Surface
Version
View Spec
View on GitHub
Cloud Foundry FoundationContainersMulti-CloudOpen-SourcePlatform-as-a-ServicePlatformAsyncAPIEvents
AsyncAPI Specification
generated: '2026-09-05'
method: searched
source: >-
https://github.com/cloudfoundry/loggregator-release/blob/main/docs/rlp_gateway.md,
https://docs.cloudfoundry.org/devguide/deploy-apps/streaming-logs.html,
https://docs.cloudfoundry.org/devguide/services/log-management.html,
https://docs.cloudfoundry.org/loggregator/architecture.html,
grpc/cloud-foundry-loggregator-v2-egress.proto, grpc/cloud-foundry-log-cache-v1-egress.proto,
openapi/cloud-foundry-capi-v3-openapi.yaml
asyncapi_published: false
webhooks_published: false
note: >-
Cloud Foundry HAS a real, documented, first-party event surface and publishes NO AsyncAPI document
describing it, and NO HTTP webhooks. Both facts matter and they are different facts. A search of the
cloudfoundry GitHub organization for asyncapi returns zero repositories and zero committed documents, so
no AsyncAPI is saved here and NO `type: AsyncAPI` pointer is emitted from this file — the same rule this
pipeline applies to /.well-known/ probes and agent cards: the pointer would assert that the Foundation
publishes a document it does not publish. NO `type: Webhooks` pointer is emitted either, because Cloud
Foundry ships no HTTP callback registration anywhere in the 248-operation Cloud Controller surface. This
file records the shape of the surface that DOES exist so a consumer is not left to infer "no events" from
"no AsyncAPI".
discovery:
mechanism: >-
Every sibling host on a Cloud Foundry foundation is discovered at RUNTIME from the Cloud Controller root
endpoint. GET / (operationId getPlatformInfo, openapi/cloud-foundry-capi-v3-openapi.yaml) returns a
links object carrying self, cloud_controller_v2, cloud_controller_v3, network_policy_v1, uaa, logging,
log_cache and log_stream hrefs. An agent handed only `api.<system-domain>` can therefore resolve the
identity server and both log surfaces without being told them — a genuinely strong discovery property,
and the reason the templated baseURLs in apis.yml are safe to state.
default_host_pattern:
source: https://github.com/cloudfoundry/cf-deployment/blob/main/cf-deployment.yml
note: >-
The Foundation's canonical deployment manifest registers api.((system_domain)), uaa.((system_domain)),
log-cache.((system_domain)) and log-stream.((system_domain)). These are DEFAULTS an operator can
change, which is exactly why the root-endpoint links above, not the pattern, are the authority.
delivery_shapes:
- shape: server-sent-events
name: Reverse Log Proxy (RLP) Gateway
transport: HTTPS, text/event-stream
path: GET /v2/read
host: operator-deployed; the gateway address is set by the GATEWAY_ADDR environment variable on the loggregator deployment
auth: OAuth 2.0 bearer token verified against the foundation's UAA (LOG_ACCESS* / LOG_ADMIN* configuration)
channels_are: envelope TYPES selected by query parameter, not named topics
envelope_types:
- log
- counter
- gauge
- timer
- event
parameters:
- name: shard_id
note: Envelopes are split between clients sharing a shard ID — the consumer-group primitive.
- name: source_id
note: One or more source IDs (an app GUID, or a platform component name such as `doppler`).
- name: counter.name
note: Filter counter envelopes by metric name.
- name: gauge.name
note: Filter gauge envelopes by metric name.
- name: deterministic_name
note: Enables deterministic routing.
errors:
- status: 400
when: No envelope type is passed in the query string.
payload_schema: >-
The SSE `data:` frame carries {"batch":[<Envelope>...]} where Envelope is the SAME message defined in
grpc/cloud-foundry-loggregator-v2-envelope.proto — so the wire schema for this HTTP stream IS already
captured in this repo, as a proto rather than as an AsyncAPI payload.
docs: https://github.com/cloudfoundry/loggregator-release/blob/main/docs/rlp_gateway.md
- shape: grpc-stream
name: Loggregator v2 Egress / Ingress
transport: gRPC over mutual TLS, inside the deployment
contracts:
- grpc/cloud-foundry-loggregator-v2-egress.proto
- grpc/cloud-foundry-loggregator-v2-ingress.proto
- grpc/cloud-foundry-loggregator-v2-envelope.proto
note: >-
The native subscription API. Nozzles (the Cloud Foundry term for a firehose consumer) attach here. These
are real published contracts, saved verbatim, and they are what an AsyncAPI for Cloud Foundry would
otherwise have to restate.
- shape: grpc-query
name: Log Cache
transport: gRPC, plus a PromQL query surface
contracts:
- grpc/cloud-foundry-log-cache-v1-egress.proto
- grpc/cloud-foundry-log-cache-v1-promql.proto
- grpc/cloud-foundry-log-cache-v1-orchestration.proto
note: >-
A bounded in-memory window over the same envelopes, queryable with PromQL. Read-after-the-fact rather
than subscribe — see conformance/cloud-foundry-conformance.yml (promql).
- shape: push-drain
name: Syslog drains
transport: syslog:// or https:// endpoint registered by the consumer
registration: >-
A user-provided service instance carrying a drain URL, bound to an app
(`cf create-user-provided-service <name> -l <drain-url>` then `cf bind-service`). Cloud Foundry then
DELIVERS to that endpoint — the only push-to-consumer path the platform has.
options:
- name: drain-data
values: [logs, metrics, all]
note: >-
With `drain-data=metrics` or `all`, container metrics arrive as STATS entries. The docs warn these are
metrics rather than a log type, so they cannot be filtered by source type.
reliability: >-
Best-effort. The docs state plainly that if a client cannot consume quickly enough, the Loggregator
buffer may overwrite lines before the client has read them; LGR envelopes report `can't reach syslog
drain url` and `dropped log messages due to high rate`. There is no replay, no ack, and no dead-letter.
docs: https://docs.cloudfoundry.org/devguide/services/log-management.html
note: >-
This is the closest thing Cloud Foundry has to a webhook, and it is deliberately NOT recorded as one:
the consumer registers a sink for a continuous log/metric stream, not a subscription to typed business
events with payload schemas. Calling it a webhook would credit the platform with a surface a buyer
evaluating "does this API have webhooks" is not going to find.
- shape: polled-log
name: Cloud Controller audit events
transport: HTTPS, ordinary paginated REST
operations:
- listAuditEvents (GET /v3/audit_events)
- getAuditEvent (GET /v3/audit_events/{guid})
note: >-
The control plane's own change feed — who created, updated or deleted what. It is POLLED: there is no
push, no cursor beyond ordinary page-number pagination and created_ats[gt] filtering, and no
notification. An agent that needs to react to a change in Cloud Foundry state polls this, or polls the
Job returned by the mutation it made (see conventions/cloud-foundry-conventions.yml async_operations).
absent:
- what: AsyncAPI document
searched:
- https://api.github.com/search/repositories?q=asyncapi+org:cloudfoundry
result: 0 repositories
- what: HTTP webhooks / callback registration
searched: openapi/cloud-foundry-capi-v3-openapi.yaml (248 operations)
result: >-
No `webhooks` root object, no callbacks object, and no subscription resource. grep for webhook across
the specification returns nothing.
Work with this as data
Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for asyncapi
4 MCP tools reach this
find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/cloud-foundry-event-surface"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.