LTI Registrations

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

Use this page to create, read, change, and delete the LTI 1.3 registrations that connect an LMS to your account.

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 take a live tf_content_ key of your agent account, like the one registration and the dashboard issue, or a legacy tf_platform_ key. A test key gets 403 platform_content_key_too_narrow; a missing or unknown key gets 401 platform_invalid_api_key. Over the account's rate limit they answer 429 platform_rate_limit_exceeded with Retry-After. See Authentication.


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

bash
curl -X POST https://api.tutorflow.io/v1/platform/lti/registrations \
  -H "Authorization: Bearer tf_content_..." \
  -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

JSON
{
  "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",
  "loginInitiationPath": "/v1/platform/lti/login/a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}

Response Fields

FieldTypeDescription
idstringRegistration ID (UUID)
platformWorkspaceIdstringThe workspace this registration belongs to: the id the account routes return as organizationId
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
loginInitiationPathstringThis registration's own OIDC login URL path, /v1/platform/lti/login/{id}. Prefix it with https://api.tutorflow.io and give it to the LMS as the login URL

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/{registrationId}, from loginInitiationPath. Before the registration exists, use the generic https://api.tutorflow.io/v1/platform/lti/login, then switch
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. Lowercase values are normalized, but agents should send uppercase enum values.

Example Request

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

Response

JSON
{
  "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",
      "loginInitiationPath": "/v1/platform/lti/login/a1b2c3d4-e5f6-7890-abcd-ef1234567890"
    }
  ],
  "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

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

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

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

Response

Returns the full updated registration object.


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

Deactivates an LTI registration by setting its status to INACTIVE. The record is not hard-deleted. New LTI launches for this registration stop working because launch resolution only uses active registrations.

Path Parameters

ParameterTypeDescription
idstringThe registration ID (UUID)

Example Request

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

Response

JSON
{
  "success": true
}

Error Responses

StatusCodeDescription
400platform_invalid_requestMissing or invalid fields in the request body
401platform_invalid_api_keyInvalid or missing API key
404platform_not_foundRegistration not found
JSON
{
  "error": {
    "code": "platform_invalid_request",
    "message": "issuer is required",
    "status": 400
  }
}