Part 3: Client Onboarding

For individual clients only

Fiat24’s client onboarding module is designed for seamless integration. We offer two flexible approaches:

  1. No-code integration – Ideal for Web3 dApp developers who want a quick and practical setup without writing code.

  2. Code-based integration – Recommended for native app developers who prefer embedding the onboarding module directly into their application code for maximum control and customisation.

1. No-code integration

Only for 4-Digit and 3-Digit Developer NFT projects.

This guide illustrates how Fiat24 separately manages the client information in a dedicated site id.fiat24.com.

https://id.fiat24.com/login?wallet=<walletTokenId>

The parameter walletTokenId needs to be added in case you want to customise the Login Page with your colors and name

Our onboarding process involves several steps to verify the identity of the customer and ensure that they meet the Swiss KYC/AML requirements to open an account with Fiat24. Here is a general overview of the onboarding process with us:

To start the onboarding process, the customer must own a Fiat24 NFT from www.fiat24.com or OpenSea shop. The NFT must be not verified before (NFT.status = 2).

  1. Check Profile This step check the eligibility of the client to open the account with Fiat24. It involves domicile and nationality check, pre-conditional risk questionnaires and collect client's email and phone number. Fiat24 conducts background checks on the customer to verify their profile and ensure that they meet our requirements to open an account.

  2. Check Address We comply with Swiss regulation to verify user's residential address by GPS location. This step should be done within the browsers such as Chrome or Safari, but not the browser inside the crypto wallet, which usually disabled the Location Services for better safety. According the related regulation, the user must be within 2 km from the given address.

  3. Scan Passport or National ID Fiat24 will verify the user's identity by asking for the passport/national ID scan. The user need to hold a NFC chip enabled passport/national ID to confirm their identity. User need to download the ePassport app ReadID Ready and scan the generated QR code to continue.

Once the customer's identity has been verified and their background checks have been completed, Fiat24 will set up their account. It will take 3-10 minutes.

Once the client has completed the onboarding process and their account has been funded, they can start using the Fiat24's services, such as making deposits, withdrawing funds, and conducting transactions.

2. Code-based Integration

Only for 2-Digit and 1-Digit Developer NFT projects.

Using API to deliver onboarding client data are restricted functions exclusively available to internal, trusted systems, ensuring that only authorised applications and users can access sensitive operations or data.

POST https://api.fiat24.com/register

Request Body

Request Body
{
    "chainId"  : 5000,
    "nftId"    : 10365,
    "email"    : "[email protected]",
    "profile"  : {
      "annualSalary": "B2",                // Single item (SALARIES)
      "totalAssets": "B1",                 // Single item (TOTAL_ASSETS)
      "mainOccupation": "EMP",              // Single item (OCCUPATIONS)
      "jobCategory": "EEE",                // Single item (JOB_CATEGORIES)
      "sector": "ACC",                     // Single item (SECTORS_MAPPING)
      "sourceOfFunds": "SAV",              // Single item (SOURCE_OF_FUNDS)
      "purposes": "SLR,PNS,IVT,FRX,TUP",   // List separated by comma of Purposes (PURPOSES_LIST)
      "signature": "0x.........",              // TAN signature using wallet (message to sign: https://api.fiat24.com/tan-signature)
      "tanMessage": "Zürich, 13.06.2025 I confirm...",  // Message signed by user (to be removed by /tan-signature)
      "tanAddress": "0x....",                  // User's address used during signature
      "tanDateMs":  123212312321               // Timestamp when user signed in ms
    },
    "address"  : {
      "countryISO3": "CHE",       // Country ISO3 input by user
      "street": "Sample Street",  // Street input by user
      "streetNumber": "123",      // Street number input by user
      "postalCode": "12345",      // Zip input by user
      "city": "Zürich",           // City input by user
      "gps": { "lat": 47.35055383741818, "lng": 8.560838999296362 },           // GPS of the input location
      "addressProof": { "lat": 47.35055383741818, "lng": 8.560838999296362 },  // Current user coordinates
      "reverseAddressProof": "Bellerivestrasse 245, Zurich 8008, Switzerland", // Reverse location using current user coordinates.
      "distance": 0.1             // Distance between the two GPS points (in KM)
    },
    "id" : {
      "gender": "M",                // "M" or "F"
      "firstName": "James",         // in Latin
      "lastName": "Bond",           // in Latin
      "nameOfHolder" : "詹姆斯·邦德", // First Name + Last Name in original language
      "birthday": "27.06.1991",
      "documentNumber": "ABCDE1234",
      "documentType": "I",          // "P", "I" (Passport or National ID)
      "documentValidUntil": "27.06.2099",
      "issuerCountry": "CHE",
      "nationality": "CHE"
    },
    "files" : {
      "clientProfilePdfUrl": "<url_to_sumsub_or_similar_pdf>",
      "idVerificationPdfUrl": "<url_to_sumsub_or_similar_pdf>"
    }
}

Response

The registration information has been submitted successfully, and all requirements have been met. Therefore, the client has been successfully accepted.

Response Body
{
    "status": 200,
    "data": {
        "status": "OK"
    }
}

Reference values from the Request Body

Many fields in the request JSON body are enumerated values. The following JavaScript code provides a reference for all possible values.

Field values
const OCCUPATIONS = [
  "EMP": "Employed",
  "SLF": "Self-employed / Freelancer",
  "RET": "Retired / Pension recipient",
  "STU": "Trainee / Student",
  "LOS": "Unemployed"
];

const JOB_CATEGORIES = [
  "EEE": "Employee",
  "MNG": "Manager",
  "CLV": "C-Level / Executive Board",
  "DIR": "Director / Member of the Management Board"
];

