


{"id":26779,"date":"2025-09-02T03:30:50","date_gmt":"2025-09-02T10:30:50","guid":{"rendered":"https:\/\/www.expressplay.com\/?page_id=26779"},"modified":"2025-09-02T03:30:50","modified_gmt":"2025-09-02T10:30:50","slug":"skm-rest-api","status":"publish","type":"page","link":"https:\/\/www.expressplay.com\/es\/skm-api-documentation\/skm-rest-api\/","title":{"rendered":"SKM REST API"},"content":{"rendered":"<p>The SKM API is an interface to a remote or local storage and management of cryptographic keys (media encryption keys for example). Each Key object has a unique key ID (KID) and a value (typically a 16-byte random number, like an AES-128 cipher key). Keys are stored encrypted with a KEK (Key Encryption Key) using a key wrapping algorithm (AES Key Wrap, RFC 3394). Each KEK has a corresponding KEKID (Key Encryption Key ID) which can be caller-assigned, or automatically computed by the server by deriving from the KEK value using a one way function. The server does not store the KEKs. Keys can be stored and retrieved in their encrypted form (in this case it is up to the caller of the API to perform the key wrapping and\/or unwrapping), or they can be stored and retrieved in clear-text form by passing the KEK as an API parameter whenever needed (this this case, it is the server that performs the key wrapping and\/or unwrapping).<br \/>\n&nbsp;<\/p>\n<h2 id=\"data-model\">Data Model<\/h2>\n<p>&nbsp;<br \/>\n<strong>A Key object has the following properties:<\/strong><\/p>\n<ul>\n<li>KID (Unique)<\/li>\n<li>Key Value (byte array, encrypted with KEK). This value is not stored on the server<\/li>\n<li>EK (encrypted representation of the Value). This is stored on the server<\/li>\n<li>KEK_ID (String that identifies a KEK. May be derived from KEK through a one-way function)<\/li>\n<li>Info (arbitrary string)<\/li>\n<li>Content ID (arbitrary string used to remember the association of the key with a specific content\/file)<\/li>\n<li>Expiration (if not null, the date\/time at which the Key object expired; it may be removed automatically by the server)<\/li>\n<li>Last Update (date\/time at which the Key object was last updated)<\/li>\n<\/ul>\n<p>&nbsp;<br \/>\n<strong>JSON representation<\/strong><br \/>\n<code>{<span class=\"json\">\"kid\":        <hex>    \/\/ (KID, 32 hex chars<br \/>\n    \"k\":          <hex>    \/\/ Key Value (not stored in DB, dynamically computed from \"ek\")<br \/>\n    \"ek\":         <hex>    \/\/ Key Value encrypted with KEK using AES Key Wrap<br \/>\n    \"kekId\":      <string> \/\/ KEK identifier<br \/>\n    \"info\":       <string> \/\/ (optional)<br \/>\n    \"contentId\":  <string> \/\/ (optional)<br \/>\n    \"expiration\": <date>   \/\/ (optional) expiration date of the object (ISO 8601 Extended Format)<br \/>\n    \"lastUpdate\": <date>   \/\/ (server-assigned) (ISO 8601 Extended Format)<br \/>\n<\/span>}<\/code><\/p>\n<p>&nbsp;<\/p>\n<h2 id=\"encrypted-vs-clear-text-key-values\">Encrypted vs Clear-text Key Values<\/h2>\n<p>&nbsp;<br \/>\nKeys are always stored on the server in their encrypted form. When Key values are exchanged through the API (either sent or received), they may be expressed either in their encrypted form (AES Key Wrap with a KEK), or in their raw clear-text form. If Key values are exchanged in their encrypted form, it is up to the caller to wrap or unwrap the key values with the appropriate KEK. If a kek URL query parameter is present, the server will automatically perform the Key value wrapping or unwrapping.<\/p>\n<p>&nbsp;<\/p>\n<h2 id=\"rest-api\">REST API<\/h2>\n<h3 id=\"common-api-parameters\">Common API parameters<\/h3>\n<table border=\"1\">\n<tr>\n<td>kek:<\/td>\n<td>(optional). When specified, this parameter contains the 16-byte KEK used to unwrap the key value, in hexadecimal (32 hex characters)<\/td>\n<\/tr>\n<\/table>\n<h3 id=\"optional-api-parameters-and-extensions\">Optional API parameters and extensions<\/h3>\n<p style=\"margin: 10px 0;\">\n<blockquote><p>Some implementations of the SKM API require API callers to authenticate themselves. This may be implemented in a number of different ways, including using a URL query parameter (like for example an API key passed in a query parameter, named apiKey, customerAuthenticator, or something similar). URL query parameters must be separated with an &#038; character.<\/p><\/blockquote>\n<p>&nbsp;<\/p>\n<h3 id=\"special-kid-syntax\">Special KID syntax<\/h3>\n<p style=\"margin: 10px 0;\">In order to facilitate the work of API clients, a 16-byte KID can be replaced by a ^ character followed by a string. In that case, the KID is simply computed as the 16-byte truncated SHA1 hash of the string.<\/p>\n<p>For example, if the KID is specified as the string ^kid1, the actual KID value is 80ea8bc8a58f990ad1f76bc665b30bfa.<\/p>\n<p>&nbsp;<\/p>\n<h3 id=\"root-url\">Root URL<\/h3>\n<p style=\"margin: 10px 0;\">\n<blockquote><p>Note: The URLs below are relative to a root URL for the Key Management Service on a server. In these examples, the root URL path is \/. But a server may use a different root URL path. For example, if the Key Management Service on a server named api.service.expressplay.com is at a root URL path \/keystore, then the URL relative path keys\/{kid} would result in a final URL https:\/\/api.service.expressplay.com\/keystore\/keys\/{kid} if accessed with HTTPS.<\/p><\/blockquote>\n<p>&nbsp;<\/p>\n<h3 id=\"api-urls\">API URLs<\/h3>\n<p style=\"margin: 10px 0;\">\n<blockquote><p>POST \/keys<\/p><\/blockquote>\n<p style=\"margin-top: 5px;\">Create a new Key object<\/p>\n<p style=\"margin-top: 5px;\">The POST body is either empty, in which case a brand new object, with a random KID, is created and returned (a KEK must be supplied through the kek URL query parameter), or contain a JSON object with a partial or complete Key object.<\/p>\n<p style=\"margin-top: 5px;\">A partial Key object is one where not all fields are set. Fields that are not set are automatically generated by the server as follows:<\/p>\n<p>&nbsp;<\/p>\n<table>\n<tr>\n<td><strong>kid<\/strong><\/td>\n<td>If the KID is not specified, a new random KID is chosen by the server. If the KID is specified, a new object is created with the specified KID, unless a Key object with the same KID already exists, in which case the rest of the POST body is ignored and the existing Key object is returned with an HTTP 200 status code.<\/td>\n<\/tr>\n<tr>\n<td><strong>k<\/strong><\/td>\n<td>If the clear-text Key Value is not specified, a new random key value will be chosen, using a cryptographically-strong random number generator.<\/td>\n<\/tr>\n<tr>\n<td><strong>ek<\/strong><\/td>\n<td>If the encrypted Key Value is not specified, a new random key value will be chosen, using a cryptographically-strong random number generator.<\/td>\n<\/tr>\n<tr>\n<td><strong>kekId<\/strong><\/td>\n<td>If a KEK ID is not specified, the server generates a KEKID value uniquely identifying the KEK<\/td>\n<\/tr>\n<tr>\n<td><strong>info<\/strong><\/td>\n<td>If the Key Info is not specified, this field remains empty<\/td>\n<\/tr>\n<tr>\n<td><strong>contentId<\/strong><\/td>\n<td>If the Content ID is not specified, this field remains empty<\/td>\n<\/tr>\n<tr>\n<td><strong>expiration<\/strong><\/td>\n<td>If no Expiration is specified, the expiration field is not set and the object does not expire.<\/td>\n<\/tr>\n<\/table>\n<p>&nbsp;<\/p>\n<p>The response contains a JSON object representing the Key object that was created or found.<\/p>\n<p style=\"margin: 10px 0;\">\n<blockquote><p>Note: It is important to set the Content-Type HTTP header to application\/json when issuing a POST request with a JSON body<\/p><\/blockquote>\n<p>&nbsp;<br \/>\n<strong>Example Request: create a new random Key object<\/strong><\/p>\n<p><code>POST \/keys?kek=000102030405060708090a0b0c0d0e0f HTTP\/1.1<\/code><\/p>\n<p>&nbsp;<br \/>\n<strong>Response<\/strong><\/p>\n<p><code>HTTP\/1.1 201 Created<br \/>\nContent-Type: application\/json<br \/>\nLocation: \/keys\/4e2df6b45e8257e187b2802b22ae7418<br \/>\n<br \/>\n{<span class=\"json\">\"kid\":   \"4e2df6b45e8257e187b2802b22ae7418\",<br \/>\n  \"k\":     \"a9b9033df0b9ca5447839e3d074817a0\",<br \/>\n  \"ek\":    \"5dbd06c0056b42fe0b8cf406679620c31bd619732730433d\",<br \/>\n  \"kekId\": \"#1.afe008a381bdac03b412a92d54b92ddf\"<br \/>\n<\/span>}<\/code><\/p>\n<p>&nbsp;<br \/>\n<strong>Example Request: create a new Key object with all fields already set<\/strong><\/p>\n<p><code>POST \/keys?kek=000102030405060708090a0b0c0d0e0f HTTP\/1.1<br \/>\n<br \/>\n{<span class=\"json\">\"kid\":       \"4e2df6b45e8257e187b2802b22ae7418\",<br \/>\n  \"k\":         \"a9b9033df0b9ca5447839e3d074817a0\",<br \/>\n  \"kekId\":     \"my-kek-id-1\",<br \/>\n  \"contentId\": \"urn:mynamespace:my-content-id-1234\",<br \/>\n  \"info\":      \"some comment\"<br \/>\n<\/span>}<\/code><\/p>\n<p>&nbsp;<br \/>\n<strong>Response<\/strong><\/p>\n<p><code>HTTP\/1.1 201 Created<br \/>\nContent-Type: application\/json<br \/>\nLocation: \/keys\/4e2df6b45e8257e187b2802b22ae7418<br \/>\n<br \/>\n{<span class=\"json\">\"kid\":       \"4e2df6b45e8257e187b2802b22ae7418\",<br \/>\n  \"k\":         \"a9b9033df0b9ca5447839e3d074817a0\",<br \/>\n  \"ek\":        \"5dbd06c0056b42fe0b8cf406679620c31bd619732730433d\",<br \/>\n  \"kekId\":     \"my-kek-id-1\",<br \/>\n  \"contentId\": \"urn:mynamespace:my-content-id-1234\",<br \/>\n  \"info\":      \"some comment\"<br \/>\n<\/span>}<\/code><\/p>\n<p>&nbsp;<\/p>\n<table>\n<tr>\n<td><strong>Query Parameters:<\/strong><\/td>\n<td>\n<ul>\n<li><strong>kek<\/strong> \u2013 (optional) KEK used to unwrap the key value<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td><strong>Request JSON Object:<\/strong><\/td>\n<td>\n<ul>\n<li><strong>kid<\/strong> (string) \u2013 KID (32 hex characters)<\/li>\n<li><strong>k<\/strong> (string) \u2013 Clear-text Key value (hex) [requires that the \u2018kek\u2019 query parameter be passed]<\/li>\n<li><strong>ek<\/strong> (string) \u2013 Encrypted Key value (hex) [mutually exclusive with the presence of a \u2018k\u2019 field]<\/li>\n<li><strong>kekId<\/strong> (string) \u2013 (optional) KEK Id<\/li>\n<li><strong>info<\/strong> (string) \u2013 (optional) Key info <\/li>\n<li><strong>contentId<\/strong> (string) \u2013 (optional) contentId<\/li>\n<li><strong>expiration <\/strong> (string) \u2013 (optional) Object expiration data\/time<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td><strong>Status Codes:<\/strong><\/td>\n<td>\n<ul>\n<li>200 OK \u2013 an existing Key object was found and returned<\/li>\n<li>201 Created \u2013 a new Key object successfully created<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/table>\n<p>&nbsp;<\/p>\n<blockquote><p>PUT \/keys\/{kid}<\/p><\/blockquote>\n<p>Update a Key object<\/p>\n<p>The PUT body must contain a JSON object for a partial or complete Key object. Fields that are not specified in the body will not be updated. The kid field, if present in the body, is ignored.<\/p>\n<p>&nbsp;<\/p>\n<blockquote><p>Note: It is important to set the Content-Type HTTP header to application\/json when issuing a PUT request with a JSON body<\/p><\/blockquote>\n<p>&nbsp;<br \/>\n<strong>Example Request: change the contentId of a Key object<\/strong><br \/>\n<code>PUT \/keys\/11a48707853ed5f13485f161523ffdc4 HTTP\/1.1<br \/>\n<br \/>\n{<span class=\"json\">\"contentId\": \"urn:namespace:x1234yyu\"<\/span>}<\/code><\/p>\n<p>&nbsp;<br \/>\n<strong>Response<\/strong><br \/>\n<code>HTTP\/1.1 200 OK<\/code><\/p>\n<p>&nbsp;<\/p>\n<table>\n<tr>\n<td><strong>Query Parameters:<\/strong><\/td>\n<td>\n<ul>\n<li><strong>kek<\/strong> \u2013 (optional) KEK used to unwrap the key value<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td><strong>Request JSON Object:<\/strong><\/td>\n<td>\n<ul>\n<li><strong>k<\/strong> (string) \u2013 Clear-text Key value (hex) [requires that the \u2018kek\u2019 query parameter be passed]<\/li>\n<li><strong>ek<\/strong> (string) \u2013 Encrypted Key value (hex) [mutually exclusive with the presence of a \u2018k\u2019 field]<\/li>\n<li><strong>kekId<\/strong> (string) \u2013 (optional) KEK Id<\/li>\n<li><strong>info<\/strong> (string) \u2013 (optional) Key info <\/li>\n<li><strong>contentId<\/strong> (string) \u2013 (optional) contentId<\/li>\n<li><strong>expiration <\/strong> (string) \u2013 (optional) Object expiration data\/time<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td><strong>Status Codes:<\/strong><\/td>\n<td>\n<ul>\n<li>200 OK \u2013 no error<\/li>\n<li>404 Not Found \u2013 key not found<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/table>\n<p>&nbsp;<\/p>\n<blockquote><p>GET \/keys\/{kid}<\/p><\/blockquote>\n<p>Returns one Key object<br \/>\n<br \/>\n<strong>Example Request (without specifying the KEK)<\/strong><br \/>\n<code>GET \/keys\/11a48707853ed5f13485f161523ffdc4 HTTP\/1.1<\/code><\/p>\n<p>&nbsp;<\/p>\n<p><strong>Example Response<\/strong><br \/>\n<code>HTTP\/1.1 200 OK<br \/>\nContent-Type: application\/json<br \/>\n<br \/>\n{<span class=\"json\">\"kid\":   \"11a48707853ed5f13485f161523ffdc4\",<br \/>\n  \"ek\":    \"b6862c586af0d70fdc594deb7b254bb38937113dbc6411ea\",<br \/>\n  \"kekId\": \"#1.afe008a381bdac03b412a92d54b92ddf\"<br \/>\n<\/span>}<\/code><\/p>\n<p>&nbsp;<br \/>\n<strong>Example Request (with KEK)<\/strong><br \/>\n<code>GET \/keys\/11a48707853ed5f13485f161523ffdc4?kek=000102030405060708090a0b0c0d0e0f HTTP\/1.1<\/code><\/p>\n<p>&nbsp;<br \/>\n<strong>Example Response<\/strong><br \/>\n<code>HTTP\/1.1 200 OK<br \/>\nContent-Type: application\/json<br \/>\n<br \/>\n{<span class=\"json\">\"kid\":   \"11a48707853ed5f13485f161523ffdc4\",<br \/>\n  \"k\":     \"d4783a651c96a872daa145ce1a378153\",<br \/>\n  \"kekId\": \"#1.afe008a381bdac03b412a92d54b92ddf\"<br \/>\n<\/span>}<\/code><\/p>\n<p>&nbsp;<\/p>\n<table>\n<tr>\n<td><strong>Query Parameters:<\/strong><\/td>\n<td>\n<ul>\n<li><strong>kek<\/strong> \u2013 (optional) KEK used to unwrap the key value<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td><strong>Status Codes:<\/strong><\/td>\n<td>\n<ul>\n<li>200 OK \u2013 no error<\/li>\n<li>400 Bad Request \u2013 bad request (ex: wrong KEK passed)\/li>\n<li>404 Not Found \u2013 key not found<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/table>\n<p>&nbsp;<\/p>\n<blockquote><p>GET \/keys\/{kid}\/value<\/p><\/blockquote>\n<p style=\"margin: 10px 0;\">Returns one Key value<\/p>\n<p style=\"margin: 10px 0;\">Instead of returning a complete JSON Key object, this request returns only the Key Value, as a hex string. If a KEK is passed in the kek query parameter, the response body contains the raw clear-text value of the Key object. If no KEK is passed, the response body contains the encrypted Key Value, prefixed with a # character<\/p>\n<p>&nbsp;<br \/>\n<strong>Example Request (with KEK)<\/strong><br \/>\n<code>GET \/keys\/00112233445566778899aabbccddeefc\/value?kek=00112233445566778899aabbccddeeff HTTP\/1.1<\/code><\/p>\n<p>&nbsp;<br \/>\n<strong>Example Response<\/strong><br \/>\n<code>HTTP\/1.1 200 OK<br \/>\nContent-Type: text\/plain<br \/>\n<br \/>\n12341234123412341234123412341234<br \/>\n<\/code><\/p>\n<p>&nbsp;<br \/>\n<strong>Example Request (without KEK)<\/strong><br \/>\n<code>GET \/keys\/00112233445566778899aabbccddeefc\/value HTTP\/1.1<\/code><\/p>\n<p>&nbsp;<br \/>\n<strong>Example Response<\/strong><br \/>\n<code>HTTP\/1.1 200 OK<br \/>\nContent-Type: text\/plain<br \/>\n<br \/>\n#ffaf1dae9201d1adf62770dca5ddb77ad773a79369e39986<\/code><\/p>\n<p>&nbsp;<\/p>\n<table>\n<tr>\n<td><strong>Query Parameters:<\/strong><\/td>\n<td>\n<ul>\n<li><strong>kek<\/strong> \u2013 (optional) KEK used to unwrap the key value<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td><strong>Status Codes:<\/strong><\/td>\n<td>\n<ul>\n<li>200 OK \u2013 no error<\/li>\n<li>400 Bad Request \u2013 bad request (ex: wrong KEK passed)\/li>\n<li>404 Not Found \u2013 key not found<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/table>\n<p>&nbsp;<\/p>\n<blockquote><p>GET \/keys\/{kid1},{kid2},&#8230;<\/p><\/blockquote>\n<p style=\"margin: 10px 0;\">Returns mutliple Key objects<\/p>\n<p style=\"margin: 10px 0;\">When multiple KIDs are specified, separated by \u2018,\u2019 characters, multiple Key objects can be retrieved with a single request. Just like for other requests, each KID may be expressed as a 32-character hex string, or a \u2018^\u2019 followed by an arbitrary string. The response body contains a JSON array of Key objects<\/p>\n<p>&nbsp;<br \/>\n<strong>Example Request<\/strong><br \/>\n<code>GET \/keys\/00112233445566778899aabbccddeefb,00112233445566778899aabbccddeefa,00112233445566778899aabbccddeeff\/value?kek=000102030405060708090a0b0c0d0e0f HTTP\/1.1<\/code><\/p>\n<p>&nbsp;<br \/>\n<strong>Example Response<\/strong><br \/>\n<code>HTTP\/1.1 200 OK<br \/>\nContent-Type: application\/json<br \/>\n<br \/>\n[<span class=\"json\">{<span class=\"json\">\"kid\":  \"00112233445566778899aabbccddeeff\",<br \/>\n    \"k\":    \"ea85a33da18d55ffead60509a5666ad1\"<br \/>\n  <\/span>},<br \/>\n  {<span class=\"json\">\"kid\":  \"00112233445566778899aabbccddeefa\",<br \/>\n    \"k\":    \"0ae81ee0bc16917f3758324c151f7010\"<br \/>\n  <\/span>},<br \/>\n  {<span class=\"json\"><br \/>\n    \"kid\":  \"00112233445566778899aabbccddeefb\",<br \/>\n    \"k\":    \"a0a1a2a3a4a5a6a7a8a9aaabacadaeaf\"<br \/>\n  <\/span>}<br \/>\n<\/span>]<\/code><\/p>\n<p>&nbsp;<\/p>\n<table>\n<tr>\n<td><strong>Query Parameters:<\/strong><\/td>\n<td>\n<ul>\n<li><strong>kek<\/strong> \u2013 (optional) KEK used to unwrap the key value<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td><strong>Status Codes:<\/strong><\/td>\n<td>\n<ul>\n<li>200 OK \u2013 no error<\/li>\n<li>400 Bad Request \u2013 bad request (ex: wrong KEK passed)\/li>\n<li>404 Not Found \u2013 key not found<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/table>\n<p>&nbsp;<\/p>\n<blockquote><p>GET \/keys\/{kid1},{kid2},&#8230;\/value<\/p><\/blockquote>\n<p style=\"margin: 10px 0;\">Returns multiple Key object values<\/p>\n<p style=\"margin: 10px 0;\">This variant of the multiple-KID request returns the key values only instead of an array of JSON Key objects. As with the single-KID Key value request, the response body contains Key values either in raw clear-text form (when a KEK is passed), or in wrapped form (prefixed with &#8216;#&#8217;). The Key values in the response body are separated by &#8216;,&#8217; characters<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Example Request (with KEK)<\/strong><br \/>\n<code>GET \/keys\/00112233445566778899aabbccddeefb,00112233445566778899aabbccddeefa,00112233445566778899aabbccddeeff\/value?kek=000102030405060708090a0b0c0d0e0f HTTP\/1.1<\/code><\/p>\n<p>&nbsp;<\/p>\n<p><strong>Example Response<\/strong><br \/>\n<code>HTTP\/1.1 200 OK<br \/>\nContent-Type: text\/plain<br \/>\n<br \/>\na0a1a2a3a4a5a6a7a8a9aaabacadaeaf,0ae81ee0bc16917f3758324c151f7010,ea85a33da18d55ffead60509a5666ad1<\/code><\/p>\n<p>&nbsp;<\/p>\n<p><strong>Example Request (without KEK)<\/strong><br \/>\n<code>GET \/keys\/00112233445566778899aabbccddeefb,00112233445566778899aabbccddeefa,00112233445566778899aabbccddeeff\/value HTTP\/1.1<\/code><\/p>\n<p>&nbsp;<\/p>\n<p><strong>Example Response<\/strong><br \/>\n<code>HTTP\/1.1 200 OK<br \/>\nContent-Type: text\/plain<br \/>\n<br \/>\n#7c98f3e4d60636d4aef4977d12dbfe75611dbd03e54dffef,#83017d13dc5067c1cff0ecab23184fd721832ad61f79ebfc,#81cf23495abdc2e6395a527c20a0bdc39e21549cfe0914f4<br \/>\n<\/code><br \/>\n&nbsp;<\/p>\n<table>\n<tr>\n<td><strong>Query Parameters:<\/strong><\/td>\n<td>\n<ul>\n<li><strong>kek<\/strong> \u2013 (optional) KEK used to unwrap the key value<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td><strong>Status Codes:<\/strong><\/td>\n<td>\n<ul>\n<li>200 OK \u2013 no error<\/li>\n<li>400 Bad Request \u2013 bad request (ex: wrong KEK passed)\/li>\n<li>404 Not Found \u2013 key not found<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/table>\n<p>&nbsp;<\/p>\n<blockquote><p>DELETE \/keys\/{kid}<\/p><\/blockquote>\n<p style=\"margin: 10px 0;\">Delete a Key object<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Example Request<\/strong><br \/>\n<code>DELETE \/keys\/00112233445566778899aabbccddeefb HTTP\/1.1<\/code><\/p>\n<p>&nbsp;<\/p>\n<p><strong>Example Response<\/strong><br \/>\n<code>HTTP\/1.1 200 OK<\/code><\/p>\n<p>&nbsp;<\/p>\n<table>\n<tr>\n<td><strong>Status Codes:<\/strong><\/td>\n<td>\n<ul>\n<li>200 OK \u2013 no error<\/li>\n<li>404 Not Found \u2013 key not found<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/table>\n<p>&nbsp;<\/p>\n<blockquote><p>GET \/keys<\/p><\/blockquote>\n<p style=\"margin: 10px 0;\">Returns all the Key objects stored on the server<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Example Request<\/strong><br \/>\n<code>GET \/keys HTTP\/1.1<\/code><\/p>\n<p>&nbsp;<\/p>\n<p><strong>Example Response<\/strong><br \/>\n<code>HTTP\/1.1 200 OK<br \/>\nContent-Type: application\/json<br \/>\n<br \/>\n[<span class=\"json\">{<span class=\"json\">\"kid\":   \"11a48707853ed5f13485f161523ffdc4\",<br \/>\n    \"ek\":    \"b6862c586af0d70fdc594deb7b254bb38937113dbc6411ea\",<br \/>\n    \"kekId\": \"#1.afe008a381bdac03b412a92d54b92ddf\"<br \/>\n  <\/span>},<br \/>\n  {<span class=\"json\">\"kid\":   \"f0bacfca77d36361179b36a4cbee8abf\",<br \/>\n    \"ek\":    \"a23ce0ab465f36a56f6e2863b16778cb7c7064662c1cbfa0\",<br \/>\n    \"kekId\": \"#1.afe008a381bdac03b412a92d54b92ddf\",<br \/>\n    \"info\":  \"foobar\"<br \/>\n    <\/span>}<br \/>\n<\/span>]<\/code><\/p>\n<p>&nbsp;<\/p>\n<table>\n<tr>\n<td><strong>Query Parameters:<\/strong><\/td>\n<td>\n<ul>\n<li><strong>kek<\/strong> \u2013 (optional) KEK used to unwrap the key value<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td><strong>Status Codes:<\/strong><\/td>\n<td>\n<ul>\n<li>200 OK \u2013 no error<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/table>\n<p>&nbsp;<\/p>\n<blockquote><p>GET \/keycount<\/p><\/blockquote>\n<p style=\"margin: 10px 0;\">Returns the number of Key objects stored on the server, as a JSON object with a \u201ckeyCount\u201d integer field<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Example Request<\/strong><br \/>\n<code>Get \/keycount HTTP\/1.1<\/code><\/p>\n<p>&nbsp;<\/p>\n<p><strong>Example Response<\/strong><br \/>\n<code>HTTP\/1.1 200 OK<br \/>\nContent-Type: application\/json<br \/>\n<br \/>\n{<span class=\"json\">\"keyCount\": 1567<\/span>}<\/code><\/p>\n<p>&nbsp;<\/p>\n<table>\n<tr>\n<td><strong>Status Codes:<\/strong><\/td>\n<td>\n<ul>\n<li>200 OK \u2013 no error<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>The SKM API is an interface to a remote or local storage and management of cryptographic keys (media encryption keys for example). Each Key object has a unique key ID (KID) and a value (typically a 16-byte random number, like an AES-128 cipher key). Keys are stored encrypted with a KEK (Key Encryption Key) using [&hellip;]<\/p>\n","protected":false},"author":131,"featured_media":0,"parent":26777,"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-26779","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.expressplay.com\/es\/wp-json\/wp\/v2\/pages\/26779","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.expressplay.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.expressplay.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.expressplay.com\/es\/wp-json\/wp\/v2\/users\/131"}],"replies":[{"embeddable":true,"href":"https:\/\/www.expressplay.com\/es\/wp-json\/wp\/v2\/comments?post=26779"}],"version-history":[{"count":0,"href":"https:\/\/www.expressplay.com\/es\/wp-json\/wp\/v2\/pages\/26779\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.expressplay.com\/es\/wp-json\/wp\/v2\/pages\/26777"}],"wp:attachment":[{"href":"https:\/\/www.expressplay.com\/es\/wp-json\/wp\/v2\/media?parent=26779"}],"wp:term":[{"taxonomy":"tax_page_type","embeddable":true,"href":"https:\/\/www.expressplay.com\/es\/wp-json\/wp\/v2\/tax_page_type?post=26779"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.expressplay.com\/es\/wp-json\/wp\/v2\/coauthors?post=26779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}