{
  "info": {
    "_postman_id": "5b0e6c1e-2f4a-4d8b-9a37-8c1f0e2d6a51",
    "name": "Osteocom Content Licensing API",
    "description": "Requests for the Osteocom Content Licensing API, in the order you call them.\n\n1. **Login**: get the bearer token.\n2. **Catalog**: the channels agreed for your account, with their videolessons.\n3. **Content authorization**: record a purchase after the customer pays. Returns the customer's `userAccessKey`.\n4. **Video access**: get a 15-minute token to play one videolesson in the player iframe.\n5. **Revoke access**: remove a customer's access to a channel.\n\n### Setup\n\nSet `clientId` and `clientSecret` in the collection variables, then run the requests in order. The test scripts fill in `token`, `channelId`, `price`, `videoId`, `userAccessKey` and `tokenAuthVideo` as you go.\n\n`baseUrl` points to Test. For production set it to `https://www.osteocom.me/sv6`.\n\n### Good to know\n\n- Every request is a `POST` with a JSON body.\n- Every request except Login needs `Authorization: Bearer <token>`. It is set on the collection. Without it you get `401`.\n- Text fields accept up to 50 characters (`userId`, `email`, `name`, `surname`).\n- A body that fails validation (missing required field, value too long, wrong type) returns `422` with an empty body.\n- Errors don't return JSON: the body is empty or a short text message. Check the status code.\n- `idChannel` and `videoId` are different ids. `idChannel` identifies the channel you sell, `videoId` a single videolesson inside it.\n\nFull reference: https://platform.developer.osteocom.me/guide/marketplaceapi/usage/apiDocumentation111",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "item": [
    {
      "name": "1. Login",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if (pm.response.code === 200) {",
              "    pm.collectionVariables.set(\"token\", pm.response.json().token);",
              "}"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"clientId\": \"{{clientId}}\",\n  \"clientSecret\": \"{{clientSecret}}\"\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        },
        "url": {
          "raw": "{{baseUrl}}/contentLicensing_login",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "contentLicensing_login"
          ]
        },
        "auth": {
          "type": "noauth"
        },
        "description": "Exchanges your credentials for the bearer token used by every other request.\n\n| Field | Type | |\n|---|---|---|\n| `clientId` | string | required |\n| `clientSecret` | string | required |\n\nThe test script saves the token in the `token` variable."
      },
      "response": [
        {
          "name": "200 Logged in",
          "originalRequest": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"clientId\": \"psiGBHLDxxxxxxdIyDw\",\n  \"clientSecret\": \"QAtSxxxxxxxxrz2JU\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/contentLicensing_login",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "contentLicensing_login"
              ]
            },
            "auth": {
              "type": "noauth"
            }
          },
          "status": "OK",
          "code": 200,
          "_postman_previewlanguage": "json",
          "header": [
            {
              "key": "Content-Type",
              "value": "application/json"
            }
          ],
          "cookie": [],
          "body": "{\n  \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaWQiOiI2NmZh...\"\n}"
        },
        {
          "name": "401 Wrong credentials",
          "originalRequest": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"clientId\": \"psiGBHLDxxxxxxdIyDw\",\n  \"clientSecret\": \"wrong-secret\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/contentLicensing_login",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "contentLicensing_login"
              ]
            },
            "auth": {
              "type": "noauth"
            }
          },
          "status": "Unauthorized",
          "code": 401,
          "_postman_previewlanguage": "text",
          "header": [],
          "cookie": [],
          "body": ""
        }
      ]
    },
    {
      "name": "2. Catalog",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if (pm.response.code === 200) {",
              "    const channel = pm.response.json().catalog[0];",
              "    if (channel) {",
              "        pm.collectionVariables.set(\"channelId\", channel.idChannel);",
              "        pm.collectionVariables.set(\"price\", channel.price);",
              "        if (channel.video && channel.video.length) {",
              "            pm.collectionVariables.set(\"videoId\", channel.video[0].videoId);",
              "        }",
              "    }",
              "}"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"clientId\": \"{{clientId}}\"\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        },
        "url": {
          "raw": "{{baseUrl}}/contentLicensing_catalog",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "contentLicensing_catalog"
          ]
        },
        "description": "Returns the channels agreed for your account. Titles and descriptions are in each channel's language.\n\n| Field | Type | |\n|---|---|---|\n| `clientId` | string | required |\n\nEach channel has an `idChannel` and a `video` array: every videolesson in it has its own `videoId`.\n\n- `idChannel` goes in Content authorization (`productId`) and Revoke access (`channelId`).\n- `videoId` goes in Video access.\n\nFields without a value are returned as `null`. `duration` is in seconds; `captions` maps a language to a `.vtt` file.\n\nThe test script saves the first channel's `idChannel` and `price`, and its first `videoId`."
      },
      "response": [
        {
          "name": "200 Catalog",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"clientId\": \"psiGBHLDxxxxxxdIyDw\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/contentLicensing_catalog",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "contentLicensing_catalog"
              ]
            }
          },
          "status": "OK",
          "code": 200,
          "_postman_previewlanguage": "json",
          "header": [
            {
              "key": "Content-Type",
              "value": "application/json"
            }
          ],
          "cookie": [],
          "body": "{\n  \"catalog\": [\n    {\n      \"idChannel\": \"66d579675f2a8c1e3f15e4d3\",\n      \"authors\": [\n        {\n          \"name\": \"John Smith\",\n          \"image\": \"https://cdn.osteocom.me/authors/smith.jpg\"\n        }\n      ],\n      \"background\": \"https://cdn.osteocom.me/backgrounds/arthroscopy.jpg\",\n      \"cover\": \"https://cdn.osteocom.me/covers/arthroscopy.jpg\",\n      \"trailer\": \"https://cdn.osteocom.me/trailers/arthroscopy.m3u8\",\n      \"price\": 100,\n      \"video\": [\n        {\n          \"videoId\": \"66d57a1b5f2a8c1e3f15e4e1\",\n          \"authors\": [\n            {\n              \"name\": \"John Smith\",\n              \"image\": \"https://cdn.osteocom.me/authors/smith.jpg\"\n            }\n          ],\n          \"background\": null,\n          \"cover\": \"https://cdn.osteocom.me/covers/arthroscopy-01.jpg\",\n          \"trailer\": null,\n          \"title\": \"Introduction to arthroscopy\",\n          \"subtitle\": \"Portals and instruments\",\n          \"htmlDescription\": \"<p>Patient positioning, portals and basic instruments.</p>\",\n          \"duration\": 2730,\n          \"videoQuality\": \"FullHD\",\n          \"audio\": [\n            \"en\"\n          ],\n          \"captions\": {\n            \"en\": \"https://cdn.osteocom.me/subtitles/66d57a1b-en.vtt\",\n            \"it\": \"https://cdn.osteocom.me/subtitles/66d57a1b-it.vtt\"\n          }\n        }\n      ],\n      \"title\": \"Arthroscopy of the knee\",\n      \"subtitle\": \"From the basics to meniscal repair\",\n      \"htmlDescription\": \"<p>A complete course on knee arthroscopy.</p>\"\n    }\n  ]\n}"
        },
        {
          "name": "404 No catalog for this clientId",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"clientId\": \"psiGBHLDxxxxxxdIyDw\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/contentLicensing_catalog",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "contentLicensing_catalog"
              ]
            }
          },
          "status": "Not Found",
          "code": 404,
          "_postman_previewlanguage": "text",
          "header": [],
          "cookie": [],
          "body": ""
        }
      ]
    },
    {
      "name": "3. Content authorization",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if (pm.response.code === 200) {",
              "    pm.collectionVariables.set(\"userAccessKey\", pm.response.json().token);",
              "}"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"clientId\": \"{{clientId}}\",\n  \"userId\": \"{{userId}}\",\n  \"email\": \"customer@example.com\",\n  \"name\": \"Mario\",\n  \"surname\": \"Rossi\",\n  \"marketingConsent\": false,\n  \"products\": [\n    { \"productId\": \"{{channelId}}\", \"price\": {{price}} }\n  ]\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        },
        "url": {
          "raw": "{{baseUrl}}/contentLicensing_contentAccessAuthorization",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "contentLicensing_contentAccessAuthorization"
          ]
        },
        "description": "Call it after the customer has paid on your platform: it records the purchase and gives the customer access to the channel.\n\n| Field | Type | |\n|---|---|---|\n| `clientId` | string | required |\n| `userId` | string, max 50 | required. Your id for the customer: keep it the same for the same person |\n| `products` | array, 1 to 100 | required. `productId` = `idChannel`, `price` = the channel price from the catalog |\n| `email` | string, max 50 | required and checked for a valid format only if marketing is enabled on your account |\n| `name`, `surname` | string, max 50 | optional |\n| `marketingConsent` | boolean | optional, default `false` |\n\nThe response `token` is the customer's `userAccessKey`. It is always the same for the same `userId`, so you can store it or ask for it again.\n\nThe test script saves it in the `userAccessKey` variable."
      },
      "response": [
        {
          "name": "200 Purchase recorded",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"clientId\": \"psiGBHLDxxxxxxdIyDw\",\n  \"userId\": \"user_12345\",\n  \"email\": \"customer@example.com\",\n  \"name\": \"Mario\",\n  \"surname\": \"Rossi\",\n  \"marketingConsent\": false,\n  \"products\": [\n    {\n      \"productId\": \"66d579675f2a8c1e3f15e4d3\",\n      \"price\": 100\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/contentLicensing_contentAccessAuthorization",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "contentLicensing_contentAccessAuthorization"
              ]
            }
          },
          "status": "OK",
          "code": 200,
          "_postman_previewlanguage": "json",
          "header": [
            {
              "key": "Content-Type",
              "value": "application/json"
            }
          ],
          "cookie": [],
          "body": "{\n  \"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOm51bGwsImlkYyI6InBzaUdC...\"\n}"
        },
        {
          "name": "400 Email required (marketing enabled)",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"clientId\": \"psiGBHLDxxxxxxdIyDw\",\n  \"userId\": \"user_12345\",\n  \"email\": null,\n  \"name\": \"Mario\",\n  \"surname\": \"Rossi\",\n  \"marketingConsent\": false,\n  \"products\": [\n    {\n      \"productId\": \"66d579675f2a8c1e3f15e4d3\",\n      \"price\": 100\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/contentLicensing_contentAccessAuthorization",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "contentLicensing_contentAccessAuthorization"
              ]
            }
          },
          "status": "Bad Request",
          "code": 400,
          "_postman_previewlanguage": "text",
          "header": [
            {
              "key": "Content-Type",
              "value": "text/plain"
            }
          ],
          "cookie": [],
          "body": "Email field required."
        },
        {
          "name": "403 Invalid email (marketing enabled)",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"clientId\": \"psiGBHLDxxxxxxdIyDw\",\n  \"userId\": \"user_12345\",\n  \"email\": \"customer@example\",\n  \"name\": \"Mario\",\n  \"surname\": \"Rossi\",\n  \"marketingConsent\": false,\n  \"products\": [\n    {\n      \"productId\": \"66d579675f2a8c1e3f15e4d3\",\n      \"price\": 100\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/contentLicensing_contentAccessAuthorization",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "contentLicensing_contentAccessAuthorization"
              ]
            }
          },
          "status": "Forbidden",
          "code": 403,
          "_postman_previewlanguage": "text",
          "header": [
            {
              "key": "Content-Type",
              "value": "text/plain"
            }
          ],
          "cookie": [],
          "body": "Unformatted email: insert a valid email."
        },
        {
          "name": "403 Empty products",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"clientId\": \"psiGBHLDxxxxxxdIyDw\",\n  \"userId\": \"user_12345\",\n  \"email\": \"customer@example.com\",\n  \"name\": \"Mario\",\n  \"surname\": \"Rossi\",\n  \"marketingConsent\": false,\n  \"products\": []\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/contentLicensing_contentAccessAuthorization",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "contentLicensing_contentAccessAuthorization"
              ]
            }
          },
          "status": "Forbidden",
          "code": 403,
          "_postman_previewlanguage": "text",
          "header": [],
          "cookie": [],
          "body": ""
        },
        {
          "name": "422 userId longer than 50 characters",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"clientId\": \"psiGBHLDxxxxxxdIyDw\",\n  \"userId\": \"customer-2f9c1a7e-4b3d-4e8a-9f61-0c2d5b7a8e94-staging\",\n  \"email\": \"customer@example.com\",\n  \"name\": \"Mario\",\n  \"surname\": \"Rossi\",\n  \"marketingConsent\": false,\n  \"products\": [\n    {\n      \"productId\": \"66d579675f2a8c1e3f15e4d3\",\n      \"price\": 100\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/contentLicensing_contentAccessAuthorization",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "contentLicensing_contentAccessAuthorization"
              ]
            }
          },
          "status": "Unprocessable Entity",
          "code": 422,
          "_postman_previewlanguage": "text",
          "header": [],
          "cookie": [],
          "body": ""
        }
      ]
    },
    {
      "name": "4. Video access",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if (pm.response.code === 200) {",
              "    pm.collectionVariables.set(\"tokenAuthVideo\", pm.response.json().tokenAuthVideo);",
              "}"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"clientId\": \"{{clientId}}\",\n  \"userId\": \"{{userId}}\",\n  \"videoId\": \"{{videoId}}\",\n  \"userAccessKey\": \"{{userAccessKey}}\"\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        },
        "url": {
          "raw": "{{baseUrl}}/contentLicensing_videoAccess",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "contentLicensing_videoAccess"
          ]
        },
        "description": "Returns a token to play one videolesson. Ask for a new one each time the player is loaded.\n\n| Field | Type | |\n|---|---|---|\n| `clientId` | string | required |\n| `userId` | string, max 50 | required. Same `userId` used in Content authorization |\n| `videoId` | string | required. A `videoId` from the catalog, not the `idChannel` |\n| `userAccessKey` | string, max 800 | required. The `token` from Content authorization, unchanged |\n\n`tokenAuthVideo` is valid for 15 minutes. Put it in the player URL:\n\n```html\n<iframe src=\"https://test.osteocom.me/en/videoaccess?signature={{tokenAuthVideo}}&sublang=en\"\n        width=\"100%\" height=\"500\" frameborder=\"0\" allowfullscreen allow=\"encrypted-media\"></iframe>\n```\n\n`sublang` is the default subtitle language (`it`, `en`, `fr`, `es`). In production use `https://www.osteocom.me`.\n\nA `401` means the customer can't watch that video: the `videoId` doesn't exist, the `userAccessKey` doesn't match the `userId`, or the customer has no active access to the channel."
      },
      "response": [
        {
          "name": "200 Video token",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"clientId\": \"psiGBHLDxxxxxxdIyDw\",\n  \"userId\": \"user_12345\",\n  \"videoId\": \"66d57a1b5f2a8c1e3f15e4e1\",\n  \"userAccessKey\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOm51bGwsImlkYyI6InBzaUdC...\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/contentLicensing_videoAccess",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "contentLicensing_videoAccess"
              ]
            }
          },
          "status": "OK",
          "code": 200,
          "_postman_previewlanguage": "json",
          "header": [
            {
              "key": "Content-Type",
              "value": "application/json"
            }
          ],
          "cookie": [],
          "body": "{\n  \"tokenAuthVideo\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjaGFubmVsSWQiOiI2NmQ1Nzk2...\"\n}"
        },
        {
          "name": "401 No access to this video",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"clientId\": \"psiGBHLDxxxxxxdIyDw\",\n  \"userId\": \"user_12345\",\n  \"videoId\": \"66d57a1b5f2a8c1e3f15e4e1\",\n  \"userAccessKey\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZHUiOiJ1c2VyXzk5OTk5...\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/contentLicensing_videoAccess",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "contentLicensing_videoAccess"
              ]
            }
          },
          "status": "Unauthorized",
          "code": 401,
          "_postman_previewlanguage": "text",
          "header": [],
          "cookie": [],
          "body": ""
        },
        {
          "name": "422 Missing videoId",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"clientId\": \"psiGBHLDxxxxxxdIyDw\",\n  \"userId\": \"user_12345\",\n  \"userAccessKey\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOm51bGwsImlkYyI6InBzaUdC...\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/contentLicensing_videoAccess",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "contentLicensing_videoAccess"
              ]
            }
          },
          "status": "Unprocessable Entity",
          "code": 422,
          "_postman_previewlanguage": "text",
          "header": [],
          "cookie": [],
          "body": ""
        }
      ]
    },
    {
      "name": "5. Revoke access",
      "request": {
        "method": "POST",
        "header": [],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"clientId\": \"{{clientId}}\",\n  \"channelId\": \"{{channelId}}\",\n  \"userId\": \"{{userId}}\"\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        },
        "url": {
          "raw": "{{baseUrl}}/contentLicensing_revocateActivation",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "contentLicensing_revocateActivation"
          ]
        },
        "description": "Removes a customer's access to a channel, for example after a refund. The customer can no longer get a video token for it.\n\n| Field | Type | |\n|---|---|---|\n| `clientId` | string | required |\n| `channelId` | string | required. The `idChannel` |\n| `userId` | string, max 50 | required |\n\nTo give access back, call Content authorization again.\n\nA `500` means there is nothing to revoke: the `userId` was never authorized, or never on that channel."
      },
      "response": [
        {
          "name": "200 Access revoked",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"clientId\": \"psiGBHLDxxxxxxdIyDw\",\n  \"channelId\": \"66d579675f2a8c1e3f15e4d3\",\n  \"userId\": \"user_12345\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/contentLicensing_revocateActivation",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "contentLicensing_revocateActivation"
              ]
            }
          },
          "status": "OK",
          "code": 200,
          "_postman_previewlanguage": "json",
          "header": [
            {
              "key": "Content-Type",
              "value": "application/json"
            }
          ],
          "cookie": [],
          "body": "{\n  \"userId\": \"user_12345\",\n  \"cancellationDate\": \"2026-09-30T10:24:00.000Z\"\n}"
        },
        {
          "name": "500 Nothing to revoke",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"clientId\": \"psiGBHLDxxxxxxdIyDw\",\n  \"channelId\": \"66d579675f2a8c1e3f15e4d3\",\n  \"userId\": \"user_00000\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/contentLicensing_revocateActivation",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "contentLicensing_revocateActivation"
              ]
            }
          },
          "status": "Internal Server Error",
          "code": 500,
          "_postman_previewlanguage": "text",
          "header": [],
          "cookie": [],
          "body": ""
        }
      ]
    }
  ],
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{token}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://test.osteocom.me/sv6",
      "type": "string"
    },
    {
      "key": "clientId",
      "value": "",
      "type": "string"
    },
    {
      "key": "clientSecret",
      "value": "",
      "type": "string"
    },
    {
      "key": "userId",
      "value": "user_12345",
      "type": "string"
    },
    {
      "key": "token",
      "value": "",
      "type": "string"
    },
    {
      "key": "channelId",
      "value": "",
      "type": "string"
    },
    {
      "key": "price",
      "value": "100",
      "type": "string"
    },
    {
      "key": "videoId",
      "value": "",
      "type": "string"
    },
    {
      "key": "userAccessKey",
      "value": "",
      "type": "string"
    },
    {
      "key": "tokenAuthVideo",
      "value": "",
      "type": "string"
    }
  ]
}
