DocumentationAPI Reference
Help CenterAPI ChangelogOpenAPI SpecStatus
Documentation

Integration Guide: KYB via API

Solution overview

  • Silently orchestrates Persona's suite of Know Your Business features, including running reports and verifying Business Owners
  • Can be configured to support a variety of countries and Owner verification types

Pre-integration

  • Make sure your organization is set up with the requisite transaction and workflows! Reach out to your Persona team for support with this.
  • Review the intended flow with your your Persona team and confirm which reports and verification checks will be run
  • Think about if you will be incorporating manual review on the business or are looking for a fully automated interaction (Persona can accomodate for either)

Integration steps

1. Create the Transaction

  • Please ensure you’re including the reference_id property under the attributes object: this will be the value you use to identify the business in your own internal systems
  • Use your Production API key to create Production transactions, and your Sandbox API key to create Sandbox transactions

Transaction fields

Whether or not these fields are required will depend on your configuration of required and non-required inputs for each country.

FieldTypeRequiredDescription
associated_peopleArray of Associated Person objectsfalseHere's where you'll define the UBOs, directors, or other people associated with the business so they can undergo a KYC verification.
business_nameStringtrueThe business's name
business_tax_identification_numberStringtrueThe business's Tax Identification Number (e.g EIN)
business_physical_addressAddress objectfalseThe business's physical address
business_registered_addressAddress objecttrueThe business's incorporation or registered address
documentsArray of FilesfalseAny business documents you'd like to verify
debugStringfalseFor Sandbox verifications only: set as passed to pass verifications or failed to force-fail the verifications. By default, the verifications will pass.

Associated Person object fields

Depending on your setup, you will either include all the information necessary to run a silent Database verification on every Associated Person ("DB Only"), or you will provide their name and email to the transaction and Persona will email them a link to verify themselves ("Inquiry only").

FieldTypeRequired?Description
account_reference_idStringfalseYour unique identifier for the user
name_firstStringtrueFirst Name
name_lastStringtrueLast name
name_middleStringfalseMiddle name. May be used in reports, but not in the verifications themselves
percentage_ownershipFloatfalseThe percentage of the company the individual owns
associationStringfalseFreeform text field to represent this individual's association to the business
birthdateDateDB onlyBirthdate, in the format of YYYY-MM-DD
addressAddress objectDB onlyAn address object
tax_identification_numberStringDB onlyTax Identification Number (e.g SSN)
email_addressStringInquiry onlyEmail address
phone_numberStringfalsePhone number

Address object fields

FieldTypeDescription
street_1StringAddress street 1
street_2StringAddress street 2
cityStringAddress city
postal_codeStringAddress postal code
subdivisionStringAddress subdivision (state). Abides by ISO 3166-2 standards.
country_codeString2-letter country code. See Persona's list of supported countries in your dashboard.

Sample cURL commands

You can use send your business data over in application/json or multipart/form-data formats. If you're uploading any business documents, we recommend using a multipart/form-data style of request.

You'll need to add in your own values for the following: <api_token>, transaction_type_id, reference_id, and the email_address fields for the associated people.

