{"openapi":"3.0.0","info":{"contact":{"x-twitter":"GoTurbine"},"description":"The Turbine Labs API provides CRUD operations for core object types, and is\nmostly RESTy. The easiest way to interact with the API is with\n[tbnctl](https://docs.turbinelabs.io/advanced/tbnctl.html).\nIf you want to make direct HTTP calls, however, you can obtain an access\ntoken using tbnctl, and then pass it in the Authorization header,\nprefixed by `Token `:\n```console\ncurl -H \"Authorization: Token <access token>\" https://api.turbinelabs.io/v1.0/cluster\n```\n","title":"Turbine Labs API","version":"1.0","x-apisguru-categories":["cloud"],"x-logo":{"url":"https://twitter.com/GoTurbine/profile_image?size=original"},"x-origin":[{"format":"swagger","url":"https://raw.githubusercontent.com/turbinelabs/api/master/swagger.yml","version":"2.0"}],"x-providerName":"turbinelabs.io"},"security":[{"api_key":[]}],"tags":[{"description":"A logical deployment of services, which typically maps to a datacenter, availability zone, or compute cluster.","name":"Zone"},{"description":"A configuration that can be applied to one or more running Proxies serving one or more Domains.","name":"Proxy"},{"description":"An interface and port a Proxy will listen on","name":"Listener"},{"description":"A served hostname and port.","name":"Domain"},{"description":"A served path within a Domain.","name":"Route"},{"description":"A collection of rules specifying how a request should be mapped to an instance within a cluster. These may be shared between multiple Routes.","name":"Shared Rules"},{"description":"A collection of Instances, homogeneous in their purpose, heterogeneous in their metadata.","name":"Cluster"},{"description":"A collection of events that have occurred in your infrastructure. This includes changes detected by the deployed collectors (new Clusters or Cluster instances) as well as routing changes through the UI or API.","name":"Audit Log"}],"paths":{"/admin/user/self":{"get":{"description":"Request the user object for an authorized requesting account.","responses":{"200":{"description":"The authorized user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"Returns the user object for the account authorized and making this request.","tags":["User Management"]}},"/admin/user/self/access_token/{access-token-key}":{"delete":{"parameters":[{"description":"the key of the Access Token that should be deleted","in":"path","name":"access-token-key","required":true,"example":"9cd24183-f848-48f8-6f55-0f0724070000","schema":{"type":"string"}},{"description":"the current checksum of the user to be modified","in":"query","name":"checksum","required":true,"example":"9cd24183-f848-48f8-6f55-0f07240700b9","schema":{"type":"string"}}],"responses":{"200":{"description":"An empty result if the API key deletion was successful."},"default":{"description":"An error; may be unexpected or validation error if the last API was removed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"Delete the specified access token.","tags":["User Management"]}},"/admin/user/self/access_tokens":{"get":{"responses":{"200":{"description":"A list of Access Tokens defined for the authenticated user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiAccessTokens"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"Lists Access Tokens that are configured for the authenticated user.","tags":["User Management"]},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessTokenDescription"}}},"description":"A short string (<255 characters) describing the expected use of the token.","required":true},"responses":{"200":{"description":"The new Access Token that was created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessToken"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"Creates a new Access Token and associates it with the authenticated user.","tags":["User Management"]}},"/changelog/adhoc":{"get":{"description":"Perform an adhoc query against the change log for your org. The filter is a JSON encoded FilterSum as defined in this file.","parameters":[{"description":"Encoded FilterSums representing the query you would like to execute. See object definition for details.","in":"query","name":"filter","x-ref-encoded-object":"#/definitions/FilterSums","schema":{"type":"string"}}],"responses":{"200":{"description":"A list of changes that meet the provided filter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedChangeDescriptions"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"Allows an arbitrary filter to be specified and applied to the org\\'s change log.","tags":["Audit Log"]}},"/changelog/cluster-graph/{clusterKey}":{"get":{"description":"Gets all changes to a cluster.\n","parameters":[{"description":"the cluster key to see an audit log for","in":"path","name":"clusterKey","required":true,"example":"9cd24183-f848-48f8-6f55-0f0724070000","schema":{"type":"string"}},{"description":"The beginning of the window we want to see changes for; measured in\nmicroseconds since Unix Epoch.\n","in":"query","name":"start","required":false,"schema":{"type":"number","format":"int64"}},{"description":"The end of the window we want to see changes for; measured in\nmicroseconds since Unix Epoch.\n","in":"query","name":"end","required":false,"schema":{"type":"number","format":"int64"}},{"description":"Determines how many ChangeDescription object should be returned to\nthe calling code.\n","in":"query","name":"max_results","required":false,"schema":{"type":"number","format":"int64"}},{"description":"When paginating a Changelog request start on the entry that comes\nimmediately before or after this ID (as determined by the direction\nargument).\n","in":"query","name":"ref_id","required":false,"schema":{"type":"string"}},{"description":"If set to \"before\" then changes will be returned that occurred before\nreference ID. If \"after\" then changes will be returned that have\noccurred since the reference ID.\n","in":"query","name":"direction","required":false,"schema":{"type":"string","enum":["before","after"]}}],"responses":{"200":{"description":"A list of changes occurring during the requested window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedChangeDescriptions"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get changes related to the indicated cluster","tags":["Audit Log"]}},"/changelog/domain-graph/{domainKey}":{"get":{"description":"Gets all changes to a domain, the proxies that front the specified domain,\nroutes within that domain, the shared rules of each route, the clusters\nconnected via route or shared rules.\n","parameters":[{"description":"the domain key to see an audit log for","in":"path","name":"domainKey","required":true,"example":"9cd24183-f848-48f8-6f55-0f0724070000","schema":{"type":"string"}},{"description":"The beginning of the window we want to see changes for; measured in\nmicroseconds since Unix Epoch.\n","in":"query","name":"start","required":false,"schema":{"type":"number","format":"int64"}},{"description":"The end of the window we want to see changes for; measured in\nmicroseconds since Unix Epoch.\n","in":"query","name":"end","required":false,"schema":{"type":"number","format":"int64"}},{"description":"Determines how many ChangeDescription object should be returned to\nthe calling code.\n","in":"query","name":"max_results","required":false,"schema":{"type":"number","format":"int64"}},{"description":"When paginating a Changelog request start on the entry that comes\nimmediately before or after this ID (as determined by the direction\nargument).\n","in":"query","name":"ref_id","required":false,"schema":{"type":"string"}},{"description":"If set to \"before\" then changes will be returned that occurred before\nreference ID. If \"after\" then changes will be returned that have\noccurred since the reference ID.\n","in":"query","name":"direction","required":false,"schema":{"type":"string","enum":["before","after"]}}],"responses":{"200":{"description":"A list of changes occurring during the requested window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedChangeDescriptions"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get changes related to the indicated domain","tags":["Audit Log"]}},"/changelog/route-graph/{routeKey}":{"get":{"description":"Gets all changes to a route, the domains associated with it, the shared\nrules it references, and the clusters connected to it.\n","parameters":[{"description":"the route key to see an audit log for","in":"path","name":"routeKey","required":true,"example":"9cd24183-f848-48f8-6f55-0f0724070000","schema":{"type":"string"}},{"description":"The beginning of the window we want to see changes for; measured in\nmicroseconds since Unix Epoch.\n","in":"query","name":"start","required":false,"schema":{"type":"number","format":"int64"}},{"description":"The end of the window we want to see changes for; measured in\nmicroseconds since Unix Epoch.\n","in":"query","name":"end","required":false,"schema":{"type":"number","format":"int64"}},{"description":"Determines how many ChangeDescription object should be returned to\nthe calling code.\n","in":"query","name":"max_results","required":false,"schema":{"type":"number","format":"int64"}},{"description":"When paginating a Changelog request start on the entry that comes\nimmediately before or after this ID (as determined by the direction\nargument).\n","in":"query","name":"ref_id","required":false,"schema":{"type":"string"}},{"description":"If set to \"before\" then changes will be returned that occurred before\nreference ID. If \"after\" then changes will be returned that have\noccurred since the reference ID.\n","in":"query","name":"direction","required":false,"schema":{"type":"string","enum":["before","after"]}}],"responses":{"200":{"description":"A list of changes occurring during the requested window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedChangeDescriptions"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get changes related to the indicated route","tags":["Audit Log"]}},"/changelog/shared-rules-graph/{sharedRulesKey}":{"get":{"description":"Gets all changes associated with set of Shared Rules; the domains using\nit and the clusters referenced by it.\n","parameters":[{"description":"the shared rules key to see an audit log for","in":"path","name":"sharedRulesKey","required":true,"example":"9cd24183-f848-48f8-6f55-0f0724070000","schema":{"type":"string"}},{"description":"The beginning of the window we want to see changes for; measured in\nmicroseconds since Unix Epoch.\n","in":"query","name":"start","required":false,"schema":{"type":"number","format":"int64"}},{"description":"The end of the window we want to see changes for; measured in\nmicroseconds since Unix Epoch.\n","in":"query","name":"end","required":false,"schema":{"type":"number","format":"int64"}},{"description":"Determines how many ChangeDescription object should be returned to\nthe calling code.\n","in":"query","name":"max_results","required":false,"schema":{"type":"number","format":"int64"}},{"description":"When paginating a Changelog request start on the entry that comes\nimmediately before or after this ID (as determined by the direction\nargument).\n","in":"query","name":"ref_id","required":false,"schema":{"type":"string"}},{"description":"If set to \"before\" then changes will be returned that occurred before\nreference ID. If \"after\" then changes will be returned that have\noccurred since the reference ID.\n","in":"query","name":"direction","required":false,"schema":{"type":"string","enum":["before","after"]}}],"responses":{"200":{"description":"A list of changes occurring during the requested window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedChangeDescriptions"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get changes related to the indicated SharedRules","tags":["Audit Log"]}},"/changelog/zone/{zoneKey}":{"get":{"description":"Retrieve all changes in the specified zone.","parameters":[{"description":"the zone key to see an audit log for","in":"path","name":"zoneKey","required":true,"example":"9cd24183-f848-48f8-6f55-0f0724070000","schema":{"type":"string"}},{"description":"The beginning of the window we want to see changes for; measured in\nmicroseconds since Unix Epoch.\n","in":"query","name":"start","required":false,"schema":{"type":"number","format":"int64"}},{"description":"The end of the window we want to see changes for; measured in\nmicroseconds since Unix Epoch.\n","in":"query","name":"end","required":false,"schema":{"type":"number","format":"int64"}},{"description":"Determines how many ChangeDescription object should be returned to\nthe calling code.\n","in":"query","name":"max_results","required":false,"schema":{"type":"number","format":"int64"}},{"description":"When paginating a Changelog request start on the entry that comes\nimmediately before or after this ID (as determined by the direction\nargument).\n","in":"query","name":"ref_id","required":false,"schema":{"type":"string"}},{"description":"If set to \"before\" then changes will be returned that occurred before\nreference ID. If \"after\" then changes will be returned that have\noccurred since the reference ID.\n","in":"query","name":"direction","required":false,"schema":{"type":"string","enum":["before","after"]}}],"responses":{"200":{"description":"A list of changes occurring during the requested window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedChangeDescriptions"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get changes in a specified zone","tags":["Audit Log"]}},"/cluster":{"get":{"description":"Get a list of clusters","parameters":[{"description":"A JSON encoded array of ClusterFilter objects. The filter is taken\nas a union of intersections. In other words an object that matches\nevery constraint in any ClusterFilter will be included.\n","in":"query","name":"filters","schema":{"type":"string"}}],"responses":{"200":{"description":"a result containing a list of clusters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiClusterResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get clusters","tags":["Cluster"]},"post":{"description":"Create a new cluster","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterCreate"}}},"description":"the cluster to create","required":true},"responses":{"200":{"description":"the newly created cluster","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"create cluster","tags":["Cluster"]}},"/cluster/{clusterKey}":{"delete":{"description":"Delete an existing cluster","parameters":[{"description":"the cluster key","in":"path","name":"clusterKey","required":true,"example":"7ef80556-60bb-46bd-4cec-f4e2533aa75c","schema":{"type":"string"}},{"description":"the current checksum of the cluster to be deleted","in":"query","name":"checksum","required":true,"example":"9cd24183-f848-48f8-6f55-0f07240700b9","schema":{"type":"string"}}],"responses":{"200":{"description":"an empty result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Empty"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"delete cluster","tags":["Cluster"]},"get":{"description":"Get details for an existing cluster","parameters":[{"description":"the cluster key","in":"path","name":"clusterKey","required":true,"example":"7ef80556-60bb-46bd-4cec-f4e2533aa75c","schema":{"type":"string"}}],"responses":{"200":{"description":"a result containing a single cluster","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get cluster","tags":["Cluster"]},"put":{"description":"Modify an existing cluster","parameters":[{"description":"the cluster key","in":"path","name":"clusterKey","required":true,"example":"5074fe62-821e-4034-55bd-b9caa09af2a1","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Cluster"}}},"description":"the cluster to modify","required":true},"responses":{"200":{"description":"A result containing the modified cluster","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"modify cluster","tags":["Cluster"]}},"/cluster/{clusterKey}/instances":{"post":{"description":"Add a new instance to a cluster","parameters":[{"description":"the cluster to add the instance to","in":"path","name":"clusterKey","required":true,"example":"1c7b1c5e-1a23-4d04-5cb4-eccea4d5994c","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Instance"}}},"description":"the instance to add","required":true},"responses":{"200":{"description":"the newly created instance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstanceResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"add instance","tags":["Cluster"]}},"/cluster/{clusterKey}/instances/{instanceIdentifier}":{"delete":{"description":"Remove an instance from a cluster","parameters":[{"description":"the current checksum of the instance to be deleted","in":"query","name":"checksum","required":true,"example":"9cd24183-f848-48f8-6f55-0f07240700b9","schema":{"type":"string"}},{"description":"the cluster to remove an instance from","in":"path","name":"clusterKey","required":true,"example":"7ef80556-60bb-46bd-4cec-f4e2533aa75c","schema":{"type":"string"}},{"description":"the instance to remove, identified as <host>:<port>","in":"path","name":"instanceIdentifier","required":true,"example":"foo-1.useast.test.com:8080","schema":{"type":"string"}}],"responses":{"200":{"description":"an empty result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Empty"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"remove instance","tags":["Cluster"]}},"/domain":{"get":{"description":"Get a list of domains","parameters":[{"description":"A JSON encoded array of DomainFilter objects. The filter is taken\nas a union of intersections. In other words an object that matches\nevery constraint in any DomainFilter will be included.\n","in":"query","name":"filters","schema":{"type":"string"}}],"responses":{"200":{"description":"a result containing a list of domains","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiDomainResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get domains","tags":["Domain"]},"post":{"description":"Create a new domain","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainCreate"}}},"description":"the domain to create","required":true},"responses":{"200":{"description":"the newly created zone","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"create domain","tags":["Domain"]}},"/domain/{domainKey}":{"delete":{"description":"Delete an existing domain","parameters":[{"description":"the domain key","in":"path","name":"domainKey","required":true,"example":"48cf1c9b-f027-4223-b405-d48018ffb900","schema":{"type":"string"}},{"description":"the current checksum of the domain to be deleted","in":"query","name":"checksum","required":true,"example":"9cd24183-f848-48f8-6f55-0f07240700b9","schema":{"type":"string"}}],"responses":{"200":{"description":"an empty result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Empty"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"delete domain","tags":["Domain"]},"get":{"description":"Get details for a single domain","parameters":[{"description":"the domain key","in":"path","name":"domainKey","required":true,"example":"48cf1c9b-f027-4223-b405-d48018ffb900","schema":{"type":"string"}}],"responses":{"200":{"description":"a result containing a single domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get domain","tags":["Domain"]}},"/listener":{"get":{"description":"Get a list of listeners","parameters":[{"description":"A JSON encoded array of ListenerFilter objects. The filter is taken\nas a union of intersections. In other words an object that matches\nevery constraint in any ListenerFilter will be included.\n","in":"query","name":"filters","schema":{"type":"string"}}],"responses":{"200":{"description":"a result containing a list of listeners","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiListenerResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"list listeners","tags":["Listener"]},"post":{"description":"Create a new listener","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListenerCreate"}}},"description":"the listener to create","required":true},"responses":{"200":{"description":"the newly created listener","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListenerResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"create listener","tags":["Listener"]}},"/listener/{listenerKey}":{"delete":{"description":"Delete existing listener","parameters":[{"description":"the listener key","in":"path","name":"listenerKey","required":true,"example":"72c86057-ee8d-4a2b-a3a7-760fbd1d3b9f","schema":{"type":"string"}},{"description":"the current checksum of the listener to be deleted","in":"query","name":"checksum","required":true,"example":"9cd24183-f848-48f8-6f55-0f07240700b9","schema":{"type":"string"}}],"responses":{"200":{"description":"an empty result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Listener"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"delete listener","tags":["Listener"]},"get":{"description":"Get details for a single listener","parameters":[{"description":"the listener key","in":"path","name":"listenerKey","required":true,"example":"72c86057-ee8d-4a2b-a3a7-760fbd1d3b9f","schema":{"type":"string"}}],"responses":{"200":{"description":"a result containing a single listener","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListenerResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get listener","tags":["Listener"]},"put":{"description":"Modify an existing listener","parameters":[{"description":"the listener key","in":"path","name":"listenerKey","required":true,"example":"5074fe62-821e-4034-55bd-b9caa09af2a1","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Listener"}}},"description":"the listener to modify","required":true},"responses":{"200":{"description":"A result containing the modified cluster","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListenerResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"modify listener","tags":["Listener"]}},"/proxy":{"get":{"description":"Get a list of proxies","parameters":[{"description":"A JSON encoded array of ProxyFilter objects. The filter is taken\nas a union of intersections. In other words an object that matches\nevery constraint in any ProxyFilter will be included.\n","in":"query","name":"filters","schema":{"type":"string"}}],"responses":{"200":{"description":"a result containing a list of proxies","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiProxyResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"list proxies","tags":["Proxy"]},"post":{"description":"Create a new proxy","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyCreate"}}},"description":"the proxy to create","required":true},"responses":{"200":{"description":"the newly created proxy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"create proxy","tags":["Proxy"]}},"/proxy/{proxyKey}":{"delete":{"description":"Delete existing proxy","parameters":[{"description":"the proxy key","in":"path","name":"proxyKey","required":true,"example":"72c86057-ee8d-4a2b-a3a7-760fbd1d3b9f","schema":{"type":"string"}},{"description":"the current checksum of the proxy to be deleted","in":"query","name":"checksum","required":true,"example":"9cd24183-f848-48f8-6f55-0f07240700b9","schema":{"type":"string"}}],"responses":{"200":{"description":"an empty result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Proxy"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"delete proxy","tags":["Proxy"]},"get":{"description":"Get details for a single proxy","parameters":[{"description":"the proxy key","in":"path","name":"proxyKey","required":true,"example":"72c86057-ee8d-4a2b-a3a7-760fbd1d3b9f","schema":{"type":"string"}}],"responses":{"200":{"description":"a result containing a single proxy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get proxy","tags":["Proxy"]}},"/route":{"get":{"description":"Get a list of routes","parameters":[{"description":"A JSON encoded array of RouteFilter objects. The filter is taken\nas a union of intersections. In other words an object that matches\nevery constraint in any RouteFilter will be included.\n","in":"query","name":"filters","schema":{"type":"string"}}],"responses":{"200":{"description":"a result containing a list of routes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiRouteResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get routes","tags":["Route"]},"post":{"description":"Create a new route","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteCreate"}}},"description":"the route to create","required":true},"responses":{"200":{"description":"the newly created route","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"create route","tags":["Route"]}},"/route/{routeKey}":{"delete":{"description":"Delete an existing route","parameters":[{"description":"the route key","in":"path","name":"routeKey","required":true,"example":"1c7b1c5e-1a23-4d04-5cb4-eccea4d5994c","schema":{"type":"string"}},{"description":"the current checksum of the route to be deleted","in":"query","name":"checksum","required":true,"example":"9cd24183-f848-48f8-6f55-0f07240700b9","schema":{"type":"string"}}],"responses":{"200":{"description":"an empty result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Empty"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"delete route","tags":["Route"]},"get":{"description":"Get details for an existing route","parameters":[{"description":"the route key","in":"path","name":"routeKey","required":true,"example":"1c7b1c5e-1a23-4d04-5cb4-eccea4d5994c","schema":{"type":"string"}}],"responses":{"200":{"description":"a result containing a single route","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get route","tags":["Route"]},"put":{"description":"Modify an existing route","parameters":[{"description":"the route key","in":"path","name":"routeKey","required":true,"example":"1c7b1c5e-1a23-4d04-5cb4-eccea4d5994c","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Route"}}},"description":"the route to modify","required":true},"responses":{"200":{"description":"A result containing the modified route","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"modify route","tags":["Route"]}},"/shared_rules":{"get":{"description":"Get a list of shared_rules","parameters":[{"description":"A JSON encoded array of SharedRulesFilter objects. The filter is taken\nas a union of intersections. In other words an object that matches\nevery constraint in any SharedRulesFilter will be included.\n","in":"query","name":"filters","schema":{"type":"string"}}],"responses":{"200":{"description":"a result containing a list of shared_rules","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiSharedRulesResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get shared_rules","tags":["Shared Rules"]},"post":{"description":"Create a new shared_rules object","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedRulesCreate"}}},"description":"the shared_rules object to create","required":true},"responses":{"200":{"description":"the newly created shared_rules object","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedRulesResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"create shared_rules","tags":["Shared Rules"]}},"/shared_rules/{sharedRulesKey}":{"delete":{"description":"Delete an existing shared_rules object","parameters":[{"description":"the shared_rules key","in":"path","name":"sharedRulesKey","required":true,"example":"1c7b1c5e-1a23-4d04-5cb4-eccea4d5994c","schema":{"type":"string"}},{"description":"the current checksum of the shared_rules to be deleted","in":"query","name":"checksum","required":true,"example":"9cd24183-f848-48f8-6f55-0f07240700b9","schema":{"type":"string"}}],"responses":{"200":{"description":"an empty result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Empty"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"delete shared_rules object","tags":["Route"]},"get":{"description":"Get details for an existing shared_rules object","parameters":[{"description":"the shared_rules key","in":"path","name":"sharedRulesKey","required":true,"example":"1c7b1c5e-1a23-4d04-5cb4-eccea4d5994c","schema":{"type":"string"}}],"responses":{"200":{"description":"a result containing a single shared_rules object","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedRulesResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get shared_rules object","tags":["Shared Rules"]},"put":{"description":"Modify an existing shared_rules object","parameters":[{"description":"the shared_rules key","in":"path","name":"sharedRulesKey","required":true,"example":"1c7b1c5e-1a23-4d04-5cb4-eccea4d5994c","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedRules"}}},"description":"the shared_rules object to modify","required":true},"responses":{"200":{"description":"A result containing the modified shared_rules object","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedRulesResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"modify shared_rules object","tags":["Shared Rules"]}},"/zone":{"get":{"description":"Get all zones. possibly with filters\n","parameters":[{"description":"A JSON encoded array of ZoneFilter objects. The filter is taken\nas a union of intersections. In other words an object that matches\nevery constraint in any ZoneFilter will be included.\n","in":"query","name":"filters","schema":{"type":"string"}}],"responses":{"200":{"description":"A result containing an array of zones","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiZoneResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get a list of zones","tags":["Zone"]},"post":{"description":"Create a new zone.\n","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneCreate"}}},"description":"the zone to create","required":true},"responses":{"200":{"description":"A result containing the newly created zone","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"create zone","tags":["Zone"]}},"/zone/{zoneKey}":{"delete":{"description":"Delete a zone.\n","parameters":[{"description":"the zone key","in":"path","name":"zoneKey","required":true,"example":"9cd24183-f848-48f8-6f55-0f0724070000","schema":{"type":"string"}},{"description":"the current checksum of the zone to be deleted","in":"query","name":"checksum","required":true,"example":"9cd24183-f848-48f8-6f55-0f07240700b9","schema":{"type":"string"}}],"responses":{"200":{"description":"an empty result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Empty"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"delete zone","tags":["Zone"]},"get":{"description":"Get details for a single zone\n","parameters":[{"description":"the zone key","in":"path","name":"zoneKey","required":true,"example":"9cd24183-f848-48f8-6f55-0f0724070000","schema":{"type":"string"}}],"responses":{"200":{"description":"a result containing a single zone","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneResult"}}}},"default":{"description":"Unexpected error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"summary":"get zone","tags":["Zone"]}}},"servers":[{"url":"https://api.turbinelabs.io/v1.0"}],"components":{"securitySchemes":{"api_key":{"in":"header","name":"Authorization","type":"apiKey"}},"schemas":{"AccessToken":{"properties":{"access_token_key":{"type":"string"},"checksum":{"type":"string"},"created_at":{"description":"A timestamp that marks when a user was deleted. It is in the format\nyyyy-mm-ddThh:mm:ss.SZ. The timezone will always be UTC.\n","type":"string"},"description":{"type":"string"},"signed_token":{"description":"This will be set only when an AccessToken is initially created\n","type":"string"},"user_key":{"type":"string"}},"required":["access_token_key","description","user_key","created_at","checksum"],"type":"object"},"AccessTokenDescription":{"properties":{"description":{"type":"string"}},"required":["description"],"type":"object"},"AllConstraints":{"properties":{"dark":{"$ref":"#/components/schemas/ClusterConstraints"},"light":{"$ref":"#/components/schemas/ClusterConstraints"},"tap":{"$ref":"#/components/schemas/ClusterConstraints"}},"required":["light"],"type":"object"},"CORSConfig":{"description":"Experimental: Controls simple CORS responses for the associated domain.\nThe configurable properties map closely to the CORS specification which\nshould be referenced for a full discussion on their meaning:\nhttps://www.w3.org/TR/cors/ or https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS.\n","properties":{"allow_credentials":{"description":"Indicates whether the response to request can be exposed when the\nomit credentials flag is unset\nhttps://www.w3.org/TR/cors/#access-control-allow-credentials-response-header.\n","type":"boolean"},"allowed_headers":{"description":"Specifies what headers are allowed to be set when a request is made.\nhttps://www.w3.org/TR/cors/#access-control-allow-headers-response-header.\n","items":{"type":"string"},"type":"array"},"allowed_methods":{"description":"Indicates which HTTP request types may be used to call an endpoint.\nhttps://www.w3.org/TR/cors/#access-control-allow-methods-response-header.\n","items":{"type":"string"},"type":"array"},"allowed_origins":{"description":"Must contain a single element specifying the domain (origin) allowed\nto make requsets to this domain. If any origin is acceptable '*' may\nbe used as a wildcard https://www.w3.org/TR/cors/#origin-request-header,\nhttps://www.w3.org/TR/cors/#access-control-allow-origin-response-header.\n","items":{"type":"string"},"type":"array"},"exposed_headers":{"description":"Indicates which response headers may be accessed from the browser.\nhttps://www.w3.org/TR/cors/#http-access-control-expose-headers.\n","items":{"type":"string"},"type":"array"},"max_age":{"description":"Sets how long (in seconds) the response to a preflight request may be\ncached. A value of -1 will disable caching. https://www.w3.org/TR/cors/#access-control-max-age-response-header.\n","type":"integer"}},"required":["allowed_origins","allowed_methods"],"type":"object"},"CertKeyPathPair":{"description":"A key/cert pair that will be served when a domain terminates a SSL/TLS\nrequest.  Paths should be absolute and accessible to the user running\nthe proxy instance.\n","properties":{"certificate_path":{"description":"Path to a certificate in the PEM format for the domain. If multiple\ncertificates need to be specified then should be contained in this file\nin the following order: first the primary certificate followed by any\nintermediary certificats.\n","type":"string"},"key_path":{"description":"Path to a file with the secret key in the PEM format for the domain.\n","type":"string"}},"required":["certificate_path","key_path"],"type":"object"},"ChangeDescription":{"properties":{"actor_key":{"description":"The user who made the change.","type":"string","x-example":"1c7b1c5e-1a23-4d04-5cb4-eccea4d5994c"},"at":{"description":"When the change took place in milliseconds since the Unix epoch.","format":"int64","type":"number"},"comment":{"description":"A description of the change.","type":"string"},"diffs":{"description":"A collection of attribute updates that compose this change.","items":{"$ref":"#/components/schemas/ChangeEntry"},"type":"array"},"txn":{"description":"A unique identifier for all this transaction. It is shared by all\nattribute updates within a change.\n","type":"string","x-example":"1c7b1c5e-1a23-4d04-5cb4-eccea4d5994c"}},"type":"object"},"ChangeEntry":{"properties":{"change_type":{"description":"Whether the value was added or removed to the object.","enum":["addition","removal"],"type":"string"},"object_key":{"description":"An ID uniquely identifying the object being changed.","type":"string","x-example":"9cd24183-f848-48f8-6f55-0f0724070000"},"object_type":{"description":"The name of the object being being altered.","enum":["org","user","zone","proxy","domain","route","shared_rules","cluster"],"type":"string"},"path":{"description":"A dot-separated / bracket-indexed path to the field changed on the object.","type":"string","x-example":"cluster.instance[10.0.1.5:8080].metadata[pod-template-hash]"},"value":{"description":"The value that has been added or removed to the object at the attribute\npath indicated in path.\n","type":"string"},"zone_key":{"description":"The zone this object is located in.","type":"string","x-example":"9cd24183-f848-48f8-6f55-0f0724070000"}},"type":"object"},"CircuitBreakers":{"description":"Provides limits on various parameters to protect clusters against sudden\nsurges in traffic.\n","properties":{"max_connections":{"description":"Maximum number of connections that will be established to all\ninstances in a cluster within a proxy. If set to 0, no new connections\nwill be created. If not specified, defaults to 1024.\n","type":"integer"},"max_pending_requests":{"description":"Maximum number of requests that will be queued while waiting on a\nconnection pool to a cluster within a proxy. If set to 0, no requests\nwill be queued. If not specified, defaults to 1024.\n","type":"integer"},"max_requests":{"description":"Maximum number of requests that can be outstanding to all instances in\na cluster within  a proxy. Only applicable to HTTP/2 traffic since\nHTTP/1.1 clusters are governed by the maximum connections circuit\nbreaker. If set to 0, no requests will be made. If not specified,\ndefaults to 1024.\n","type":"integer"},"max_retries":{"description":"Maximum number of retries that can be outstanding to all instances in\na cluster within a proxy. If set to 0, requests will not be retried.\nIf not specified, defaults to 3.\n","type":"integer"}},"type":"object"},"Cluster":{"allOf":[{"$ref":"#/components/schemas/ClusterCreate"},{"properties":{"checksum":{"type":"string"},"cluster_key":{"type":"string"}},"required":["cluster_key","checksum"],"type":"object"}]},"ClusterConstraint":{"properties":{"cluster_key":{"type":"string"},"constraint_key":{"type":"string"},"metadata":{"$ref":"#/components/schemas/Metadata"},"properties":{"$ref":"#/components/schemas/Metadata"},"response_data":{"allOf":[{"$ref":"#/components/schemas/ResponseData"}],"description":"When a request is served by a cluster selected by this constraint annotate\nthe response with the information specified within this ResponseData\nobject. It's possible that multiple response data configurations will\napply; if that's the case then the values from ClusterConstarint takes\nprecedence over those from a Route or SharedRules object.\n"},"weight":{"type":"integer"}},"type":"object"},"ClusterConstraints":{"items":{"$ref":"#/components/schemas/ClusterConstraint"},"type":"array"},"ClusterCreate":{"properties":{"circuit_breakers":{"$ref":"#/components/schemas/CircuitBreakers"},"health_checks":{"$ref":"#/components/schemas/HealthChecks"},"instances":{"$ref":"#/components/schemas/Instances"},"name":{"type":"string"},"outlier_detection":{"$ref":"#/components/schemas/OutlierDetection"},"require_tls":{"description":"If set, requests to this collection of hosts will be made via HTTPS.\nAt this time neither certificate validation and certificate pinning\nare supported for proxy clients of this cluster.\n","type":"boolean"},"zone_key":{"type":"string"}},"required":["zone_key","name"],"type":"object"},"ClusterFilter":{"properties":{"cluster_key":{"type":"string"},"name":{"type":"string"},"zone_key":{"type":"string"}},"type":"object"},"ClusterResult":{"properties":{"result":{"$ref":"#/components/schemas/Cluster"}},"type":"object"},"CohortSeed":{"properties":{"name":{"description":"The name of the cookie, the header field, or the query argument to\nbe checked for a cohort seed value.\n","type":"string"},"type":{"description":"Where a request's cohort seed will be drawn from.","enum":["header","cookie","query"],"type":"string"},"use_zero_value_seed":{"description":"If true, requests with a seed source which resolves to an empty value\nwill still be grouped and routed consistently. This means a misspelled\nor missing seed source on a request will sort all such traffic into a\nsingle backend. This could result in all traffic being assigned to a\nbackend intended for only a small percentage of traffic. Use with\ncaution.\n","type":"boolean"}},"type":"object"},"CookieDatum":{"description":"This describes a cookie that should be set in response to a HTTP request.\n","properties":{"domain":{"description":"Specifies the hosts to hich a cookie will be sent. Maps directly to a\ncookie's 'Domain' attribute.\n","type":"string"},"expires_in_sec":{"description":"This indicates how long a cookie will be valid, in seconds. If not set the\ndefault is to provide no expiration information. If set to 0 the cookie will\nhave an 'Expires' attribute set to 'Mon, 1 Jan 0001 12:00:00 UTC'. For values\ngreater than 0 the cookie's 'Max-Age' attribute will be set to that value.\n","type":"integer"},"http_only":{"description":"If set the cookie value will not be accessible via Document.cookie. Maps\ndirectly to 'HttpOnly' attribute.\n","type":"boolean"},"name":{"description":"The name of the cookie that will be attached to the response sent.","type":"string"},"path":{"description":"Specifies the path a cookie will be associated with. Maps directly to\nthe 'Path' attribute.\n","type":"string"},"same_site":{"description":"Allows assertions how a cookie should behave wend making cross-site requests.\nMaps directly to 'SameSite' attribute. If unset no guidance will be included\nin the cookie.\n","enum":["Strict","Lax"],"type":"string"},"secure":{"description":"If set the cookie will only be sent on subsequent requests when accessing\na server via HTTPS. Maps directly to 'Secure' attribute.\n","type":"boolean"},"value":{"description":"A literal value to send as the cookie value or a reference to\nsome metadatum value set on the Cluster Intsance that handles\na specific request.\n","type":"string"},"value_is_literal":{"description":"If true then the value attribute is treated as a literal and no attempt\nto resolve to a server metadatum.\n","type":"boolean"}},"type":"object"},"Domain":{"allOf":[{"$ref":"#/components/schemas/DomainCreate"},{"properties":{"checksum":{"type":"string"},"domain_key":{"type":"string"}},"required":["domain_key","checksum"],"type":"object"}]},"DomainCreate":{"properties":{"aliases":{"description":"A set of alternate names that this Domain may be referenced by. May\nstart ('*.') or end ('.*') with a wildcard.\n","items":{"type":"string"},"type":"array"},"checksum":{"type":"string"},"cors_config":{"$ref":"#/components/schemas/CORSConfig"},"domain_key":{"type":"string"},"force_https":{"description":"If set to true, requests must use TLS. If a request is not using TLS, (as determined by\nthe scheme or the presence of X-Forwarded-Proto header), a 301 redirect will be sent\ntelling the client to use HTTPS.\n","type":"boolean"},"gzip_enabled":{"description":"Experimental: if set to true will enable gzip compression on data that passes trough this domain","type":"boolean"},"name":{"type":"string"},"port":{"type":"integer"},"redirects":{"items":{"$ref":"#/components/schemas/Redirect"},"type":"array"},"ssl_config":{"$ref":"#/components/schemas/SSLConfig"},"zone_key":{"type":"string"}},"required":["zone_key","name","port"],"type":"object"},"DomainFilter":{"properties":{"domain_key":{"type":"string"},"name":{"type":"string"},"proxy_keys":{"description":"matches Domains with a superset of the specified proxy_keys. A\nslice with a single value of \"-\" will produce Domains with no linked\nProxies.\n","items":{"type":"string"},"type":"array"},"zone_key":{"type":"string"}},"type":"object"},"DomainResult":{"properties":{"result":{"$ref":"#/components/schemas/Domain"}},"type":"object"},"Empty":{"type":"object"},"Error":{"properties":{"code":{"format":"int32","type":"integer"},"fields":{"type":"string"},"message":{"type":"string"}},"type":"object"},"Filter":{"properties":{"absolute_match_only":{"description":"If set this will return ChangeEntry values with a path that matches\nthe attribute_path property exactly.\n","type":"boolean"},"actor_key":{"description":"The user who made the change.","type":"string","x-example":"1c7b1c5e-1a23-4d04-5cb4-eccea4d5994c"},"attribute_path":{"description":"A dot-separated / bracket-indexed path to the field changed on the\nobject. '%' may be used as a wildcard.\n","type":"string","x-example":"cluster.instance[%].metadata[app-name]"},"attribute_value":{"description":"The value that has been added or removed to the object at the attribute\npath indicated in path.\n","type":"string"},"change_txn":{"description":"A unique identifier for all this transaction. It is shared by all\nattribute updates within a change.\n","type":"string","x-example":"1c7b1c5e-1a23-4d04-5cb4-eccea4d5994c"},"change_type":{"description":"Whether the value was added or removed to the object.","enum":["addition","removal"],"type":"string"},"exclude_empty_values":{"description":"If set this will exclude ChangeEntry records that save the addition\nor removal of an empty value.\n","type":"boolean"},"negative_match":{"description":"If set this filter will match the all ChangeEntry records that do\nNOT meet the constraints laid out in this Filter object.\n","type":"boolean"},"object_key":{"description":"An ID uniquely identifying the object being changed.","type":"string","x-example":"9cd24183-f848-48f8-6f55-0f0724070000"},"object_type":{"description":"The name of the object being being altered.","enum":["org","user","zone","proxy","domain","route","shared_rules","cluster"],"type":"string"},"org_key":{"description":"The organization the objects being updated belong to.","type":"string","x-example":"1c7b1c5e-1a23-4d04-5cb4-eccea4d5994c"},"time_range":{"$ref":"#/components/schemas/TimeRange"},"zone_key":{"description":"The zone this object is located in.","type":"string","x-example":"9cd24183-f848-48f8-6f55-0f0724070000"}},"type":"object"},"FilterProducts":{"properties":{"and":{"description":"An array of changelog filters that will be joined via logical AND.","items":{"$ref":"#/components/schemas/Filter"},"type":"array"}},"type":"object"},"FilterSums":{"properties":{"or":{"description":"An array of changelog filters that will be joined via logical OR.","items":{"$ref":"#/components/schemas/FilterProducts"},"type":"array"}},"type":"object"},"HTTPHealthCheck":{"properties":{"host":{"description":"The value of the host header in the HTTP health check request.\nIf left empty, the name of the cluster being health checked\nwill be used.\n","type":"string"},"path":{"description":"Specifies the HTTP path that will be requested during health\nchecking.\n","type":"string"},"request_headers_to_add":{"allOf":[{"$ref":"#/components/schemas/Metadata"}],"description":"Specifies a list of HTTP headers that should be added to each request\nsent to the health checked cluster.\n"},"service_name":{"description":"An optional service name parameter which is used to validate\nthe identity of the health checked cluster.\n","type":"string"}},"type":"object"},"HeaderConstraint":{"description":"Indicates that a request's headers should meet some requirement before being\nselected for a rewrite. Must have zore or one elements.\n","properties":{"case_sensitive":{"description":"If set, the header value check will be case sensitive.","type":"boolean"},"invert":{"description":"If set, the header constraint will succeed if the match described faile.\n","type":"boolean"},"name":{"description":"The header that is being checked. This must match the regexp \"^[0-9a-zA-Z-]+$\".\nThis is checked in a case insensitive manner.\n","type":"string"},"value":{"description":"If set the header's value will be compared to this. The default is to\nmake case insensitive comparisons.\n","type":"string"}},"required":["name"],"type":"object"},"HeaderDatum":{"description":"This describes a HTTP header that should be attached to requests.\n","properties":{"name":{"description":"The name of the header that will be attached to the response sent.\nThis is case insensitive.\n","type":"string"},"value":{"description":"A literal value to send as the header value or a reference to\nsome metadatum value set on the Cluster Intsance that handles\na specific request. If this value is empty after looking up an\nInstance metadatum value no header will be sent.\n","type":"string"},"value_is_literal":{"description":"If true then the value attribute is treated as a literal and no attempt\nto resolve instance metadatum to find a value.\n","type":"boolean"}},"type":"object"},"HealthCheck":{"description":"Configures active health checking for every instance in a cluster.\n","properties":{"health_checker":{"description":"Defines the type of health checker to use. Only a single health\nchecker can be defined per HealthCheck.\n","properties":{"http_health_check":{"$ref":"#/components/schemas/HTTPHealthCheck"},"tcp_health_check":{"$ref":"#/components/schemas/TCPHealthCheck"}},"type":"object"},"healthy_edge_interval_msec":{"description":"Interval used for the first health check right after a host is marked\nas healthy. For subsequent health checks, the proxy will shift back to\nusing the standard health check interval(\\'interval_msec\\') that is\ndefined. Defaults to the same value as \\'interval_msec\\' if not\nspecified.\n","type":"integer"},"healthy_threshold":{"description":"The number of healthy health checks required before a host is marked\nhealthy. Note that during startup, only a single successful health\ncheck is required to mark a host healthy.\n","type":"integer"},"interval_jitter_msec":{"description":"An optional jitter amount that is added to each interval value\ncalculated by the proxy. If not specified, defaults to 0.\n","type":"integer"},"interval_msec":{"description":"The interval between health checks. The first round of health checks\nwill occur during startup before any traffic is routed to a cluster.\nThis means that the \\'no_traffic_interval_msec\\' value will be used as\nthe first interval of health checks.\n","type":"integer"},"no_traffic_interval_msec":{"description":"Interval used when a cluster has never had traffic routed to it. It\nallows cluster information to be kept up to date, without sending a\npotentially large amount of active health checking traffic for no\nreason. Once a cluster has been used for traffic routing, The proxy\nwill shift back to using the standard health check interval that is\ndefined. Note that this interval takes precedence over any other.\nDefaults to 60s.\n","type":"integer"},"reuse_connection":{"description":"Whether or not to reuse health check connections between health checks.\nDefault is true.\n","type":"boolean"},"timeout_msec":{"description":"The time to wait for a health check response. If the timeout is\nreached without a response, the health check attempt will be\nconsidered a failure. This is a required field and must be greater\nthan 0.\n","type":"integer"},"unhealthy_edge_interval_msec":{"description":"Interval used for the first health check right after a host is marked\nas unhealthy. For subsequent health checks, the proxy will shift back\nto using either \\'unhealthy_interval_msec\\' if present or the standard\nhealth check interval, \\'interval_msec\\'.\n","type":"integer"},"unhealthy_interval_msec":{"description":"Interval used for hosts that are marked as unhealthy. As soon as the\nhost is marked as healthy, The proxy will shift back to using the\nstandard health check interval that is defined. This defaults to the\nsame value as \\'interval_msec\\' if not specified.\n","type":"integer"},"unhealthy_threshold":{"description":"The number of unhealthy health checks required before a host is\nmarked unhealthy. Note that for *http* health checking, if a host\nresponds with 503, this threshold is ignored and the host is\nconsidered unhealthy immediately.\n","type":"integer"}},"required":["timeout_msec","interval_msec","unhealthy_threshold","healthy_threshold","health_checker"],"type":"object"},"HealthChecks":{"items":{"$ref":"#/components/schemas/HealthCheck"},"type":"array"},"Instance":{"properties":{"host":{"type":"string"},"metadata":{"$ref":"#/components/schemas/Metadata"},"port":{"type":"integer"}},"type":"object"},"InstanceResult":{"properties":{"result":{"$ref":"#/components/schemas/Instance"}},"type":"object"},"Instances":{"items":{"$ref":"#/components/schemas/Instance"},"type":"array"},"Listener":{"allOf":[{"$ref":"#/components/schemas/ListenerCreate"},{"properties":{"checksum":{"type":"string"},"listener_key":{"type":"string","x-example":"9cd24183-f848-48f8-6f55-0f0724070000"}},"required":["listener_key","zone_key","checksum"],"type":"object"}]},"ListenerCreate":{"properties":{"domain_keys":{"items":{"type":"string"},"type":"array","x-example":["9cd24183-f848-48f8-6f55-0f0724070000","9cd24183-f848-48f8-6f55-0f0724070001"]},"ip":{"description":"the interface this listener should bind to.","type":"string","x-example":"0.0.0.0"},"name":{"type":"string","x-example":"http-web"},"port":{"description":"the port this listener should bind to.","type":"integer","x-example":80},"protocol":{"description":"the protocol this listener will handle. http and http2 configure the listener to only\nprocess requests of that type. http_auto will adapt to HTTP/1.1 and HTTP/2 as needed.\ntcp configures the listener to be a tcp proxy\n","enum":["http","http2","http_auto","tcp"],"type":"string"},"tracing_config":{"$ref":"#/components/schemas/TracingConfig"},"zone_key":{"type":"string"}},"required":["listener_key","name","host","port","protocol"],"type":"object"},"ListenerResult":{"properties":{"result":{"$ref":"#/components/schemas/Listener"}},"type":"object"},"Match":{"description":"Represents a mapping of request attributes to constraints on a cluster\nusing different matching schemes.\n\nCertain combinations of `kind` and `behavior` are not allowed\n  | kind | behavior |\n  | ---- | -------- |\n  | query | regex |\n  | query | range |\n  | cookie | range |\n","properties":{"behavior":{"description":"Defines how a request attribute should be matched. If not specified,\ndefaults to `exact`. Valid values are\n  * exact\n  * regex\n  * range\n  * prefix\n  * suffix\n","type":"string"},"from":{"allOf":[{"$ref":"#/components/schemas/Metadatum"}],"description":"The request attribute key and value to match. `key` must always be\ndefined while `value` can be unspecified (only if behavior is set to\n`exact`) to indicate that all values should be matched. If to.value\nis also unspecified, the matched value of the request will be used as\na constraint on the destination cluster.\n\n\\# Behavior\n  * `regex` if To.Value is unspecified, `value` must contain one and\n  only one subgroup. Otherwise, `value` must not be empty.\n  * `range` `value` must be specified and must be of the format\n  `[start_integer, end_integer)`. Start and end must be valid integer\n  values and `end_integer` must be greater than `start_integer`.\n  * `prefix`/`suffix` `value` must be specified\n\n\\# Kind\n  * `cookie` does not support `range` behavior\n  * `query` does not support `regex` behavior\n"},"kind":{"description":"Defines the attribute by which a request should be matched on. Valid\nvalues are\n  * cookie\n  * header\n  * query (for query parameter)\n","type":"string"},"to":{"allOf":[{"$ref":"#/components/schemas/Metadatum"}],"description":"The constraints on a cluster that a matched request should map to. If\nto.key is specified and to.value is not, the matched from.value will\nbe used as a metadata constraint on instances in the destination\ncluster, keyed by to.key. If using `regex` behavior with multiple\nsubgroups in from.value, variables `$1` through `$n`, where n is the\nnumber of subgroups in the matching regex, can be used to interpolate\ncaptured matches in to.value.\n"}},"type":"object"},"Matches":{"items":{"$ref":"#/components/schemas/Match"},"type":"array"},"Metadata":{"items":{"$ref":"#/components/schemas/Metadatum"},"type":"array"},"Metadatum":{"properties":{"key":{"type":"string"},"value":{"type":"string"}},"type":"object"},"MultiAccessTokens":{"properties":{"result":{"items":{"$ref":"#/components/schemas/AccessToken"},"type":"array"}},"type":"object"},"MultiClusterResult":{"properties":{"result":{"items":{"$ref":"#/components/schemas/Cluster"},"type":"array"}},"type":"object"},"MultiDomainResult":{"properties":{"result":{"items":{"$ref":"#/components/schemas/Domain"},"type":"array"}},"type":"object"},"MultiListenerResult":{"properties":{"result":{"items":{"$ref":"#/components/schemas/Listener"},"type":"array"}},"type":"object"},"MultiProxyResult":{"properties":{"result":{"items":{"$ref":"#/components/schemas/Proxy"},"type":"array"}},"type":"object"},"MultiRouteResult":{"properties":{"result":{"items":{"$ref":"#/components/schemas/Route"},"type":"array"}},"type":"object"},"MultiSharedRulesResult":{"properties":{"result":{"items":{"$ref":"#/components/schemas/SharedRules"},"type":"array"}},"type":"object"},"MultiZoneResult":{"properties":{"result":{"items":{"$ref":"#/components/schemas/Zone"},"type":"array"}},"type":"object"},"OutlierDetection":{"description":"A form of passive health checking that dynamically determines whether\ninstances in a cluster are performing unlike others and preemptively\nremoves them from a load balancing set.\n","properties":{"base_ejection_time_msec":{"description":"The base time that a host is ejected for. The real time is equal to\nthe base time multiplied by the number of times the host has been\nejected. Defaults to 30s. Setting this to 0 means that no host will\nbe ejected for longer than `interval_msec`.\n","type":"integer"},"consecutive_5xx":{"description":"The number of consecutive 5xx responses before a consecutive 5xx ejection\noccurs. Defaults to 5. Setting this to 0 effectively turns off the\nconsecutive 5xx detector.\n","type":"integer"},"consecutive_gateway_failure":{"description":"The number of consecutive gateway failures (502, 503, 504 status or\nconnection errors that are mapped to one of those status codes) before a\nconsecutive gateway failure ejection occurs. Defaults to 5. Setting this\nto 0 effectively turns off the consecutive gateway failure detector.\n","type":"integer"},"enforcing_consecutive_5xx":{"description":"The % chance that a host will be actually ejected when an outlier status\nis detected through consecutive 5xx. This setting can be used to disable\nejection or to ramp it up slowly. Defaults to 100.\n","type":"integer"},"enforcing_consecutive_gateway_failure":{"description":"The % chance that a host will be actually ejected when an outlier status\nis detected through consecutive gateway failures. This setting can be\nused to disable ejection or to ramp it up slowly. Defaults to 0.\n","type":"integer"},"enforcing_success_rate":{"description":"The % chance that a host will be actually ejected when an outlier status\nis detected through success rate statistics. This setting can be used to\ndisable ejection or to ramp it up slowly. Defaults to 100.\n","type":"integer"},"interval_msec":{"description":"The time interval between ejection analysis sweeps. This can result in\nboth new ejections due to success rate outlier detection as well as\nhosts being returned to service. Defaults to 10s and must be greater\nthan 0.\n","type":"integer"},"max_ejection_percent":{"description":"The maximum % of an upstream cluster that can be ejected due to\noutlier detection. Defaults to 10% but will always eject at least one\nhost.\n","type":"integer"},"success_rate_minimum_hosts":{"description":"The number of hosts in a cluster that must have enough request volume to\ndetect success rate outliers. If the number of hosts is less than this\nsetting, outlier detection via success rate statistics is not performed\nfor any host in the cluster. Defaults to 5. Setting this to 0 effectively\ntriggers the success rate detector regardless of the number of valid hosts\nduring an interval (as determined by `success_rate_request_volume`).\n","type":"integer"},"success_rate_request_volume":{"description":"The minimum number of total requests that must be collected in one\ninterval (as defined by interval_msec) to include this host\nin success rate based outlier detection. If the volume is lower than this\nsetting, outlier detection via success rate statistics is not performed\nfor that host. Defaults to 100. Must be greater than 0.\n","type":"integer"},"success_rate_stdev_factor":{"description":"This factor is used to determine the ejection threshold for success rate\noutlier ejection. The ejection threshold is the difference between the\nmean success rate, and the product of this factor and the standard\ndeviation of the mean success rate: mean - (stdev *\nsuccess_rate_stdev_factor). This factor is divided by a thousand to get a\ndouble. That is, if the desired factor is 1.9, the runtime value should\nbe 1900. Defaults to 1900. Setting this to 0 effectively turns off the\nsuccess rate detector.\n","type":"integer"}},"type":"object"},"PageDetails":{"properties":{"direction":{"description":"The direction walked from the ref_id when building this page.","enum":["before","after"],"type":"string"},"has_more":{"description":"Whether or not there are more entries to be requested after this page.","type":"boolean"},"ref_id":{"description":"The ID used as a reference when building this page.","type":"string"},"total_entries":{"description":"How many total entries would have been returned in the time window\nif it had not been paginated.\n","type":"integer"}},"type":"object"},"PaginatedChangeDescriptions":{"properties":{"details":{"$ref":"#/components/schemas/PaginationDetails"},"result":{"items":{"$ref":"#/components/schemas/ChangeDescription"},"type":"array"}},"type":"object"},"PaginationDetails":{"properties":{"pagination":{"$ref":"#/components/schemas/PageDetails"}},"type":"object"},"Proxy":{"allOf":[{"$ref":"#/components/schemas/ProxyCreate"},{"properties":{"checksum":{"type":"string"},"proxy_key":{"type":"string"}},"required":["proxy_key","zone_key","checksum"],"type":"object"}]},"ProxyCreate":{"properties":{"domain_keys":{"items":{"type":"string"},"type":"array"},"listener_keys":{"items":{"type":"string"},"type":"array"},"name":{"type":"string"},"zone_key":{"type":"string"}},"required":["zone_key","name"],"type":"object"},"ProxyFilter":{"properties":{"domain_keys":{"description":"matches Proxies with a superset of the specified domain_keys. A\nslice with a single value of \"-\" will produce Proxies with no linked\nDomains.\n","items":{"type":"string"},"type":"array"},"name":{"type":"string"},"proxy_key":{"type":"string"},"zone_key":{"type":"string"}},"type":"object"},"ProxyResult":{"properties":{"result":{"$ref":"#/components/schemas/Proxy"}},"type":"object"},"Redirect":{"description":"Specifies how a URL within a domain should be rewritten when requested.\n","properties":{"from":{"description":"A regexp that will be matched against the URL (not including the host/port). May include capture groups for reference in \"to.\"","type":"string"},"header_constraints":{"items":{"$ref":"#/components/schemas/HeaderConstraint"},"type":"array"},"name":{"description":"A unique (to this Domain) name for the Redirect. Must match the regexp \"^[0-9a-zA-Z-]+$\"","type":"string"},"redirect_type":{"description":"How this redirect should be presented via HTTP response code.","enum":["permanent","temporary"],"type":"string"},"to":{"description":"The new URL that will be constructed from the request. Capture groups from \"from\" may be referenced as \"$&lt;group number&gt;\" which begins at 1.","type":"string"}},"required":["name","from","to","redirect_type"],"type":"object"},"ResponseData":{"properties":{"cookies":{"items":{"$ref":"#/components/schemas/CookieDatum"},"type":"array"},"headers":{"items":{"$ref":"#/components/schemas/HeaderDatum"},"type":"array"}},"type":"object"},"RetryPolicy":{"description":"Number of times to retry a request and how long to wait before timing out.","properties":{"num_retries":{"description":"Number of times to retry an upstream request. Note that the initial\nconnection attempt is not included in this number, hence 0 means initial\nattempt and no retries, and 1 means initial attempt plus one retry.\n","format":"int64","type":"integer"},"per_try_timeout_msec":{"description":"Time limit in milliseconds for a single attempt.","format":"int64","type":"integer"},"timeout_msec":{"description":"Total time limit in milliseconds for all attempts (including the initial attempt)\n","format":"int64","type":"integer"}},"type":"object"},"Route":{"allOf":[{"$ref":"#/components/schemas/RouteCreate"},{"properties":{"checksum":{"type":"string"},"route_key":{"type":"string"}},"required":["route_key","checksum"],"type":"object"}]},"RouteCreate":{"properties":{"checksum":{"type":"string"},"cohort_seed":{"$ref":"#/components/schemas/CohortSeed"},"domain_key":{"type":"string"},"path":{"type":"string"},"response_data":{"allOf":[{"$ref":"#/components/schemas/ResponseData"}],"description":"When a request is served by this Route annotate the response with the\ninformation specified within this ResponseData object. It's possible\nthat multiple response data configurations will apply; if that's the\ncase then the values from Route take precedence over those from a\nSharedRules object.\n"},"retry_policy":{"$ref":"#/components/schemas/RetryPolicy"},"route_key":{"type":"string"},"rules":{"items":{"$ref":"#/components/schemas/Rule"},"type":"array"},"shared_rules_key":{"type":"string"},"zone_key":{"type":"string"}},"required":["domain_key","zone_key","path","shared_rules_key"],"type":"object"},"RouteFilter":{"properties":{"domain_key":{"type":"string"},"path":{"type":"string"},"path_prefix":{"type":"string"},"route_key":{"type":"string"},"shared_rules_key":{"type":"string"},"zone_key":{"type":"string"}},"type":"object"},"RouteResult":{"properties":{"result":{"$ref":"#/components/schemas/Route"}},"type":"object"},"Rule":{"properties":{"cohort_seed":{"$ref":"#/components/schemas/CohortSeed"},"constraints":{"$ref":"#/components/schemas/AllConstraints"},"matches":{"$ref":"#/components/schemas/Matches"},"methods":{"items":{"type":"string"},"type":"array"},"rule_key":{"type":"string"}},"type":"object"},"SSLConfig":{"description":"Experimental: Specifies whether a domain should support SSL/TLS\nconnections from clients.  If not set the proxy will expect unencrypted HTTP\ntraffic.\n","properties":{"cert_key_pairs":{"description":"SSLConfig must have one cert_key_pairs entry specified.","items":{"$ref":"#/components/schemas/CertKeyPathPair"},"type":"array"},"cipher_filter":{"description":"An OpenSSL compatible filter string indicating the ciphers acceptable\nfor this proxy to use while communicating with clients. The default value\nis EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH. For more information\nsee https://wiki.openssl.org/index.php/Manual:Ciphers(1)\n","type":"string"},"protocols":{"description":"A list of acceptable SSL/TLS protocol. The default values are TLSv1,\nTLSv1.1, TLSv1.2. Additional valid values are SSLv2 and SSLv3.\n","items":{"type":"string"},"type":"array"}},"required":["cert_key_pairs"],"type":"object"},"SharedRules":{"allOf":[{"$ref":"#/components/schemas/SharedRulesCreate"},{"properties":{"checksum":{"type":"string"},"shared_rules_key":{"type":"string"}},"required":["shared_rules_key","checksum"],"type":"object"}]},"SharedRulesCreate":{"properties":{"checksum":{"type":"string"},"cohort_seed":{"$ref":"#/components/schemas/CohortSeed"},"default":{"$ref":"#/components/schemas/AllConstraints"},"properties":{"$ref":"#/components/schemas/Metadata"},"response_data":{"allOf":[{"$ref":"#/components/schemas/ResponseData"}],"description":"When a request is served by a Route that is part of this SharedRules\ngroup the response is annotated with the information specified within\nthis ResponseData object. It's possible that multiple response data\nconfigurations will apply; if that's the case then the values from\nthe applicable Route and ClusterConstarint takes precedence over those\nspecified here.\n"},"retry_policy":{"$ref":"#/components/schemas/RetryPolicy"},"rules":{"items":{"$ref":"#/components/schemas/Rule"},"type":"array"},"shared_rules_key":{"type":"string"},"zone_key":{"type":"string"}},"required":["name","zone_key","default"],"type":"object"},"SharedRulesFilter":{"properties":{"name":{"type":"string"},"shared_rules_key":{"type":"string"},"zone_key":{"type":"string"}},"type":"object"},"SharedRulesResult":{"properties":{"result":{"$ref":"#/components/schemas/SharedRules"}},"type":"object"},"TCPHealthCheck":{"properties":{"receive":{"description":"An array of base64 encoded strings, each representing array of\nbytes that is expected in health check responses. When\nchecking the response, \"fuzzy\" matching is performed such that\neach binary block must be found, and in the order specified,\nbut not necessarily contiguously.\n","items":{"type":"string"},"type":"array"},"send":{"description":"Base64 encoded string representing an array of bytes to be\nsent in health check requests. Leaving this field empty\nimplies a connect-only health check.\n","type":"string"}},"type":"object"},"TimeRange":{"properties":{"end":{"description":"The end of the window we want to see changes for; measured in\nmicroseconds since Unix Epoch.\n","format":"int64","type":"integer"},"start":{"description":"The beginning of the window we want to see changes for; measured in microseconds since Unix Epoch.","format":"int64","type":"integer"}},"type":"object"},"TracingConfig":{"description":"Configures tracing operations to be performed on the given listener\n","properties":{"ingress":{"description":"Determines whether spans sent from this listener should be treated as ingress\nor egress operations.\n","type":"boolean","x-example":true},"request_headers_for_tags":{"description":"the headers specified here will be added to the generated spans as annotations\n","items":{"type":"string"},"type":"array","x-example":["x-forwarded-for","x-user-id"]}},"type":"object"},"User":{"properties":{"checksum":{"type":"string"},"deleted_at":{"description":"A timestamp that marks when a user was deleted. It is in the format\nyyyy-mm-ddThh:mm:ss.SZ. The timezone will always be UTC.\n","type":"string","x-example":"2025-06-15T13:47:09.419Z"},"login_email":{"type":"string"},"user_key":{"type":"string"}},"required":["user_key","login_email","checksum"],"type":"object"},"Zone":{"properties":{"checksum":{"type":"string"},"name":{"type":"string"},"zone_key":{"type":"string"}},"required":["zone_key","name","checksum"],"type":"object"},"ZoneCreate":{"properties":{"name":{"type":"string"}},"required":["name"],"type":"object"},"ZoneFilter":{"properties":{"name":{"type":"string"},"zone_key":{"type":"string"}},"type":"object"},"ZoneResult":{"properties":{"result":{"$ref":"#/components/schemas/Zone"}},"type":"object"}}}}