openapi: 3.2.0 info: title: Cloud Foundry V3 Domains API description: '# Welcome to the Experimental Cloud Foundry V3 API Docs!' version: latest license: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0.html contact: name: Cloud Foundry url: https://www.cloudfoundry.org/ servers: - url: https://api.example.local description: Cloud Foundry V3 API server security: - oauth: - cloud_controller.read - cloud_controller.write tags: - name: Domains description: Domains represent a fully qualified domain name that is used for application routes. paths: /v3/domains: get: summary: List domains description: Retrieve all domains the user has access to. operationId: listDomains tags: - Domains parameters: - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PerPage' - $ref: '#/components/parameters/OrderBy' - $ref: '#/components/parameters/CreatedAts' - $ref: '#/components/parameters/UpdatedAts' - $ref: '#/components/parameters/LabelSelector' - name: guids in: query schema: type: array items: type: string description: Comma-delimited list of GUIDs to filter by - name: names in: query schema: type: array items: type: string description: Comma-delimited list of domain names to filter by - name: organization_guids in: query schema: type: array items: type: string description: Comma-delimited list of owning organization GUIDs to filter by responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/DomainList' examples: default: summary: default value: pagination: total_results: 3 total_pages: 2 first: href: https://api.example.org?page=1&per_page=2 last: href: https://api.example.org?page=2&per_page=2 next: href: https://api.example.org?page=2&per_page=2 previous: null resources: - guid: 123e4567-e89b-12d3-a456-426614174000 created_at: '2019-03-08T01:06:19Z' updated_at: '2019-03-08T01:06:19Z' name: test-domain.com internal: false router_group: guid: 123e4567-e89b-12d3-a456-426614174000 supported_protocols: - tcp metadata: labels: {} annotations: {} relationships: organization: data: null shared_organizations: data: [] links: self: href: https://api.example.org/v3/domains/3a5d3d89-3f89-4f05-8188-8a2b298c79d5 route_reservations: href: https://api.example.org/v3/domains/3a5d3d89-3f89-4f05-8188-8a2b298c79d5/route_reservations router_group: href: https://api.example.org/routing/v1/router_groups/5806148f-cce6-4d86-7fbd-aa269e3f6f3f '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '409': $ref: '#/components/responses/Conflict' '422': $ref: '#/components/responses/UnprocessableEntity' '500': $ref: '#/components/responses/500' '502': $ref: '#/components/responses/BadGateway' '503': $ref: '#/components/responses/ServiceUnavailable' post: summary: Create a domain description: Create a domain. operationId: createDomain tags: - Domains requestBody: $ref: '#/components/requestBodies/DomainCreateRequestBody' responses: '201': description: Successfully created domain content: application/json: schema: $ref: '#/components/schemas/Domain' links: organization: operationId: getOrganization parameters: guid: $response.body#/relationships/organization/data/guid description: Retrieve the organization for this domain (private domains only) '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '409': $ref: '#/components/responses/Conflict' '422': $ref: '#/components/responses/UnprocessableEntity' '500': $ref: '#/components/responses/500' '503': $ref: '#/components/responses/ServiceUnavailable' /v3/domains/{guid}: get: summary: Get a domain description: Retrieve a domain. operationId: getDomain tags: - Domains parameters: - $ref: '#/components/parameters/Guid' responses: '200': description: Successfully retrieved domain content: application/json: schema: $ref: '#/components/schemas/Domain' links: organization: operationId: getOrganization parameters: guid: $response.body#/relationships/organization/data/guid description: Retrieve the organization for this domain (private domains only) '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' patch: summary: Update a domain description: Update a domain. operationId: updateDomain tags: - Domains parameters: - $ref: '#/components/parameters/Guid' requestBody: description: Domain object that needs to be updated required: true content: application/json: schema: type: object properties: metadata: $ref: '#/components/schemas/Metadata' description: Request schema for updating a domain examples: default: summary: default value: metadata: labels: key: value annotations: note: detailed information responses: '200': description: Successfully updated domain content: application/json: schema: $ref: '#/components/schemas/Domain' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '422': $ref: '#/components/responses/UnprocessableEntity' '500': $ref: '#/components/responses/500' '503': $ref: '#/components/responses/ServiceUnavailable' delete: summary: Delete a domain description: Delete a domain. operationId: deleteDomain tags: - Domains parameters: - $ref: '#/components/parameters/Guid' responses: '202': description: Accepted headers: Location: description: URL of the job that is deleting the domain schema: type: string format: uri '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/UnprocessableEntity' '500': $ref: '#/components/responses/500' /v3/domains/{guid}/relationships/shared_organizations: post: summary: Share a domain description: This endpoint shares an organization-scoped domain to other organizations specified by a list of organization guids. This will allow any of the other organizations to use the organization-scoped domain. operationId: shareDomain tags: - Domains parameters: - $ref: '#/components/parameters/Guid' requestBody: description: List of organizations to share the domain with required: true content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Relationship' description: Organization relationships; each organization will be entitled to manage this isolation segment examples: default: summary: default value: data: - guid: 123e4567-e89b-12d3-a456-426614174000 - guid: 123e4567-e89b-12d3-a456-426614174000 responses: '200': description: Successfully shared domain content: application/json: schema: type: object properties: data: type: array items: type: object properties: guid: type: string format: uuid examples: default: summary: default value: data: - guid: 123e4567-e89b-12d3-a456-426614174000 - guid: 123e4567-e89b-12d3-a456-426614174000 '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/UnprocessableEntity' /v3/domains/{guid}/relationships/shared_organizations/{org_guid}: delete: summary: Unshare a domain description: This endpoint removes an organization from the list of organizations an organization-scoped domain is shared with. This prevents the organization from using the organization-scoped domain. operationId: unshareDomain tags: - Domains parameters: - $ref: '#/components/parameters/Guid' - name: org_guid in: path required: true schema: type: string format: uuid description: The GUID of the organization to unshare the domain from responses: '204': description: Successfully unshared domain '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/UnprocessableEntity' /v3/domains/{guid}/route_reservations: get: summary: Check reserved routes for a domain description: Check if a specific route for a domain exists, regardless of the user’s visibility for the route in case the route belongs to a space the user does not belong to. operationId: checkReservedRoutesForDomain tags: - Domains parameters: - $ref: '#/components/parameters/Guid' - name: host in: query schema: type: string description: Hostname to filter by - name: path in: query schema: type: string description: Path to filter by - name: port in: query schema: type: integer description: Port to filter by responses: '200': description: OK content: application/json: schema: type: object properties: matching_route: type: boolean examples: default: summary: default value: matching_route: true '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' /v3/organizations/{guid}/domains: get: summary: List domains for an organization description: 'Retrieve all domains available in an organization for the current user. This will return unscoped domains (those without an owning organization), domains that are scoped to the given organization (owned by the given organization), and domains that have been shared with the organization. To retrieve the default domain for an organization, use the get default domain endpoint.' operationId: listDomainsForOrganization tags: - Domains parameters: - $ref: '#/components/parameters/Guid' - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PerPage' - $ref: '#/components/parameters/OrderBy' - name: names in: query schema: type: array items: type: string description: Comma-delimited list of domain names to filter by responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/DomainList' examples: default: summary: default value: pagination: total_results: 3 total_pages: 2 first: href: https://api.example.org?page=1&per_page=2 last: href: https://api.example.org?page=2&per_page=2 next: href: https://api.example.org?page=2&per_page=2 previous: null resources: - guid: 123e4567-e89b-12d3-a456-426614174000 created_at: '2019-03-08T01:06:19Z' updated_at: '2019-03-08T01:06:19Z' name: test-domain.com internal: false router_group: guid: 123e4567-e89b-12d3-a456-426614174000 supported_protocols: - tcp metadata: labels: {} annotations: {} relationships: organization: data: null shared_organizations: data: [] links: self: href: https://api.example.org/v3/domains/3a5d3d89-3f89-4f05-8188-8a2b298c79d5 route_reservations: href: https://api.example.org/v3/domains/3a5d3d89-3f89-4f05-8188-8a2b298c79d5/route_reservations router_group: href: https://api.example.org/routing/v1/router_groups/5806148f-cce6-4d86-7fbd-aa269e3f6f3f '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' components: schemas: Link: type: object properties: href: type: string description: The URL of the link method: type: string description: An optional field containing the HTTP method to be used when following the URL required: - href description: 'Each link is keyed by its type and will include a href for the URL and an optional method for links that cannot be followed using GET. ' Relationship: type: object properties: guid: type: string format: uuid description: The GUID of the resource DomainList: type: object properties: pagination: $ref: '#/components/schemas/Pagination' resources: type: array items: $ref: '#/components/schemas/Domain' Error: type: object properties: code: type: integer description: A numeric code for this error detail: type: string description: Detailed description of the error title: type: string description: Name of the error Domain: type: object allOf: - $ref: '#/components/schemas/BaseSchema' - properties: name: type: string description: The name of the domain; must be between 3 ~ 253 characters and follow [RFC 1035](https://tools.ietf.org/html/rfc1035) internal: type: boolean description: Whether the domain is used for internal (container-to-container) traffic router_group: type: - object - 'null' properties: guid: type: string format: uuid description: The guid of the desired router group to route `tcp` traffic through; if set, the domain will only be available for `tcp` traffic supported_protocols: type: array items: type: string enum: - http - tcp description: Available protocols for routes using the domain, currently `http` and `tcp` relationships: $ref: '#/components/schemas/Relationships' metadata: $ref: '#/components/schemas/Metadata' links: type: object properties: self: $ref: '#/components/schemas/Link' description: The URL to get this domain organization: $ref: '#/components/schemas/Link' description: The URL to get the organization for this domain route_reservations: $ref: '#/components/schemas/Link' description: The URL to get the route reservations for this domain shared_organizations: $ref: '#/components/schemas/Link' description: The URL to get the shared organizations for this domain router_group: $ref: '#/components/schemas/Link' description: The URL to get the router group for this domain description: 'A domain is a fully qualified domain name that is used for application routes. A domain can be scoped to an organization, meaning it can be used to create routes for spaces inside that organization, or be left unscoped to allow all organizations access. ' Errors: type: object properties: errors: type: array items: $ref: '#/components/schemas/Error' description: 'An error response will always return a list of error objects. Errors appear on the job resource for asynchronous operations. Clients should use the code and title fields for programmatically handling specific errors. The message in the detail field is subject to change over time. ' RelationshipToOne: type: object properties: data: type: - object - 'null' $ref: '#/components/schemas/Relationship' links: type: object properties: self: $ref: '#/components/schemas/Link' related: $ref: '#/components/schemas/Link' description: 'Some relationships relate a resource to exactly one other resource. For example an app can belong to only one space. ' Pagination: type: object properties: total_results: type: integer description: The total number of results available total_pages: type: integer description: The total number of pages available first: allOf: - $ref: '#/components/schemas/Link' - description: The first page of results last: allOf: - $ref: '#/components/schemas/Link' - description: The last page of results next: oneOf: - $ref: '#/components/schemas/Link' - type: 'null' description: The next page of results previous: oneOf: - $ref: '#/components/schemas/Link' - type: 'null' description: The previous page of results description: 'Pagination is a technique used to divide a large set of results into smaller, more manageable sets. This allows clients to retrieve results in smaller chunks, reducing the amount of data transferred and improving performance. The pagination object is a JSON object that contains information about the pagination state of the results. It includes the total number of results available, the total number of pages available, and links to the first, last, next, and previous pages of results. ' Metadata: type: object properties: labels: type: object additionalProperties: type: - string - 'null' description: 'A set of key-value pairs that describe the resource. Labels are a JSON object that contains information about a resource. They are used to tag resources with metadata that can be used to filter and group resources. Labels are included in the response body of a request to retrieve a resource. Labels are user-specified key/value pairs that are attached to API Resources. They are queryable, identifying attributes of a resource, but they do not affect the operation of CloudFoundry. For example, an app may be assigned a label with key sensitive and possible values true or false. Users could then find all sensitive apps with a selector for sensitive=true, resulting in a response containing only apps having the label key sensitive with a label value of true. Labels Labels allow users to apply identifying attributes to resources that are meaningful to the user, but not the CloudFoundry system. Examples may include (but are not limited to): "production" : "true" or "production" : "false" "env" : "dev" or "env" : "test" or "env" : "prod" "chargeback-code" : "abc123" Label keys Label keys are made up of an (optional) prefix, and name. If a prefix is present, it is separated from the name by a /. Prefixes are dns names intended to enable namespacing of label keys. A label key prefix must adhere to the following restrictions: Length: 0-253 characters Allowed characters: alphanumeric ( [a-z0-9A-Z] ), -, and . DNS subdomain format (series of subdomain labels separated by .) A label key name must adhere to the following restrictions: Length: 1-63 characters Allowed characters: alphanumeric ( [a-z0-9A-Z] ), -, _, and . Must begin and end with an alphanumeric character Label values Label values must adhere to the following restrictions: Length: 0-63 characters Allowed characters: alphanumeric ( [a-z0-9A-Z] ), -, _, and . Must begin and end with an alphanumeric character Empty values are allowed ' annotations: type: object additionalProperties: type: - string - 'null' description: 'A set of key-value pairs that describe the resource. Annotations are a JSON object that contains information about a resource. They are used to tag resources with metadata that can be used to filter and group resources. Annotations are included in the response body of a request to retrieve a resource. Annotations are user-specified key-value pairs that are attached to API resources. They do not affect the operation of Cloud Foundry. Annotations cannot be used in filters. When a service instance is being created, the service broker is sent the annotations of the service instance, and the space and organization in which the service instance resides. When a service instance is being updated, the service broker is sent the annotations of the space and organization in which the service instance resides. When a service binding is being created, the service broker is sent annotations of any associated app, and the space and organization in which the binding resides. Only annotations with a prefix (e.g. company.com/contacts) are sent to service brokers. Examples may include (but are not limited to): "contact info": "bob@example.com jane@example.com" "library versions": "Spring: 5.1, Redis Client: a184098. yaml parser: 38" "git-sha": "d56fe0367554ae5e878e37ed6c5b9a82f5995512" Annotation keys Annotation keys are made up of an (optional) prefix and name. If a prefix is present, it is separated from the name by a /. Prefixes are DNS names intended to enable namespacing of annotation keys. An annotation key prefix must adhere to the following restrictions: Length: 0-253 characters Allowed characters: a-z, A-Z, 0-9, -, and .; emojis cannot be used in keys DNS subdomain format (series of subdomain annotations separated by .) An annotation key name must adhere to the following restrictions: Length: 1-63 characters Allowed characters: a-z, A-Z, 0-9, -, _, and .; emojis cannot be used in keys Must begin and end with an alphanumeric character Annotation values Annotation values must adhere to the following restrictions: Length: 0-5000 unicode characters ' description: 'Metadata is a JSON object that contains information about a resource. It includes the GUID of the resource, the time the resource was created, the time the resource was last updated, and links to the resource. Metadata is included in the response body of a request to retrieve a resource. ' RelationshipToMany: type: object properties: data: type: array items: $ref: '#/components/schemas/Relationship' links: type: object properties: self: $ref: '#/components/schemas/Link' related: $ref: '#/components/schemas/Link' description: 'Some relationships relate a resource to several other resources. For example, an isolation segment can be entitled to multiple organizations. ' BaseSchema: type: object properties: guid: type: string format: uuid description: The unique identifier for the resource created_at: type: string format: date-time description: The ISO8601 compatible date and time when resource was created updated_at: type: string format: date-time description: The ISO8601 compatible date and time when resource was last updated description: 'A resource represents an individual object within the system, such as an app or a service. It is represented as a JSON object. A resource consists of several required resource fields and other attributes specific to the resource. See Resources and Experimental Resources for specific resources. ' Relationships: type: object description: 'Relationships represent associations between resources. When relationships are mutable, they can be used to create, read, update, and delete these associations. An app’s relationship to its current droplet is mutable, but an app’s relationship to its space is not. Relationships do not affect the fundamental properties of a resource, but may affect their behavior and permissions logic. Relationships are tied to the lifecycles of the associated resources and will be removed if either of the associated resources are deleted. For example, if a user is removed from an organization, both the user and the organization persist, but the relationship between them does not. Not all resources implement every relationship operation demonstrated in the examples below. See the docs for each resource to see how it interacts with its relationships. Endpoints that return relationship data list this information under the relationships key. The relationship object The relationship object is a key-value pair that uniquely identifies a resource. In practice this is almost always the guid of a resource. ' responses: Forbidden: description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Errors' NotFound: description: Not Found content: application/json: schema: $ref: '#/components/schemas/Errors' UnprocessableEntity: description: Unprocessable Entity content: application/json: schema: $ref: '#/components/schemas/Errors' BadGateway: description: Bad Gateway content: application/json: schema: $ref: '#/components/schemas/Error' BadRequest: description: Bad Request content: application/json: schema: $ref: '#/components/schemas/Errors' text/html: schema: type: string Unauthorized: description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Errors' Conflict: description: Conflict content: application/json: schema: $ref: '#/components/schemas/Errors' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/Errors' ServiceUnavailable: description: Service Unavailable content: application/json: schema: $ref: '#/components/schemas/Errors' parameters: OrderBy: name: order_by in: query required: false schema: type: string description: 'Value to sort by. Defaults to ascending; prepend with `-` to sort descending. ' example: created_at Guid: name: guid in: path required: true schema: type: string format: uuid description: The unique identifier for the resource PerPage: name: per_page in: query required: false schema: type: integer description: Number of results per page, valid values are 1 through 5000 example: 50 Page: name: page in: query required: false schema: type: integer description: Page to display; valid values are integers >= 1 example: 1 UpdatedAts: name: updated_ats in: query required: false schema: type: string description: 'Timestamp to filter by. When filtering on equality, several comma-delimited timestamps may be passed. Also supports filtering with [relational operators](#relational-operators). ' example: '2021-01-01T00:00:00Z' LabelSelector: name: label_selector in: query description: A query string containing a list of [label selector](#labels-and-selectors) requirements required: false schema: type: string example: environment=production CreatedAts: name: created_ats in: query required: false schema: type: string description: 'Timestamp to filter by. When filtering on equality, several comma-delimited timestamps may be passed. Also supports filtering with [relational operators](#relational-operators). ' example: '2021-01-01T00:00:00Z' requestBodies: DomainCreateRequestBody: description: Domain object that needs to be created required: true content: application/json: schema: type: object required: - name properties: name: type: string description: Name of the domain internal: type: boolean description: Whether the domain is used for internal (container-to-container) traffic router_group: type: object properties: guid: type: string format: uuid description: 'The desired router group guid. _note: creates a `tcp` domain; cannot be used when `internal` is set to `true` or domain is scoped to an org_' relationships: type: object properties: organization: $ref: '#/components/schemas/RelationshipToOne' description: A relationship to the organization the domain will be scoped to; _note cannot be used when `internal` is set to `true` or domain is associated with a router group_ shared_organizations: $ref: '#/components/schemas/RelationshipToMany' description: A relationship to organizations the domain will be shared with _Note cannot be used without an organization relationship_ metadata: $ref: '#/components/schemas/Metadata' examples: default: summary: default value: name: example.com internal: false securitySchemes: oauth: type: oauth2 flows: implicit: authorizationUrl: https://uaa.cloudfoundry.local/api-oauth/dialog scopes: cloud_controller.admin: This scope provides read and write access to all resources cloud_controller.admin_read_only: This scope provides read only access to all resources cloud_controller.global_auditor: This scope provides read access to all resources cloud_controller.read: Read access to the Cloud Controller cloud_controller.write: Write access to the Cloud Controller cloud_controller.update_build_state: This scope allows its bearer to update the state of a build; currently only used when updating builds cloud_controller_service_permissions.read: This scope provides read only access for service instance permissions bearer: type: http scheme: bearer bearerFormat: JWT description: Bearer JWT token authentication