Saby Vok Ruby Client

saby_vok - Ruby-клиент для API «Всё о компаниях» (СБИС). Библиотека сама выполняет сервисную авторизацию, автоматически обновляет токены при 401/403, проставляет заголовки X-SBISAccessToken и X-SBISSessionId, а также умеет работать с JSON и бинарными ответами.

Требования

  • Ruby >= 3.1

  • Действующие client_id, client_secret, secret_key в личном кабинете СБИС

Установка

Через Bundler:

gem "saby_vok"

или командой:

bundle add saby_vok

Без Bundler:

gem install saby_vok

После установки подключите библиотеку:

require "saby_vok"

Быстрый старт

require "saby_vok"

client = SabyVok::Client.new(
  ENV.fetch("SABY_CLIENT_ID"),
  ENV.fetch("SABY_CLIENT_SECRET"),
  ENV.fetch("SABY_SECRET_KEY")
)

companies = client.req(inn: "7605016030")
puts companies.first["company_name"]

Бинарные ответы сохраняйте как есть:

File.binwrite("logo.png", client.(inn: "7605016030"))

Обработка ошибок

begin
  client.req
rescue SabyVok::ValidationError => e
  warn "wrong params: #{e.message}"
rescue SabyVok::AuthError => e
  warn "auth failed: #{e.message}"
rescue SabyVok::HttpError => e
  warn "http #{e.status}: #{e.body}"
end

Конфигурация и синглтон

SabyVok.configure do |config|
  config.client_id = ENV.fetch("SABY_CLIENT_ID")
  config.client_secret = ENV.fetch("SABY_CLIENT_SECRET")
  config.secret_key = ENV.fetch("SABY_SECRET_KEY")
  config.host = "https://api.sbis.ru/vok/"      # опционально
  config.timeout = 10                           # секунды
  config.retries = 2
end

client = SabyVok.client

Нужно обновить настройки - вызовите SabyVok.reset_client!, либо создавайте отдельные экземпляры SabyVok::Client.new(...) для разных проектов/хостов. Внутри используются мьютексы (Mutex и Mutex_m), поэтому загрузка токенов и доступ к SabyVok.client потокобезопасны.

Rails / Rack проекты

# Gemfile
gem "saby_vok"

# config/initializers/saby_vok.rb
SabyVok.configure do |config|
  creds = Rails.application.credentials.fetch(:saby_vok)
  config.client_id     = creds.fetch(:client_id)
  config.client_secret = creds.fetch(:client_secret)
  config.secret_key    = creds.fetch(:secret_key)
end

# anywhere in app
SabyVok.client.req(inn: params[:inn])

Поддерживаемые методы

JSON:

  • req, registration_information, tenders_info, tenders(limit:, page:)

  • finance, cost_business, reliability, reliability_blocks, market_position, creditworthiness

  • owners, affiliate, dirs_history, founders_history

  • license_stat, license_data, inspections_stat, inspections_data

  • statistic_courts, courts, executive_lists, bankruptcy, fea

  • subscriptions_events, subscriptions_contractors, subscribe, unsubscribe

  • contractor_history, contacts_official, branches

  • excerpts_list, excerpts_last, search, client_stat

  • trademarks, vehicle, vehicle_stat, pledges

Бинарные:

  • logo, bankruptcy_file, events_file

  • sro_file, excerpts_file, trademarks_image

  • pdf_business_report, pdf_due_diligence_report, pdf_financial_report, pdf_signed_excerpt

  • xml_egrul_excerpt, xml_reporting_excerpt

  • pledges_file, tenders документы

Ограничения API

  • Нужен хотя бы один из параметров: inn или ogrn.

  • kpp разрешён только вместе с inn.

  • Массовые запросы: до 20 значений одного типа (ИНН или ОГРН). Пары ИНН+КПП указывайте перед одиночными ИНН.

  • Пагинация: limit > 0, page >= 0.

Демо-окружение

  • Базовый URL демо: https://api.sbis.ru/vok-demo/.

  • Демо-ИНН: 7605016030, 7736050003, 7707049388, 7814593627, 7827004484, 772871281410, 6382082839, 7708503727, 7709464710.

  • В демо отключены методы, возвращающие файлы.

Разработка

bundle install
rake test
rubocop

Пулы и багрепорты приветствуются в issues.

Лицензия

MIT - см. LICENSE.txt.

Автор

Vitalii Dementev - @DementevVV