Skip to main content
POST
Submits Know Your Customer (KYC) identity information for an existing customer. Each call creates a new KYC record for the customer — nothing is updated in place — and hosted checkout uses the most recent one. Use this endpoint when you have already verified customer identity through your own KYC provider and want to sync that data with Soap. The provider field identifies which KYC provider performed the verification. Accepted values are plaid, veriff, didit, sumsub, idology, seon, footprint, socure, geo_comply, acuity, surt, persona, and shufti. Every Soap API request is authenticated with a bearer token in the Authorization header:
Your API key is in the Soap Dashboard under the Developers section. It looks like key_.... Requests with a missing or invalid API key return 422 — never 401 — with a JSON error field, usually {"error": "API key not found."}. Branch on the status code rather than the message: GET /api/v1/device_pings/latest_geo_check does not yet return the same wording. Never expose your API key in client-side code — it is server-side only.
KYC upsert is enabled by default and can be switched off per account. If it is disabled for yours, the endpoint responds with a 404 and the hint KYC upsert is disabled for this business. Contact Soap to enable it.

How upserted records are used

  • A customer can have several KYC records. Hosted checkout reads the most recent one, whether Soap created it during in-checkout verification or you submitted it here.
  • Upserting verified: false for a customer who already passed in-checkout verification therefore sends them back through verification on their next checkout that requires KYC.
  • In production, when KYC is enabled for a checkout type, every checkout of that type with a verified record checks that the verified identity’s name is consistent with the customer profile’s current first_name and last_name. This applies to records you submit here just as it does to Soap’s own verification. Keep the profile on the customer’s legal first name and surname as shown on their ID, with no nicknames, middle names, initials or suffixes. A mismatch restricts the customer with reason code KYC_DOES_NOT_MATCH_PROFILE_NAME; fix the profile with Update Customer and lift the restriction in the dashboard.

Required Fields

Required: customer_id, first_name, last_name, date_of_birth, address_line_1, city, state, postal_code, country, provider, verified Optional: address_line_2, phone_number, email, last_four_ssn (accepted and stored, but not echoed back in the response)

Authorizations

Authorization
string
header
required

Bearer token authentication using your API key (key_...). Used for every endpoint except POST /api/v1/device_pings.

Body

application/json
customer_id
string
required

Unique identifier for the customer

Example:

"cus_vi57KegYgcRqcGHqip8q6UZiqtrwMT870"

first_name
string
required

Customer's first name

Minimum string length: 1
Example:

"John"

last_name
string
required

Customer's last name

Minimum string length: 1
Example:

"Doe"

date_of_birth
string
required

Customer's date of birth (YYYY-MM-DD)

Example:

"1990-01-15"

address_line_1
string
required

Primary address line

Minimum string length: 1
Example:

"123 Main Street"

city
string
required

City name

Minimum string length: 1
Example:

"San Francisco"

state
string
required

Two-letter state code (uppercase)

Pattern: ^[A-Z]{2}$
Example:

"CA"

postal_code
string
required

Postal or ZIP code

Example:

"94102"

country
string
required

Three-letter uppercase country code, for example USA. Required — there is no default.

Pattern: ^[A-Z]{3}$
Example:

"USA"

provider
enum<string>
required

KYC provider identifier used for verification

Available options:
plaid,
veriff,
didit,
sumsub,
idology,
seon,
footprint,
socure,
geo_comply,
acuity,
surt,
persona,
shufti
Example:

"plaid"

verified
boolean
required

Whether the customer has been verified by the KYC provider. You can choose to provide an unverified identity by setting this field value to false. Hosted checkout reads the customer's most recent KYC record, so false sends an already-verified customer back through verification on their next checkout that requires KYC.

Example:

true

email
string | null

Customer's email address

Example:

"john@example.com"

phone_number
string | null

Customer's phone number

Example:

"5551234567"

address_line_2
string | null

Secondary address line (apartment, suite, etc.)

Example:

"Apt 4B"

last_four_ssn
string | null

Last four digits of the customer's SSN (optional)

Required string length: 4
Pattern: ^[0-9]{4}$
Example:

"1234"

Response

KYC identity created or updated successfully

id
string

Unique identifier for the KYC identity record

Example:

"id_A3GuXEbThpqk2t6UTxEuoceVJyUEAX7V"

first_name
string
Example:

"John"

last_name
string
Example:

"Doe"

email
string | null
Example:

"john@example.com"

phone_number
string | null
Example:

"5551234567"

date_of_birth
string
Example:

"1990-01-15"

address_line_1
string
Example:

"123 Main Street"

address_line_2
string | null
Example:

null

city
string
Example:

"San Francisco"

state
string
Example:

"CA"

postal_code
string
Example:

"94102"

country
string
Example:

"USA"

provider
string
Example:

"your_kyc_provider"

verified
boolean
Example:

true