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") |
platformIssuer | string | Yes | The issuer identifier of the LMS (the iss claim in LTI JWTs) |
platformAuthorizationEndpoint | string | Yes | The LMS OAuth2 authorization URL |
platformTokenEndpoint | string | Yes | The LMS OAuth2 token URL (used for AGS grade passback) |
platformJwksUrl | string | Yes | The LMS public JWKS endpoint for verifying signed JWTs |
clientId | string | Yes | The client ID assigned by the LMS when registering TutorFlow |
deploymentId | string | No | The deployment ID assigned by the LMS. Some platforms require this. |
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",
"platformIssuer": "https://canvas.instructure.com",
"platformAuthorizationEndpoint": "https://canvas.instructure.com/api/lti/authorize_redirect",
"platformTokenEndpoint": "https://canvas.instructure.com/login/oauth2/token",
"platformJwksUrl": "https://canvas.instructure.com/api/lti/security/jwks",
"clientId": "10000000000001",
"deploymentId": "1"
}'Response
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Canvas Production",
"platformIssuer": "https://canvas.instructure.com",
"platformAuthorizationEndpoint": "https://canvas.instructure.com/api/lti/authorize_redirect",
"platformTokenEndpoint": "https://canvas.instructure.com/login/oauth2/token",
"platformJwksUrl": "https://canvas.instructure.com/api/lti/security/jwks",
"clientId": "10000000000001",
"deploymentId": "1",
"toolLoginUrl": "https://api.tutorflow.io/v1/platform/lti/login",
"toolLaunchUrl": "https://api.tutorflow.io/v1/platform/lti/launch",
"toolJwksUrl": "https://api.tutorflow.io/v1/platform/lti/.well-known/jwks.json",
"status": "active",
"createdAt": "2026-03-25T12:00:00Z",
"updatedAt": "2026-03-25T12:00:00Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
id | string | Registration ID (UUID) |
name | string | Descriptive name |
platformIssuer | string | LMS issuer identifier |
platformAuthorizationEndpoint | string | LMS authorization URL |
platformTokenEndpoint | string | LMS token URL |
platformJwksUrl | string | LMS JWKS URL |
clientId | string | Client ID from the LMS |
deploymentId | string | Deployment ID from the LMS |
toolLoginUrl | string | TutorFlow OIDC login initiation URL (configure this in your LMS) |
toolLaunchUrl | string | TutorFlow launch callback URL (configure this in your LMS) |
toolJwksUrl | string | TutorFlow public JWKS URL (configure this in your LMS) |
status | string | active or inactive |
createdAt | string | ISO 8601 timestamp |
updatedAt | string | ISO 8601 timestamp |
GET /v1/platform/lti/registrations
Returns a paginated list of LTI registrations for the authenticated workspace.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page | number | 1 | Page number |
take | number | 20 | Items per page (max 100) |
status | string | - | Filter by status: active or inactive |
Example Request
curl "https://api.tutorflow.io/v1/platform/lti/registrations?page=1&take=10" \
-H "Authorization: Bearer tf_platform_..."Response
{
"data": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Canvas Production",
"platformIssuer": "https://canvas.instructure.com",
"clientId": "10000000000001",
"deploymentId": "1",
"status": "active",
"createdAt": "2026-03-25T12:00:00Z",
"updatedAt": "2026-03-25T12:00:00Z"
}
],
"meta": {
"page": 1,
"take": 10,
"itemCount": 1,
"pageCount": 1,
"hasPreviousPage": false,
"hasNextPage": false
}
}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).
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Canvas Production",
"platformIssuer": "https://canvas.instructure.com",
"platformAuthorizationEndpoint": "https://canvas.instructure.com/api/lti/authorize_redirect",
"platformTokenEndpoint": "https://canvas.instructure.com/login/oauth2/token",
"platformJwksUrl": "https://canvas.instructure.com/api/lti/security/jwks",
"clientId": "10000000000001",
"deploymentId": "1",
"toolLoginUrl": "https://api.tutorflow.io/v1/platform/lti/login",
"toolLaunchUrl": "https://api.tutorflow.io/v1/platform/lti/launch",
"toolJwksUrl": "https://api.tutorflow.io/v1/platform/lti/.well-known/jwks.json",
"status": "active",
"createdAt": "2026-03-25T12:00:00Z",
"updatedAt": "2026-03-25T12:00:00Z"
}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 |
platformIssuer | string | No | Updated issuer URL |
platformAuthorizationEndpoint | string | No | Updated authorization URL |
platformTokenEndpoint | string | No | Updated token URL |
platformJwksUrl | string | No | Updated JWKS URL |
clientId | string | No | Updated client ID |
deploymentId | string | No | Updated deployment ID |
status | string | No | active or inactive |
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)",
"deploymentId": "2"
}'Response
Returns the full updated registration object.
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Canvas Production (Updated)",
"platformIssuer": "https://canvas.instructure.com",
"platformAuthorizationEndpoint": "https://canvas.instructure.com/api/lti/authorize_redirect",
"platformTokenEndpoint": "https://canvas.instructure.com/login/oauth2/token",
"platformJwksUrl": "https://canvas.instructure.com/api/lti/security/jwks",
"clientId": "10000000000001",
"deploymentId": "2",
"toolLoginUrl": "https://api.tutorflow.io/v1/platform/lti/login",
"toolLaunchUrl": "https://api.tutorflow.io/v1/platform/lti/launch",
"toolJwksUrl": "https://api.tutorflow.io/v1/platform/lti/.well-known/jwks.json",
"status": "active",
"createdAt": "2026-03-25T12:00:00Z",
"updatedAt": "2026-03-25T12:05:00Z"
}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,
"message": "Registration deleted successfully"
}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": "platformIssuer is required",
"status": 400
}
}