{"record":{"id":"62de6faa7655a2a4","repo":"instructure/canvas-lms","slug":"kaltura-session-failed-to-generate","errorCode":null,"errorMessage":"Kaltura session failed to generate","messagePattern":"Kaltura session failed to generate","errorType":"exception","errorClass":null,"httpStatus":500,"severity":"error","filePath":"app/controllers/services_api_controller.rb","lineNumber":77,"sourceCode":"\n  # @API Start Kaltura session\n  # Start a new Kaltura session, so that new media can be recorded and uploaded\n  # to this Canvas instance's Kaltura instance.\n  #\n  # @response_field ks The kaltura session id, for use in the kaltura v3 API.\n  #     This can be used in the uploadtoken service, for instance, to upload a new\n  #     media file into kaltura.\n  #\n  # @example_response\n  #     {\n  #       'ks': '1e39ad505f30c4fa1af5752b51bd69fe'\n  #     }\n  def start_kaltura_session\n    @user = @current_user\n    client = CanvasKaltura::ClientV3.new\n    uid = \"#{@user.id}_#{@domain_root_account.id}\"\n    res = client.startSession(CanvasKaltura::SessionType::USER, uid)\n    raise \"Kaltura session failed to generate\" if res.nil? || res.include?(\"START_SESSION_ERROR\")\n\n    hash = {\n      ks: res,\n      subp_id: CanvasKaltura::ClientV3.config[\"subpartner_id\"],\n      partner_id: CanvasKaltura::ClientV3.config[\"partner_id\"],\n      uid:,\n      serverTime: Time.zone.now.to_i\n    }\n    if value_to_boolean(params[:include_upload_config])\n      hash[:kaltura_setting] = CanvasKaltura::ClientV3.config.try(:slice,\n                                                                  \"domain\",\n                                                                  \"resource_domain\",\n                                                                  \"rtmp_domain\",\n                                                                  \"protocol\",\n                                                                  \"partner_id\",\n                                                                  \"subpartner_id\",\n                                                                  \"player_ui_conf\",\n                                                                  \"player_cache_st\",","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/app/controllers/services_api_controller.rb#L59-L95","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"# before\nres = client.startSession(CanvasKaltura::SessionType::USER, uid)\nraise \"Kaltura session failed to generate\" if res.nil? || res.include?(\"START_SESSION_ERROR\")\n# after\nbegin\n  res = client.startSession(CanvasKaltura::SessionType::USER, uid)\nrescue CanvasKaltura::Errors::ClientError => e\n  Rails.logger.error(\"Kaltura startSession failed: #{e.message}\")\n  raise \"Kaltura session failed to generate\"\nend","handlingStrategy":"try-catch","validationCode":"const settings = CanvasKaltura::ClientV3.config\nabort if settings.blank? || settings['partner_id'].blank? || settings['secret'].blank?\n# optionally ping the Kaltura host first\nres = Net::HTTP.get_response(URI(settings['service_url']))\nabort unless res.is_a?(Net::HTTPSuccess)","typeGuard":"function hasKalturaConfig(cfg) {\n  return cfg != null && typeof cfg.partner_id === 'string' && cfg.partner_id.length > 0 && typeof cfg.secret === 'string' && cfg.secret.length > 0;\n}","tryCatchPattern":"try {\n  const session = await fetchKalturaSession(userId, accountId);\n  if (!session || session.includes('START_SESSION_ERROR')) throw new KalturaSessionError();\n} catch (e) {\n  logger.error('Kaltura session failed', { cause: e });\n  return res.status(503).json({ error: 'Media service unavailable' });\n}","preventionTips":["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"],"tags":["kaltura","third-party-api","configuration"],"backgroundTag":"upstream-api-error","analyzedSha":"1c9f0bb8013ed69c4f2efe11fd483025469b7e6c","analyzedAt":"2026-09-15T20:33:18.891Z","contentChangedAt":"2026-09-15T20:33:18.891Z","schemaVersion":2},"datasetVersion":"2026-09-23T02:17:17.105Z"}