Ship an LMS integration without becoming an LTI expert.
LearnPort is hosted LTI 1.3 infrastructure for education software teams. A university points their LMS at us; you get a normalized session over a plain JSON API. No OIDC handshake, no JWT verification, no signing keys to rotate.
Free during early access. No credit card, no billing to configure.
import { LearnPort } from "@learnport/sdk";
const learnport = new LearnPort({ apiKey: process.env.LEARNPORT_API_KEY });
// Your LTI callback receives a one-time token in the query string.
const launch = await learnport.lti.launches.redeem(token);
launch.user.email; // "ada@university.edu"
launch.context.title; // "Introduction to Systems"
launch.user.roles; // ["instructor"]- Target time to first launch
- Under 30 minutes
- LMS work you write yourself
- One endpoint
- Test launches before a real LMS
- Unlimited
- Secrets you have to rotate
- Zero
How it works
Three steps, and none of them are cryptography
The parts of LTI that take weeks are the parts we already built. What is left is the part that is specific to your product.
Point the LMS at LearnPort
Canvas and generic LTI 1.3 wizards produce the exact login, launch, and JWKS URLs, plus a Markdown install pack an LMS admin can follow without asking you questions.
Test against the simulator
Run a real launch as a student or an instructor before any university is involved. Same handshake, same token, no ticket queue.
Redeem a normalized session
One authenticated POST returns the user, course context, and roles as plain JSON. No OIDC, no JWKS fetching, no deployment IDs.
What you get
Built for the failure modes, not the happy path
Anyone can make one launch work. The hard part is the launch that fails at 8am on the first day of term, in an LMS you cannot log into.
The cryptography is ours, not yours
Signed id_token verification against remote JWKS, single-use state via atomic consume, hashed launch tokens redeemable exactly once, and pinned redirect destinations re-authorized at launch time.
A debugger, not a stack trace
Every attempt is recorded — successes and failures — with a stable error code, what was expected, and what actually arrived. Diagnostics stay server-side, out of unauthenticated responses.
A simulator that behaves like an LMS
A fake platform provisioned per environment that walks the full OIDC and launch handshake, so your integration tests do not depend on somebody else's Canvas instance.
Install packs admins can follow
LMS-specific, copy-pasteable setup instructions generated from your real configuration — the artifact that usually costs a week of back-and-forth email.
Environments and API keys built in
Development and production environments per application, each with their own keys and platform registrations, so a test launch can never touch production data.
A typed SDK and a sample app
@learnport/sdk wraps the JSON API with types, and a minimal sample callback shows the whole integration end to end in well under a hundred lines.
Honest status
LTI 1.3 core and Advantage work today.
Launches, course context, the simulator, the debugger, install packs, and the TypeScript SDK are working now — including Names and Roles (NRPS), Assignment and Grade Services (AGS), and Deep Linking via the API and SDK. Team management, billing, and Dynamic Registration are still ahead.
Available now
Everything below runs end to end in CI against the simulator.
- OIDC login, id_token verification, JWKS rotation
- Canvas wizard and generic LTI 1.3 registration
- Launch simulator for student and instructor roles
- NRPS roster, AGS line items and scores, Deep Linking
- Launch attempt recording with cause-and-fix guidance
- Organizations, applications, environments, API keys
- @learnport/sdk with a runnable sample app
Start with a simulated launch, not a support ticket.
Create an account, provision a simulator environment, and run a real LTI 1.3 handshake in a few minutes.