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

  1. Verify Kaltura settings (account_settings / plugin :kaltura) partner_id, subpartner_id, secret keys and service host are correct
  2. Test connectivity from the Canvas server to the Kaltura host (curl the Kaltura API endpoint)
  3. Check Canvas logs / Kaltura admin console for why START_SESSION_ERROR was returned (invalid partner, disabled account)
  4. 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

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


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)