Skip to content

Instantly share code, notes, and snippets.

@swombat
Created March 12, 2025 06:42
Show Gist options
  • Save swombat/62b80e0d8048e1634684062afd268fe9 to your computer and use it in GitHub Desktop.
Save swombat/62b80e0d8048e1634684062afd268fe9 to your computer and use it in GitHub Desktop.
Sumsub API example
class SumsubApi < GenericApi
BASE_URL = "https://api.sumsub.com"
def initialize(api_token: Rails.application.credentials[:sumsub][:api_token], secret_key: Rails.application.credentials[:sumsub][:secret],
base_url: BASE_URL, debug: true)
@api_token = api_token
@secret_key = secret_key
@base_url = base_url
@debug = debug
end
def get_applicant_levels
wrap_errors do
http_client.get("/resources/applicants/-/levels")
end
end
def create_applicant(level_name: "id-and-liveness", id:, email:, phone_number:)
wrap_errors do
http_client.post("/resources/applicants/?levelName=#{level_name}", { externalUserId: id, email: email, phone: phone_number }.to_json)
end
end
def http_client
faraday = Faraday.new(base_url) do |faraday|
faraday.headers['X-App-Token'] = @api_token
faraday.headers['X-App-Access-Ts'] = Time.now.to_i.to_s
faraday.request :multipart
faraday.request :url_encoded
faraday.headers['Content-Type'] = 'application/json'
# faraday.request :retry
faraday.response :logger, ::Logger.new($stdout), { bodies: true } do |logger|
logger.filter(/(X-App-Token) (\S+)/, '\1REDACTED')
end
faraday.response :raise_error
faraday.response :json
end
SumSubHttpClient.new(faraday, @secret_key)
end
def base_url
@base_url
end
def wrap_errors
response = yield
Rails.logger.debug("Sumsub API response: #{response.inspect}") if @debug
response.body.respond_to?(:attributize!) ? response.body.attributize! : response
rescue => e
error_detail = if e.respond_to?(:response) && e.response && e.response[:body] && e.response[:body]["detail"]
"- #{e.response[:body]["detail"]}"
else
""
end
Rails.logger.error("Sumsub API error: #{e.message} #{error_detail}")
Rails.logger.error("\n== Sumsub API error Inspect: #{e.inspect}") if @debug
raise e
end
class SumSubHttpClient
def initialize(faraday, secret_key)
@faraday = faraday
@secret_key = secret_key
end
def get(*args)
@faraday.headers['X-App-Access-Sig'] = sign(:get, *args)
@faraday.get(*args)
end
def post(*args)
@faraday.headers['X-App-Access-Sig'] = sign(:post, *args)
@faraday.post(*args)
end
def sign(method, *args)
data = "#{Time.now.to_i}#{method.to_s.upcase}#{args[0]}#{args[1] && args[1]}"
Rails.logger.debug "Signing for Sumsub: `#{data}`"
digest = OpenSSL::Digest.new('sha256')
OpenSSL::HMAC.hexdigest(digest, @secret_key, data)
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment