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
| 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_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
| Field | Type | Description |
|---|---|---|
id | string | Registration ID (UUID) |
platformWorkspaceId | string | The workspace this registration belongs to |
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 |
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 |
| 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 |
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
| 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_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
| 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_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
| 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_platform_..."Response
{
"success": true
}Error Responses
| Status | Code | Description |
|---|---|---|
400 | platform_invalid_request | Missing or invalid fields in the request body |
401 | platform_unauthorized | Invalid or missing API key |
404 | platform_not_found | Registration not found |
409 | platform_conflict | A registration with the same issuer and client ID already exists |
{
"error": {
"code": "platform_invalid_request",
"message": "issuer is required",
"status": 400
}
}