Early access · LTI 1.3 core is live

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.

Redeem a launch — the whole integration
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.

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

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

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