Skip to main content

Phase 1: Organization Registration

Organization registration creates the foundation for all B2B operations including the organization entity, legal information, addresses, and default admin user.

What Gets Created

ComponentStatusDescription
Organization RecordPENDING_VERIFICATIONCore organization entity
Default Admin UserPENDING_ACTIVATIONCreated via Kafka event
WalletINACTIVEDefault wallet (activated later)
CategorizationAssignedFeature-based category (if provided)
Important: Employees, directors, and shareholders arrays in the registration request are ignored. Use separate endpoints to add these entities.

Register Organization

Endpoint: POST /api/v2.1/customer/organization/registrationHeaders:
X-Tenant-ID: fh_api_finsei_ltd_7f957f77
Authorization: Bearer {admin-jwt-token}
Content-Type: application/json
X-Forwarded-For: 192.168.1.100
Request Body:
{
  "tenantId": "97e7ff29-15f3-49ef-9681-3bbfcce4f6cd",
  "legalName": "Acme Corporation Limited",
  "tradingName": "Acme Corp",
  "businessType": "B2B",
  "registrationNumber": "REG123456789",
  "taxId": "TAX987654321",
  "vatNumber": "GB123456789",
  "incorporationDate": "2010-05-20",
  "legalForm": "LIMITED_LIABILITY_COMPANY",
  "industry": "TECHNOLOGY",
  "sector": "SOFTWARE_DEVELOPMENT",
  "numberOfEmployees": 50,
  "annualRevenue": "5000000",
  "website": "https://www.acme-corp.com",
  "description": "Leading provider of enterprise software solutions",
  "registeredAddress": {
    "street": "456 Business Avenue",
    "streetNumber": "456",
    "building": "Tech Tower",
    "floor": "5th Floor",
    "city": "London",
    "state": "Greater London",
    "postalCode": "EC1A 1BB",
    "country": "GB",
    "addressType": "REGISTERED_OFFICE"
  },
  "tradingAddress": {
    "street": "456 Business Avenue",
    "city": "London",
    "postalCode": "EC1A 1BB",
    "country": "GB",
    "addressType": "TRADING_ADDRESS"
  },
  "contactEmail": "[email protected]",
  "contactPhone": "+442071234567",
  "contactPerson": {
    "firstName": "Jane",
    "lastName": "Smith",
    "position": "CEO",
    "email": "[email protected]",
    "phone": "+442071234569"
  },
  "representatives": [
    {
      "firstName": "Jane",
      "lastName": "Smith",
      "role": "CEO",
      "email": "[email protected]",
      "ownershipPercentage": 60.0,
      "nationality": "GB",
      "dateOfBirth": "1975-03-15",
      "isPEP": false
    },
    {
      "firstName": "John",
      "lastName": "Doe",
      "role": "CFO",
      "email": "[email protected]",
      "ownershipPercentage": 40.0,
      "nationality": "GB",
      "dateOfBirth": "1978-07-22",
      "isPEP": false
    }
  ],
  "categorization": {
    "id": "org-cat-550e8400-e29b-41d4-a716-446655440100",
    "name": "MEDIUM_RISK_BUSINESS",
    "isActive": true,
    "categoryFeatureRelations": [
      {
        "feature": {
          "id": "org-feat-660e8400-e29b-41d4-a716-446655440101",
          "code": "BUSINESS_TRANSACTION_LIMITS"
        },
        "enabled": true,
        "parametrization": [
          { "name": "riskLevel", "value": "MEDIUM" },
          { "name": "riskScore", "value": "55" },
          { "name": "monthlyLimit", "value": "500000" },
          { "name": "transactionLimit", "value": "100000" },
          { "name": "dailyLimit", "value": "200000" }
        ]
      },
      {
        "feature": {
          "id": "org-feat-770e8400-e29b-41d4-a716-446655440102",
          "code": "INTERNATIONAL_PAYMENTS"
        },
        "enabled": true,
        "parametrization": [
          { "name": "swiftEnabled", "value": "true" },
          { "name": "sepaEnabled", "value": "true" },
          { "name": "crossBorderLimit", "value": "50000" }
        ]
      }
    ]
  }
}

Required Fields

FieldRequiredDescription
legalNameOfficial legal name
businessTypeB2B, B2C, etc.
registrationNumberCompany registration number
taxIdTax identification number
incorporationDateDate of incorporation
registeredAddressOfficial registered address
contactEmailPrimary contact email
vatNumberConditionalRequired if VAT registered

Ownership Validation

Representatives’ ownership must total 100%:
function validateOwnership(representatives) {
  const totalOwnership = representatives.reduce(
    (sum, rep) => sum + rep.ownershipPercentage, 0
  );
  
  if (totalOwnership !== 100) {
    throw new ValidationError(
      `Total ownership must equal 100%. Current: ${totalOwnership}%`
    );
  }
}

Default Admin Creation

After organization creation, a Kafka event triggers automatic admin user creation:
OrganizationCreatedEvent → Create Admin User
                         → Send Activation Email
The default admin receives:
  • Email: contactEmail from registration
  • Roles: ADMIN, ADMIN_USER
  • Status: PENDING_ACTIVATION

Get Organization Details

Endpoint: GET /api/v2.1/customer/organization/{organizationId}Headers:
Authorization: Bearer {jwt-token}

Next Step

After registration, proceed to Phase 2: Personnel Management to add directors, shareholders, and employees.

Phase 2: Personnel Management

Add directors, shareholders, and employees