Skip to content
API Integration

API Reference ​

All endpoints are POST requests relative to your environment base URL. Send and receive application/json.

Base https://test.osteocom.me/sv6

Base URL

Examples target the Test base URL. Switch with the Environment selector above — production is https://www.osteocom.me/sv6.

Field limits

Every endpoint validates the body before processing it. Text fields accept up to 50 characters unless stated otherwise — this includes userId, email, name and surname. A missing required field, a value that is too long or a value of the wrong type is rejected with 422 Unprocessable Entity, and the response does not say which field failed.

Authorization POST ​

POST/contentLicensing_login

Exchange your client credentials for a bearer token. The returned token authorizes every subsequent call via the Authorization header.

Body parameters

clientId*
string
Required
Your unique client ID, provided by Osteocom.
clientSecret*
string
Required
Your secret key, provided by Osteocom.

Returns

token
string
Optional
A JWT bearer token for subsequent requests.
js
const res = await fetch("https://test.osteocom.me/sv6/contentLicensing_login", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    clientId: "psiGBHLDxxxxxxdIyDw",
    clientSecret: "QAtSxxxx…rz2JU",
  }),
});

const data = await res.json();
bash
curl -X POST https://test.osteocom.me/sv6/contentLicensing_login \
  -H "Content-Type: application/json" \
  -d '{"clientId":"psiGBHLDxxxxxxdIyDw","clientSecret":"QAtSxxxx…rz2JU"}'
python
import requests

res = requests.post(
    "https://test.osteocom.me/sv6/contentLicensing_login",
    json={"clientId": "psiGBHLDxxxxxxdIyDw", "clientSecret": "QAtSxxxx…rz2JU"},
)
data = res.json()
json
{ "token": "eyJhbGciOiJIUzI1Ni...JWT" }

Status codes

StatusMeaning
200OK — a valid JWT token.
401Not Authorized — unknown client.

Catalog access POST ​

POST/contentLicensing_catalog

Retrieve the catalog of channels and videolessons pre-agreed for your account. Each channel's content reflects its configured language.

Headers

Authorization*
string
Required
Bearer token, e.g. Bearer <token>.

Body parameters

clientId*
string
Required
Your unique client ID.

Returns

catalog
array of objects
Optional
Each object is a channel available to your account.
Show child attributes
idChannelstring
Channel identifier. Use as productId in Content authorization and as channelId in Revoke access. Video access takes a videoId from video instead.
titlestring
Channel title, in the channel's configured language.
subtitlestring
Channel subtitle.
htmlDescriptionstring
Rich HTML description of the channel.
priceinteger
Price of the channel.
coverstring
Cover image URL.
backgroundstring
Background image URL.
trailerstring
Trailer video URL.
authorsarray of objects
The channel's authors — each with name and image.
videoarray of objects
The videolessons in the channel — each with videoId, title, duration (seconds) and videoQuality. Pass videoId to Video access.
js
const res = await fetch("https://test.osteocom.me/sv6/contentLicensing_catalog", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: `Bearer ${token}`,
  },
  body: JSON.stringify({ clientId: "psiGBHLDxxxxxxdIyDw" }),
});

const data = await res.json();
bash
curl -X POST https://test.osteocom.me/sv6/contentLicensing_catalog \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"clientId":"psiGBHLDxxxxxxdIyDw"}'
python
res = requests.post(
    "https://test.osteocom.me/sv6/contentLicensing_catalog",
    headers={"Authorization": f"Bearer {token}"},
    json={"clientId": "psiGBHLDxxxxxxdIyDw"},
)
data = res.json()
json
{
  "catalog": [
    {
      "idChannel": "66d579675f2xxxxxxf15e4d3",
      "title": "Advanced Orthopedic Surgery",
      "subtitle": "Master advanced surgical techniques",
      "price": 100,
      "cover": "https://cdn.osteocom.me/covers/cover1.jpg",
      "authors": [{ "name": "Dr. Smith", "image": "https://cdn.osteocom.me/..." }],
      "video": [
        {
          "videoId": "video_001",
          "title": "Introduction to Arthroscopy",
          "duration": 2730,
          "videoQuality": "FULL_HD"
        }
      ]
    }
  ]
}

Status codes

StatusMeaning
200The catalog is returned.
401Missing or invalid bearer token.
404No catalog is configured for this clientId.

Content authorization POST ​

POST/contentLicensing_contentAccessAuthorization

Record a customer's purchase so they're authorized to access the content. Pass your own userId and the purchased products. Reusing the same userId reuses the same customer — no duplicate is created.

Headers

Authorization*
string
Required
Bearer token.

Body parameters

clientId*
string
Required
Your unique client ID.
userId*
string
Required
Your stable, unique identifier for the customer. Any format up to 50 characters — it just has to stay the same for the same person.
email
string
Optional
Customer email, up to 50 characters. Becomes mandatory if marketing consent is enabled for your account; must be a valid address.
marketingConsent
boolean
Optional
Whether the customer opted in to marketing (e.g. newsletters). Defaults to false.
name
string
Optional
Customer's first name, up to 50 characters.
surname
string
Optional
Customer's last name, up to 50 characters.
products*
array of objects
Required
The purchased products, each with a price — from 1 to 100 per call.
Show child attributes
productIdstring
The channel's idChannel from the catalog.
priceinteger
The price of that product.

Returns

