


{"id":26816,"date":"2026-02-12T04:28:13","date_gmt":"2026-02-12T12:28:13","guid":{"rendered":"https:\/\/www.expressplay.com\/?page_id=26816"},"modified":"2026-02-12T04:28:13","modified_gmt":"2026-02-12T12:28:13","slug":"dynamic-license-constraints-for-cpix-based-workflows","status":"publish","type":"page","link":"https:\/\/www.expressplay.com\/ja\/developer\/dynamic-license-constraints-for-cpix-based-workflows\/","title":{"rendered":"Dynamic License constraints for CPIX-Based Workflows"},"content":{"rendered":"<style>\nh2,h3 {\n\tmargin: 20px 0;\n}\n.anchor-offset {\n\tscroll-margin-top: 40px;\n}\ncode {\n    word-break: break-all;\n    white-space: pre-wrap;\n    font-size: 14px;\n    color: #555;\n    margin: 20px 0;\n}\ntable {\n    margin: 10px 0;\n}\ntd,th {\n    padding: 10px;\n}\ntable, td, th {\n    border: 1px solid #eee;\n}\nblockquote {\n    border-left: 5px solid #eee;\n    padding: 10px 20px;\n    margin-top: 20px;\n}\ndt {\n    font-weight: 600;\n}\ndd {\n    padding-left: 10px;\n    margin-bottom: 10px;\n}\ncode {\n   display: inline;\n   padding: 5px;\n}\n<\/style>\n<p>This feature allows you to apply <strong>security rules on content resolution<\/strong> (SD, HD, UHD), using the <code>IntendedTrackType<\/code> attribute from the CPIX document. It is particularly useful for <strong>AWS MediaPackage V2 workflows<\/strong>, where Key IDs (KIDs) are generated dynamically and cannot be referenced statically.<br \/>\n&nbsp;<\/p>\n<h3>Background \/ Problem Statement<\/h3>\n<p>Traditionally, <code>hdcpOutputControl<\/code> settings were associated directly with specific KIDs.<br \/>\nHowever, in dynamic packaging workflows\u2014such as those used by AWS MediaPackage V2\u2014KIDs are generated at runtime based on stream order and track configuration.<br \/>\n<br \/>\nAs a result:<\/p>\n<ul>\n<li>KIDs cannot be predicted or hardcoded.<\/li>\n<li>Enforcing different HDCP requirements per resolution (for example, <strong>HDCP 2.2 only for UHD content<\/strong>) becomes impractical when relying on static KID-based configuration.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h3>Solution Overview<\/h3>\n<p>\nTo address this limitation, the server now supports <strong>binding security rules to<\/strong> <code>IntendedTrackType<\/code> instead of individual KIDs.<br \/>\n<br \/>\nBy referencing the <code>IntendedTrackType<\/code> defined in the <code>ContentKeyUsageRule<\/code> section of the CPIX request, HDCP policies can be applied <strong>dynamically and reliably<\/strong> to the appropriate tracks, regardless of how KIDs are generated.<br \/>\n&nbsp;<\/p>\n<h3>Supported Track Types<\/h3>\n<p>The following <code>IntendedTrackType<\/code> values are supported:<br \/>\n<\/p>\n<ul>\n<li>SD<\/li>\n<li>HD<\/li>\n<li>UHD1<\/li>\n<li>UHD2<\/li>\n<li>AUDIO<\/li>\n<li>ALL<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h3>Configuration Details<\/h3>\n<p>Instead of specifying a KID in your Security configurations, define the target track using <code>MediaTrackType<\/code>.<br \/>\n<br \/>\nThe server will automatically:<\/p>\n<ul>\n<li>Identify all content keys associated with the specified track type<\/li>\n<li>Apply the configured security ruleoutput control to those keys at runtime<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h3>Example Use Case<\/h3>\n<p>&nbsp;<br \/>\n<strong>Requirement:<\/strong><br \/>\nEnforce <strong>HDCP version 2.2<\/strong> exclusively for <strong>UHD content<\/strong>, while allowing lower HDCP versions for SD and HD.<br \/>\n<br \/>\n<strong>Configuration Approach:<\/strong><br \/>\nSet the <code>hdcpOutputControl<\/code> policy to target the <code>UHD1<\/code> track type.<br \/>\n<br \/>\n<strong>Result:<\/strong><br \/>\nAny content key associated with the UHD1 track in the CPIX document will automatically receive the HDCP 2.2 enforcement, without requiring static KID references.<br \/>\n&nbsp;<\/p>\n<h2>DRM Token Request Configuration<\/h2>\n<p>You can apply security rules per track type in DRM token requests using the <code>mediaTrackType.N<\/code> parameter.<br \/>\n&nbsp;<\/p>\n<h3>Request Details<\/h3>\n<p>Method: <code>POST<\/code><\/p>\n<table class=\"workflows-table\">\n<colgroup>\n<col width=\"10%\" \/>\n<col width=\"10%\" \/>\n<col width=\"10%\" \/>\n<col width=\"15%\" \/>\n<col width=\"15%\" \/>\n<col width=\"15%\" \/>\n<col width=\"25%\" \/>\n<\/colgroup>\n<thead valign=\"bottom\">\n<tr>\n<th class=\"head\">Drm Type<\/th>\n<th class=\"head\">End point<\/th>\n<th class=\"head\">Query Parameters<\/th>\n<th class=\"head\">Description<\/th>\n<th class=\"head\">Type<\/th>\n<th class=\"head\">Required<\/th>\n<th class=\"head\">Sample values<\/th>\n<\/tr>\n<\/thead>\n<tbody valign=\"top\">\n<tr>\n<td>Widevine<\/td>\n<td>https:\/\/wv-gen-license.service.expressplay.com\/hms\/wv\/token<\/td>\n<td rowspan=\"3\">mediaTrackType.N<\/td>\n<td rowspan=\"3\">We can use this parameter to apply security rules. Only KEK and mediaTrackType.N \/mediaTrackType combination will work.Instead of KID we can use this parameter<\/td>\n<td rowspan=\"3\">String<\/td>\n<td rowspan=\"3\">OPTIONAL<\/td>\n<td rowspan=\"3\">\n<ul>\n<li>SD<\/li>\n<li>HD<\/li>\n<li>UHD1<\/li>\n<li>UHD2<\/li>\n<li>AUDIO<\/li>\n<li>VIDEO<\/li>\n<li>ALL<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td>FairPlay<\/td>\n<td>https:\/\/fp-gen-license.service.expressplay.com\/hms\/fp\/token<\/td>\n<\/tr>\n<tr>\n<td>PlayReady<\/td>\n<td>https:\/\/pr-gen-license.service.expressplay.com\/hms\/pr\/token<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h2>Retrieving Media Track Type from KMS<\/h2>\n<p>The media track type associated with a KID can also be retrieved using KMS APIs.<br \/>\n<\/p>\n<h3>Get Key by KID<\/h3>\n<p><strong>Endpoint<\/strong><br \/>\n&nbsp;<\/p>\n<blockquote>\n<dl class=\"docutils\">GET \/keys\/{kid}<\/dl>\n<\/blockquote>\n<p>&nbsp;<br \/>\n<strong>Production URL<\/strong><br \/>\n&nbsp;<\/p>\n<blockquote>\n<dl class=\"docutils\">\n  https:\/\/api.service.expressplay.com\/keystore\/keys\/<KID>?customerAuthenticator=<Cust_AUTH>&#038;kek=<KEK>&#038;mtt=<true|false>\n<\/dl>\n<\/blockquote>\n<p>&nbsp;<br \/>\n<strong>Query Parameter<\/strong><\/p>\n<table class=\"workflows-table\">\n<colgroup>\n<col width=\"20%\" \/>\n<col width=\"40%\" \/>\n<col width=\"20%\" \/>\n<col width=\"25%\" \/>\n<\/colgroup>\n<thead valign=\"bottom\">\n<tr>\n<th class=\"head\">Parameter<\/th>\n<th class=\"head\">Description<\/th>\n<th class=\"head\">Type<\/th>\n<th class=\"head\">Required<\/th>\n<\/tr>\n<\/thead>\n<tbody valign=\"top\">\n<tr>\n<td>mtt<\/td>\n<td>If true, returns the track type for the KID<\/td>\n<td>Boolean<\/td>\n<td>Optional<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h3>Sample Response<\/h3>\n<blockquote>\n<dl class=\"docutils\">\n  {<br \/>\n   &#8220;kid&#8221;: &#8220;7BAC3E9F5568401FB3B27D5A5325B483&#8221;,<br \/>\n   &#8220;kekId&#8221;: &#8220;#1.81DAF6B5F09AE9FE657AF420B763BA1B7FB2EF2C&#8221;,<br \/>\n   &#8220;ek&#8221;: &#8220;A0608DB68886337912EC3E867AE77A16A4F7D15E81E2577B&#8221;,<br \/>\n   &#8220;k&#8221;: &#8220;7A8999B86773491396940A88729811CC&#8221;,<br \/>\n   &#8220;lastUpdate&#8221;: &#8220;2025-11-27T04:56:43Z&#8221;,<br \/>\n   &#8220;mediaTrackType&#8221;: &#8220;VIDEO&#8221;<br \/>\n  }\n <\/dl>\n<\/blockquote>\n<p>&nbsp;<\/p>\n<h3>Get All Keys<\/h3>\n<p><strong>Endpoint<\/strong><br \/>\n&nbsp;<\/p>\n<blockquote>\n<dl class=\"docutils\">GET \/keys<\/dl>\n<\/blockquote>\n<p>&nbsp;<br \/>\n<strong>Production URL<\/strong><br \/>\n&nbsp;<\/p>\n<blockquote>\n<dl class=\"docutils\">\n  https:\/\/api.service.expressplay.com\/keystore\/keys?customerAuthenticator=<Cust_AUTH>&#038;kek=<KEK>&#038;mtt=<true|false>\n<\/dl>\n<\/blockquote>\n<p>&nbsp;<br \/>\n<strong>Query Parameter<\/strong><\/p>\n<table class=\"workflows-table\">\n<colgroup>\n<col width=\"20%\" \/>\n<col width=\"40%\" \/>\n<col width=\"20%\" \/>\n<col width=\"25%\" \/>\n<\/colgroup>\n<thead valign=\"bottom\">\n<tr>\n<th class=\"head\">Parameter<\/th>\n<th class=\"head\">Description<\/th>\n<th class=\"head\">Type<\/th>\n<th class=\"head\">Required<\/th>\n<\/tr>\n<\/thead>\n<tbody valign=\"top\">\n<tr>\n<td>mtt<\/td>\n<td>If true, returns track type for all KIDs for the customer<\/td>\n<td>Boolean<\/td>\n<td>Optional<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h3>Sample Response<\/h3>\n<blockquote>\n<dl class=\"docutils\">\n  [<br \/>\n   {<br \/>\n    &#8220;kid&#8221;: &#8220;391ED0FCCDB246C1AD413D167F0E4232&#8221;,<br \/>\n    &#8220;kekId&#8221;: &#8220;#1.81DAF6B5F09AE9FE657AF420B763BA1B7FB2EF2C&#8221;,<br \/>\n    &#8220;ek&#8221;: &#8220;E4B40AB4E7BF089A2B24AE931E6C549BCE5B397CF58E9519&#8221;,<br \/>\n    &#8220;k&#8221;: &#8220;2697B687551B45C7A97C1FD97080478E&#8221;,<br \/>\n    &#8220;lastUpdate&#8221;: &#8220;2025-11-26T07:31:59Z&#8221;,<br \/>\n    &#8220;mediaTrackType&#8221;: &#8220;ALL&#8221;<br \/>\n   },<br \/>\n   {<br \/>\n    &#8220;kid&#8221;: &#8220;7B213CDB76B84CFCAAB715D37D801125&#8221;,<br \/>\n    &#8220;kekId&#8221;: &#8220;#1.81DAF6B5F09AE9FE657AF420B763BA1B7FB2EF2C&#8221;,<br \/>\n    &#8220;ek&#8221;: &#8220;EBE38E334F45BB19C6F270F0FE03843B785AEB99B3242CA5&#8221;,<br \/>\n    &#8220;k&#8221;: &#8220;FFEAAB8427F9408AA55AA77E334C74E7&#8221;,<br \/>\n    &#8220;iv&#8221;: &#8220;21BFE06B62256B42A3550F0620714111&#8221;,<br \/>\n    &#8220;lastUpdate&#8221;: &#8220;2025-11-26T07:31:59Z&#8221;,<br \/>\n    &#8220;mediaTrackType&#8221;: &#8220;VIDEO&#8221;<br \/>\n   }<br \/>\n  ]\n <\/dl>\n<\/blockquote>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This feature allows you to apply security rules on content resolution (SD, HD, UHD), using the IntendedTrackType attribute from the CPIX document. It is particularly useful for AWS MediaPackage V2 workflows, where Key IDs (KIDs) are generated dynamically and cannot be referenced statically. &nbsp; Background \/ Problem Statement Traditionally, hdcpOutputControl settings were associated directly with specific KIDs. However, in dynamic packaging workflows\u2014such as those used by AWS MediaPackage V2\u2014KIDs are generated at runtime based on stream order and track configuration. As a result: KIDs cannot be predicted or hardcoded. Enforcing different HDCP requirements per resolution (for example, HDCP 2.2 only for UHD content) becomes impractical when relying on static KID-based [&hellip;]<\/p>\n","protected":false},"author":131,"featured_media":0,"parent":10924,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-skm-api-documentation.php","meta":{"_acf_changed":false,"footnotes":""},"tax_page_type":[],"coauthors":[638],"class_list":["post-26816","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.expressplay.com\/ja\/wp-json\/wp\/v2\/pages\/26816","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.expressplay.com\/ja\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.expressplay.com\/ja\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.expressplay.com\/ja\/wp-json\/wp\/v2\/users\/131"}],"replies":[{"embeddable":true,"href":"https:\/\/www.expressplay.com\/ja\/wp-json\/wp\/v2\/comments?post=26816"}],"version-history":[{"count":0,"href":"https:\/\/www.expressplay.com\/ja\/wp-json\/wp\/v2\/pages\/26816\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.expressplay.com\/ja\/wp-json\/wp\/v2\/pages\/10924"}],"wp:attachment":[{"href":"https:\/\/www.expressplay.com\/ja\/wp-json\/wp\/v2\/media?parent=26816"}],"wp:term":[{"taxonomy":"tax_page_type","embeddable":true,"href":"https:\/\/www.expressplay.com\/ja\/wp-json\/wp\/v2\/tax_page_type?post=26816"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.expressplay.com\/ja\/wp-json\/wp\/v2\/coauthors?post=26816"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}