Organization Shareholders API
Manage beneficial owners and shareholders
Organization Shareholders API
APIs for managing beneficial owners and shareholders of business organizations.
Available Operations
POST /v2.1/.../shareholders
GET /v2/organizations/{id}/shareholders
DELETE /v2/organizations/{id}/shareholders/{shareholderId}
Add Shareholders (v2.1)
Before You Start
Prerequisites:
- Organization must be registered
- You must have ADMIN_USER role
- Total ownership across all shareholders must equal 100%
Important Validation Rules:
- Individual vs Corporate shareholders have different required fields
- Beneficial owners (≥25% ownership) require enhanced due diligence
- Ownership percentages must sum to exactly 100%
Endpoint
POST /api/v2.1/customer/organization/{organizationId}/shareholders
Request
organizationId string path required Organization identifier
type string body required Shareholder type: INDIVIDUAL or CORPORATE
ownershipPercentage number body required Ownership percentage (0-100)
firstName string body First name (required for INDIVIDUAL)
lastName string body Last name (required for INDIVIDUAL)
companyName string body Company name (required for CORPORATE)
isBeneficialOwner boolean body Whether this is a beneficial owner (25%+ ownership)
isPEP boolean body Politically Exposed Person status
Code Examples
curl -X POST "https://sandbox.finhub.cloud/api/v2.1/customer/organization/org_12345/shareholders" \
-H "Accept: application/json, text/plain, */*" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "X-Tenant-ID: 97e7ff29-15f3-49ef-9681-3bbfcce4f6cd" \
-H "X-Forwarded-From: e2e-test" \
-H "platform: web" \
-H "deviceId: 356938035643809" \
-d '{
"type": "INDIVIDUAL",
"firstName": "Sarah",
"lastName": "Investor",
"dateOfBirth": "1980-05-10",
"nationality": "FR",
"ownershipPercentage": 25.0,
"isBeneficialOwner": true,
"isPEP": false,
"address": {
"street": "789 Investor Blvd",
"city": "Paris",
"postalCode": "75001",
"country": "FR"
}
}'const response = await fetch(
'https://sandbox.finhub.cloud/api/v2.1/customer/organization/org_12345/shareholders',
{
method: 'POST',
headers: {
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`,
'X-Tenant-ID': '97e7ff29-15f3-49ef-9681-3bbfcce4f6cd',
'X-Forwarded-From': 'e2e-test',
'platform': 'web',
'deviceId': '356938035643809'
},
body: JSON.stringify({
type: 'INDIVIDUAL',
firstName: 'Sarah',
lastName: 'Investor',
nationality: 'FR',
ownershipPercentage: 25.0,
isBeneficialOwner: true,
isPEP: false
})
}
);
const { data } = await response.json();
console.log('Shareholder ID:', data.shareholderId);{
"success": true,
"data": {
"shareholderId": "sh_11111",
"status": "PENDING_VERIFICATION",
"createdAt": "2024-01-15T10:30:00Z"
}
}List Shareholders (v2)
Endpoint
GET /api/v2/organizations/{organizationId}/shareholders
Code Examples
curl -X GET "https://sandbox.finhub.cloud/api/v2/organizations/org_12345/shareholders" \
-H "Accept: application/json, text/plain, */*" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "X-Tenant-ID: 97e7ff29-15f3-49ef-9681-3bbfcce4f6cd" \
-H "X-Organization-ID: org_12345" \
-H "X-Forwarded-From: e2e-test" \
-H "platform: web" \
-H "deviceId: 356938035643809"const response = await fetch(
'https://sandbox.finhub.cloud/api/v2/organizations/org_12345/shareholders',
{
headers: {
'Accept': 'application/json, text/plain, */*',
'Authorization': `Bearer ${accessToken}`,
'X-Tenant-ID': '97e7ff29-15f3-49ef-9681-3bbfcce4f6cd',
'X-Organization-ID': 'org_12345',
'X-Forwarded-From': 'e2e-test',
'platform': 'web',
'deviceId': '356938035643809'
}
}
);
const { data } = await response.json();
data.shareholders.forEach(s => {
const name = s.type === 'INDIVIDUAL' ? `${s.firstName} ${s.lastName}` : s.companyName;
console.log(`${name}: ${s.ownershipPercentage}%`);
});{
"success": true,
"data": {
"shareholders": [
{
"shareholderId": "sh_12345",
"type": "INDIVIDUAL",
"firstName": "Max",
"lastName": "Owner",
"ownershipPercentage": 51.0,
"isBeneficialOwner": true,
"status": "VERIFIED"
}
]
}
}Remove Shareholder (v2)
Endpoint
DELETE /api/v2/organizations/{organizationId}/shareholders/{shareholderId}
Code Examples
curl -X DELETE "https://sandbox.finhub.cloud/api/v2/organizations/org_12345/shareholders/sh_12345" \
-H "Accept: application/json, text/plain, */*" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "X-Tenant-ID: 97e7ff29-15f3-49ef-9681-3bbfcce4f6cd" \
-H "X-Organization-ID: org_12345" \
-H "X-User-Roles: ADMIN_USER" \
-H "X-Forwarded-From: e2e-test" \
-H "platform: web" \
-H "deviceId: 356938035643809"{
"success": true
}Beneficial Ownership Rules
- Individuals owning 25% or more must be declared as beneficial owners
- Corporate shareholders must disclose their own beneficial owners
- PEP (Politically Exposed Person) status must be declared
Shareholder Types Comparison
| Field | Individual Shareholder | Corporate Shareholder |
|---|---|---|
| Required | firstName, lastName, dateOfBirth, nationality | companyName, registrationNumber, country |
| Ownership | ownershipPercentage, numberOfShares | ownershipPercentage, numberOfShares |
| Identity | Passport/ID number | Tax ID, incorporation docs |
| Contact | Personal email, phone | Contact person details |
| Due Diligence | PEP check if ≥25% | UBO disclosure required |
Ownership Validation (100% Rule)
When adding shareholders, the system validates that total ownership equals 100%:
// Example: Adding multiple shareholders
const shareholders = [
{ name: "Founder A", ownershipPercentage: 60.0 },
{ name: "Founder B", ownershipPercentage: 30.0 },
{ name: "Investor C", ownershipPercentage: 10.0 }
];
// Total: 100% ✅ Valid
// This would fail:
const invalidShareholders = [
{ name: "Founder A", ownershipPercentage: 60.0 },
{ name: "Founder B", ownershipPercentage: 30.0 }
];
// Total: 90% ❌ Invalid - missing 10%Share Classes
| Share Class | Description | Voting Rights |
|---|---|---|
| ORDINARY | Standard common shares | Yes |
| PREFERENCE | Preference shares with priority dividends | Usually limited |
| REDEEMABLE | Can be bought back by company | Yes or No |
Response Codes
| Code | Description |
|---|---|
200 | Shareholders retrieved/updated successfully |
201 | Shareholder added successfully |
204 | Shareholder removed successfully |
400 | Invalid request data or ownership validation failed |
409 | Ownership total does not equal 100% |
404 | Organization or shareholder not found |
500 | Internal server error |
Common Validation Errors
Error: Ownership Total Mismatch
Problem: Total ownership across all shareholders ≠ 100%
Solution:
{
"error": "Ownership validation failed",
"currentTotal": 95.0,
"required": 100.0,
"missing": 5.0
}Review all shareholder percentages and ensure they sum to exactly 100%.
Error: Beneficial Owner Not Declared
Problem: Shareholder with ≥25% ownership not marked as beneficial owner
Solution:
Set isBeneficialOwner: true for any shareholder with 25% or more ownership.
Error: Missing Required Fields
Problem: Individual shareholder missing personal details
Solution: Ensure all required fields are provided:
- Individual: firstName, lastName, dateOfBirth, nationality
- Corporate: companyName, registrationNumber, taxId, country
API Schema Reference
For the complete OpenAPI schema specification, see the API Schema Mapping document.
Related Endpoints
Complete HTTP headers reference
Register new organizations
Manage organization directors
Manage organization employees
Failed to load openapi.yaml: No number after minus sign in JSON at position 1 (line 1 column 2)