curl -X POST https://api.withpersona.com/api/v1/transactions \
-H "Content-Type: application/json" \
-H 'Authorization: Bearer <api-token>' \
-d '{
  "data": {
    "attributes": {
      "transaction_type_id": "<your transaction ID>",
      "reference_id": "<your internal ID to identify the business>",
      "fields": {
        "associated_people": [
          {
            "name_first": "Alexander",
            "name_last": "Sample",
            "percentage_ownership": 75,
            "email_address": "<your email>",
            "association": "CEO",
            "birthdate": "1990-01-01",
            "address": {
              "street_1": "353 Sacramento Street",
              "street_2": "STE 1400",
              "city": "San Francisco",
              "subdivision": "CA",
              "postal_code": "94111",
              "country_code": "US"
            },
            "tax_identification_number": "111111111"
          },
          {
            "name_first": "Jennifer",
            "name_last": "Sample",
            "email_address": "<your email>",
            "association": "UBO",
            "percentage_ownership": 25,
            "birthdate": "1990-02-02",
            "address": {
              "street_1": "201 Post St",
              "city": "San Francisco",
              "subdivision": "CA",
              "postal_code": "94108",
              "country_code": "US"
            },
            "tax_identification_number": "222222222"
          }
        ],
        "business_name": "My Sample Business",
        "business_tax_identification_number": "12-3456789",
        "business_physical_address": {
          "street_1": "353 Sacramento Street",
          "street_2": "STE 1400",
          "city": "San Francisco",
          "subdivision": "CA",
          "postal_code": "94111",
          "country_code": "US"
        },
        "business_registered_address": {
          "street_1": "981 Mission St",
          "street_2": "",
          "city": "San Francisco",
          "subdivision": "CA",
          "postal_code": "94103",
          "country_code": "US"
        },
        "documents" [
          {
           "filename": "proof_of_address.pdf",
           "data": "<base64 encoded string of the file>"
          }
        ]
      }
    }
  }
}'
curl -X POST https://withpersona.com/api/v1/transactions \
-H 'Authorization: Bearer <api token>' \
--form 'data[attributes][transaction-type-id]=<transaction-type-id>' \
--form 'data[attributes][fields][business_name]=My Sample Business' \
--form 'data[attributes][fields][business_tax_identification_number]=12-3456789' \
--form 'data[attributes][fields][business_physical_address][street_1]=353 Sacramento St' \
--form 'data[attributes][fields][business_physical_address][street_2]=Ste 1400' \
--form 'data[attributes][fields][business_physical_address][city]=San Francisco' \
--form 'data[attributes][fields][business_physical_address][subdivision]=CA' \
--form 'data[attributes][fields][business_physical_address][postal_code]=94111' \
--form 'data[attributes][fields][business_physical_address][country_code]=US' \
--form 'data[attributes][fields][business_registered_address][street_1]=981 Mission St' \
--form 'data[attributes][fields][business_registered_address][street_2]=' \
--form 'data[attributes][fields][business_registered_address][city]=San Francisco' \
--form 'data[attributes][fields][business_registered_address][subdivision]=CA' \
--form 'data[attributes][fields][business_registered_address][postal_code]=94103' \
--form 'data[attributes][fields][business_registered_address][country_code]=US' \
--form 'data[attributes][fields][associated_people][][name_first]=Alexander' \
--form 'data[attributes][fields][associated_people][][name_last]=Sample' \
--form 'data[attributes][fields][associated_people][][email_address]=<your email>' \
--form 'data[attributes][fields][associated_people][][association]=CEO' \
--form 'data[attributes][fields][associated_people][][birthdate]=1990-01-01' \
--form 'data[attributes][fields][associated_people][][percentage_ownership]=75' \
--form 'data[attributes][fields][associated_people][][address][street_1]=353 Sacramento St' \
--form 'data[attributes][fields][associated_people][][address][street_2]=STE 1400' \
--form 'data[attributes][fields][associated_people][][address][city]=San Francisco' \
--form 'data[attributes][fields][associated_people][][address][subdivision]=CA' \
--form 'data[attributes][fields][associated_people][][address][postal_code]=94111' \
--form 'data[attributes][fields][associated_people][][address][country_code]=US' \
--form 'data[attributes][fields][associated_people][][tax_identification_number]=111111111' \
--form 'data[attributes][fields][associated_people][][name_first]=Jennifer' \
--form 'data[attributes][fields][associated_people][][name_last]=Sample' \
--form 'data[attributes][fields][associated_people][][association]=UBO' \
--form 'data[attributes][fields][associated_people][][email_address]=<your email>' \
--form 'data[attributes][fields][associated_people][][birthdate]=1990-021-02' \
--form 'data[attributes][fields][associated_people][][percentage_ownership]=25' \
--form 'data[attributes][fields][associated_people][][address][street_1]=353 Sacramento St' \
--form 'data[attributes][fields][associated_people][][address][street_2]=STE 1400' \
--form 'data[attributes][fields][associated_people][][address][city]=San Francisco' \
--form 'data[attributes][fields][associated_people][][address][subdivision]=CA' \
--form 'data[attributes][fields][associated_people][][address][postal_code]=94111' \
--form 'data[attributes][fields][associated_people][][address][country_code]=US' \
--form 'data[attributes][fields][associated_people][][tax_identification_number]=222222222' \
--form 'data[attributes][fields][account_reference_id]=kyb_test_1' \
--form 'data[attributes][fields][documents][]=@path_to_file.png'

2. Listen for the Transaction status

We recommend listening to the transaction.status-updated webhook (docs) to know when to proceed with the business. You can alternatively make an API call to fetch the transaction (docs)

Transaction statuses

Below are the default statuses that Persona includes in a KYB Transaction. You can make your own modifications as it fits your use case. To view and edit these statuses, click “… > Custom Statuses” on your transaction type’s page

Status nameDescription
createdTransaction has been created.
approvedTransaction has been approved: you can proceed with the business.
declinedTransaction has been declined: verifications unsuccessful or business otherwise declined.
needs_reviewTransaction is awaiting manual review.
erroredTransaction has errored.

KYB Case and manual review

Many KYB flows include some level of manual review. Persona streamlines manual review with our Cases product: every KYB transaction will create a case where you can view all of the business's verifications, reports, and associated people information all in once place. You can Approve or Decline a case from there, and that decision will reflect back on the transaction via Persona's orchestration engine (workflows).