Skip to main content
https://.thoughtindustries.com

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/v2

Replace 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_KEY

Unauthenticated 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.

View Course Actions

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 approaches

API 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: GET takes query-string parameters. POST and PUT accept a JSON body (application/json). DELETE requests never carry a body.
  • Responses: JSON, except the XLIFF translation endpoints (/v2/content/:type/:id.xlf), which return application/xml.
  • Timestamps: ISO 8601 strings in response bodies; startDate / endDate query parameters and pagination cursors use Unix milliseconds.
  • Pagination: Every list endpoint returns a pageInfo block with cursor and hasMore. 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 the errors field.
  • Rate limits: Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. Throttled responses (429) include Retry-After.
Related training5 min
API Fundamentals -- Thought Industries Academy

A 5-minute course on Thought Industries Academy covering the basics of API fundamentals.