OpenAPI Specification
Complete OpenAPI 3.0 specification
You're viewing a development version of manager,
the latest released version is v1.4.1
Page not available in that version
The current page OpenAPI Specification doesn't exist in version v1.4.1 of the documentation for this product.
We can take you to the closest parent section instead: /docs/acd/components/manager/v1.4.1/api_guide/
Overview
The CDN Manager API is documented using the OpenAPI 3.0 specification. This appendix provides the complete specification for reference and for generating API clients.
OpenAPI Specification (YAML)
openapi: 3.0.3
info:
title: AgileTV CDN Manager API
version: "1.0"
servers:
- url: https://<manager-host>/api
description: CDN Manager API server
paths:
/v1/auth/login:
post:
summary: Login and create session
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/LoginRequest'
responses:
'200':
description: Session created
content:
application/json:
schema:
$ref: '#/components/schemas/LoginResponse'
'401': { description: Unauthorized, content: { application/json: { schema: { $ref: '#/components/schemas/ErrorResponse' } } } }
'500': { description: Internal error, content: { application/json: { schema: { $ref: '#/components/schemas/ErrorResponse' } } } }
/v1/auth/token:
post:
summary: Exchange session for access token
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TokenRequest'
responses:
'200':
description: Access token
content:
application/json:
schema:
$ref: '#/components/schemas/TokenResponse'
'401': { description: Unauthorized, content: { application/json: { schema: { $ref: '#/components/schemas/ErrorResponse' } } } }
'500': { description: Internal error, content: { application/json: { schema: { $ref: '#/components/schemas/ErrorResponse' } } } }
/v1/auth/logout:
post:
summary: Revoke session
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/LogoutRequest'
responses:
'200': { description: Revoked, content: { application/json: { schema: { $ref: '#/components/schemas/LogoutResponse' } } } }
'401': { description: Unauthorized, content: { application/json: { schema: { $ref: '#/components/schemas/ErrorResponse' } } } }
'500': { description: Internal error, content: { application/json: { schema: { $ref: '#/components/schemas/ErrorResponse' } } } }
/v1/selection_input{tail}:
get:
summary: Read selection input
parameters:
- $ref: '#/components/parameters/Tail'
- $ref: '#/components/parameters/Search'
- $ref: '#/components/parameters/Sort'
- $ref: '#/components/parameters/Limit'
responses:
'200': { description: JSON value }
'400': { description: Bad request, content: { application/json: { schema: { $ref: '#/components/schemas/ErrorResponse' } } } }
'404': { description: Not found }
'500': { description: Backend failure }
post:
summary: Merge selection input
parameters:
- $ref: '#/components/parameters/Tail'
- $ref: '#/components/parameters/Ttl'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AnyJson'
responses:
'201': { description: Created, content: { application/json: { schema: { $ref: '#/components/schemas/AnyJson' } } } }
'500': { description: Backend failure }
'503': { description: Service unavailable }
delete:
summary: Delete selection input
parameters:
- $ref: '#/components/parameters/Tail'
responses:
'204': { description: Deleted }
'503': { description: Service unavailable }
/v2/selection_input{tail}:
get:
summary: Read selection input v2
parameters:
- $ref: '#/components/parameters/TailV2'
- $ref: '#/components/parameters/Search'
responses:
'200': { description: JSON value }
'400': { description: Invalid search pattern }
'404': { description: Not found }
'500': { description: Backend failure }
put:
summary: Replace selection input v2
parameters:
- $ref: '#/components/parameters/TailV2'
- $ref: '#/components/parameters/Ttl'
- $ref: '#/components/parameters/CorrelationId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AnyJson'
responses:
'200': { description: Updated }
'500': { description: Backend failure }
post:
summary: Push to selection input v2
parameters:
- $ref: '#/components/parameters/TailV2'
- $ref: '#/components/parameters/Ttl'
- $ref: '#/components/parameters/CorrelationId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AnyJson'
responses:
'200': { description: Pushed }
'500': { description: Backend failure }
delete:
summary: Delete selection input v2
parameters:
- $ref: '#/components/parameters/TailV2'
responses:
'204': { description: Deleted }
'500': { description: Backend failure }
/v1/configuration:
get:
summary: Read configuration
responses:
'200': { description: Configuration, content: { application/json: { schema: { $ref: '#/components/schemas/AnyJson' } } }, headers: { ETag: { schema: { type: string } } } }
'304': { description: Not modified }
'500': { description: Backend failure }
put:
summary: Replace configuration
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AnyJson'
responses:
'200': { description: Replaced }
'500': { description: Backend failure }
delete:
summary: Delete configuration
responses:
'200': { description: Deleted }
'500': { description: Backend failure }
/v1/routing/geoip:
get:
summary: GeoIP lookup
parameters:
- name: ip
in: query
required: true
schema: { type: string }
responses:
'200': { description: GeoIP data, content: { application/json: { schema: { $ref: '#/components/schemas/GeoIpResponse' } } } }
'400': { description: Invalid IP }
'500': { description: Backend failure }
/v1/routing/validate:
get:
summary: Validate routing
parameters:
- name: ip
in: query
required: true
schema: { type: string }
responses:
'200': { description: Allowed }
'403': { description: Access Denied }
'400': { description: Invalid IP }
'500': { description: Backend failure }
/v1/metrics:
post:
summary: Ingest metrics
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/MetricsIngress'
responses:
'200': { description: Stored }
'500': { description: Validation/back-end error }
get:
summary: Aggregate metrics
responses:
'200': { description: Aggregated metrics, content: { application/json: { schema: { $ref: '#/components/schemas/AnyJson' } } } }
'500': { description: Backend failure }
/v1/discovery/hosts:
get:
summary: List discovered hosts by namespace
responses:
'200':
description: Discovered hosts keyed by namespace
content:
application/json:
schema:
type: object
additionalProperties:
type: array
items:
$ref: '#/components/schemas/DiscoveryHost'
'500': { description: Backend failure }
/v1/discovery/namespaces:
get:
summary: List discovery namespaces with Confd URIs
responses:
'200':
description: Namespaces with Confd links
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/DiscoveryNamespace'
'500': { description: Backend failure }
/v1/datastore:
get:
summary: List datastore keys
responses:
'200': { description: Keys list, content: { application/json: { schema: { type: array, items: { type: string } } } } }
'500': { description: Backend failure }
/v1/datastore/{key}:
get:
summary: Get a JSON value by key
parameters:
- name: key
in: path
required: true
schema: { type: string }
responses:
'200': { description: JSON value, content: { application/json: { schema: { $ref: '#/components/schemas/AnyJson' } } } }
'404': { description: Not found }
'500': { description: Backend failure }
post:
summary: Create a JSON value at key
parameters:
- name: key
in: path
required: true
schema: { type: string }
- $ref: '#/components/parameters/Ttl'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AnyJson'
responses:
'201': { description: Created }
'409': { description: Conflict (already exists) }
'500': { description: Backend failure }
put:
summary: Update/replace a JSON value at key
parameters:
- name: key
in: path
required: true
schema: { type: string }
- $ref: '#/components/parameters/Ttl'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AnyJson'
responses:
'200': { description: Updated }
'404': { description: Not found }
'500': { description: Backend failure }
delete:
summary: Delete a datastore key
parameters:
- name: key
in: path
required: true
schema: { type: string }
responses:
'204': { description: Deleted }
'500': { description: Backend failure }
/v1/subnets:
get:
summary: List all subnet mappings
responses:
'200': { description: Subnet mappings, content: { application/json: { schema: { type: object, additionalProperties: { type: string } } } } }
'500': { description: Backend failure }
put:
summary: Create or update subnet mappings
requestBody:
required: true
content:
application/json:
schema:
type: object
additionalProperties:
type: string
description: Map of CIDR strings to classification values
responses:
'200': { description: Created }
'400': { description: Invalid CIDR format }
'500': { description: Backend failure }
delete:
summary: Delete all subnet mappings
responses:
'204': { description: Deleted }
'500': { description: Backend failure }
/v1/subnets/byKey/{subnet}:
get:
summary: Get subnet mappings by CIDR prefix
parameters:
- name: subnet
in: path
required: true
schema: { type: string }
responses:
'200': { description: Subnet mappings, content: { application/json: { schema: { type: object, additionalProperties: { type: string } } } } }
'500': { description: Backend failure }
delete:
summary: Delete subnet mappings by CIDR prefix
parameters:
- name: subnet
in: path
required: true
schema: { type: string }
responses:
'204': { description: Deleted }
'500': { description: Backend failure }
/v1/subnets/byValue/{value}:
get:
summary: Get subnet mappings by value
parameters:
- name: value
in: path
required: true
schema: { type: string }
responses:
'200': { description: Subnet mappings, content: { application/json: { schema: { type: object, additionalProperties: { type: string } } } } }
'500': { description: Backend failure }
delete:
summary: Delete subnet mappings by value
parameters:
- name: value
in: path
required: true
schema: { type: string }
responses:
'204': { description: Deleted }
'500': { description: Backend failure }
/v1/operator_ui/modules/blocked_tokens:
get:
summary: List blocked tokens
parameters:
- $ref: '#/components/parameters/Search'
- $ref: '#/components/parameters/Sort'
- $ref: '#/components/parameters/Limit'
responses:
'200': { description: Blocked tokens, content: { application/json: { schema: { type: array, items: { $ref: '#/components/schemas/BlockedToken' } } } } }
'400': { description: Parse error, content: { application/json: { schema: { $ref: '#/components/schemas/ErrorResponse' } } } }
/v1/operator_ui/modules/blocked_tokens/{token}:
get:
summary: Get blocked token
parameters:
- name: token
in: path
required: true
schema: { type: string }
responses:
'200': { description: Blocked token, content: { application/json: { schema: { $ref: '#/components/schemas/BlockedToken' } } } }
'404': { description: Not found }
'400': { description: Parse error, content: { application/json: { schema: { $ref: '#/components/schemas/ErrorResponse' } } } }
/v1/operator_ui/modules/blocked_user_agents:
get:
summary: List blocked user agents
parameters:
- $ref: '#/components/parameters/Search'
- $ref: '#/components/parameters/Sort'
- $ref: '#/components/parameters/Limit'
responses:
'200': { description: Blocked user agents, content: { application/json: { schema: { type: array, items: { $ref: '#/components/schemas/BlockedUserAgent' } } } } }
'400': { description: Parse error, content: { application/json: { schema: { $ref: '#/components/schemas/ErrorResponse' } } } }
/v1/operator_ui/modules/blocked_user_agents/{encoded}:
get:
summary: Get blocked user agent
parameters:
- name: encoded
in: path
required: true
schema: { type: string }
responses:
'200': { description: Blocked user agent, content: { application/json: { schema: { $ref: '#/components/schemas/BlockedUserAgent' } } } }
'400': { description: Parse error, content: { application/json: { schema: { $ref: '#/components/schemas/ErrorResponse' } } } }
/v1/operator_ui/modules/blocked_referrers:
get:
summary: List blocked referrers
parameters:
- $ref: '#/components/parameters/Search'
- $ref: '#/components/parameters/Sort'
- $ref: '#/components/parameters/Limit'
responses:
'200': { description: Blocked referrers, content: { application/json: { schema: { type: array, items: { $ref: '#/components/schemas/BlockedReferrer' } } } } }
'400': { description: Parse error, content: { application/json: { schema: { $ref: '#/components/schemas/ErrorResponse' } } } }
/v1/operator_ui/modules/blocked_referrers/{encoded}:
get:
summary: Get blocked referrer
parameters:
- name: encoded
in: path
required: true
schema: { type: string }
responses:
'200': { description: Blocked referrer, content: { application/json: { schema: { $ref: '#/components/schemas/BlockedReferrer' } } } }
'400': { description: Parse error, content: { application/json: { schema: { $ref: '#/components/schemas/ErrorResponse' } } } }
/v1/health/alive:
get:
summary: Liveness check
responses:
'200': { description: Alive, content: { application/json: { schema: { $ref: '#/components/schemas/HealthStatus' } } } }
/v1/health/ready:
get:
summary: Readiness check
responses:
'200': { description: Ready, content: { application/json: { schema: { $ref: '#/components/schemas/HealthStatus' } } } }
'503': { description: Unready, content: { application/json: { schema: { $ref: '#/components/schemas/HealthStatus' } } } }
components:
parameters:
Tail:
name: tail
in: path
required: true
schema: { type: string }
TailV2:
name: tail
in: path
required: true
schema: { type: string }
Search:
name: search
in: query
required: false
schema: { type: string }
Sort:
name: sort
in: query
required: false
schema: { type: string, enum: [asc, desc] }
Limit:
name: limit
in: query
required: false
schema: { type: integer, minimum: 1 }
Ttl:
name: ttl
in: query
required: false
schema: { type: string, description: Humantime duration }
CorrelationId:
name: correlation_id
in: query
required: false
schema: { type: string }
schemas:
LoginRequest:
type: object
required: [email, password]
properties:
email: { type: string, format: email }
password: { type: string, format: password }
LoginResponse:
type: object
properties:
session_id: { type: string }
session_token: { type: string }
verified_at: { type: string, format: date-time }
expires_at: { type: string, format: date-time }
LogoutRequest:
type: object
required: [session_id]
properties:
session_id: { type: string }
session_token: { type: string }
LogoutResponse:
type: object
properties:
status: { $ref: '#/components/schemas/StatusValue' }
TokenRequest:
type: object
required: [session_id, session_token, grant_type]
properties:
session_id: { type: string }
session_token: { type: string }
scope: { type: string }
grant_type: { type: string, enum: [session] }
TokenResponse:
type: object
required: [access_token, scope, expires_in, token_type]
properties:
access_token: { type: string }
scope: { type: string }
expires_in: { type: integer, format: int64 }
token_type: { type: string, enum: [bearer] }
ErrorResponse:
type: object
properties:
message: { type: string }
AnyJson:
description: Arbitrary JSON value
MetricsIngress:
type: object
additionalProperties:
type: object
additionalProperties: { type: number }
GeoIpResponse:
type: object
properties:
city:
type: object
properties:
name: { type: string }
asn: { type: integer }
is_anonymous: { type: boolean }
BlockedToken:
type: object
properties:
household_token: { type: string }
expire_time: { type: integer, format: int64 }
BlockedUserAgent:
type: object
properties:
user_agent: { type: string }
BlockedReferrer:
type: object
properties:
referrer: { type: string }
DiscoveryHost:
type: object
properties:
name: { type: string }
DiscoveryNamespace:
type: object
properties:
namespace: { type: string }
confd_uri: { type: string }
HealthStatus:
type: object
properties:
status: { $ref: '#/components/schemas/StatusValue' }
StatusValue:
type: string
enum: [Ok, Fail]
Using the OpenAPI Specification
Generating API Clients
The OpenAPI specification can be used to generate client libraries in multiple languages:
Using openapi-generator:
# Generate Python client
openapi-generator generate -i openapi.yaml -g python -o ./python-client
# Generate TypeScript client
openapi-generator generate -i openapi.yaml -g typescript-axios -o ./typescript-client
# Generate Go client
openapi-generator generate -i openapi.yaml -g go -o ./go-client
Using swagger-codegen:
swagger-codegen generate -i openapi.yaml -l python -o ./python-client
Validating the Specification
To validate the OpenAPI specification:
# Using swagger-cli
swagger-cli validate openapi.yaml
# Using spectral
spectral lint openapi.yaml
Next Steps
- Authentication API - Detailed authentication flow
- API Guide Index - Browse all API documentation
- Operations Guide - Day-to-day operational procedures