LTI Registrations

Create, list, update, and delete LTI 1.3 platform registrations for LMS integration.

LTI Registrations API

Manage LTI 1.3 registrations that connect your LMS (Canvas, Moodle, Blackboard, etc.) to TutorFlow. Each registration represents a trust relationship between an LMS platform and TutorFlow as an LTI tool.

All endpoints in this section require a Platform API key.


POST /v1/platform/lti/registrations

Creates a new LTI registration. You will need platform details from your LMS administrator.

Request Body

FieldTypeRequiredDescription
namestringYesA descriptive name for this registration (e.g., "Canvas Production")
issuerstringYesThe issuer identifier of the LMS (the iss claim in LTI JWTs)
clientIdstringYesThe client ID assigned by the LMS when registering TutorFlow
authorizationEndpointstringYesThe LMS OAuth2 authorization URL
tokenEndpointstringYesThe LMS OAuth2 token URL (used for AGS grade passback)
jwksEndpointstringYesThe LMS public JWKS endpoint for verifying signed JWTs
metadataobjectNoOptional metadata associated with the registration

Example Request

curl -X POST https://api.tutorflow.io/v1/platform/lti/registrations \
  -H "Authorization: Bearer tf_platform_..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Canvas Production",
    "issuer": "https://canvas.instructure.com",
    "clientId": "10000000000001",
    "authorizationEndpoint": "https://canvas.instructure.com/api/lti/authorize_redirect",
    "tokenEndpoint": "https://canvas.instructure.com/login/oauth2/token",
    "jwksEndpoint": "https://canvas.instructure.com/api/lti/security/jwks"
  }'

Response

{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "platformWorkspaceId": "workspace-uuid",
  "name": "Canvas Production",
  "issuer": "https://canvas.instructure.com",
  "clientId": "10000000000001",
  "authorizationEndpoint": "https://canvas.instructure.com/api/lti/authorize_redirect",
  "tokenEndpoint": "https://canvas.instructure.com/login/oauth2/token",
  "jwksEndpoint": "https://canvas.instructure.com/api/lti/security/jwks",
  "status": "active",
  "metadata": null,
  "createdAt": "2026-03-25T12:00:00Z",
  "updatedAt": "2026-03-25T12:00:00Z"
}

Response Fields

FieldTypeDescription
idstringRegistration ID (UUID)
platformWorkspaceIdstringThe workspace this registration belongs to
namestringDescriptive name
issuerstringLMS issuer identifier
clientIdstringClient ID from the LMS
authorizationEndpointstringLMS authorization URL
tokenEndpointstringLMS token URL
jwksEndpointstringLMS JWKS URL
statusstringactive or inactive
metadataobjectOptional metadata, or null
createdAtstringISO 8601 timestamp
updatedAtstringISO 8601 timestamp

LMS Configuration

When configuring TutorFlow in your LMS, use the following tool URLs:

SettingURL
OIDC Login Initiation URLhttps://api.tutorflow.io/v1/platform/lti/login
Launch / Redirect URLhttps://api.tutorflow.io/v1/platform/lti/launch
Public JWKS URLhttps://api.tutorflow.io/v1/platform/lti/.well-known/jwks.json

GET /v1/platform/lti/registrations

Returns a paginated list of LTI registrations for the authenticated workspace.

Query Parameters

ParameterTypeDefaultDescription
limitnumber20Items per page (1–100)
offsetnumber0Number of items to skip
statusstring-Filter by status: ACTIVE or INACTIVE

Example Request

curl "https://api.tutorflow.io/v1/platform/lti/registrations?limit=10&offset=0" \
  -H "Authorization: Bearer tf_platform_..."

Response

{
  "items": [
    {
      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "platformWorkspaceId": "workspace-uuid",
      "name": "Canvas Production",
      "issuer": "https://canvas.instructure.com",
      "clientId": "10000000000001",
      "authorizationEndpoint": "https://canvas.instructure.com/api/lti/authorize_redirect",
      "tokenEndpoint": "https://canvas.instructure.com/login/oauth2/token",
      "jwksEndpoint": "https://canvas.instructure.com/api/lti/security/jwks",
      "status": "active",
      "metadata": null,
      "createdAt": "2026-03-25T12:00:00Z",
      "updatedAt": "2026-03-25T12:00:00Z"
    }
  ],
  "total": 1
}

GET /v1/platform/lti/registrations/:id

Retrieves a single LTI registration by its ID.

Path Parameters

ParameterTypeDescription
idstringThe registration ID (UUID)

Example Request

curl https://api.tutorflow.io/v1/platform/lti/registrations/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
  -H "Authorization: Bearer tf_platform_..."

Response

Returns the full registration object (same schema as the POST response above).


PUT /v1/platform/lti/registrations/:id

Updates an existing LTI registration. All fields are optional; only the fields you include will be updated.

Path Parameters

ParameterTypeDescription
idstringThe registration ID (UUID)

Request Body

FieldTypeRequiredDescription
namestringNoUpdated name
issuerstringNoUpdated issuer URL
clientIdstringNoUpdated client ID
authorizationEndpointstringNoUpdated authorization URL
tokenEndpointstringNoUpdated token URL
jwksEndpointstringNoUpdated JWKS URL
metadataobjectNoUpdated metadata

Example Request

curl -X PUT https://api.tutorflow.io/v1/platform/lti/registrations/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
  -H "Authorization: Bearer tf_platform_..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Canvas Production (Updated)"
  }'

Response

Returns the full updated registration object.


DELETE /v1/platform/lti/registrations/:id

Deletes an LTI registration. This immediately invalidates all LTI launches associated with this registration. Students will no longer be able to launch TutorFlow from the linked LMS until a new registration is created.

Path Parameters

ParameterTypeDescription
idstringThe registration ID (UUID)

Example Request

curl -X DELETE https://api.tutorflow.io/v1/platform/lti/registrations/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
  -H "Authorization: Bearer tf_platform_..."

Response

{
  "success": true
}

Error Responses

StatusCodeDescription
400platform_invalid_requestMissing or invalid fields in the request body
401platform_unauthorizedInvalid or missing API key
404platform_not_foundRegistration not found
409platform_conflictA registration with the same issuer and client ID already exists
{
  "error": {
    "code": "platform_invalid_request",
    "message": "issuer is required",
    "status": 400
  }
}