openapi: 3.1.0 info: title: Time-addressable Media Store description: | The Time-addressable Media Store (TAMS) is used for storing segmented media flows. The TAMS consists of a media store for the media flow segment objects and a service providing a database index of the flow segments. This document is a specification of the service API. See the [bbc/tams](https://github.com/bbc/tams) repository for more background on TAMS. **Note**: the examples provided in this specification are for a system which uses a media store that provides HTTP URLs for uploading and downloading media objects in buckets. This could for example be implemented using an AWS S3 compatible store using presigned URLs or by a simple file system storage with an HTTP frontend. Clients should parse the /service endpoint and handle the media store type in use appropriately. version: '6.0' contact: name: BBC R&D - Cloud-Fit Production Team email: cloudfit-opensource@rd.bbc.co.uk url: https://github.com/bbc/tams license: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0 servers: - url: http://localhost:4010 description: Local mock of API - url: https://example.com/tams/{version} description: Example TAMS service variables: version: description: API version default: v6.0 security: - {} - basic_auth: [] - bearer_token_auth: [] paths: /: head: summary: List Root Endpoints description: Return root path headers operationId: HEAD_root tags: - Service responses: '200': $ref: '#/components/responses/trait_resource_listing_head_200' get: summary: List Root Endpoints description: List of paths available from this API. operationId: GET_root tags: - Service responses: '200': description: '' content: application/json: schema: example: - service - flows - sources - flow-delete-requests /service: head: summary: Service Information description: Return service path headers operationId: HEAD_service tags: - Service responses: '200': $ref: '#/components/responses/trait_resource_listing_head_200' get: summary: Service Information description: Provide information about the service, including the media store in use. operationId: GET_service tags: - Service responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/service' example: $ref: examples/service-get-200.json post: summary: Update Service Information description: Update the service info. operationId: POST_service tags: - Service requestBody: content: application/json: example: $ref: examples/service-post.json schema: $ref: '#/components/schemas/servicepost' required: true responses: '200': description: Success. The service info has been updated. '400': description: Bad request. Invalid service JSON. /service/webhooks: head: summary: List Webhook URLs description: Return webhooks path headers operationId: HEAD_webhooks tags: - Webhooks responses: '200': $ref: '#/components/responses/trait_resource_listing_head_200' '404': description: Webhooks are not supported by this API implementation get: summary: List Webhook URLs description: | Get the list of registered webhook URLs. Implementations SHOULD take steps to avoid displaying URLs to users other than those who have suitable permissions (e.g. the owning user). Availability of this endpoint is indicated by the name "webhooks" appearing in the `event_stream_mechanisms` list on the service endpoint. operationId: GET_webhooks tags: - Webhooks responses: '200': description: Return the list of known webhook URLs. Note that the `api_key_value` will be omitted. content: application/json: example: - url: https://hook.example.com api_key_name: Authorization events: - flows/created - flows/updated - flows/deleted schema: type: array items: $ref: '#/components/schemas/webhook' '404': description: Webhooks are not supported by this API implementation post: summary: Register Webhook URL description: | Register to receive event notifications as webhooks on a specified URL. Webhook messages will conform to the format in the `webhooks` section of the API docs, depending on the event type (as defined in the same section). Availability of this endpoint is indicated by the name "webhooks" appearing in the `event_stream_mechanisms` list on the service endpoint. Making a POST request to this endpoint with the same URL, API key name and value but a different list of `events` SHOULD update the existing registration. POSTing an empty list of events SHOULD remove the registration. HTTP requests from the service SHOULD include a `api_key_name` header with the 'api_key_value' value. Clients SHOULD verify this against the value they provided when registering the webhook. API implementations MAY partially support event filtering and transformations. API implementations SHALL return a 400 response code if the filtering or transformation specified in the request is not supported. API implementations SHOULD consider the security implementations of providing webhooks, and include appropriate mitigations against Server Side Request Forgery (SSRF) attacks and similar. operationId: POST_webhooks tags: - Webhooks requestBody: content: application/json: example: url: https://hook.example.com api_key_name: Authorization api_key_value: Bearer 21238dksdjqwpqscj9 events: - flows/created - flows/updated schema: $ref: '#/components/schemas/webhookpost' required: true responses: '201': description: Success. The webhook has been registered or updated '204': description: Success. The webhook has been removed '400': description: Bad request. Invalid parameters or unsupported event filtering or transformation. '404': description: Webhooks are not supported by this API implementation /sources: head: summary: List Sources description: Return Sources path headers operationId: HEAD_sources tags: - Sources parameters: - name: label in: query description: Filter on Sources that have the given label. schema: type: string - name: tag.{name} in: query description: | Filter on Sources that have a tag named {name} and with the given value. The {name} could contain escaped characters to allow it to be used in a URL. schema: type: string - name: tag_exists.{name} in: query description: | Filter on Sources that have a tag named {name} regardless of value. The {name} could contain escaped characters to allow it to be used in a URL. If set to true then the presence of the tag is filtered for. If set to false then its absence is. If left out then no filtering on tag presence is performed. schema: type: boolean - name: format in: query description: Filter on source format. schema: $ref: '#/components/schemas/contentformat' - $ref: '#/components/parameters/trait_resource_paged_key' - $ref: '#/components/parameters/trait_paged_limit' responses: '200': description: '' headers: Link: description: Provides references to cursors for paging. Only the 'rel' attribute with value 'next' and a link to the next page is currently supported. If 'next' is not present then it is the last page. schema: type: string X-Paging-Limit: description: Identifies the current limit being used for paging. This may not match the requested value if the requested value was too high for the implementation schema: type: integer X-Paging-NextKey: description: Opaque string that can be supplied to the `page` query parameter to get the next page of results. schema: type: string content: application/json: schema: type: string '400': $ref: '#/components/responses/trait_resource_info_head_400' get: summary: List Sources description: List the Sources registered in the store and their details. operationId: GET_sources tags: - Sources parameters: - name: label in: query description: Filter on Sources that have the given label. schema: type: string - name: tag.{name} in: query description: | Filter on Sources that have a tag named {name} and with the given value. The {name} could contain escaped characters to allow it to be used in a URL. schema: type: string - name: tag_exists.{name} in: query description: | Filter on Sources that have a tag named {name} regardless of value. The {name} could contain escaped characters to allow it to be used in a URL. If set to true then the presence of the tag is filtered for. If set to false then its absence is. If left out then no filtering on tag presence is performed. schema: type: boolean - name: format in: query description: Filter on source format. schema: $ref: '#/components/schemas/contentformat' - $ref: '#/components/parameters/trait_resource_paged_key' - $ref: '#/components/parameters/trait_paged_limit' responses: '200': description: '' headers: Link: description: Provides references to cursors for paging. Only the 'rel' attribute with value 'next' and a link to the next page is currently supported. If 'next' is not present then it is the last page. schema: type: string X-Paging-Limit: description: Identifies the current limit being used for paging. This may not match the requested value if the requested value was too high for the implementation schema: type: integer X-Paging-NextKey: description: Opaque string that can be supplied to the `page` query parameter to get the next page of results. schema: type: string content: application/json: example: $ref: examples/sources-get-200.json schema: type: array items: $ref: '#/components/schemas/source' '400': description: Bad request. Invalid query options. /sources/{sourceId}: parameters: - name: sourceId in: path required: true schema: $ref: '#/components/schemas/uuid' description: The Source identifier. head: summary: Source Details description: Return Source headers operationId: HEAD_sources-sourceId tags: - Sources responses: '200': $ref: '#/components/responses/trait_resource_info_head_200' '404': $ref: '#/components/responses/trait_resource_info_head_404' get: summary: Source Details description: Returns Source metadata. operationId: GET_sources-sourceId tags: - Sources responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/source' examples: basic: summary: Source containing elemental video value: $ref: examples/source-get-200-basic.json multi: summary: Multi-essence Source description: Multi-essence Sources collect multiple Sources of different formats under one Source ID. value: $ref: examples/source-get-200-multi.json '404': description: The requested Source does not exist. /sources/{sourceId}/tags: parameters: - name: sourceId in: path required: true schema: $ref: '#/components/schemas/uuid' description: The Source identifier. head: summary: List Source Tags description: Return Source tags path headers operationId: HEAD_sources-sourceId-tags tags: - Sources responses: '200': $ref: '#/components/responses/trait_resource_listing_head_200' '404': description: The requested Source does not exist. get: summary: List Source Tags description: Returns the Source tags. operationId: GET_sources-sourceId-tags tags: - Sources responses: '200': description: '' content: application/json: example: ingested_by: ingest_service_api schema: $ref: '#/components/schemas/tags' '404': description: The requested Source does not exist. /sources/{sourceId}/tags/{name}: parameters: - name: name in: path required: true schema: type: string description: The tag name. - name: sourceId in: path required: true schema: $ref: '#/components/schemas/uuid' description: The Source identifier. head: summary: Source Tag Value description: Return Source tag path headers operationId: HEAD_sources-sourceId-tags-name tags: - Sources responses: '200': $ref: '#/components/responses/trait_resource_info_head_200' '404': description: The requested Source or tag does not exist. get: summary: Source Tag Value description: Return the tag value associated with the tag name. operationId: GET_sources-sourceId-tags-name tags: - Sources responses: '200': description: '' content: application/json: example: | "ingest_service_api" schema: type: string '404': description: The requested Source or tag does not exist. put: summary: Create or Update Source Tag description: Create or update the Source tag operationId: PUT_sources-sourceId-tags-name tags: - Sources requestBody: content: application/json: example: | "new_value" schema: type: string required: true responses: '204': description: No content. The tag has been created or updated. '400': description: Bad request. Invalid Source tag value. '404': description: The requested Source does not exist, or the tag name in the path is invalid. delete: summary: Delete Source Tag description: Delete a specific tag on a Source operationId: DELETE_sources-sourceId-tags-name tags: - Sources responses: '204': description: No content. The Source tag has been deleted. '404': description: The requested Source ID or tag in the path is invalid. /sources/{sourceId}/description: parameters: - name: sourceId in: path required: true schema: $ref: '#/components/schemas/uuid' description: The Source identifier. head: summary: Source Description description: Return Source description path headers operationId: HEAD_sources-sourceId-description tags: - Sources responses: '200': $ref: '#/components/responses/trait_resource_info_head_200' '404': $ref: '#/components/responses/trait_resource_info_head_404' get: summary: Source Description description: Returns the Source description property. operationId: GET_sources-sourceId-description tags: - Sources responses: '200': description: '' content: application/json: example: | "Big Buck Bunny" schema: type: string '404': description: The requested Source does not exist. put: summary: Create or Update Source Description description: Create or update the description property. operationId: PUT_sources-sourceId-description tags: - Sources requestBody: content: application/json: example: | "Big Buck Bunny Movie" schema: type: string required: true responses: '204': description: No content. The description has been created or updated. '400': description: Bad request. Invalid Source description. '404': description: The requested Source does not exist. delete: summary: Delete Source Description description: Delete the description property. operationId: DELETE_sources-sourceId-description tags: - Sources responses: '204': description: No content. The Source description property has been deleted. '404': description: The Source ID in the path is invalid. /sources/{sourceId}/label: parameters: - name: sourceId in: path required: true schema: $ref: '#/components/schemas/uuid' description: The Source identifier. head: summary: Source Label description: Return Source label path headers operationId: HEAD_sources-sourceId-label tags: - Sources responses: '200': $ref: '#/components/responses/trait_resource_info_head_200' '404': description: The requested Source does not exist, or does not have a label set. get: summary: Source Label description: Returns the Source label property. operationId: GET_sources-sourceId-label tags: - Sources responses: '200': description: '' content: application/json: example: | "Big Buck Bunny" schema: type: string '404': description: The requested Source does not exist, or does not have a label set. put: summary: Create or Update Source Label description: Create or update the label property. operationId: PUT_sources-sourceId-label tags: - Sources requestBody: content: application/json: example: | "Big Buck Bunny Movie" schema: type: string required: true responses: '204': description: No content. The label has been created or updated. '400': description: Bad request. Invalid Source label. '404': description: The requested Source does not exist. delete: summary: Delete Source Label description: Delete the label property. operationId: DELETE_sources-sourceId-label tags: - Sources responses: '204': description: No content. The Source label property has been deleted. '404': description: The requested Source ID in the path is invalid. /flows: head: summary: List Flows description: Return flows path headers operationId: HEAD_flows tags: - Flows parameters: - name: source_id in: query description: Filter on source identifier. schema: $ref: '#/components/schemas/uuid' - name: timerange in: query description: Filter on flows that overlap the given timerange. schema: default: _ $ref: '#/components/schemas/timerange' - name: format in: query description: Filter on flow format. schema: $ref: '#/components/schemas/contentformat' - name: codec in: query description: Filter on flow codec. schema: $ref: '#/components/schemas/mimetype' - name: label in: query description: Filter on flows that have the given label. schema: type: string - name: tag.{name} in: query description: | Filter on flows that have a tag named {name} and with the given value. The {name} could contain escaped characters to allow it to be used in a URL. schema: type: string - name: tag_exists.{name} in: query description: | Filter on flows that have a tag named {name} regardless of value. The {name} could contain escaped characters to allow it to be used in a URL. If set to true then the presence of the tag is filtered for. If set to false then its absence is. If left out then no filtering on tag presence is performed. schema: type: boolean - name: frame_width in: query description: Filter on video flows that have the given frame width. schema: type: integer - name: frame_height in: query description: Filter on video flows that have the given frame height. schema: type: integer - $ref: '#/components/parameters/trait_resource_paged_key' - $ref: '#/components/parameters/trait_paged_limit' responses: '200': description: '' headers: Link: description: Provides references to cursors for paging. Only the 'rel' attribute with value 'next' and a link to the next page is currently supported. If 'next' is not present then it is the last page. schema: type: string X-Paging-Limit: description: Identifies the current limit being used for paging. This may not match the requested value if the requested value was too high for the implementation schema: type: integer X-Paging-NextKey: description: Opaque string that can be supplied to the `page` query parameter to get the next page of results. schema: type: string content: application/json: schema: type: string '400': description: Bad request. Invalid query options. get: summary: List Flows description: List the flows registered in the store. operationId: GET_flows tags: - Flows parameters: - name: source_id in: query description: Filter on source identifier. schema: $ref: '#/components/schemas/uuid' - name: timerange in: query description: Filter on flows that overlap the given timerange. An empty timerange returns flows with no content. schema: default: _ $ref: '#/components/schemas/timerange' - name: format in: query description: Filter on flow format. schema: $ref: '#/components/schemas/contentformat' - name: codec in: query description: Filter on flow codec. schema: $ref: '#/components/schemas/mimetype' - name: label in: query description: Filter on flows that have the given label. schema: type: string - name: tag.{name} in: query description: | Filter on flows that have a tag named {name} and with the given value. The {name} could contain escaped characters to allow it to be used in a URL. schema: type: string - name: tag_exists.{name} in: query description: | Filter on flows that have a tag named {name} regardless of value. The {name} could contain escaped characters to allow it to be used in a URL. If set to true then the presence of the tag is filtered for. If set to false then its absence is. If left out then no filtering on tag presence is performed. schema: type: boolean - name: frame_width in: query description: Filter on video flows that have the given frame width. schema: type: integer - name: frame_height in: query description: Filter on video flows that have the given frame height. schema: type: integer - $ref: '#/components/parameters/trait_resource_paged_key' - $ref: '#/components/parameters/trait_paged_limit' responses: '200': description: '' headers: Link: description: Provides references to cursors for paging. Only the 'rel' attribute with value 'next' and a link to the next page is currently supported. If 'next' is not present then it is the last page. schema: type: string X-Paging-Limit: description: Identifies the current limit being used for paging. This may not match the requested value if the requested value was too high for the implementation schema: type: integer X-Paging-NextKey: description: Opaque string that can be supplied to the `page` query parameter to get the next page of results. schema: type: string content: application/json: example: $ref: examples/flows-get-200.json schema: type: array items: $ref: '#/components/schemas/flow' '400': description: Bad request. Invalid query options. /flows/{flowId}: parameters: - name: flowId in: path required: true schema: $ref: '#/components/schemas/uuid' description: The flow identifier. head: summary: Flow Details description: Return flow path headers operationId: HEAD_flows-flowId tags: - Flows parameters: - name: include_timerange in: query description: Include the available segment timerange in the response. schema: default: false type: boolean - name: timerange in: query description: Limit the returned available segment timerange to this timerange. schema: default: _ $ref: '#/components/schemas/timerange' responses: '200': $ref: '#/components/responses/trait_resource_info_head_200' '400': description: Bad request. Invalid query options. '404': $ref: '#/components/responses/trait_resource_info_head_404' get: summary: Flow Details description: Returns flow metadata. operationId: GET_flows-flowId tags: - Flows parameters: - name: include_timerange in: query description: Include the available segment timerange in the response. schema: default: false type: boolean - name: timerange in: query description: Limit the returned available segment timerange to this timerange. schema: default: _ $ref: '#/components/schemas/timerange' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/flow' examples: video: summary: Video Flow - H.264 Codec value: $ref: examples/flow-get-200-video-h264.json audio: summary: Audio Flow - AAC Codec value: $ref: examples/flow-get-200-audio-aac.json rawvideo: summary: Video Flow - Uncompressed (Quicktime) value: $ref: examples/flow-get-200-video-raw.json ttml: summary: Data Flow - TTML description: TAMS can also be used for storing non-AV content such as subtitles or event data value: $ref: examples/flow-get-200-data-ttml.json multi: summary: Multi-essence Flow description: Multi-essence Flows are used to collect multiple Flows of different formats under one Flow ID value: $ref: examples/flow-get-200-multi.json multi-container-map: summary: Multi-essence Flow with a container map description: | Multi-essence Flows are used to collect multiple Flows of different formats under one Flow ID. The collection has container maps for the audio Flows as there are 2 audio tracks in the container. value: $ref: examples/flow-get-200-multi-container-map.json audio-multi: summary: Audio Flow in a multi-essence Flow description: | The audio Flow does not have a container property as the media is accessed via the multi-essence Flow value: $ref: examples/flow-get-200-audio-aac-multi.json '404': description: The requested flow does not exist. '400': description: Bad request. Invalid query options. put: summary: Create or Replace Flow description: Create or replace the flow metadata. operationId: PUT_flows-flowId tags: - Flows requestBody: content: application/json: examples: audio: summary: Stereo audio Flow value: $ref: examples/flow-put.json multi: summary: Multi-essence Flow value: $ref: examples/flow-put-multi.json schema: $ref: '#/components/schemas/flow' required: true responses: '201': description: The flow has been created. content: application/json: example: $ref: examples/flow-put-201.json schema: $ref: '#/components/schemas/flow' '204': description: No content. The flow has been updated. '400': description: Bad request. Invalid flow JSON. '403': description: Forbidden. You do not have permission to modify this flow. It may be marked read-only. '404': description: The requested Flow ID in the path is invalid. delete: summary: Delete Flow description: | Deletes the flow and associated segments. If flow segment deletion takes too long then this request will return 202 Accepted and the `Location` header will point to a Flow Delete Request to monitor deletion progress operationId: DELETE_flows-flowId tags: - Flows responses: '202': description: This request has taken longer than the configured timeout, and will continue asynchronously headers: Location: schema: type: string example: /flow-delete-request/{request-id} content: application/json: schema: $ref: '#/components/schemas/deletionrequest' example: $ref: examples/deletion-request-get-200.json '204': description: No content. The flow has been deleted and the flow segments have been or will be deleted. '403': description: Forbidden. You do not have permission to modify this flow. It may be marked read-only. '404': description: The requested Flow ID in the path is invalid. /flows/{flowId}/tags: parameters: - name: flowId in: path required: true schema: $ref: '#/components/schemas/uuid' description: The flow identifier. head: summary: List Flow Tags description: Return flow tags path headers operationId: HEAD_flows-flowId-tags tags: - Flows responses: '200': $ref: '#/components/responses/trait_resource_listing_head_200' '404': description: The requested flow does not exist. get: summary: List Flow Tags description: Returns the flow tags. operationId: GET_flows-flowId-tags tags: - Flows responses: '200': description: '' content: application/json: example: $ref: examples/flow-tags-get-200.json schema: $ref: '#/components/schemas/tags' '404': description: The requested flow does not exist. /flows/{flowId}/tags/{name}: parameters: - name: name in: path required: true schema: type: string description: The tag name. - name: flowId in: path required: true schema: $ref: '#/components/schemas/uuid' description: The flow identifier. head: summary: Flow Tag Value description: Return flow tag path headers operationId: HEAD_flows-flowId-tags-name tags: - Flows responses: '200': $ref: '#/components/responses/trait_resource_info_head_200' '404': description: The requested flow or tag does not exist. get: summary: Flow Tag Value description: Return the tag value associated with the tag name. operationId: GET_flows-flowId-tags-name tags: - Flows responses: '200': description: '' content: application/json: example: | "full" schema: type: string '404': description: The requested flow or tag does not exist. put: summary: Create or Update Flow Tag description: Create or update the tag. operationId: PUT_flows-flowId-tags-name tags: - Flows requestBody: content: application/json: example: | "proxy" schema: type: string required: true responses: '204': description: No content. The tag has been created or updated. '400': description: Bad request. Invalid flow tag value. '403': description: Forbidden. You do not have permission to modify this flow. It may be marked read-only. '404': description: The requested flow does not exist. delete: summary: Delete Flow Tag description: Delete the tag. operationId: DELETE_flows-flowId-tags-name tags: - Flows responses: '204': description: No content. The flow tag has been deleted. '403': description: Forbidden. You do not have permission to modify this flow. It may be marked read-only. '404': description: The requested flow ID in the path is invalid. /flows/{flowId}/description: parameters: - name: flowId in: path required: true schema: $ref: '#/components/schemas/uuid' description: The flow identifier. head: summary: Flow Description description: Return flow description path headers operationId: HEAD_flows-flowId-description tags: - Flows responses: '200': $ref: '#/components/responses/trait_resource_info_head_200' '404': $ref: '#/components/responses/trait_resource_info_head_404' get: summary: Flow Description description: Returns the flow description property. operationId: GET_flows-flowId-description tags: - Flows responses: '200': description: '' content: application/json: example: | "video capture" schema: type: string '404': description: The requested flow does not exist. put: summary: Create or Update Flow Description description: Create or update the description property. operationId: PUT_flows-flowId-description tags: - Flows requestBody: content: application/json: example: | "Big Buck Bunny video-only capture" schema: type: string required: true responses: '204': description: No content. The description has been created or updated. '400': description: Bad request. Invalid flow description. '403': description: Forbidden. You do not have permission to modify this flow. It may be marked read-only. '404': description: The requested flow does not exist. delete: summary: Delete Flow Description description: Delete the description property. operationId: DELETE_flows-flowId-description tags: - Flows responses: '204': description: No content. The flow description property has been deleted. '403': description: Forbidden. You do not have permission to modify this flow. It may be marked read-only. '404': description: The requested flow ID in the path is invalid. /flows/{flowId}/label: parameters: - name: flowId in: path required: true schema: $ref: '#/components/schemas/uuid' description: The flow identifier. head: summary: Flow Label description: Return Flow label path headers operationId: HEAD_flows-flowId-label tags: - Flows responses: '200': $ref: '#/components/responses/trait_resource_info_head_200' '404': description: The requested Flow does not exist, or does not have a label set. get: summary: Flow Label description: Returns the Flow label property. operationId: GET_flows-flowId-label tags: - Flows responses: '200': description: '' content: application/json: example: | "Big Buck Bunny" schema: type: string '404': description: The requested Flow does not exist, or does not have a label set. put: summary: Create or Update Flow Label description: Create or update the label property. operationId: PUT_flows-flowId-label tags: - Flows requestBody: content: application/json: example: | "Big Buck Bunny Movie" schema: type: string required: true responses: '204': description: No content. The label has been created or updated. '400': description: Bad request. Invalid Flow label. '403': description: Forbidden. You do not have permission to modify this flow. It may be marked read-only. '404': description: The requested Flow does not exist. delete: summary: Delete Flow Label description: Delete the label property. operationId: DELETE_flows-flowId-label tags: - Flows responses: '204': description: No content. The Flow label property has been deleted. '404': description: The requested Flow ID in the path is invalid. /flows/{flowId}/read_only: parameters: - name: flowId in: path required: true schema: $ref: '#/components/schemas/uuid' description: The flow identifier. head: summary: Flow Read-Only description: Return flow read_only path headers operationId: HEAD_flows-flowId-read-only tags: - Flows responses: '200': $ref: '#/components/responses/trait_resource_info_head_200' '404': $ref: '#/components/responses/trait_resource_info_head_404' get: summary: Flow Read-Only description: Returns the flow read_only property. operationId: GET_flows-flowId-read-only tags: - Flows responses: '200': description: '' content: application/json: example: true schema: type: boolean '404': description: The requested flow does not exist. put: summary: Set Flow Read-Only description: Set the read-only property. operationId: PUT_flows-flowId-read-only tags: - Flows requestBody: content: application/json: example: true schema: type: boolean required: true responses: '204': description: No content. The read_only property has been set to the given value. '400': description: Bad request. Invalid flow read_only value. Value must be boolean. '404': description: The requested flow does not exist. /flows/{flowId}/flow_collection: parameters: - name: flowId in: path required: true schema: $ref: '#/components/schemas/uuid' description: The flow identifier. head: summary: Flow Collection description: Returns the flow collection path headers operationId: HEAD_flows-flowId-flow-collection tags: - Flows responses: '200': $ref: '#/components/responses/trait_resource_info_head_200' '404': $ref: '#/components/responses/trait_resource_info_head_404' get: summary: Flow Collection description: Returns the flow collection property. operationId: GET_flows-flowId-flow-collection tags: - Flows responses: '200': description: '' content: application/json: example: $ref: examples/flow-collection-get-200.json schema: $ref: '#/components/schemas/flowcollection' '404': description: The requested flow does not exist. put: summary: Create or Update Flow Collection description: Create or update the flow collection property. operationId: PUT_flows-flowId-flow-collection tags: - Flows requestBody: content: application/json: example: $ref: examples/flow-collection-put.json schema: $ref: '#/components/schemas/flowcollection' required: true responses: '204': description: No content. The flow collection has been created or updated. '400': description: Bad request. Invalid flow collection. '403': description: Forbidden. You do not have permission to modify this flow. It may be marked read-only. '404': description: The requested flow does not exist. delete: summary: Delete Flow Collection description: Delete the flow collection property. operationId: DELETE_flows-flowId-flow-collection tags: - Flows responses: '204': description: No content. The flow collection property has been deleted. '403': description: Forbidden. You do not have permission to modify this flow. It may be marked read-only. '404': description: The requested flow ID in the path is invalid. /flows/{flowId}/max_bit_rate: parameters: - name: flowId in: path required: true schema: $ref: '#/components/schemas/uuid' description: The flow identifier. head: summary: Flow Maximum Bit Rate description: Returns the flow max bit rate path headers operationId: HEAD_flows-flowId-max-bit-rate tags: - Flows responses: '200': $ref: '#/components/responses/trait_resource_info_head_200' '404': $ref: '#/components/responses/trait_resource_info_head_404' get: summary: Flow Maximum Bit Rate description: Returns the flow max bit rate property. operationId: GET_flows-flowId-max-bit-rate tags: - Flows responses: '200': description: '' content: application/json: example: 5000 schema: type: integer minimum: 0 '404': description: The requested flow does not exist. put: summary: Create or Update Flow Maximum Bit Rate description: Create or update the max bit rate property. operationId: PUT_flows-flowId-max-bit-rate tags: - Flows requestBody: content: application/json: example: 5000 schema: type: integer minimum: 0 required: true responses: '204': description: No content. The max bit rate has been created or updated. '400': description: Bad request. Invalid flow max bit rate. '403': description: Forbidden. You do not have permission to modify this flow. It may be marked read-only. '404': description: The requested flow does not exist. delete: summary: Delete Flow Maximum Bit Rate description: Delete the flow max bit rate property. operationId: DELETE_flows-flowId-max-bit-rate tags: - Flows responses: '204': description: No content. The flow max bit rate property has been deleted. '403': description: Forbidden. You do not have permission to modify this flow. It may be marked read-only. '404': description: The requested flow ID in the path is invalid. /flows/{flowId}/avg_bit_rate: parameters: - name: flowId in: path required: true schema: $ref: '#/components/schemas/uuid' description: The flow identifier. head: summary: Flow Average Bit Rate description: Returns the flow average bit rate path headers operationId: HEAD_flows-flowId-avg-bit-rate tags: - Flows responses: '200': $ref: '#/components/responses/trait_resource_info_head_200' '404': $ref: '#/components/responses/trait_resource_info_head_404' get: summary: Flow Average Bit Rate description: Returns the flow average bit rate property. operationId: GET_flows-flowId-avg-bit-rate tags: - Flows responses: '200': description: '' content: application/json: example: 3246 schema: type: integer minimum: 0 '404': description: The requested flow does not exist. put: summary: Create or Update Flow Average Bit Rate description: Create or update the average bit rate property. operationId: PUT_flows-flowId-avg-bit-rate tags: - Flows requestBody: content: application/json: example: 3246 schema: type: integer minimum: 0 required: true responses: '204': description: No content. The average bit rate has been created or updated. '400': description: Bad request. Invalid flow avg bit rate. '403': description: Forbidden. You do not have permission to modify this flow. It may be marked read-only. '404': description: The requested flow does not exist. delete: summary: Delete Flow Average Bit Rate description: Delete the flow average bit rate property. operationId: DELETE_flows-flowId-avg-bit-rate tags: - Flows responses: '204': description: No content. The flow average bit rate property has been deleted. '403': description: Forbidden. You do not have permission to modify this flow. It may be marked read-only. '404': description: The requested flow ID in the path is invalid. /flows/{flowId}/segments: parameters: - name: flowId in: path required: true schema: $ref: '#/components/schemas/uuid' description: The flow identifier. head: summary: List Flow Segments description: Return flow segments path headers operationId: HEAD_flows-flowId-segments tags: - FlowSegments parameters: - name: object_id in: query description: Filter on object identifier. schema: type: string - name: timerange in: query description: Return only the results in the timerange specified. schema: $ref: '#/components/schemas/timerange' - name: reverse_order in: query description: Return segments in reverse time order. schema: default: false type: boolean - name: accept_get_urls in: query description: | A comma separated list of labels of flow segment `get_urls` to include in the response. Omitting `accept_get_urls` will result in all `get_urls` returned. An empty `accept_get_urls` results in an empty or no `get_urls` in the response. Flow segment `get_urls` with no label cannot be filtered for; they will only be returned if `accept_get_urls` is omitted. Without `get_urls`, the response from the service could be substantially faster if it is not required to generate a large number of pre-signed URLs for example. schema: type: string pattern: ^([^,]+(,[^,]+)*)?$ - $ref: '#/components/parameters/trait_resource_paged_key' - $ref: '#/components/parameters/trait_paged_limit' responses: '200': description: '' headers: Link: description: Provides references to cursors for paging. Only the 'rel' attribute with value 'next' is currently supported. If 'next' is not present then it is the last page. schema: type: string X-Paging-Limit: description: Identifies the current limit being used for paging. This may not match the requested value if the requested value was too high for the implementation schema: type: integer X-Paging-Timerange: description: Identifies the timerange for the returned data set. schema: $ref: '#/components/schemas/timerange' X-Paging-Count: description: The number of items in the returned data set. schema: type: integer X-Paging-Reverse-Order: description: The items are returned in reverse order. schema: type: boolean X-Paging-NextKey: description: Opaque string that can be supplied to the `page` query parameter to get the next page of results. schema: type: string content: application/json: schema: type: string '400': description: Bad request. Invalid query options. '404': description: The flow ID in the path is invalid. get: summary: List Flow Segments description: | Returns the flow segments. The flow segment provides information about the media object. The media store type, which is indicated in the /service resource, determines the information that is included to allow the flow segment's media object to be downloaded. The examples provided here are for the "http_object_store" media store type which MUST include a `get_urls` property that contains the HTTP URLs for downloading the media object - server implementations should generate this internally. The flow segment may include timing and timerange adjustment information that the client needs to apply when extracting the samples from the media object. - If `sample_count` is set, the timerange of samples must be `sample_offset` to `sample_offset + sample_count` (exclusive). Otherwise, the timerange of samples must be `sample_offset` until the end. - The sample timestamp in the flow segment (`segment_ts`) is the timestamp in the media object (`media_object_ts`) adjusted by `ts_offset`: `segment_ts = media_object_ts + ts_offset`. The `segment_ts` should equal the start of the `timerange` for the sample at `sample_offset`. Use the pagination options to limit the results to a timerange and/or count. The list of flow segments can be empty. A request for segments from a non-existent flow will return an empty list, not a 404. Note that for codecs with temporal re-ordering, the timerange representes the _presentation_ timeline, and clients may need to check the `key_frame_count` property and/or read backwards from the start of the requested timerange to retrieve enough reference material to start decoding. When making requests to the provided `get_urls`, clients should include credentials if the provided URL is on the same origin as the API itself, akin to the `same-origin` mode in the [WhatWG Fetch Standard](https://fetch.spec.whatwg.org/#concept-request-credentials-mode). operationId: GET_flows-flowId-segments tags: - FlowSegments parameters: - name: object_id in: query description: Filter on object identifier. schema: type: string - name: timerange in: query description: Return only the results in the timerange specified. schema: $ref: '#/components/schemas/timerange' - name: reverse_order in: query description: Return segments in reverse time order. schema: default: false type: boolean - name: accept_get_urls in: query description: | A comma separated list of labels of flow segment `get_urls` to include in the response. Omitting `accept_get_urls` will result in all `get_urls` returned. An empty `accept_get_urls` results in an empty or no `get_urls` in the response. Flow segment `get_urls` with no label cannot be filtered for; they will only be returned if `accept_get_urls` is omitted. Without `get_urls`, the response from the service could be substantially faster if it is not required to generate a large number of pre-signed URLs for example. schema: type: string pattern: ^([^,]+(,[^,]+)*)?$ - $ref: '#/components/parameters/trait_resource_paged_key' - $ref: '#/components/parameters/trait_paged_limit' responses: '200': description: '' headers: Link: description: Provides references to cursors for paging. Only the 'rel' attribute with value 'next' is currently supported. If 'next' is not present then it is the last page. schema: type: string X-Paging-Limit: description: Identifies the current limit being used for paging. This may not match the requested value if the requested value was too high for the implementation schema: type: integer X-Paging-Timerange: description: Identifies the timerange for the returned data set. schema: $ref: '#/components/schemas/timerange' X-Paging-Count: description: The number of items in the returned data set. schema: type: integer X-Paging-Reverse-Order: description: The items are returned in reverse order. schema: type: boolean X-Paging-NextKey: description: Opaque string that can be supplied to the `page` query parameter to get the next page of results. schema: type: string content: application/json: schema: type: array items: $ref: '#/components/schemas/flowsegment' examples: basic: summary: Basic Example value: $ref: examples/flow-segments-get-200.json sample_count: summary: Partial Segment description: | This example takes part of an existing segment, offsets it with `ts_offset` and then selects a subset of the samples within using `ts_offset` for the second segment in the sequence. value: $ref: examples/flow-segments-get-200-sample-offset.json multiple_urls: summary: Multiple URLs description: | This example shows how the media object for a Flow Segment could be accessed using multiple URLs. Clients are free to choose any of the URLs given (which return identical media objects), however the server has expressed a preference for the "pipeline-a" URLs by putting them first in the list. value: $ref: examples/flow-segments-get-200-multiple-urls.json '400': description: Bad request. Invalid query options. '404': description: The flow ID in the path is invalid. post: summary: Create Flow Segment description: | Register a new flow segment, attaching the object id given to a point in the flow timeline. The segment may use a newly-written object, or re-use an existing object from another flow. For newly-written objects, the client is responsible for ensuring that the segment written to the store obeys the following restrictions: - The object id provided for a segment MUST be one which was received in a POST from /storage for this flow. - All samples in the object SHOULD be used by the segment. - The timestamps of each sample in the media object MUST equal its position on the Flow timeline, OR `ts_offset` MUST be set such that `media_object_ts + ts_offset = segment_ts` - The timerange of the segment MUST NOT overlap any other segment in the same Flow. The behaviour is undefined if there is an overlap with existing segments and a store may return a 400 error response. - The `sample_offset` SHOULD be zero. If a client needs to modify a Flow segment, e.g. to correct metadata such as the `key_frame_count` or add additional URLs to `get_urls`, then the client SHOULD first delete the existing segment and then write a new one. The behaviour is undefined if the segment exists and a store may return a 400 error response. Clients are expected to decide how to break content into media objects, however those objects SHOULD be large enough to avoid excessive round trip overheads in the underlying store (_e.g._ of the order of several megabytes) and where codecs with temporal re-ordering are used, object SHOULD contain complete GOPs or decodable units. For objects that have been re-used from other flows, the `sample_offset` and `sample_count` MAY be used to specify part of the object to use: - The `timerange` field indicates the new segment's position in the flow - The sample associated with the start of the `timerange` MUST be the one selected by `sample_offset` - Likewise, the sample associated with the end of the `timerange` MUST be the one selected by `sample_offset + sample_count - 1`, unless `timerange` has an exclusive end, in which case it will be `sample_offset + sample_count`. - The timerange of the segment MUST NOT overlap any other segment in the same Flow. operationId: POST_flows-flowId-segments tags: - FlowSegments requestBody: content: application/json: example: $ref: examples/flow-segment-post.json schema: $ref: '#/components/schemas/flowsegment' required: true responses: '201': description: created. The flow segment has been created. '400': description: Bad request. Invalid flow segment JSON or the flow 'container' is not set. '403': description: Forbidden. You do not have permission to modify this flow. It may be marked read-only. '404': description: The flow does not exist. delete: summary: Delete Flow Segment description: | Deletes the flow segments. If the deletion takes too long then this request will return 202 Accepted and the `Location` header will point to a Flow Delete Request to monitor deletion progress operationId: DELETE_flows-flowId-segments tags: - FlowSegments parameters: - name: timerange in: query description: Only delete flow segments that are completely covered by the given timerange. schema: default: _ $ref: '#/components/schemas/timerange' - name: object_id in: query description: Filter on object identifier. schema: type: string responses: '202': description: This request has taken longer than the configured timeout, and will continue asynchronously headers: Location: schema: type: string example: /flow-delete-request/{request-id} content: application/json: schema: $ref: '#/components/schemas/deletionrequest' example: $ref: examples/deletion-request-get-200.json '204': description: No content. The flow segments have been or will be deleted. '400': description: Bad request. Invalid query options. '403': description: Forbidden. You do not have permission to modify this flow. It may be marked read-only. '404': description: The requested flow ID in the path is invalid. /flows/{flowId}/storage: parameters: - name: flowId in: path required: true schema: $ref: '#/components/schemas/uuid' description: The flow identifier. post: summary: Allocate Flow Storage description: | Allocate storage locations for writing media objects. The media store type, which is indicated in the /service resource, determines the information provided in the response. The examples and description below are for the "http_object_store" media store type. This media store type provides HTTP URLs for uploading and downloading media objects in buckets. The response will include a PUT URL that a client uses to upload the media object. The client is expected to register the flow segment using the /flows/{flowId}/segments endpoint once the upload is complete. Implementations need to handle situations where objects were uploaded but no flow segment was registered successfully. The response may include PUT URLs for creating buckets for the media objects. These PUT URLs should be used before uploading media objects. The object_id associated with each storage location has the bucket name as its prefix. The response may include PUT URLs for setting the CORS properties for the buckets and media objects. When making requests to the provided `put_url`, clients should include credentials if the provided URL is on the same origin as the API itself, akin to the `same-origin` mode in the [WhatWG Fetch Standard](https://fetch.spec.whatwg.org/#concept-request-credentials-mode). operationId: POST_flows-flowId-storage tags: - MediaStorage requestBody: content: application/json: schema: $ref: '#/components/schemas/flowstoragepost' example: $ref: examples/flow-storage-post.json responses: '201': description: Storage locations for writing media objects. content: application/json: schema: $ref: '#/components/schemas/flowstorage' example: $ref: examples/flow-storage-post-201.json '400': description: Bad request. Invalid flow storage request JSON or the flow 'container' is not set. '403': description: Forbidden. You do not have permission to modify this flow. It may be marked read-only. '404': description: The requested flow does not exist. /flow-delete-requests: head: summary: List Flow Delete Requests description: Return flow-delete-requests path headers operationId: HEAD_flow-delete-requests tags: - FlowDeleteRequests responses: '200': $ref: '#/components/responses/trait_resource_listing_head_200' get: summary: List Flow Delete Requests description: | List deletion requests currently being worked on, for monitoring in development. This will not necessarily list all requests, nor return a consistent set in any particular order, and should not be relied upon by clients. However if there are any requests in the system, it will always return at least one. operationId: GET_flow-delete-requests tags: - FlowDeleteRequests responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/deletionrequestslist' example: $ref: examples/deletion-requests-get-200.json /flow-delete-requests/{request-id}: parameters: - name: request-id in: path required: true schema: type: string head: summary: Flow Delete Request Details description: Return flow delete request path headers operationId: HEAD_flow-delete-requests-request-id tags: - FlowDeleteRequests responses: '200': $ref: '#/components/responses/trait_resource_info_head_200' '404': $ref: '#/components/responses/trait_resource_info_head_404' get: summary: Flow Delete Request Details description: | Get information about a timerange of FlowSegments that are being deleted. A deletion request is created when a client DELETEs a long timeranges of segments, which takes longer than a single HTTP request. Clients will be redirected here to monitor the request's progress. operationId: GET_flow-delete-requests-request-id tags: - FlowDeleteRequests responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/deletionrequest' example: $ref: examples/deletion-request-get-200.json '404': description: The requested flow delete request does not exist. webhooks: flows/created: post: security: - {} requestBody: content: application/json: schema: title: Flow Created Notification description: Information about a Flow which has been newly created in this store instance required: - event_timestamp - event_type - event properties: event_timestamp: description: Timestamp at which the new Flow was created type: string format: date-time event_type: type: string const: flows/created event: type: object required: - flow properties: flow: $ref: '#/components/schemas/flow' flows/updated: post: security: - {} requestBody: content: application/json: schema: title: Flow Updated Notification description: Information about a Flow for which the metadata has been modified. required: - event_timestamp - event_type - event properties: event_timestamp: description: Timestamp at which the Flow was modified type: string format: date-time event_type: type: string const: flows/updated event: type: object required: - flow properties: flow: $ref: '#/components/schemas/flow' flows/deleted: post: security: - {} requestBody: content: application/json: schema: title: Flow Deleted Notification description: Notification that a Flow has been deleted (or scheduled for deletion). required: - event_timestamp - event_type - event properties: event_timestamp: description: Timestamp at which the Flow was modified type: string format: date-time event_type: type: string const: flows/deleted event: type: object required: - flow_id properties: flow_id: $ref: '#/components/schemas/uuid' flows/segments_added: post: security: - {} requestBody: content: application/json: schema: title: Flow Segments Added description: | Notification that new segments have been added to a Flow. required: - event_timestamp - event_type - event properties: event_timestamp: description: Timestamp at which the most recent segment in the timerange was added (and the message generated) type: string format: date-time event_type: type: string const: flows/segments_added event: type: object required: - flow_id - segments properties: flow_id: $ref: '#/components/schemas/uuid' segments: type: array items: $ref: '#/components/schemas/flowsegment' flows/segments_deleted: post: security: - {} requestBody: content: application/json: schema: title: Flow Segments Deleted description: | Notification that segments have been deleted from a Flow. required: - event_timestamp - event_type - event properties: event_timestamp: description: Timestamp at which the most recent segment in the timerange was added (and the message generated) type: string format: date-time event_type: type: string const: flows/segments_added event: type: object required: - flow_id - timerange properties: flow_id: $ref: '#/components/schemas/uuid' timerange: description: The timerange of segments that have been deleted. The timerange MUST intersect with a segment which has been deleted at both start and end (e.g. it cannot start or end in empty space). $ref: '#/components/schemas/timerange' sources/created: post: security: - {} requestBody: content: application/json: schema: title: Source Created Notification description: Information about a Source which has been newly created in this store instance required: - event_timestamp - event_type - event properties: event_timestamp: description: Timestamp at which the new Source was created type: string format: date-time event_type: type: string const: sources/created event: type: object required: - source properties: source: $ref: '#/components/schemas/source' sources/updated: post: security: - {} requestBody: content: application/json: schema: title: Source Updated Notification description: Information about a Source for which the metadata has been modified. required: - event_timestamp - event_type - event properties: event_timestamp: description: Timestamp at which the Source was modified type: string format: date-time event_type: type: string const: sources/updated event: type: object required: - source properties: source: $ref: '#/components/schemas/source' sources/deleted: post: security: - {} requestBody: content: application/json: schema: title: Source Deleted Notification description: Notification that a Source has been deleted. required: - event_timestamp - event_type - event properties: event_timestamp: description: Timestamp at which the Source was modified type: string format: date-time event_type: type: string const: sources/deleted event: type: object required: - source_id properties: source_id: $ref: '#/components/schemas/uuid' components: schemas: uuid: title: UUID pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ type: string contentformat: title: Content Format description: Identifies the content format for a flow or source using a URN string. enum: - urn:x-nmos:format:video - urn:x-nmos:format:audio - urn:x-nmos:format:data - urn:x-nmos:format:multi type: string mimetype: title: MIME Type pattern: .*/.* description: MIME Type string. type: string deletionrequest: type: object title: Deletion Request description: Describes an ongoing deletion request required: - id - flow_id - timerange_to_delete - delete_flow - status properties: id: description: Deletion Request ID type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ flow_id: description: ID of the flow to which the deletion request relates type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ timerange_to_delete: description: The timerange of FlowSegments to be deleted in this request, as described by the [TimeRange](../schemas/timerange#top) type $ref: '#/components/schemas/timerange' timerange_remaining: description: The timerange of FlowSegments not yet deleted by this request, as described by the [TimeRange](../schemas/timerange#top) type $ref: '#/components/schemas/timerange' delete_flow: description: Whether the Flow should be deleted once the timerange has been type: boolean created: description: Date/Time when this deletion request was created type: string format: date-time created_by: description: A string identifier for the entity that created the deletion request. Implementations SHOULD set suitable default values for `created_by` based on the principal accessing the system, and MAY permit clients to edit the value, subject to suitable permissions-based limitations. type: string updated: description: Date/Time when this deletion request was updated type: string format: date-time expiry: description: Date/Time when this deletion request will be deleted type: string format: date-time status: description: Status of the delete request type: string enum: - created - started - done - error error: description: Provides more information for the error status. type: object required: - type - summary - time properties: type: description: The error type name. type: string summary: description: Summary description of the error and causes. type: string traceback: description: Stack trace leading to error (as a list of strings) type: array items: type: string time: description: Time at which the error ocurred, to aid in log correlation type: string format: date-time deletionrequestslist: title: Deletion Requests List type: array items: $ref: '#/components/schemas/deletionrequest' flowcollection: title: Flow Collection type: array items: $ref: '#/components/schemas/collectionitem' flowsegment: type: object description: Provides the location and metadata of the media files corresponding to timerange segments of a Flow. title: Flow Segment required: - object_id - timerange properties: object_id: description: The object store identifier for the media object. type: string ts_offset: description: The timestamp offset between the sample timestamps stored in the media file and the corresponding timestamp in the segment, ie. ts_offset = segment ts - media object ts. Assumed to be 0:0 if not set. Format as described by the [Timestamp](../schemas/timestamp#top) type, but cannot be negative $ref: '#/components/schemas/timestamp' timerange: description: The timerange for the samples contained in the segment. The timerange start is always inclusive. If samples have a duration then the timerange end is exclusive and covers at least the duration of the last sample. The exclusive timerange end will typically be set to the timestamp of the next sample. If the samples don't have a duration then the timerange end is inclusive. Format is described by the [TimeRange](../schemas/timerange#top) type. Note that where temporal re-ordering is used, the timerange and samples refers to the presentation timeline. $ref: '#/components/schemas/timerange' last_duration: description: The difference between the exclusive end of the `timerange` and the last sample timestamp. Format as described by the [Timestamp](../schemas/timestamp#top) type, but cannot be negative $ref: '#/components/schemas/timestamp' sample_offset: description: The start of the segment represented as a count of samples from the start of the object. Note that a sample is a video frame or audio sample. A (coded) audio frame has multiple audio samples. Assumed to be 0 if not set. type: integer sample_count: description: The count of samples in the segment (which may be fewer than in the object). The count could be less than expected given the segment duration and rate if there are gaps. If not set, every sample from sample_offset onwards is used. Note that a sample is a video frame or audio sample. A (coded) audio frame has multiple audio samples type: integer get_urls: description: A list of URLs to which a GET request can be made to directly retrieve the contents of the segment. This is required by the `http_object_store` media store type, which is the only one currently described. Clients may choose any URL in the list and treat them as identical, however servers may sort the list such that the preferred URL is first. type: array items: type: object required: - url properties: label: description: Label identifying this URL. If the 'label' is not set then this URL can't be filtered for using the 'accept_get_urls' API query parameter. type: string url: description: A URL to which a GET request can be made to directly retrieve the contents of the segment. Clients should include credentials if the provide URL is on the same origin as the API endpoint type: string additionalProperties: false key_frame_count: description: The number of key frames in the segment. This should be set greater than zero when the segment contains key frames that serve as a stream access point type: integer flowstoragepost: title: Flow Storage Post description: Post data for the flow storage endpoint type: object properties: limit: description: Limit the number of storage segments in each response page. Implementations may specify their own default and maximum for the limit type: integer flowstorage: type: object title: Media Bucket Object Store description: Gives information on storage for media objects. This schema is for the `http_object_store` media store type which provides URLs for storing media objects in bucket, and is the only store type currently implemented. properties: pre: type: array description: Actions that need to be taken before the media object can be written items: type: object description: An action required: - action properties: action: type: string enum: - create_bucket bucket_id: type: string description: The name of the bucket that needs to be created put_url: $ref: '#/components/schemas/httprequest' put_cors_url: $ref: '#/components/schemas/httprequest' media_objects: type: array description: List of information for identifying and uploading media objects items: type: object description: Information for a media object required: - object_id - put_url properties: object_id: description: The object store identifier for the media object. type: string put_url: $ref: '#/components/schemas/httprequest' put_cors_url: $ref: '#/components/schemas/httprequest' additionalProperties: false flow: type: object description: Describes a Flow title: Flow oneOf: - $ref: '#/components/schemas/flowvideo' - $ref: '#/components/schemas/flowaudio' - $ref: '#/components/schemas/flowdata' - $ref: '#/components/schemas/flowmulti' servicepost: title: Update Service Info description: Post update to the service info type: object properties: name: description: The service instance name type: string description: description: The service instance description type: string service: type: object description: Provides information about the store service title: Service required: - type - api_version - media_store properties: name: description: The service instance name type: string description: description: The service instance description type: string type: description: The type identifier for the service. The value must start with 'urn:x-tams:service' type: string api_version: description: The version of the TAMS API specification this deployment implements type: string pattern: ^(0|[1-9]\d*)\.(0|[1-9]\d*)$ service_version: description: 'The version of software providing this service. Note: Different implementations and software houses may use different conventions for their version identification. As such, this field is intentionally permissive and intended to be informative only. Implementations should avoid using this field to determine compatibility.' type: string media_store: type: object description: Provide information about the media store for this service required: - type properties: type: description: The type of the media store. This determines the endpoints for reading and writing media type: string enum: - http_object_store event_stream_mechanisms: type: array description: List the types of event stream that this implementation supports items: $ref: '#/components/schemas/eventstreamcommon' source: type: object description: |- Describes a Source: an abstract representation of a piece of media as defined in Sources may be elemental (and represented directly by a Flow), or may represent a collection of other Sources, e.g. a Source collecting video and audio together. title: Source required: - id - format properties: id: description: Source identifier type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ format: description: The primary content type URN for the Source. type: string enum: - urn:x-nmos:format:video - urn:x-nmos:format:audio - urn:x-nmos:format:data - urn:x-nmos:format:multi format: uri label: description: Freeform string label for the Source type: string description: description: Freeform text describing the Source type: string created_by: description: A string identifier for the entity that created the Source. Implementations SHOULD set suitable default values for `created_by` based on the principal accessing the system, and MAY permit clients to edit the value, subject to suitable permissions-based limitations. type: string updated_by: description: A string identifier for the entity that updated the Source metadata most recently. Implementations SHOULD set suitable default values for `updated_by` based on the principal accessing the system, and MAY permit clients to edit the value, subject to suitable permissions-based limitations. type: string created: description: The date-time the Source was created in a given context, e.g. in the store. Implementations SHOULD ignore this if given in a PUT request, and instead manage it internally type: string format: date-time updated: description: The date-time the Source metadata was last updated in a given context, e.g. in the store. Implementations SHOULD ignore this if given in a PUT request, and instead manage it internally type: string format: date-time tags: $ref: '#/components/schemas/tags' source_collection: type: array description: List of Sources that are collected together by this Source. This attribute is intended to be read-only. Implementations SHOULD ignore this if given in a PUT request, and instead manage it internally. Source collections can be inferred from Flow collection definitions. items: $ref: '#/components/schemas/collectionitem' collected_by: type: array description: Sources that reference this Source to include it in a collection. This attribute is intended to be read-only. Implementations SHOULD ignore this if given in a PUT request, and instead manage it internally. Source collections can be inferred from Flow collection definitions. items: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ tags: title: Tags description: Key value is a freeform string. type: object additionalProperties: type: string timerange: title: TimeRange description: | A timerange of timestamps. It is represented using one or two timestamps with inclusivity and exclusivity markers. E.g. * `[0:0_10:0)` represents 10 seconds of media starting at timestamp `0:0` and ending before `10:0`. * `(5:0_` represents a timerange starting after `5:0` and to eternity. * `[1694429247:0_1694429248:0)` is a 1 second TAI timerange starting at 2023-09-11T10:46:50.0Z UTC. * `[1694429247:0]` is an instantaneous TAI timerange at 2023-09-11T10:46:50.0Z UTC. This is equivalent to `[1694429247:0_1694429247:0]`. The short syntax is preferred due to ease of identification as instantaneous. Instantaneous TimeRanges cannot use exclusive markers (i.e. `(` or `)`). * A `[` or `]` indicates that bound is inclusive, and a `(` or `)` indicates that bound is exclusive. Details of the format can be found in the [Timestamps in TAMS](https://github.com/bbc/tams/blob/main/docs/appnotes/0008-timestamps-in-TAMS.md) application note. type: string pattern: ^(\[|\()?(-?\d+:\d+)?(_(-?\d+:\d+)?)?(\]|\))?$ webhookpost: title: Register Webhook description: Register to receive updates via webhook type: object required: - url - events properties: url: description: The URL to which the API should make HTTP POST requests with event data type: string api_key_name: description: The HTTP header name that is added to the event POST with value 'api_key_value' type: string api_key_value: description: The value that the HTTP header 'api_key_name' will be set to type: string events: description: List of event types to receive type: array items: type: string flow_ids: description: Limit Flow and Flow Segment events to Flows in the given list of Flow IDs type: array items: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ source_ids: description: Limit Flow, Flow Segment and Source events to Sources in the given list of Source IDs type: array items: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ flow_collected_by_ids: description: Limit Flow and Flow Segment events to those with Flow that is collected by a Flow Collection in the given list of Flow Collection IDs type: array items: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ source_collected_by_ids: description: Limit Flow, Flow Segment and Source events to those with Source that is collected by a Source Collection in the given list of Source Collection IDs type: array items: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ accept_get_urls: description: List of labels of URLs to include in the `get_urls` property in `flows/segments_added` events. This option is the same as the `accept_get_urls` query parameter for the /flows/{flowId}/segments API endpoint, except that the labels are represented using a JSON array rather than a (comma separated list) string. type: array items: type: string webhook: title: Register Webhook description: Register to receive updates via webhook type: object required: - url - events properties: url: description: The URL to which the API should make HTTP POST requests with event data type: string api_key_name: description: The HTTP header name that is added to the event POST type: string api_key_value: description: The value that the HTTP header 'api_key_name' will be set to type: string events: description: List of event types to receive type: array items: type: string flow_ids: description: Limit Flow and Flow Segment events to Flows in the given list of Flow IDs type: array items: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ source_ids: description: Limit Flow, Flow Segment and Source events to Sources in the given list of Source IDs type: array items: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ flow_collected_by_ids: description: Limit Flow and Flow Segment events to those with Flow that is collected by a Flow Collection in the given list of Flow Collection IDs type: array items: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ source_collected_by_ids: description: Limit Flow, Flow Segment and Source events to those with Source that is collected by a Source Collection in the given list of Source Collection IDs type: array items: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ accept_get_urls: description: List of labels of URLs to include in the `get_urls` property in `flows/segments_added` events. This option is the same as the `accept_get_urls` query parameter for the /flows/{flowId}/segments API endpoint, except that the labels are represented using a JSON array rather than a (comma separated list) string. type: array items: type: string collectionitem: type: object description: Describes how an object (Source or Flow) is collected into another object of the same type title: Collection Item required: - id - role properties: id: description: Source or Flow Identifier of the member of this collection. Sources must only collect Sources, and Flows must only collect Flows. Must already be registered in TAMS type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ role: description: A human-readable role of the element in this collection (e.g. 'R' to denote a right audio channel in a collection of mono audio Sources) type: string container_mapping: description: Describes the mapping of the Flow essence from this Flow collection's container $ref: '#/components/schemas/containermapping' eventstreamcommon: type: object description: Describes an event stream mechanism available in this implementation of TAMS title: Event Stream Mechanism required: - name properties: name: description: Name of this type of event stream mechanism. Must be unique. Any name defined in this specification is reserved type: string docs: description: Location (e.g. a URL) at which documentation for this event stream mechanism may be found type: string config: type: object description: Configuration options required to make use of this mechanism flowaudio: type: object description: Describes an audio Flow title: Audio Flow allOf: - $ref: '#/components/schemas/flowcore' - type: object required: - format - essence_parameters - codec properties: format: description: The primary content type URN for the flow. type: string enum: - urn:x-nmos:format:audio essence_parameters: type: object description: Describes the parameters of the essence inside this audio Flow title: Audio Flow Essence Parameters required: - sample_rate - channels additionalProperties: false properties: sample_rate: description: The fixed number of samples per second. type: integer exclusiveMinimum: 0 channels: description: The channel count. type: integer exclusiveMinimum: 0 bit_depth: description: The number of significant bits used to represent the audio sample. The minumum number of bytes then equals `round_up(bit_depth / 8)`. If codec is `audio/x-raw-int` bit_depth must be set. If codec is `audio/x-raw-float` bit_depth must be set to 32 or 64 type: integer exclusiveMinimum: 0 codec_parameters: title: Audio Codec Parameters type: object required: [] properties: coded_frame_size: description: The fixed number of samples per coded audio frame. type: integer mp4_oti: description: The MPEG-4 Object Type Identification. For more information on the use of this property in codec strings, see https://developer.mozilla.org/en-US/docs/Web/Media/Formats/codecs_parameter#mpeg-4_audio type: integer unc_parameters: title: Uncompressed Audio Parameters type: object required: - unc_type properties: unc_type: description: The uncompressed audio multi-channel representation type. If codec is `audio/x-raw-int` or `audio/x-raw-float`, unc_type must be set. type: string enum: - interleaved - planar - pairs flowdata: type: object description: Describes a data Flow title: Data Flow allOf: - $ref: '#/components/schemas/flowcore' - type: object required: - format - essence_parameters - codec properties: format: description: The primary content type URN for the flow. type: string enum: - urn:x-nmos:format:data essence_parameters: type: object description: Describes the parameters of the essence inside this data Flow title: Data Flow Essence Parameters additionalProperties: false properties: data_type: description: The type of information encoded in the flow, identified using a URN. e.g. The data_type may be urn:x-tams:data:bounding-box, and the codec `application/json`. type: string flowmulti: type: object description: Describes a multi-essence Flow title: Multi-essence Flow allOf: - $ref: '#/components/schemas/flowcore' - type: object required: - format properties: format: description: The primary content type URN for the flow. type: string enum: - urn:x-nmos:format:multi flowvideo: type: object description: Describes a video Flow title: Video Flow allOf: - $ref: '#/components/schemas/flowcore' - type: object required: - format - essence_parameters - codec properties: format: description: The primary content type URN for the flow. type: string enum: - urn:x-nmos:format:video essence_parameters: type: object description: Describes the parameters of the essence inside this video Flow title: Video Flow Essence Parameters required: - frame_width - frame_height additionalProperties: false properties: frame_rate: description: The fixed number of frames per second. If this parameter is unset, the frame_rate is either unknown or variable. type: object required: - numerator properties: numerator: description: numerator type: integer exclusiveMinimum: 0 denominator: description: denominator type: integer default: 1 exclusiveMinimum: 0 frame_width: description: The width of the picture in pixels. type: integer exclusiveMinimum: 0 frame_height: description: The height of the picture in pixels. type: integer exclusiveMinimum: 0 bit_depth: description: The number of significant bits used to represent the video component sample. If codec is `video/raw`, bit_depth must be set. type: integer exclusiveMinimum: 0 interlace_mode: description: Interlaced video mode for frames in this Flow type: string enum: - progressive - interlaced_tff - interlaced_bff - interlaced_psf colorspace: description: Colorspace used for the video type: string enum: - BT601 - BT709 - BT2020 - BT2100 transfer_characteristic: description: Transfer characteristic type: string enum: - SDR - HLG - PQ aspect_ratio: description: The display aspect ratio. i.e. display_width / display_height type: object required: - numerator - denominator properties: numerator: description: numerator type: integer exclusiveMinimum: 0 denominator: description: denominator type: integer exclusiveMinimum: 0 pixel_aspect_ratio: description: The pixel aspect ratio. This is usually 1:1 (i.e. square pixels) for modern video. Some, usually older, video formats use non-square pixels e.g. some Standard Definition video. This is where that may be indicated. type: object required: - numerator - denominator properties: numerator: description: numerator type: integer exclusiveMinimum: 0 denominator: description: denominator type: integer exclusiveMinimum: 0 component_type: description: Picture component representation. type: string enum: - YCbCr - RGB horiz_chroma_subs: description: Horizontal chroma component sub-sampling. When unc_type is set to a YUV type, horiz_chroma_subs must be set. type: integer exclusiveMinimum: 0 vert_chroma_subs: description: Vertical chroma component sub-sampling. When unc_type is set to a YUV type, vert_chroma_subs must be set. type: integer exclusiveMinimum: 0 unc_parameters: type: object title: Uncompressed Video Parameters required: - unc_type properties: unc_type: description: Uncompressed picture packing type. If codec is `video/raw`, unc_type must be set. type: string enum: - planar - YUYV - UYVY - AYUV - v210 - v216 - RGB - RGBx - xRGB - BGRx - xBGR - RGBA - ARGB - BGRA - ABGR - alpha avc_parameters: type: object title: AVC Codec Parameters required: - profile - level - flags properties: profile: description: AVC / H.264 profile byte. For more information on the use of this property in codec strings, see https://developer.mozilla.org/en-US/docs/Web/Media/Formats/codecs_parameter#using_the_codecs_parameter type: integer level: description: AVC / H.264 level byte. For more information on the use of this property in codec strings, see https://developer.mozilla.org/en-US/docs/Web/Media/Formats/codecs_parameter#using_the_codecs_parameter type: integer flags: description: AVC / H.264 flags byte. For more information on the use of this property in codec strings, see https://developer.mozilla.org/en-US/docs/Web/Media/Formats/codecs_parameter#using_the_codecs_parameter type: integer httprequest: type: object title: HTTP Request description: Gives information on a particular http request a client should perform required: - url properties: url: description: The URL to make the request to type: string body: description: The text of the body which needs to be included in the request type: string content-type: description: The content type which must be used type: string headers: description: Additional headers that should be included type: object additionalProperties: type: string additionalProperties: true timestamp: title: Timestamp description: | A signed nanosecond resolution timestamp represented as "{sign?}{seconds}:{nanoseconds}". The intended interpretation of the value is assumed to be defined elsewhere. E.g. * "1:40000000" is the timestamp of the 27th video frame for 25 Hz video with origin at "0:0". * "1694429247:40000000" is the TAI timestamp for a video frame at 2023-09-11T10:46:50.04Z UTC. Details of the format can be found in the [Timestamps in TAMS](https://github.com/bbc/tams/blob/main/docs/appnotes/0008-timestamps-in-TAMS.md) application note. type: string pattern: ^-?\d+:\d+$ containermapping: type: object description: Defines the location of Flow essence data in a container track title: Container Mapping properties: track_index: description: A zero-based and sequential track index in the container. This assumes a reliable ordering of tracks type: integer minimum: 0 format_track_index: description: A zero-based and sequential track index in the container for a particular Flow format. A container with a video and 2 audio tracks would have a format_track_index 0 for the video Flow and format_track_index 0 and 1 for the audio Flows. This assumes a reliable ordering of tracks for each Flow format type: integer minimum: 0 audio_track: description: Mapping for channels in audio tracks to the Flow channels type: object properties: channel_numbers: description: Array of (zero-based) container channel numbers in Flow order type: array minItems: 1 items: type: integer minimum: 0 channel_range: description: Inclusive range of (zero-based) container channel numbers type: string pattern: ^[0-9]+_[0-9]+$ mp2ts_container: description: Mapping to MPEG-2 Transport Stream containers, ISO/IEC 13818-1 or ITU-T Recommendation H.222.0 type: object properties: pid: description: The packet ID for the elementary stream packets type: integer mxf_container: description: Mapping to Material Exchange Format containers, SMPTE ST 377-1 type: object properties: package_uid: description: The package UID. Either a SMPTE UMID URN or UUID URN type: string pattern: ^urn:smpte:umid:[0-9a-fA-F]{8}(.[0-9a-fA-F]{8}){7}$|^urn:uuid:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$ track_id: description: The track ID in the package type: integer isobmff_container: description: Mapping to ISO Base Media File Format (e.g. MP4 and MOV) containers, ISO/IEC 14496-12 type: object properties: track_id: description: The track ID type: integer flowcore: type: object description: Describes a Flow (common properties to all Flows, imported by type-specific specifications) title: Flow Core required: - id - source_id properties: id: description: Flow identifier type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ source_id: description: Source identifier type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ label: description: Freeform string label for the flow type: string description: description: Freeform text describing the flow type: string created_by: description: A string identifier for the entity that created the flow. Implementations SHOULD set suitable default values for `created_by` based on the principal accessing the system, and MAY permit clients to edit the value, subject to suitable permissions-based limitations. type: string updated_by: description: A string identifier for the entity that updated the flow metadata most recently. Implementations SHOULD set suitable default values for `updated_by` based on the principal accessing the system, and MAY permit clients to edit the value, subject to suitable permissions-based limitations. type: string tags: $ref: '#/components/schemas/tags' metadata_version: description: A change to the flow metadata, not including metadata_version, last_update or segments, results in a new version. If the metadata_version for flow instances is identical then the metadata is identical. type: string generation: description: An indication of how many lossy encodings the flow content has been through. A flow with a higher generation may contain less of the original information than a flow with a lower generation. type: integer minimum: 0 created: description: The date-time the flow was created in a given context, e.g. in the store. Implementations SHOULD ignore this if given in a PUT request, and instead manage it internally type: string format: date-time metadata_updated: description: The date-time the flow metadata was updated in a given context, e.g. in the store. Implementations SHOULD ignore this if given in a PUT request, and instead manage it internally type: string format: date-time segments_updated: description: The date-time the flow segments were updated in a given context, e.g. in the store. Implementations SHOULD ignore this if given in a PUT request, and instead manage it internally type: string format: date-time read_only: description: If set to 'true', implementations SHOULD reject client requests to update Flow metadata (other than the read_only property), Flow Segments and media objects type: boolean codec: description: A MIME type identification of the (lossy or lossless) coding used for the flow content. type: string pattern: ^[^\s/]+/[^\s/]+$ container: description: The container MIME type for flow segments. type: string pattern: ^[^\s/]+/[^\s/]+$ avg_bit_rate: description: The average bit rate of the flow segments in 1000 bits/second. A precise definition can be found in the [Setting Flow Bit Rate Properties](https://github.com/bbc/tams/blob/main/docs/appnotes/0013-setting-flow-bit-rate-properties.md) AppNote. type: integer minimum: 0 max_bit_rate: description: The maximum bit rate of the flow segments in 1000 bits/second. A precise definition can be found in the [Setting Flow Bit Rate Properties](https://github.com/bbc/tams/blob/main/docs/appnotes/0013-setting-flow-bit-rate-properties.md) AppNote. type: integer minimum: 0 segment_duration: description: The target flow segment duration in seconds. The duration for each segment may vary around this target value. See also the [Setting Flow Bit Rate Properties](https://github.com/bbc/tams/blob/main/docs/appnotes/0013-setting-flow-bit-rate-properties.md) AppNote for how this property can be used to calculate buffer sizes. type: object required: - numerator properties: numerator: description: numerator type: integer exclusiveMinimum: 0 denominator: description: denominator type: integer default: 1 exclusiveMinimum: 0 timerange: description: The timerange of samples available in the flow, as described by the [TimeRange](../schemas/timerange#top) type $ref: '#/components/schemas/timerange' flow_collection: description: List of Flows that are collected together by this Flow. $ref: '#/components/schemas/flowcollection' collected_by: type: array description: Flows that reference this Flow to include it in a collection. This attribute is intended to be read-only. Implementations SHOULD ignore this if given in a PUT request, and instead manage it internally items: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ container_mapping: description: Describes the mapping of the Flow essence from the this Flow's container $ref: '#/components/schemas/containermapping' responses: trait_resource_listing_head_200: description: '' content: application/json: schema: type: string trait_resource_info_head_200: description: '' content: application/json: schema: type: string trait_resource_info_head_400: description: Bad request. Query parameters are invalid. trait_resource_info_head_404: description: Resource was not found. parameters: trait_paged_limit: name: limit in: query description: Restrict the response to the specified number of results. Implementations may specify their own default and maximum for the limit schema: type: integer trait_resource_paged_key: name: page in: query description: Opaque string used by backend to access a specific page of results. Clients should read the next URL from the `Link` header returned with responses, or use value of the returned X-Paging-NextKey header. If not supplied, the first page is accessed. Implementations should ensure a consistent sort order is applied to pages of results. schema: type: string securitySchemes: basic_auth: type: http scheme: basic description: HTTP basic authentication bearer_token_auth: type: http scheme: bearer description: HTTP bearer token authentication tags: - name: Service description: The service root and documentation about the service itself - name: Sources description: | The ephemeral concept of an individual piece of media without being rendered to a specific encoding/packaging. externalDocs: url: https://specs.amwa.tv/ms-04/releases/v1.0.0/docs/2.2._Explanation_-_Source.html - name: Flows description: | Sources which have been 'rendered' to a specific encoding/packaging format. externalDocs: url: https://specs.amwa.tv/ms-04/releases/v1.0.0/docs/2.3._Explanation_-_Flow.html - name: FlowSegments description: | A timerange segment of a Flow that references a media object in the object store. - name: MediaStorage description: The system that stores the media objects referenced by flow segments. - name: FlowDeleteRequests description: Resource for monitoring long running deletion of flows and flow segments. - name: Webhooks description: Configures webhooks to deliver notifications externally. Optional, and may not be implemented