Skip to Content
API referenceTypeScript SDK

TypeScript SDK

@mtp/sdk wraps the Platform API for Node.js services. It holds your API key, exchanges it for a machine token on first use, caches the token until shortly before expiry, refreshes single-flight, retries once on 401, and validates every response against the same zod contracts the platform is built from.

import { MtpClient, MtpApiError } from '@mtp/sdk'; const mtp = new MtpClient({ baseUrl: 'https://api.train.hopemtp.app', clientId: process.env.MTP_CLIENT_ID!, clientSecret: process.env.MTP_CLIENT_SECRET!, });

Methods

MethodEndpointScope
listContentItems({ type?, tag? })GET /content-itemscontent.read
getContentItem(itemId)GET /content-items/{id}content.read
findLearners(email)GET /learners?email=learners.read
getLearner(learnerId)GET /learners/{id}learners.read
enroll({ learnerId, courseItemId })POST /enrollmentsenrollments.write
getEnrollment(enrollmentId)GET /enrollments/{id}enrollments.read
listEnrollments(learnerId)GET /learners/{id}/enrollmentsenrollments.read
createSignInTicket({ learnerId, destination?, enrollmentId? })POST /sign-in-ticketslearners.sign_in
scopes()The scopes the token endpoint reported for this key—

Errors

Every failed call throws MtpApiError with status, code, message, and requestId (when the API supplied one). Include the request id in support requests.

try { await mtp.getLearner(id); } catch (err) { if (err instanceof MtpApiError && err.status === 404) { // not a member of this organization } }

Options

OptionDefaultNotes
fetchglobal fetchInject for tests or a proxying agent
timeoutMs15000Per request
tokenSafetyMarginSeconds30Refresh this early; tokens live 600 seconds

The client holds a secret. Use it in server code only. Browsers get a learner session through createSignInTicket, never a key.

Last updated on