instructure/canvas-lms · error · ImportError
No category_id given for an institutional tag category
Error message
No category_id given for an institutional tag category
What it means
Validation guard in InstitutionalTagCategoryImporter::Work#add_institutional_tag_category raised when the sis_id argument (category_id) is blank. The category cannot be created or matched to an existing institutional tag category without a SIS identifier, so the row is rejected at parse time.
Solutions
- Provide a category_id (sis id) for every institutional tag category row
- Re-run the SIS batch after correcting the file
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at lib/sis/institutional_tag_category_importer.rb:42 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of instructure/canvas-lms@1c9f0bb801 (2026-09-15).
Data as JSON: /api/errors/691d240658e1a9f8.
Report an issue: GitHub.
Appendix: source
Thrown at lib/sis/institutional_tag_category_importer.rb:42
importer = Work.new(@batch, @root_account, @logger)
yield importer
SisBatchRollBackData.bulk_insert_roll_back_data(importer.roll_back_data)
importer.success_count
end
class Work
attr_accessor :success_count, :roll_back_data
def initialize(batch, root_account, logger)
@batch = batch
@root_account = root_account
@logger = logger
@success_count = 0
@roll_back_data = []
end
def add_institutional_tag_category(sis_id, name, description, status)
raise ImportError, "No category_id given for an institutional tag category" if sis_id.blank?
raise ImportError, "No name given for institutional tag category #{sis_id}" if name.blank?
raise ImportError, "No status given for institutional tag category #{sis_id}" if status.blank?
raise ImportError, "Improper status \"#{status}\" for institutional tag category #{sis_id}" unless /\A(active|deleted)/i.match?(status)
return if @batch.skip_deletes? && /deleted/i.match?(status)
category = InstitutionalTagCategory.find_by(root_account_id: @root_account.id, sis_source_id: sis_id)
category ||= InstitutionalTagCategory.new(account: @root_account,
root_account: @root_account,
sis_source_id: sis_id)
category.name = name
category.description = description
category.sis_batch_id = @batch.id
category.workflow_state = /deleted/i.match?(status) ? "deleted" : "active"
if category.save
data = SisBatchRollBackData.build_data(sis_batch: @batch, context: category)
@roll_back_data << data if dataView on GitHub (pinned to 1c9f0bb801)