Enrollment APIs

This guide explains how to enroll end users using the Enrollments APIs, including identity requirements, validation rules, and common enrollment scenarios.

📘

For full request/response schemas, see the API Reference – Enrollments.


POST /programs/{programCode}/enrollments

Creates a new enrollment for a user and performs the following core operations:

  • Creates a new user profile
  • Creates an account
  • Creates one or more payment instruments (virtual and/or physical)
  • Supports instant issue (card‑in‑hand) enrollment
  • Supports account upgrades (for example, GPR → DDA when upgradeFlag=true)
📘

Important
If a valid enrollment request is submitted and processing fails during OFAC screening, the enrollment will automatically complete once OFAC is cleared.

Request and response field definitions and examples are documented in the API Reference.


Name Validation Rules

All name fields (firstName, middleName, lastName) must follow the rules below. These rules are enforced during enrollment and KYC execution.

Allowed Characters

  • Alphabetic characters: A–Z, a–z
  • Space
  • Apostrophe (')
  • Hyphen (-)
  • Period (.)
  • Supported diacritics:
    • Grave: À à
    • Acute: Á á
    • Tilde: Ã ã Ñ ñ
    • Cedilla: Ç ç
    • Circumflex: Î î
    • Diaeresis / Umlaut: Ü ü

Validation Rules

  • Names must start and end with a letter (diacritics allowed)
  • No consecutive special characters (spaces, apostrophes, hyphens, or periods)
  • Diacritics must be paired with a letter
  • Disallowed characters include numbers, emojis, and all other symbols

Length Requirements

FieldMinMax
First name125
Middle name125
Last name225

Suggested validation regex (example only):

^(?=.25$)[A-Za-zÀ-ÿ](?:[A-Za-zÀ-ÿ]|[ .'-](?![ .'-]))*[A-Za-zÀ-ÿ]$

❗ If any name field does not meet these requirements, enrollment fails with HTTP 400 – Bad Request.


Supported Identity Types

The Enrollments API supports two identity verification flows:

  • SSN / ITIN (U.S. persons)
  • Foreign‑issued identity documents

The identity type determines which identifying fields are required and how KYC is performed.


SSN / ITIN Enrollment Flow

This is the standard enrollment flow for U.S. customers.

Required Identifying Fields

  • dateOfBirth (YYYY‑MM‑DD)
  • One of the following (mutually exclusive):
    • Full ssn (9 digits)
    • ssnSuffix (last 4 digits)

Non‑U.S. SSNs will fail KYC verification.

KYC Execution

When executeKycFlag=true, the platform validates:

  • Name
  • Date of birth
  • Address
  • SSN or ITIN
  • Phone number

Common SSN / ITIN errors include:

  • Providing both ssn and ssnSuffix
  • Invalid date‑of‑birth format
  • Missing home address
  • Multiple default phone numbers

Foreign ID Enrollment Flow

Foreign ID enrollment supports non‑U.S. persons using government‑issued identity documents.

Required Fields

  • First and last name (middle name optional)
  • Date of birth
  • U.S. residential address
    • Must be a physical address
    • PO Boxes, PMBs, CMRAs, and foreign addresses are not supported
  • Email
  • Mobile phone number
  • Foreign identity details:
    • identityType
    • identityValue
    • identityCountryCode
    • identityExpirationDate

Additional Compliance Fields

Source of funds (required):

  • Salary or wages
  • Business income
  • Pension or retirement
  • Investments or asset sales
  • Inheritance or gifts
  • Government benefits
  • Legal settlements
  • Lottery or gambling winnings

Occupation (required):

  • Employed
  • Self‑employed / business owner
  • Student (employed or unemployed)
  • Unemployed
  • Retired

Foreign ID user data must be encrypted before calling the enrollment endpoint.


User Data Requirements (Unencrypted)

The following top‑level objects are required to successfully perform KYC:

  • profileData
  • identifyingData
  • email
  • phoneNumbers

These objects are encrypted and passed as encryptedUserData in the enrollment request.


Enrollment Data Validation Rules

