API Reference
All endpoints are POST requests relative to your environment base URL. Send and receive application/json.
Base URL
Examples target the Test base URL. Switch with the Environment selector above — production is https://www.osteocom.me/sv6.
Authorization POST
Exchange your client credentials for a bearer token. The returned token authorizes every subsequent call via the Authorization header.
Body parameters
Returns
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();curl -X POST https://test.osteocom.me/sv6/contentLicensing_login \
-H "Content-Type: application/json" \
-d '{"clientId":"psiGBHLDxxxxxxdIyDw","clientSecret":"QAtSxxxx…rz2JU"}'import requests
res = requests.post(
"https://test.osteocom.me/sv6/contentLicensing_login",
json={"clientId": "psiGBHLDxxxxxxdIyDw", "clientSecret": "QAtSxxxx…rz2JU"},
)
data = res.json(){ "token": "eyJhbGciOiJIUzI1Ni...JWT" }Status codes
| Status | Meaning |
|---|---|
200 | OK — a valid JWT token. |
401 | Not Authorized — unknown client. |
Catalog access POST
Retrieve the catalog of channels and videolessons pre-agreed for your account. Each channel's content reflects its configured language.
Headers
Bearer <token>.Body parameters
Returns
Show child attributes
productId in authorization and video calls.name and image.videoId, title, duration (seconds) and videoQuality.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();curl -X POST https://test.osteocom.me/sv6/contentLicensing_catalog \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"clientId":"psiGBHLDxxxxxxdIyDw"}'res = requests.post(
"https://test.osteocom.me/sv6/contentLicensing_catalog",
headers={"Authorization": f"Bearer {token}"},
json={"clientId": "psiGBHLDxxxxxxdIyDw"},
)
data = res.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"
}
]
}
]
}Content authorization POST
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
Body parameters
false.Show child attributes
idChannel from the catalog.Returns
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();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}]}'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(){ "token": "eyJhbGciOiJIUzI1Ni...JWT" }Status codes
| Status | Meaning |
|---|---|
200 | Purchase recorded. |
400 | Email field required. |
403 | Malformed email. |
Video access POST
Issue a short-lived token for the authorized customer. Embed tokenAuthVideo in the player URL — see Video access.
Headers
Body parameters
Returns
signature.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();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>"}'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(){ "tokenAuthVideo": "eyJhbGciOiJIUzI1Ni...JWT", "expiresIn": 900 }Status codes
| Status | Meaning |
|---|---|
200 | A signed video token is returned. |
401 | Not authorized, or token expired. |
404 | Video not found. |
Revoke access POST
Revoke a customer's access to a channel at any time — for example on a refund or chargeback.
Headers
Body parameters
idChannel) to revoke.userId.Returns
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();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"}'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(){ "userId": "user_12345", "cancellationDate": "2026-06-09T10:24:00Z" }Status codes
| Status | Meaning |
|---|---|
200 | Revocation successful. |