class Sumsub::Request

Constants

PRODUCTION_URL
TEST_URL

Attributes

secret_key[R]
token[R]
url[R]

Public Class Methods

new( token: Sumsub.configuration.token, secret_key: Sumsub.configuration.secret_key, production: Sumsub.configuration.production ) click to toggle source
# File lib/sumsub/request.rb, line 8
def initialize(
  token: Sumsub.configuration.token, 
  secret_key: Sumsub.configuration.secret_key,
  production: Sumsub.configuration.production
)
  @token = token
  @secret_key = secret_key
  @url = production ? PRODUCTION_URL : TEST_URL
end

Public Instance Methods

add_id_doc(applicant_id, metadata, file_path: nil) click to toggle source

API docs: developers.sumsub.com/api-reference/#adding-an-id-document To understand how the body was build manually bellow: roytuts.com/boundary-in-multipart-form-data/ Sumsub::Struct::DocumentMetadata can be used as metadata.

# File lib/sumsub/request.rb, line 32
def add_id_doc(applicant_id, metadata, file_path: nil)
  resource = "applicants/#{applicant_id}/info/idDoc"

  boundary = '----XYZ'

  body = + '--' + boundary + "\r\n"
  body += 'Content-Disposition: form-data; name="metadata"'
  body += "\r\nContent-type: application/json; charset=utf-8\r\n\r\n"
  body += metadata.to_json
  body += "\r\n"
  body += '--' + boundary

  if file_path
    content = File.read(file_path)
    file_name = File.basename(file_path)
    content_type = MIME::Types.type_for(file_name).first.content_type

    body += "\r\n" 
    body += 'Content-Disposition: form-data; name="content"; filename="' + file_name + '"'
    body += "\r\nContent-type: #{content_type}; charset=utf-8\r\n\r\n"
    body += content + "\r\n"
    body += '--' + boundary + '--'
  else
    body += '--'
  end

  headers = build_header(
    resource, 
    body: body, 
    content_type: 'multipart/form-data; boundary=' + boundary
  ).merge({ "X-Return-Doc-Warnings": true })
  response = HTTP.headers(headers)
                 .post("#{@url}/resources/#{resource}", body: body)

  parse_response(response)
end
change_applicant_top_level_info(applicant_new_values) click to toggle source

API docs: developers.sumsub.com/api-reference/#changing-top-level-info Sumsub::Struct::ApplicantUpdate can be used as applicant_new_values.

# File lib/sumsub/request.rb, line 133
def change_applicant_top_level_info(applicant_new_values)
  resource = "applicants/"
  headers = build_header(resource, method: 'PATCH', body: applicant_new_values.to_json)
  response = HTTP.headers(headers)
                 .patch("#{@url}/resources/#{resource}", json: applicant_new_values)

  parse_response(response)
end
create_applicant(lvl_name, applicant) click to toggle source

API docs: developers.sumsub.com/api-reference/#creating-an-applicant Sumsub::Struct::Applicant can be used as applicant.

# File lib/sumsub/request.rb, line 20
def create_applicant(lvl_name, applicant)
  resource = "applicants?levelName=#{lvl_name}"
  headers = build_header(resource, body: applicant.to_json)
  response = HTTP.headers(headers)
                 .post("#{@url}/resources/#{resource}", json: applicant)
  
  parse_response(response)
end
get_access_token(user_id, levelName, ttl_in_seconds: nil, external_action_id: nil) click to toggle source

API docs: developers.sumsub.com/api-reference/#access-tokens-for-sdks

# File lib/sumsub/request.rb, line 143
def get_access_token(user_id, levelName, ttl_in_seconds: nil, external_action_id: nil)
  resource = "accessTokens?userId=#{user_id}&levelName=#{levelName}&ttlInSecs=#{ttl_in_seconds}&external_action_id=#{external_action_id}"
  headers = build_header(resource, method: 'POST')
  response = HTTP.headers(headers)
                 .post("#{@url}/resources/#{resource}")

  parse_response(response)
end
get_applicant_data(applicant_id, as_external_user_id: false) click to toggle source

API docs: developers.sumsub.com/api-reference/#getting-applicant-data

