instructure/canvas-lms · error
Kaltura session failed to generate
Error message
Kaltura session failed to generate
What it means
Canvas raises this in ServicesApiController#start_kaltura_session when the Kaltura client's startSession call returns nil or a string containing 'START_SESSION_ERROR'. It means Canvas could not obtain a Kaltura session (ks) token, typically due to misconfigured or unreachable Kaltura integration settings.
Solutions
- Verify Kaltura settings (account_settings / plugin :kaltura) partner_id, subpartner_id, secret keys and service host are correct
- Test connectivity from the Canvas server to the Kaltura host (curl the Kaltura API endpoint)
- Check Canvas logs / Kaltura admin console for why START_SESSION_ERROR was returned (invalid partner, disabled account)
- Ensure @current_user is present; anonymous calls cannot build a uid
Example fix
# before
res = client.startSession(CanvasKaltura::SessionType::USER, uid)
raise "Kaltura session failed to generate" if res.nil? || res.include?("START_SESSION_ERROR")
# after
begin
res = client.startSession(CanvasKaltura::SessionType::USER, uid)
rescue CanvasKaltura::Errors::ClientError => e
Rails.logger.error("Kaltura startSession failed: #{e.message}")
raise "Kaltura session failed to generate"
end Defensive patterns
Strategy: try-catch
Validate before calling
const settings = CanvasKaltura::ClientV3.config abort if settings.blank? || settings['partner_id'].blank? || settings['secret'].blank? # optionally ping the Kaltura host first res = Net::HTTP.get_response(URI(settings['service_url'])) abort unless res.is_a?(Net::HTTPSuccess)
Type guard
function hasKalturaConfig(cfg) {
return cfg != null && typeof cfg.partner_id === 'string' && cfg.partner_id.length > 0 && typeof cfg.secret === 'string' && cfg.secret.length > 0;
} Try / catch
try {
const session = await fetchKalturaSession(userId, accountId);
if (!session || session.includes('START_SESSION_ERROR')) throw new KalturaSessionError();
} catch (e) {
logger.error('Kaltura session failed', { cause: e });
return res.status(503).json({ error: 'Media service unavailable' });
} Prevention
- Validate Kaltura plugin settings on boot and in account settings UI
- Monitor Kaltura API availability with a health check
- Alert on START_SESSION_ERROR occurrences in logs
- Rotate and verify Kaltura secrets after any credential change
When it happens
Trigger: Calling any API endpoint that proxies Kaltura (e.g. media upload/session endpoints) when CanvasKaltura::ClientV3.config is missing/incorrect (bad partner_id, admin secret, or host) or the Kaltura server rejects the session request and returns START_SESSION_ERROR or nil.
Common situations: Kaltura plugin not configured on the account (blank secrets, wrong partner id), Kaltura SaaS credentials expired/rotated, network/firewall blocking the Kaltura host, or Kaltura account suspended.
Related errors
- A partner ID is required to use Academic Benchmarks
- A partner key is required to use Academic Benchmarks
- an object with an interface for loading settings must be…
- an object with an interface for loading settings must be…
- category has reached the maximum number of tags
AI-assisted analysis of instructure/canvas-lms@1c9f0bb801 (2026-09-15).
Data as JSON: /api/errors/62de6faa7655a2a4.
Report an issue: GitHub.
Appendix: source
Thrown at app/controllers/services_api_controller.rb:77
# @API Start Kaltura session
# Start a new Kaltura session, so that new media can be recorded and uploaded
# to this Canvas instance's Kaltura instance.
#
# @response_field ks The kaltura session id, for use in the kaltura v3 API.
# This can be used in the uploadtoken service, for instance, to upload a new
# media file into kaltura.
#
# @example_response
# {
# 'ks': '1e39ad505f30c4fa1af5752b51bd69fe'
# }
def start_kaltura_session
@user = @current_user
client = CanvasKaltura::ClientV3.new
uid = "#{@user.id}_#{@domain_root_account.id}"
res = client.startSession(CanvasKaltura::SessionType::USER, uid)
raise "Kaltura session failed to generate" if res.nil? || res.include?("START_SESSION_ERROR")
hash = {
ks: res,
subp_id: CanvasKaltura::ClientV3.config["subpartner_id"],
partner_id: CanvasKaltura::ClientV3.config["partner_id"],
uid:,
serverTime: Time.zone.now.to_i
}
if value_to_boolean(params[:include_upload_config])
hash[:kaltura_setting] = CanvasKaltura::ClientV3.config.try(:slice,
"domain",
"resource_domain",
"rtmp_domain",
"protocol",
"partner_id",
"subpartner_id",
"player_ui_conf",
"player_cache_st",View on GitHub (pinned to 1c9f0bb801)