const PURPOSES_LIST = [
  "SLR": "Salary account",
  "EXP": "Living expenses",
  "PNS": "Savings / Pension",
  "PTP": "Peer-to-peer payments",
  "IVT": "Investments",
  "FRX": "Money exchange",
  "TUP": "Crypto off-ramp"
]

const SOURCE_OF_FUNDS = [
  "SAV": "Savings and Pension",
  "BIZ": "Own business operations or salary",
  "ERB": "Inheritance",
  "INV": "Capital gain from traditional investments",
  "DIG": "Digital Asset Investment",
  "REA": "Capital gain from real estate",
  "RUL": "Compensation from legal rulings"
];

const SECTORS_MAPPING = {
  "ACC": "Accountancy",
  "ADM": "Administrative / HR / Recruitment",
  "SEX": "Adult Entertainment / Dating Business",
  "AGR": "Agriculture / Forestry / Fishing",
  "NUC": "Atomic/Nuclear-related",
  "ANT": "Arts and Antiques Dealer",
  "BRK": "Broker / Dealer",
  "CAS": "Casinos / Gambling and connected (all forms)",
  "TSM": "Catering and Restaurants / Hotel industry / Cleaning",
  "NGO": "Charities and Social services / NGO / Religious or political organisations",
  "BAU": "Construction / Real Estate",
  "BTC": "Crypto Exchange / Broker",
  "ART": "Culture / Entertainment / Theme parks ",
  "EDU": "Education",
  "WTR": "Electricity / Water Supply / Sewage / Waste Management",
  "EMG": "Emergency Serving",
  "BNK": "Financial Services - Retail Banking",
  "PBK": "Financial Services - Private Banking",
  "FIN": "Financial Services - Foreign Exchange Dealer",
  "ISU": "Financial Services - Insurance",
  "MTA": "Financial Services - Payment Services",
  "TRA": "Financial Services – Regulated money transfer agent",
  "GOV": "Government / Public Administration / Defence",
  "MED": "Healthcare / Medical",
  "INT": "Information Technology",
  "JEW": "Jewellery incl. All Precious Stones and Metals",
  "LAW": "Legal",
  "MAN": "Manufacturing excl. tobacco",
  "MKT": "Marketing / Media / Communications / Social media",
  "MIN": "Mining and Quarrying",
  "FAR": "Pharmaceuticals",
  "OIL": "Oils and Gas",
  "TBK": "Tobacco",
  "SAL": "Retail sales excl. tobacco",
  "RUB": "Rubber and Plastic",
  "DEV": "Science / Engineering / Technology",
  "WEL": "Sports and Wellness",
  "SCW": "Social Work",
  "TSP": "Transportation and Storage",
  "WPN": "Weapon or Armament manufacturing and trade",
};

const NON_ALLOWED_SECTORS = [
  "SEX", "ANT", "NUC", "BRK", "CAS", "NGO", "BTC", "EMG", "PBK", "FIN", "ISU", "TRA", "MTA", "GOV", "JEW", "MIN", "OIL", "FAR", "SCW", "TBK", "TSP", "WPN"
];

const SALARIES = {
  "B1": "under 50'000",
  "B2": "50'000 - 100'000",
  "B3": "100'000 - 500'000",
  "B4": "500'000 - 1'000'000",
  "B5": "over 1'000'000",
}

const TOTAL_ASSETS = {
  "B1": "under 100'000",
  "B2": "100'000 - 500'000",
  "B3": "500'000 - 1'000'000",
  "B4": "1'000'000 - 10'000'000",
  "B5": "over 10'000'000"
}

Form A - Message to Sign

POST https://api.fiat24.com/tan-signature

Request Body

Request Body
{
    "chainId"  : 5000,
    "nftId"    : 10365,
    "email"    : "[email protected]",
    "profile"  : {
      "annualSalary": "B2",                // Single item (SALARIES)
      "totalAssets": "B1",                 // Single item (TOTAL_ASSETS)
      "mainOccupation": "EMP",              // Single item (OCCUPATIONS)
      "jobCategory": "EEE",                // Single item (JOB_CATEGORIES)
      "sector": "ACC",                     // Single item (SECTORS_MAPPING)
      "sourceOfFunds": "SAV",              // Single item (SOURCE_OF_FUNDS)
      "purposes": "SLR,PNS,IVT,FRX,TUP",   // List separated by comma of Purposes (PURPOSES_LIST)
    },
    "address"  : {
      "countryISO3": "CHE",       // Country ISO3 input by user
      "street": "Sample Street",  // Street input by user
      "streetNumber": "123",      // Street number input by user
      "postalCode": "12345",      // Zip input by user
      "city": "Zürich",           // City input by user
      "gps": { "lat": 47.35055383741818, "lng": 8.560838999296362 },           // GPS of the input location
      "addressProof": { "lat": 47.35055383741818, "lng": 8.560838999296362 },  // Current user coordinates
      "reverseAddressProof": "Bellerivestrasse 245, Zurich 8008, Switzerland", // Reverse location using current user coordinates.
      "distance": 0.1             // Distance between the two GPS points (in KM)
    },
    "id" : {
      "gender": "M",                // "M" or "F"
      "firstName": "James",         // in Latin
      "lastName": "Bond",           // in Latin
      "nameOfHolder" : "詹姆斯·邦德", // First Name + Last Name in original language
      "birthday": "27.06.1991",
      "documentNumber": "ABCDE1234",
      "documentType": "I",          // "P", "I" (Passport or National ID)
      "documentValidUntil": "27.06.2099",
      "issuerCountry": "CHE",
      "nationality": "CHE"
    }
}

Response

This information will be required for the registration API.

Response Body
{
    "status": 200,
    "data": {
        "tanDateMs": <int>,
        "messageToSign": <string>
    }
}

Last updated