# File lib/sumsub/request.rb, line 80
def get_applicant_data(applicant_id, as_external_user_id: false) 
  resource = as_external_user_id ? 
    "applicants/-;externalUserId=#{applicant_id}/one" : 
    "applicants/#{applicant_id}/one"
  headers = build_header(resource, method: 'GET')
  response = HTTP.headers(headers)
                 .get("#{@url}/resources/#{resource}")

  parse_response(response)
end
get_applicant_detailed_status(applicant_id) click to toggle source

API docs: developers.sumsub.com/api-reference/#getting-applicant-status-api

# File lib/sumsub/request.rb, line 70
def get_applicant_detailed_status(applicant_id)
  resource = "applicants/#{applicant_id}/requiredIdDocsStatus"
  headers = build_header(resource, method: 'GET')
  response = HTTP.headers(headers)
                 .get("#{@url}/resources/#{resource}")

  parse_response(response)
end
get_applicant_status(applicant_id) click to toggle source

API docs: developers.sumsub.com/api-reference/#getting-applicant-status-sdk

# File lib/sumsub/request.rb, line 92
def get_applicant_status(applicant_id) 
  resource = "applicants/#{applicant_id}/status"
  headers = build_header(resource, method: 'GET')
  response = HTTP.headers(headers)
                 .get("#{@url}/resources/#{resource}")
  
  parse_response(response)
end
get_document_image(inspection_id, image_id) click to toggle source

API docs: developers.sumsub.com/api-reference/#getting-document-images

# File lib/sumsub/request.rb, line 112
def get_document_image(inspection_id, image_id)
  resource = "inspections/#{inspection_id}/resources/#{image_id}"
  headers = build_header(resource, method: 'GET')
  response = HTTP.headers(headers)
                 .get("#{@url}/resources/#{resource}")

  parse_response(response)
end
request_applicant_check(applicant_id, reason: nil) click to toggle source

API docs: developers.sumsub.com/api-reference/#requesting-an-applicant-check

# File lib/sumsub/request.rb, line 102
def request_applicant_check(applicant_id, reason: nil)
  resource = "applicants/#{applicant_id}/status/pending?reason=#{reason}"
  headers = build_header(resource)
  response = HTTP.headers(headers)
                 .post("#{@url}/resources/#{resource}")
  
  parse_response(response)
end
reset_applicant(applicant_id) click to toggle source

API docs: developers.sumsub.com/api-reference/#resetting-an-applicant

# File lib/sumsub/request.rb, line 122
def reset_applicant(applicant_id)
  resource = "applicants/#{applicant_id}/reset"
  headers = build_header(resource)
  response = HTTP.headers(headers)
                 .post("#{@url}/resources/#{resource}")

  parse_response(response)
end
verify_webhook_sender(webhook_secret_key, payload) click to toggle source

API docs: developers.sumsub.com/api-reference/#verifying-webhook-sender Your payload need to be informed as a string.

# File lib/sumsub/request.rb, line 154
def verify_webhook_sender(webhook_secret_key, payload)
  resource = "inspectionCallbacks/testDigest?secretKey=#{webhook_secret_key}"
  headers = build_header(
    resource, 
    method: 'POST', 
    content_type: 'text/plain',
    accept: 'text/plain',
    body: payload
  )

  response = HTTP.headers(headers)
                 .post("#{@url}/resources/#{resource}", body: payload)

  parse_response(response)
end

Private Instance Methods

build_header( resource, body: nil, method: 'POST', content_type: 'application/json', accept: 'application/json' ) click to toggle source

More infos about the required header and the signing strategy: developers.sumsub.com/api-reference/#app-tokens

# File lib/sumsub/request.rb, line 174
def build_header(
  resource, 
  body: nil, 
  method: 'POST', 
  content_type: 'application/json', 
  accept: 'application/json'
)
  epoch_time = Time.now.to_i
  access_signature = Sumsub::MessageSigner.sign(
    time: epoch_time, 
    resource: resource, 
    body: body, 
    method: method,
  )

  {
    "X-App-Token": @token.encode("UTF-8"),
    "X-App-Access-Sig": access_signature.encode("UTF-8"),
    "X-App-Access-Ts": epoch_time.to_s.encode("UTF-8"),
    "Accept": accept,
    "Content-Type": content_type
  }
end
parse_response(response) click to toggle source
# File lib/sumsub/request.rb, line 198
def parse_response(response)
  Sumsub::Parser.parse(response.to_s)
end