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
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | A descriptive name for this registration (e.g., "Canvas Production") |
issuer | string | Yes | The issuer identifier of the LMS (the iss claim in LTI JWTs) |
clientId | string | Yes | The client ID assigned by the LMS when registering TutorFlow |
authorizationEndpoint | string | Yes | The LMS OAuth2 authorization URL |
tokenEndpoint | string | Yes | The LMS OAuth2 token URL (used for AGS grade passback) |
jwksEndpoint | string | Yes | The LMS public JWKS endpoint for verifying signed JWTs |
metadata | object | No | Optional metadata associated with the registration |
Example Request
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
{
"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
| Field | Type | Description |
|---|---|---|
id | string | Registration ID (UUID) |
platformWorkspaceId | string | The workspace this registration belongs to: the id the account routes return as organizationId |
name | string | Descriptive name |
issuer | string | LMS issuer identifier |
clientId | string | Client ID from the LMS |
authorizationEndpoint | string | LMS authorization URL |
tokenEndpoint | string | LMS token URL |
jwksEndpoint | string | LMS JWKS URL |
status | string | ACTIVE or INACTIVE |
metadata | object | Optional metadata, or null |
createdAt | string | ISO 8601 timestamp |
updatedAt | string | ISO 8601 timestamp |
loginInitiationPath | string | This 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:
| Setting | URL |
|---|---|
| OIDC Login Initiation URL | https://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 URL | https://api.tutorflow.io/v1/platform/lti/launch |
| Public JWKS URL | https://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
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | number | 20 | Items per page (1–100) |
offset | number | 0 | Number of items to skip |
status | string | - | Filter by status: ACTIVE or INACTIVE. Lowercase values are normalized, but agents should send uppercase enum values. |
Example Request
curl "https://api.tutorflow.io/v1/platform/lti/registrations?limit=10&offset=0" \
-H "Authorization: Bearer tf_content_..."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",
"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
| Parameter | Type | Description |
|---|---|---|
id | string | The registration ID (UUID) |
Example Request
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
| Parameter | Type | Description |
|---|---|---|
id | string | The registration ID (UUID) |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | Updated name |
issuer | string | No | Updated issuer URL |
clientId | string | No | Updated client ID |
authorizationEndpoint | string | No | Updated authorization URL |
tokenEndpoint | string | No | Updated token URL |
jwksEndpoint | string | No | Updated JWKS URL |
metadata | object | No | Updated metadata |
Example Request
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
| Parameter | Type | Description |
|---|---|---|
id | string | The 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_content_..."Response
{
"success": true
}Error Responses
| Status | Code | Description |
|---|---|---|
400 | platform_invalid_request | Missing or invalid fields in the request body |
401 | platform_invalid_api_key | Invalid or missing API key |
404 | platform_not_found | Registration not found |
{
"error": {
"code": "platform_invalid_request",
"message": "issuer is required",
"status": 400
}
}