FieldRequiredRule / ValidationPartner guidance & constraints
First nameYesMust meet allowed character and length rulesUse the user’s legal first name. Leading/trailing spaces and special characters may cause request rejection.
Last nameYesMust meet allowed character and length rulesUse the legal last name without suffixes (e.g., Jr, Sr) unless explicitly supported.
Date of birthYesMust be formatted as YYYY-MM-DDRequests with an invalid date format are rejected before KYC is executed.
Phone numbersYesAt least one phone number requiredOnly one default phone number is allowed. Missing phone numbers will cause enrollment failure when KYC is required.
EmailYesMust be in a valid email formatUsed for communication and fraud signals; invalid formats result in enrollment rejection.
Addresses objectYesAt least one address object requiredAddresses must include a valid type and follow duplication and default rules.
Address typesYesDuplicate address types are not allowedOnly one of each type (home, work, billing, shipping) may be provided.
Default addressYesOnly one address may be marked as defaultIf isDefault is omitted, the home address is treated as default.
Home addressYesRequired when KYC is executedHome address must be a physical residential address. PO Boxes, PMBs, and CMRAs are not supported.
Shipping addressConditionalRequired when issuing a physical cardShipping address is not evaluated for KYC. Program and carrier rules determine eligibility.
Address line 1YesMust meet character and length rulesStreet address is required. USPS‑compliant abbreviations are acceptable.
CityYesMust meet length and character rulesRequired unless ZIP + state satisfy program rules.
StateYesMust be a valid 2‑character state codeRequired for U.S. addresses.
ZIP codeYesMust be 5 digits onlyExtended ZIP codes are not supported.
CountryYesDefaults to USA if omittedNon‑U.S. countries may route the user into Foreign ID enrollment flows.

KYC Identity Verification Rules

FieldRequiredRule / ValidationPartner guidance & constraints
First nameYesMust match identity recordsShould match the name on SSN or identity document. Nicknames may trigger KYC mismatches.
Last nameYesMust match identity recordsVariations or suffixes may cause step‑up verification.
Date of birthYesMust match identity recordsIncorrect DOB frequently results in KYC failure or IDV.
Full SSNConditionalRequired if kycPendingGate = kyc2Do not submit both ssn and ssnSuffix. Full SSN is mandatory for KYC2.
SSN structureYesCertain SSN patterns are invalidSSNs with 000, 666, or 900–999 prefixes, 00 group, or 0000 serial fail validation.
Residential (home) addressYesUsed for identity verificationMust be a physical address. PO Boxes and commercial mail services are not accepted for KYC.
Address consistencyYesMust align with identity dataAddress mismatches commonly trigger KYC step‑up or failure.
Phone numberYesUsed as a supporting signalMust be reachable. Multiple defaults are not allowed.
EmailYesUsed as a supporting signalHigh‑risk or disposable emails may increase verification friction.
Identity document (IDV)ConditionalRequired if kycPendingGate = idvPartners must route the user through Socure document verification for new implementations.
OFAC screeningYesPerformed automaticallyOFAC matches may require manual review (kycPendingGate = manual).

Enrollment Error Codes

HTTPCodeSubCodeDescription
4007000Date of birth must be YYYY‑MM‑DD
4006300Cannot provide both SSN and SSN suffix
4001010Phone number missing when KYC is required
40010200Duplicate address types are not allowed
40010400Multiple default addresses or phones provided
40010420Home address is missing
4006405xxInvalid characters in user data fields
4006200Terms acceptance timestamp must be within 720 hours
4006500Invalid or unsupported currency
400101192Enrollment declined due to multiple existing accounts

Enrollment Limits

SSN / ITIN limits:

  • 1 active account per SSN / ITIN per program
  • 3 lifetime accounts per SSN / ITIN per program

Phone number limits (default phone only):

  • 2 active accounts per phone number per program
  • 10 lifetime accounts per phone number per program

Requests exceeding these thresholds are rejected.


Idempotent Retries and Account Cycle Day

In some scenarios, enrollment may succeed without assigning an account cycle day (BCD). When this occurs:

  • The account remains in a pending state
  • Payment instruments are not created

Partners must retry the same POST /enrollments request idempotently. Once completed:

  • The account cycle day is populated
  • The account status transitions to normal
  • Payment instruments are created
  • An Account Updated webhook is sent

GET /programs/{programCode}/enrollments/accounts/{accountIdentifier}

