API
Show Series
Manage the Show / Series catalogue producers see in the HotMic studio.
The Show Series catalogue powers the Show / Series dropdown that producers use when creating an event in the studio. Use these endpoints to read the current catalogue and to replace it.
Concept
The Show Series catalogue is one theme setting scoped to your studio (resolved automatically from your API key). It has two top-level fields:
enabled(boolean) — whether the Show / Series picker is shown to producers in the studio.options(array of objects) — the list of selectable shows. Each item must have aname(non-empty string). Any other fields you include (e.g. IDs, namespaces, seasons) are stored and returned as-is.
The catalogue is replaced wholesale on every write — there is no per-item endpoint. Send the entire list every time.
Retrieve the Show Series Catalogue
https://public-api.hotmic.io/studio/show-seriesRetrieve Show Series Endpoint
Returns the current Show Series catalogue for your studio.
Header Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| x-api-key | String | Required | The API key provided to you by HotMic. |
Examples
curl --location --request GET 'https://public-api.hotmic.io/studio/show-series' \
--header 'Accept: application/json' \
--header 'x-api-key: String'var request = require('request');
var options = {
'method': 'GET',
'url': 'https://public-api.hotmic.io/studio/show-series',
'headers': {
'Accept': 'application/json',
'x-api-key': 'String'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});var myHeaders = new Headers();
myHeaders.append("Accept", "application/json");
myHeaders.append("x-api-key", "String");
var requestOptions = {
method: 'GET',
headers: myHeaders,
redirect: 'follow'
};
fetch("https://public-api.hotmic.io/studio/show-series", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
url = "https://public-api.hotmic.io/studio/show-series"
headers = {
'Accept': 'application/json',
'x-api-key': 'String'
}
response = requests.request("GET", url, headers=headers)
print(response.text)require "uri"
require "net/http"
url = URI("https://public-api.hotmic.io/studio/show-series")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"
request["x-api-key"] = "String"
response = https.request(request)
puts response.read_bodyResponses
{
"show_series": {
"enabled": true,
"options": [
{
"name": "Anderson Cooper 360",
"show_series_id": "97abb6d9-ae8c-4309-8f7c-087012437379",
"show_series_namespace": "urn:wbd:identifier:program-inventory:id",
"seasons": [
{
"name": "2026",
"show_season_id": "4f4e22ae-d880-4ec9-9635-abb0498abec7",
"show_season_namespace": "urn:wbd:identifier:program-inventory:id"
}
]
}
]
}
}{
"error": "No active theme found for this app"
}If your studio has a theme but no Show Series configured yet, the response is { "show_series": null }.
Replace the Show Series Catalogue
https://public-api.hotmic.io/studio/show-seriesReplace Show Series Endpoint
Replaces the Show Series catalogue with the body you provide. POST is accepted as an alias and behaves identically.
Header Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| x-api-key | String | Required | The API key provided to you by HotMic. |
| Content-Type | String | Required | Must be application/json. |
Body Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| enabled | Boolean | Required | Turns the Show / Series picker on/off in the studio. |
| options | Array | Required | The full catalogue (array of objects). Each item must have a non-empty name; other fields are stored and returned as-is. Send [] to clear. |
Examples
curl --location --request PUT 'https://public-api.hotmic.io/studio/show-series' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--header 'x-api-key: String' \
--data-raw '{
"enabled": true,
"options": [
{
"name": "Anderson Cooper 360",
"show_series_id": "97abb6d9-ae8c-4309-8f7c-087012437379"
}
]
}'var request = require('request');
var options = {
'method': 'PUT',
'url': 'https://public-api.hotmic.io/studio/show-series',
'headers': {
'Accept': 'application/json',
'Content-Type': 'application/json',
'x-api-key': 'String'
},
body: JSON.stringify({
enabled: true,
options: [
{ name: 'Anderson Cooper 360', show_series_id: '97abb6d9-ae8c-4309-8f7c-087012437379' }
]
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});var myHeaders = new Headers();
myHeaders.append("Accept", "application/json");
myHeaders.append("Content-Type", "application/json");
myHeaders.append("x-api-key", "String");
var raw = JSON.stringify({
enabled: true,
options: [
{ name: 'Anderson Cooper 360', show_series_id: '97abb6d9-ae8c-4309-8f7c-087012437379' }
]
});
var requestOptions = {
method: 'PUT',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://public-api.hotmic.io/studio/show-series", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
import json
url = "https://public-api.hotmic.io/studio/show-series"
payload = json.dumps({
"enabled": True,
"options": [
{ "name": "Anderson Cooper 360", "show_series_id": "97abb6d9-ae8c-4309-8f7c-087012437379" }
]
})
headers = {
'Accept': 'application/json',
'Content-Type': 'application/json',
'x-api-key': 'String'
}
response = requests.request("PUT", url, headers=headers, data=payload)
print(response.text)require "uri"
require "net/http"
require "json"
url = URI("https://public-api.hotmic.io/studio/show-series")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Accept"] = "application/json"
request["Content-Type"] = "application/json"
request["x-api-key"] = "String"
request.body = JSON.dump({
enabled: true,
options: [
{ name: "Anderson Cooper 360", show_series_id: "97abb6d9-ae8c-4309-8f7c-087012437379" }
]
})
response = https.request(request)
puts response.read_bodyResponses
{
"show_series": {
"enabled": true,
"options": [
{
"name": "Anderson Cooper 360",
"show_series_id": "97abb6d9-ae8c-4309-8f7c-087012437379",
"show_series_namespace": "urn:wbd:identifier:program-inventory:id",
"seasons": [
{
"name": "2026",
"show_season_id": "4f4e22ae-d880-4ec9-9635-abb0498abec7",
"show_season_namespace": "urn:wbd:identifier:program-inventory:id"
}
]
}
]
}
}{
"error": "'options[0].name' is required and must be a non-empty string"
}POST /studio/show-series is accepted as an alias for PUT. Both methods behave identically and are idempotent — submitting the same body twice produces the same result, so it is safe to retry on network failures. Items not in the new options list are removed.
Each item in options must include a non-empty name; any additional fields (for example show_series_id, show_series_namespace, seasons) are stored and returned as-is. Unknown top-level keys other than enabled and options are rejected with 400.
Items in a GET response may also include server-managed fields such as _id, created_at, and updated_at. These are informational — you do not need to send them on write, and they will not be added to items you PUT for the first time.
To clear the catalogue, send { "enabled": false, "options": [] }. Changes are visible to the studio immediately — there is no cache lag.
Errors
| Status | Body | When |
|---|---|---|
400 | {"error":"Invalid JSON body"} | Body is not valid JSON (PUT/POST). |
400 | {"error":"Body must be a JSON object"} | Body is null, an array, or a primitive (PUT/POST). |
400 | {"error":"Unknown fields: foo"} | Body has a top-level field other than enabled / options (PUT/POST). |
400 | {"error":"'enabled' must be a boolean"} | enabled is missing or the wrong type (PUT/POST). |
400 | {"error":"'options' must be an array"} | options is missing or not an array (PUT/POST). |
400 | {"error":"'options[N]' must be an object"} | An entry in options is not a plain object (PUT/POST). |
400 | {"error":"'options[N].name' is required and must be a non-empty string"} | A name is missing, empty, or not a string (PUT/POST). |
401 | Error, missing or invalid x-api-key authentication header. | API key is missing. |
403 | {"message":"Forbidden"} | API key not recognized. |
404 | {"error":"No active theme found for this app"} | Your studio has no active theme document. Contact HotMic support. |
500 | {"error":"Internal server error","details":"..."} | Unexpected server error. |
Notes for Integrators
- Always send the full list. There is no incremental / diff endpoint. To add one show, fetch the current list with
GET, append your new item, andPUTthe whole thing back. - Idempotent. Submitting the same body twice produces the same result. Safe to retry on network failures.
- Rate limits. Subject to the public API's default quota (50,000 requests/day per key, 500 req/s burst); there is no endpoint-specific limit.