Base URL
https://techledculture.com
Authorization: Bearer <licenceKey>v1 Licensed API — Branded Plays
The v1 API is the licensed integration surface: authenticate with your licence key as a Bearer token and every play arrives with your terminology overrides already applied server-side. Rate limit: 600 requests/hour per licence. CORS is open on all v1 endpoints.
/api/hmwi/v1/playsReturns all licensed plays, fully branded (terminology substituted server-side), plus your branding block.
Parameters
| signal | query (optional) | Filter plays by dropping-signal tag, e.g. ?signal=trust or ?signal=psychological safety |
Response
{
"apiVersion": "v1",
"branding": {
"companyName": "Acme Corp",
"logoUrl": "https://acme.com/logo.svg",
"brandColors": { "primary": "#e11d48", "accent": "#7c3aed", "bg": "#ffffff" },
"terminologyOverrides": { "play": "activity" },
"tier": "five-teams", "teamLimit": 5, "status": "active"
},
"count": 23,
"plays": [
{
"slug": "courage-hackathon",
"title": "Courage Hackathon",
"duration": "60–90 min",
"signalTags": ["Fear Mask", "Voice Suppression"],
"why": [ ... ], "steps": [ ... ], "whatNext": "...", ...
},
...
]
}/api/hmwi/v1/plays/:slugReturns one licensed play as branded JSON — or, with ?format=html, as a fully self-contained branded HTML document (inline CSS, your logo and colours) ready to drop into an iframe, intranet page, or LMS block.
Parameters
| :slug | path | Play URL slug, e.g. courage-hackathon |
| format | query (optional) | "html" returns a self-contained branded HTML document instead of JSON |
Response
{ "apiVersion": "v1", "branding": { ... }, "play": { ... } }
// ?format=html →
<!DOCTYPE html>
<html> ... your logo, colours, terminology ... </html>/api/hmwi/v1/brandingReturns your licence's current branding configuration.
Response
{ "apiVersion": "v1", "branding": { "companyName": "Acme Corp", ... } }/api/hmwi/v1/brandingPartially updates your branding — company name, logo, colours, terminology. Only the fields you send change.
Parameters
| companyName | body (string, optional) | Your organisation name |
| logoUrl | body (string, optional) | HTTPS URL to your logo (SVG or PNG) |
| brandColors | body (object, optional) | { primary, accent, bg } — CSS hex colours |
| terminologyOverrides | body (object, optional) | Key→value map, e.g. { "play": "activity" } |
Response
{ "apiVersion": "v1", "branding": { ...updated... } }Public Catalogue (metadata only)
/api/hmwi/playsReturns catalogue metadata for all 23 plays — title, duration, signal tags, and a link to the public detail page. Full step-by-step content ships via the v1 licensed API above.
Response
{
"note": "Public catalog (metadata only). Licensed full content: GET /api/hmwi/v1/plays ...",
"plays": [
{
"slug": "courage-hackathon",
"title": "Courage Hackathon",
"format": "full",
"duration": "60–90 min",
"durationMins": 75,
"who": "Whole team",
"signalTags": ["Fear Mask", "Voice Suppression"],
"detailUrl": "https://techledculture.com/interventions/courage-hackathon"
},
...
]
}/api/hmwi/plays/:slugReturns catalogue metadata for a single play by its URL slug.
Parameters
| :slug | path | Play URL slug, e.g. courage-hackathon |
Response
{
"note": "Public catalog (metadata only). ...",
"play": { "slug": "courage-hackathon", "title": "Courage Hackathon", ... }
}Licence Management
/api/hmwi/license-from-sessionResolves a Stripe checkout session ID to a licence key. Used immediately after purchase.
Parameters
| session_id | query | Stripe checkout session ID (from ?session_id= on success URL) |
Response
{ "licenseKey": "tlc-abc123...", "status": "pending" }/api/hmwi/license/:keyReturns the public status of a licence key (no branding data).
Parameters
| :key | path | Licence key (tlc-...) |
Response
{
"licenseKey": "tlc-...",
"tier": "five-teams",
"teamLimit": 5,
"status": "active",
"companyName": "Acme Corp",
"activatedAt": "2026-07-25T13:00:00Z"
}/api/hmwi/license/:key/brandingReturns the full branding configuration for a licence. Suitable for embedding from your domain. Cached for 60 s.
Parameters
| :key | path | Licence key |
Response
{
"licenseKey": "tlc-...",
"companyName": "Acme Corp",
"logoUrl": "https://acme.com/logo.svg",
"brandColors": { "primary": "#1d4ed8", "accent": "#7c3aed", "bg": "#ffffff" },
"terminologyOverrides": { "play": "activity", "signal": "indicator" },
"tier": "five-teams",
"teamLimit": 5,
"status": "active"
}/api/hmwi/license/:key/activateSets company branding on a licence and transitions it to active. Idempotent — safe to call again to update branding.
Parameters
| companyName | body (string, required) | Your organisation name |
| logoUrl | body (string, optional) | HTTPS URL to your logo (SVG or PNG) |
| brandColors | body (object, optional) | { primary, accent, bg } — CSS hex colours |
| terminologyOverrides | body (object, optional) | Key→value map, e.g. { "play": "activity" } |
Response
{ "ok": true, "license": { ... } }Example: fetch all plays from your LMS
const AUTH = { headers: { Authorization: "Bearer tlc-abc123..." } };
// Fetch your fully branded play library (terminology pre-applied)
const { plays, branding } = await fetch(
"https://techledculture.com/api/hmwi/v1/plays", AUTH
).then(r => r.json());
// Embed one play as a self-contained branded HTML document
const html = await fetch(
"https://techledculture.com/api/hmwi/v1/plays/courage-hackathon?format=html",
AUTH
).then(r => r.text());
iframeEl.srcdoc = html;
// Update your branding
await fetch("https://techledculture.com/api/hmwi/v1/branding", {
method: "PUT",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer tlc-abc123..."
},
body: JSON.stringify({
brandColors: { primary: "#e11d48", accent: "#7c3aed", bg: "#fff" },
terminologyOverrides: { play: "activity" }
})
});