Skip to content

Applying for Cards

Before issuing cards, users must complete a card application that triggers KYC (Know Your Customer) for individuals or KYB (Know Your Business) for companies. Once approved, the identity can issue unlimited cards without repeating the verification process.

Individual Application

Individual applications collect personal identity information and submit it to Rain for KYC/AML review.

Application Flow

Submit an Application

graphql
mutation CreateRainCardApplication($input: CreateRainCardApplicationInput!) {
  createRainCardApplication(input: $input) {
    success
    applicantId
    rainApplicationId
    applicationStatus
    applicationCompletionUrl
    shareToken
    error
  }
}
graphql
# Variables
{
  "input": {
    "walletAddress": "0x1234...abcd",
    "occupation": "Software Developers",
    "annualSalary": "100000_TO_150000",
    "accountPurpose": "PERSONAL_SPENDING",
    "expectedMonthlyVolume": "1000_TO_5000",
    "isTermsOfServiceAccepted": true,
    "cardNickname": "My Card",
    "requestedLimitAmount": 25000,
    "requestedLimitFrequency": "30 day"
  }
}

Input Fields

FieldTypeDescription
walletAddressString!Ethereum (0x...) or Solana (base58) wallet address
occupationString!SOC occupation description (e.g., "Software Developers", "Chief Executives")
annualSalaryString!Salary range (e.g., "100000_TO_150000")
accountPurposeString!Purpose of the account (e.g., "PERSONAL_SPENDING", "BUSINESS")
expectedMonthlyVolumeString!Expected monthly volume range (e.g., "1000_TO_5000")
isTermsOfServiceAcceptedBoolean!Must be true to proceed
cardNicknameStringOptional display name for the first card
requestedLimitAmountIntDesired credit limit in dollars (e.g., 25000)
requestedLimitFrequencyStringLimit period (e.g., "30 day", "7 day")
sessionIdStringSession ID from generateEncryptionKeys (required if setting PIN at application)
encryptedPinStringPre-encrypted PIN to stage for the first card

Response

If the response includes an applicationCompletionUrl, redirect the user to that URL to complete additional verification steps (e.g., document upload, selfie).

Corporate Application

Corporate applications onboard a company and its beneficial owners. The process triggers KYB for the company entity and individual KYC for each Ultimate Beneficial Owner (UBO).

Application Flow

Submit a Corporate Application

graphql
mutation CreateRainCorporateApplication($input: CreateRainCorporateApplicationInput!) {
  createRainCorporateApplication(input: $input) {
    success
    companyId
    name
    applicationStatus
    error
  }
}
graphql
# Variables
{
  "input": {
    "name": "Acme Corp",
    "address": {
      "line1": "123 Business Ave",
      "city": "Miami",
      "region": "FL",
      "postalCode": "33101",
      "countryCode": "US"
    },
    "entity": {
      "name": "Acme Corporation",
      "description": "Software development",
      "industry": "541512",
      "registrationNumber": "12345678",
      "taxId": "12-3456789",
      "website": "https://acme.com",
      "type": "LLC",
      "expectedSpend": "10000_TO_50000"
    },
    "initialUser": {
      "firstName": "John",
      "lastName": "Doe",
      "birthDate": "1980-01-15",
      "nationalId": "123456789",
      "countryOfIssue": "US",
      "email": "john@acme.com",
      "address": {
        "line1": "123 Main St",
        "city": "Miami",
        "region": "FL",
        "postalCode": "33101",
        "countryCode": "US"
      },
      "isTermsOfServiceAccepted": true,
      "walletAddress": "0x1234...abcd"
    },
    "representatives": [
      {
        "firstName": "Jane",
        "lastName": "Smith",
        "birthDate": "1985-06-20",
        "nationalId": "987654321",
        "countryOfIssue": "US",
        "email": "jane@acme.com",
        "address": {
          "line1": "456 Oak Ave",
          "city": "Miami",
          "region": "FL",
          "postalCode": "33101",
          "countryCode": "US"
        }
      }
    ],
    "ultimateBeneficialOwners": [
      {
        "firstName": "John",
        "lastName": "Doe",
        "birthDate": "1980-01-15",
        "nationalId": "123456789",
        "countryOfIssue": "US",
        "email": "john@acme.com",
        "address": {
          "line1": "123 Main St",
          "city": "Miami",
          "region": "FL",
          "postalCode": "33101",
          "countryCode": "US"
        }
      }
    ],
    "sourceKey": "your-app-key"
  }
}

Key Corporate Fields

SectionFieldsNotes
Entityname, description, industry (NAICS), registrationNumber, taxId, website, type, expectedSpendwebsite is required by Rain API
Initial UserPersonal details + walletAddress + isTermsOfServiceAcceptedFirst user/admin of the company
RepresentativesArray of persons authorized to act on behalf of the companyAt least one required
UBOsArray of persons with 25%+ ownershipEach triggers individual KYC

After corporate approval, add users to the company, then issue cards to each user.

Application Status Values

StatusDescriptionAction
approvedVerified. Cards can be issued.Proceed to createRainCard
pendingUnder review. No action required.Poll or subscribe for updates
needsInformationAdditional information required.Check applicationReason for details
needsVerificationIdentity verification pending.Redirect user to applicationCompletionUrl
manualReviewFlagged for manual review by Rain compliance.Wait for resolution
deniedApplication denied.Display denial to user
lockedAccount locked by compliance.Contact Rain support
canceledApplication canceled.Resubmit if needed

Monitoring Application Status

Real-Time Subscription

Subscribe to application status changes for the authenticated user:

graphql
subscription CardApplicationUpdates {
  AgioCard_card_application(order_by: { updated_at: desc }) {
    id
    rain_application_id
    application_status
    application_reason
    wallet_address
    created_at
    updated_at
  }
}

Event Bus Events

The platform emits events when application status changes:

EventDescription
CARD_APPLICATION_APPROVEDApplication approved — cards can now be issued
CARD_APPLICATION_DENIEDApplication denied

Polling Pattern

If subscriptions are not available, poll the CardApplicationUpdates subscription data via the vwCards query. Use a 5-second interval while the application is in pending status, and fall back to 30-second intervals for other statuses.

One-Time Applications

Applications are one-time per identity. Once a user or company is approved, unlimited cards can be issued without repeating the KYC/KYB process.

Next Steps

Applying for Cards has loaded