Download OpenAPI specification:
API for Osteocom content licensing partners: read your catalog, record purchases and play videolessons in the Osteocom player.
Call the endpoints in this order:
userAccessKey. Send your orderId so the call is safe to retry.Every request is a POST with a JSON body. All requests except Login need Authorization: Bearer <token>.
Text fields accept up to 50 characters unless stated otherwise (email 255, orderId 100, userAccessKey 800). A body that fails validation (missing required field, value too long, wrong type) returns 422 with an empty body. Errors don't return JSON: the body is empty or a short text message.
idChannel and videoId are different ids: idChannel identifies the channel you sell, videoId a single videolesson inside it.
Guides: https://platform.developer.osteocom.me/guide/marketplaceapi/ · Postman collection: https://platform.developer.osteocom.me/postman/osteocom-content-licensing.postman_collection.json
Exchanges your credentials for the bearer token used by every other request.
| clientId required | string Your client ID, provided by Osteocom. |
| clientSecret required | string Your secret key, provided by Osteocom. |
{- "clientId": "psiGBHLDxxxxxxdIyDw",
- "clientSecret": "QAtSxxxxxxxxrz2JU"
}{- "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaWQiOiI2NmZh..."
}Returns the channels agreed for your account, each with its videolessons. Titles and descriptions are in the channel's language. Fields without a value are returned as null.
| clientId required | string (ClientId) <= 50 characters Your client ID, provided by Osteocom. |
{- "clientId": "psiGBHLDxxxxxxdIyDw"
}{- "catalog": [
- {
- "idChannel": "66d579675f2a8c1e3f15e4d3",
- "background": "string",
- "cover": "string",
- "trailer": "string",
- "price": 100,
- "video": [
- {
- "videoId": "66d57a1b5f2a8c1e3f15e4e1",
- "background": "string",
- "cover": "string",
- "trailer": "string",
- "title": "Introduction to arthroscopy",
- "subtitle": "Portals and instruments",
- "htmlDescription": "string",
- "duration": 2730,
- "videoQuality": "FullHD",
- "audio": [
- "en"
],
}
], - "title": "Arthroscopy of the knee",
- "subtitle": "From the basics to meniscal repair",
- "htmlDescription": "string"
}
]
}Call it after the customer has paid on your platform: it records the purchase and gives the customer access to the channels in products.
The response token is the customer's userAccessKey, needed by Video access. It is always the same for the same userId.
Send your orderId (recommended). A purchase already recorded with the same orderId for your account is not recorded again: the call returns 200 with the same token. You can retry after a timeout or a network error without checking first, and every order maps to exactly one sale. Use a new orderId for every new purchase: a retry never re-grants access revoked in the meantime. Without orderId every call records a new sale.
| clientId required | string (ClientId) <= 50 characters Your client ID, provided by Osteocom. |
| userId required | string (UserId) <= 50 characters Your id for the customer. Any format, but keep it the same for the same person: Osteocom uses it to match purchases and video access. |
string or null <= 255 characters Customer email. Required, and checked for a valid format, only if marketing is enabled on your account. | |
| name | string or null <= 50 characters |
| surname | string or null <= 50 characters |
| marketingConsent | boolean Default: false Whether the customer agreed to receive marketing (e.g. newsletters). |
required | Array of objects (PurchasedProduct) [ 1 .. 100 ] items |
| orderId | string or null <= 100 characters Recommended. Your own order number. A purchase already recorded with this |
{- "clientId": "psiGBHLDxxxxxxdIyDw",
- "userId": "user_12345",
- "email": "customer@example.com",
- "name": "Mario",
- "surname": "Rossi",
- "marketingConsent": false,
- "products": [
- {
- "productId": "66d579675f2a8c1e3f15e4d3",
- "price": 100
}
], - "orderId": "ORD-2026-000123"
}{- "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOm51bGwsImlkYyI6InBzaUdC..."
}Returns a token to play one videolesson, valid for 15 minutes. Ask for a new one each time the player is loaded.
Put the token in the player URL:
<iframe src="https://test.osteocom.me/en/videoaccess?signature=TOKEN_AUTH_VIDEO&sublang=en"
width="100%" height="500" frameborder="0" allowfullscreen allow="encrypted-media"></iframe>
sublang is the default subtitle language (it, en, fr, es). In production use https://www.osteocom.me.
| clientId required | string (ClientId) <= 50 characters Your client ID, provided by Osteocom. |
| userId required | string (UserId) <= 50 characters Your id for the customer. Any format, but keep it the same for the same person: Osteocom uses it to match purchases and video access. |
| videoId required | string <= 50 characters A |
| userAccessKey required | string <= 800 characters The |
{- "clientId": "psiGBHLDxxxxxxdIyDw",
- "userId": "user_12345",
- "videoId": "66d57a1b5f2a8c1e3f15e4e1",
- "userAccessKey": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOm51bGwsImlkYyI6InBzaUdC..."
}{- "tokenAuthVideo": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjaGFubmVsSWQiOiI2NmQ1Nzk2..."
}Removes a customer's access to a channel, for example after a refund. The recorded purchase stays. To give access back, call Content authorization again with a new orderId.
Safe to repeat: when the access is already revoked, the call returns 200 with the date of the original revocation.
| clientId required | string (ClientId) <= 50 characters Your client ID, provided by Osteocom. |
| channelId required | string <= 50 characters The channel's |
| userId required | string (UserId) <= 50 characters Your id for the customer. Any format, but keep it the same for the same person: Osteocom uses it to match purchases and video access. |
{- "clientId": "psiGBHLDxxxxxxdIyDw",
- "channelId": "66d579675f2a8c1e3f15e4d3",
- "userId": "user_12345"
}{- "userId": "user_12345",
- "cancellationDate": "2026-09-30T10:24:00.000Z"
}