Ruby client for Det Centrale Virksomhedsregister (CVR) via Datafordeler GraphQL and Fildownload.
Denmark only — look up an 8-digit CVR or registered company name and return
picker-shaped fields (name, light address, status). Also supports Datafordeler
CVR Fildownload (list/download totalextract zips) and CVR_Events pull/poll for
incremental sync.
# Gemfile
gem "cvrvaelger"bundle add cvrvaelger
# or: gem install cvrvaelgerRequires Ruby 3.3+. No Rails dependency.
require "cvrvaelger"
client = Cvrvaelger::Client.new(
api_key: ENV.fetch("CVRVAELGER_API_KEY")
)
company = client.lookup("47458714")
company.cvr # => "47458714"
company.name # => "LEGO SYSTEM A/S"
company.address_line # => "Åstvej 1"
company.postal_code # => "7190"
company.city # => "Billund"
company.status # => "aktiv"
# Picker: 8 digits → lookup; otherwise exact, case-sensitive name match.
# Datafordeler string filters are `eq` / `in` only (no contains / fuzzy).
hits = client.search("LEGO SYSTEM A/S")
client.search("lego") # => []
# Optional bitemporal cut-off (GraphQL `virkningstid`, default: now)
client.lookup("47458714", at: Time.utc(2020, 1, 1))
# Fildownload: list metadata and stream a zip to disk
files = client.available_file_downloads(entity: "Navn", type_of_data: "Current", format: "json")
client.download_latest(entity: "Virksomhed", type: "current", format: "json", to: "tmp/virksomhed.zip")
client.download_file(files.first.file_name, to: "tmp/navn.zip")
# Incremental sync after a TotalDownload baseline (persist last event_id yourself).
# See Datafordeler transitions guide for entitetsbaserede hændelser.
status = client.register_import_status
page = client.events(since_event_id: last_id, first: 100)
page.events.each do |event|
# from_failed_import marks duplicate catch-up events — handle in the host app.
next if event.event_action == "d" # delete local row for event.object_datafordeler_row_id
case event.entity_name
when "Virksomhed"
client.virksomhed_by_row_id(event.object_datafordeler_row_id) # => Hash or nil
when "Navn"
client.navn_by_row_id(event.object_datafordeler_row_id)
when "Adressering"
client.adressering_by_row_id(event.object_datafordeler_row_id)
# other entities: query GraphQL yourself
end
end
page = client.events(since_event_id: last_id, first: 100, after: page.end_cursor) if page.has_next_pageSSE / GraphQL subscriptions are not wrapped here; poll with events instead.
Environment variables:
| Variable | Purpose |
|---|---|
CVRVAELGER_API_KEY |
Datafordeler API key (preferred) |
DATAFORDELER_API_KEY |
Accepted alias |
CVRVAELGER_BASE_URL |
Override GraphQL endpoint (default https://graphql.datafordeler.dk/CVR/v2) |
CVRVAELGER_FILE_DOWNLOAD_BASE_URL |
Override Fildownload host (default https://api.datafordeler.dk) |
There is no demo/default secret. Create a free user + IT-system API key in
Datafordeler Administration. Company entities do not
require a special CVR access request; CVRPerson is out of scope for this gem.
bundle exec rake test
bundle exec rake rubocopUnit tests stub HTTP via an injected callable. Live examples use
VCR cassettes recorded against the real API
(API keys redacted as <API_KEY>). CI uses record: :none (fail-closed).
To refresh cassettes locally:
VCR_RECORD=all bundle exec rake test TEST=test/client_live_test.rb
VCR_RECORD=all bundle exec rake test TEST=test/graphql_features_test.rb
VCR_RECORD=all bundle exec rake test TEST=test/file_download_live_test.rb
VCR_RECORD=all bundle exec rake test TEST=test/client_events_live_test.rbNever hand-write cassette response bodies.
Company data via Datafordeler / Erhvervsstyrelsen CVR. This gem is an independent open-source client and is not affiliated with or endorsed by those agencies.
- Bump
Cvrvaelger::VERSIONinlib/cvrvaelger/version.rb(gemspec reads it). - Update
CHANGELOG.mdfor that version. - Commit and push to
main. - Tag and push:
git tag vX.Y.Z && git push origin vX.Y.Z(or create a GitHub Release forvX.Y.Z— that also pushes the tag). - Tag must match the gem version (
v0.1.0↔0.1.0). The push_gem workflow verifies this, then publishes via RubyGems Trusted Publishing (rubygems/release-gem, OIDC — noRUBYGEMS_API_KEYsecret).
MIT. See LICENSE.txt.