token
string
Optional
The user's access key, used in the video call. Stable per customer.
js
const res = await fetch("https://test.osteocom.me/sv6/contentLicensing_contentAccessAuthorization", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: `Bearer ${token}`,
  },
  body: JSON.stringify({
    clientId: "psiGBHLDxxxxxxdIyDw",
    userId: "user_12345",
    products: [{ productId: "66d579675f2xxxxxxf15e4d3", price: 100 }],
  }),
});

const data = await res.json();
bash
curl -X POST https://test.osteocom.me/sv6/contentLicensing_contentAccessAuthorization \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"clientId":"psiGBHLDxxxxxxdIyDw","userId":"user_12345","products":[{"productId":"66d579675f2xxxxxxf15e4d3","price":100}]}'
python
res = requests.post(
    "https://test.osteocom.me/sv6/contentLicensing_contentAccessAuthorization",
    headers={"Authorization": f"Bearer {token}"},
    json={
        "clientId": "psiGBHLDxxxxxxdIyDw",
        "userId": "user_12345",
        "products": [{"productId": "66d579675f2xxxxxxf15e4d3", "price": 100}],
    },
)
data = res.json()
json
{ "token": "eyJhbGciOiJIUzI1Ni...JWT" }

Status codes

StatusMeaning
200Purchase recorded.
400Email field required.
401Missing or invalid bearer token.
403Malformed email, no catalog configured for this clientId, or an empty products list.
422Body validation failed — see Field limits.

Video access POST ​

POST/contentLicensing_videoAccess

Issue a short-lived token for the authorized customer. Embed tokenAuthVideo in the player URL — see Video access.

Headers

Authorization*
string
Required
Bearer token.

Body parameters

userId*
string
Required
Your stable identifier for the customer — the same userId used in Content authorization.
clientId*
string
Required
Your unique client ID.
videoId*
string
Required
The videolesson to play: a videoId from the channel's video array in the catalog — not the channel's idChannel.
userAccessKey*
string
Required
The token returned by Content authorization for the same userId, sent unchanged. Up to 800 characters.

Returns

tokenAuthVideo
string
Optional
A token to pass as the player URL signature. Valid for 15 minutes.
js
const res = await fetch("https://test.osteocom.me/sv6/contentLicensing_videoAccess", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: `Bearer ${token}`,
  },
  body: JSON.stringify({
    clientId: "psiGBHLDxxxxxxdIyDw",
    userId: "user_12345",
    videoId: "591441cexxxxxcc4f8d653",
    userAccessKey: userAccessToken,
  }),
});

const data = await res.json();
bash
curl -X POST https://test.osteocom.me/sv6/contentLicensing_videoAccess \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"clientId":"psiGBHLDxxxxxxdIyDw","userId":"user_12345","videoId":"591441cexxxxxcc4f8d653","userAccessKey":"<userAccessKey>"}'
python
res = requests.post(
    "https://test.osteocom.me/sv6/contentLicensing_videoAccess",
    headers={"Authorization": f"Bearer {token}"},
    json={
        "clientId": "psiGBHLDxxxxxxdIyDw",
        "userId": "user_12345",
        "videoId": "591441cexxxxxcc4f8d653",
        "userAccessKey": user_access_key,
    },
)
data = res.json()
json
{ "tokenAuthVideo": "eyJhbGciOiJIUzI1Ni...JWT" }

Status codes

StatusMeaning
200A signed video token is returned.
401Missing or invalid bearer token, or the customer can't watch this video: the videoId doesn't exist, the userAccessKey doesn't match the userId, or the customer has no active access to the channel.
422Body validation failed — see Field limits.

Revoke access POST ​

POST/contentLicensing_revocateActivation

Revoke a customer's access to a channel at any time — for example on a refund or chargeback.

Headers

Authorization*
string
Required
Bearer token.

Body parameters

clientId*
string
Required
Your unique client ID.
channelId*
string
Required
The channel (idChannel) to revoke.
userId*
string
Required
The customer to revoke, identified by your userId.

Returns

userId
string
Optional
The customer whose access was revoked.
cancellationDate
string
Optional
When the revocation took effect.
js
const res = await fetch("https://test.osteocom.me/sv6/contentLicensing_revocateActivation", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: `Bearer ${token}`,
  },
  body: JSON.stringify({
    clientId: "psiGBHLDxxxxxxdIyDw",
    channelId: "66d579675f2xxxxxxf15e4d3",
    userId: "user_12345",
  }),
});

const data = await res.json();
bash
curl -X POST https://test.osteocom.me/sv6/contentLicensing_revocateActivation \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"clientId":"psiGBHLDxxxxxxdIyDw","channelId":"66d579675f2xxxxxxf15e4d3","userId":"user_12345"}'
python
res = requests.post(
    "https://test.osteocom.me/sv6/contentLicensing_revocateActivation",
    headers={"Authorization": f"Bearer {token}"},
    json={
        "clientId": "psiGBHLDxxxxxxdIyDw",
        "channelId": "66d579675f2xxxxxxf15e4d3",
        "userId": "user_12345",
    },
)
data = res.json()
json
{ "userId": "user_12345", "cancellationDate": "2026-06-09T10:24:00Z" }

Status codes

StatusMeaning
200Revocation successful.
401Missing or invalid bearer token.
422Body validation failed — see Field limits.

Built with VitePress.