REST API
Programmatic access to Thought Industries via standard HTTP endpoints — organized by domain so you can find what you need fast.
Base URL
https://example.thoughtindustries.com/incoming/v2Replace the subdomain with your instance. Custom vanity domains are also supported.
Authentication
Send your API key as a Bearer token in the Authorization header. Manage keys in Settings → Security.
Authorization: Bearer YOUR_API_KEYUnauthenticated requests return 401 with an empty body.
Quick Start
Verify your credentials with a ping:
curl "https://example.thoughtindustries.com/incoming/v2/ping" \
-H 'Authorization: Bearer YOUR_API_KEY'
# → { "valid": true }Use Course Actions for new integrations
The Course Actions feed (GET /v2/events/courseAction) consolidates enrollments, status changes (including completions and starts), certificate grants, and access-revocation events into a single stream — typed by type and source. The older courseEnrollment and courseCompletion endpoints remain available and route through the same unified handler.
Webhooks or polling?
If your system can receive inbound HTTP, prefer Webhooks for real-time event delivery. Use REST polling when you need to backfill history or your environment can only make outbound calls.
Compare approachesAPI Categories
Endpoints are grouped by domain in the left sidebar — Notifications & Events, User Management, Certifications, Content, Courses, Course Groups, Assessments, ILT/VILT, Commerce, Panorama (clients & licenses), and Logs.
Conventions
- • Request bodies:
GETtakes query-string parameters.POSTandPUTaccept a JSON body (application/json).DELETErequests never carry a body. - • Responses: JSON, except the XLIFF translation endpoints (
/v2/content/:type/:id.xlf), which returnapplication/xml. - • Timestamps: ISO 8601 strings in response bodies;
startDate/endDatequery parameters and pagination cursors use Unix milliseconds. - • Pagination: Every list endpoint returns a
pageInfoblock withcursorandhasMore. Cursors are opaque base64 tokens — pass them back unchanged in?cursor=. Do not parse them. - • Errors: JSON errors use the envelope
{ "errors": ["<message>"] }. Check both the HTTP status and theerrorsfield. - • Rate limits: Every response carries
X-RateLimit-Limit,X-RateLimit-Remaining, andX-RateLimit-Reset. Throttled responses (429) includeRetry-After.
A 5-minute course on Thought Industries Academy covering the basics of API fundamentals.