Returns encrypted enrollment details for an account.

Notes:

  • Joint accounts return two account holders
  • GPR → DDA upgrades may include upgradeKycStateData

Refer to the API Reference for full request and response examples.

Example Enrollment Details Response (Joint Account)

For joint accounts, the enrollment details response contains multiple account holders.

Each account holder includes its own:

  • user
  • paymentInstruments
  • accountHolderIdentifier

One account holder is marked as the primary account holder (isPrimaryAccountHolder=true).

{
  "account": {
    "accountIdentifier": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "accountReferenceNumber": "EXAMPLE12345",
    "status": "normal",
    "accountStatusChangedDateTime": "2099-01-01T00:00:00.000Z",
    "statusReasons": [
      "healthy"
    ],
    "directDepositInformation": {
      "accountNumber": "000000000000000",
      "routingNumber": "000000000"
    },
    "purses": [
      {
        "purseIdentifier": "11111111-2222-3333-4444-555555555555",
        "purseType": "primary",
        "availableBalance": 0,
        "ledgerBalance": 0,
        "availableBalanceAsOfDateTime": "2099-01-01T00:00:00Z",
        "ledgerBalanceAsOfDateTime": "2099-01-01T00:00:00Z",
        "isHidden": false,
        "status": "active"
      }
    ],
    "accountHolders": [
      {
        "paymentInstruments": [
          {
            "encryptedPrivatePaymentInstrumentData": {
              "version": "EC_v1",
              "ephemeralPublicKey": "BASE64_PUBLIC_KEY_PLACEHOLDER",
              "publicKeyHash": "BASE64_HASH_PLACEHOLDER",
              "data": "ENCRYPTED_DATA_PLACEHOLDER"
            },
            "paymentIdentifier": "pi-primary-0001",
            "paymentInstrumentIdentifier": "card-primary-virtual-0001",
            "paymentInstrumentType": "virtual",
            "status": "activated",
            "isPinSet": false,
            "last4Pan": "1111",
            "activatedDateTime": "2099-01-01T00:00:00Z",
            "issuedDateTime": "2099-01-01T00:00:00Z",
            "isPrivateDataViewable": false
          }
        ],
        "user": {
          "firstName": "Primary",
          "lastName": "ExampleUser",
          "dobStatus": "matched",
          "last4Identity": "1111",
          "identityType": "ssn",
          "userIdentifier": "user-primary-0001",
          "status": "active",
          "isPrimaryAccountHolder": true,
          "kycStateData": {
            "ofacStatus": "passed",
            "kycStatus": "passed",
            "kycPendingGate": "healthy"
          }
        }
      },
      {
        "paymentInstruments": [
          {
            "encryptedPrivatePaymentInstrumentData": {
              "version": "EC_v1",
              "ephemeralPublicKey": "BASE64_PUBLIC_KEY_PLACEHOLDER",
              "publicKeyHash": "BASE64_HASH_PLACEHOLDER",
              "data": "ENCRYPTED_DATA_PLACEHOLDER"
            },
            "paymentIdentifier": "pi-secondary-0002",
            "paymentInstrumentIdentifier": "card-secondary-virtual-0002",
            "paymentInstrumentType": "virtual",
            "status": "activated",
            "isPinSet": false,
            "last4Pan": "2222",
            "activatedDateTime": "2099-01-01T00:00:00Z",
            "issuedDateTime": "2099-01-01T00:00:00Z",
            "isPrivateDataViewable": false
          }
        ],
        "user": {
          "firstName": "Secondary",
          "lastName": "SampleUser",
          "dobStatus": "matched",
          "last4Identity": "2222",
          "identityType": "ssn",
          "userIdentifier": "user-secondary-0002",
          "status": "active",
          "isPrimaryAccountHolder": false,
          "kycStateData": {
            "ofacStatus": "passed",
            "kycStatus": "passed",
            "kycPendingGate": "healthy"
          }
        }
      }
    ],
    "accountCycleDay": 1
  },
  "responseDetails": [
    {
      "code": 0,
      "subCode": 0,
      "description": "Success",
      "url": "https://example.documentation"
    }
  ]
}

Refer to the API Reference for additional response schema.