Shareholders Endpoint
Complete documentation for the VOTR Shareholders API endpoint
📚 Interactive API Documentation
For a complete interactive API documentation with live testing capabilities, visit our Swagger documentation:
🔗 Shareholders API Swagger Documentation - Try It Now!
The Swagger documentation provides:
- Interactive API endpoint testing
- Detailed request/response schemas
- Authentication examples
- Real-time API exploration
- Code generation for multiple languages
You can also download the OpenAPI specification: shareholders-api-spec.yaml
� Shareholders Data Submission
The Shareholders endpoint allows brokers to submit shareholder data for specific events. This endpoint is used to upload shareholder information including contact details, shareholdings, and voting preferences.
API Endpoints
Development:
POST https://shareholders-api-dev.govotr.com/api/v1/
Production:
POST https://shareholders-api.govotr.com/api/v1/
Headers
Authorization: Bearer YOUR_ACCESS_TOKEN
Content-Type: application/json
Note: This endpoint uses the same OAuth Bearer token authentication as other VOTR API calls. Obtain your access token from the OAuth Token endpoint before making requests.
Request Schema
Main Request Object
| Field | Type | Required | Description |
|---|---|---|---|
brokerId |
string |
✅ | 24-character hexadecimal broker ID |
eventId |
string |
✅ | 24-character hexadecimal event ID |
data |
array |
✅ | Array of shareholder data (1-50 items) |
Data Item Schema
Each item in the data array must contain the following fields:
Required Fields
| Field | Type | Description |
|---|---|---|
totalShares |
number |
Number of shares (0.000001 - 999,999,999, up to 6 decimals) |
accountNo |
string |
Account number (1-50 alphanumeric chars) |
cusipNo |
string |
CUSIP number (exactly 9 alphanumeric chars) |
preferredVoting |
string |
Voting preference ("E-Delivery" or "Full Set") |
Important:
- Either
address(or both) must be provided. If neither is provided, the request will fail with a validation error.naaPreferenceis conditionally required based on thepreferredVotingdesignation.- While
nameandnoboOboare optional, it is highly encouraged that these fields are included for proper shareholder identification and preference tracking.- If
noboObois not provided, shareholders will default to OBO (Objecting Beneficial Owner) status.
Conditionally Required Fields
| Field | Type | Description |
|---|---|---|
naaPreference |
boolean |
NAA preference setting (required based on preferredVoting designation) |
Optional Fields
| Field | Type | Description |
|---|---|---|
name |
string or null |
Shareholder name (max 100 chars). Highly encouraged to include for proper identification. |
noboObo |
string or null |
NOBO/OBO status ("nobo" or "obo"). Highly encouraged to include. Defaults to "obo" if omitted. |
email |
string or null |
Valid email address (max 255 chars). Either email or address must be provided. |
managerCode |
string or null |
Manager code (1-50 alphanumeric chars) |
repCode |
string or null |
Rep code (1-50 alphanumeric chars) |
ibdNumber |
string or null |
IBD number (1-50 alphanumeric chars) |
householdingFlag |
string or null |
Householding flag setting (string value) |
introBrokerName |
string or null |
Introducing broker name (1-100 chars) |
isin |
string or null |
International Securities Identification Number (1-50 chars) |
proxyFlag |
boolean or null |
Proxy flag (default false) |
address |
object or null |
Address object (see Address Schema). Either email or address must be provided. |
Address Schema
| Field | Type | Description |
|---|---|---|
addressLine1 |
string or null |
Address line 1 (max 100 chars) |
addressLine2 |
string or null |
Address line 2 (max 100 chars) |
city |
string or null |
City (max 50 chars) |
state |
string or null |
State (max 100 chars) |
zipCode |
string or null |
ZIP code (max 100 chars) |
country |
string or null |
Country (max 50 chars) |
Sample Request
Example 1: With Email
{
"brokerId": "681a3f923b07005fdc5b5417",
"eventId": "688a009f3b699e129a64513b",
"data": [
{
"totalShares": 100.5,
"accountNo": "ACC123456",
"cusipNo": "037833100",
"email": "john.doe@example.com",
"name": "John Doe",
"noboObo": "nobo",
"preferredVoting": "E-Delivery",
"naaPreference": true,
"managerCode": "MGR001",
"repCode": "REP123",
"ibdNumber": "IBD123456",
"householdingFlag": "true",
"introBrokerName": "ABC Securities",
"isin": "US0378331005",
"proxyFlag": false
}
]
}
Example 2: With Address
{
"brokerId": "681a3f923b07005fdc5b5417",
"eventId": "688a009f3b699e129a64513b",
"data": [
{
"totalShares": 250.75,
"accountNo": "ACC789012",
"cusipNo": "68389X105",
"address": {
"addressLine1": "456 Oak Avenue",
"addressLine2": "Suite 200",
"city": "Los Angeles",
"state": "CA",
"zipCode": "90210",
"country": "USA"
},
"name": "Jane Smith",
"noboObo": "obo",
"preferredVoting": "Full Set",
"introBrokerName": "XYZ Brokers",
"isin": "US5949181045",
"proxyFlag": true
}
]
}
Response
Success Response
{
"SendMessageResponse": {
"ResponseMetadata": {
"RequestId": "af15a64f-0a6c-5058-9fc3-c73ddbbe2b66"
},
"SendMessageResult": {
"MD5OfMessageAttributes": null,
"MD5OfMessageBody": "e465a41bb78e2b21f614e77566871238",
"MD5OfMessageSystemAttributes": null,
"MessageId": "8fd668bd-66bd-4fb4-94d5-697efe5b67d2",
"SequenceNumber": null
}
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
RequestId |
string |
Unique identifier for the request |
MD5OfMessageBody |
string |
MD5 hash of the message body |
MessageId |
string |
Unique identifier for the message |
MD5OfMessageAttributes |
null |
MD5 hash of message attributes |
MD5OfMessageSystemAttributes |
null |
MD5 hash of system attributes |
SequenceNumber |
null |
Sequence number (if applicable) |
Validation Rules
Field Validation
Broker and Event IDs
- Must be exactly 24 characters
- Must contain only hexadecimal characters (a-f, 0-9)
- Case sensitive (lowercase only)
Email and Address Validation
- Either
emailORaddressmust be provided (or both) - If neither is provided, validation will fail
- Email must follow standard email format:
user@domain.com - Email maximum 255 characters
- Address object can be
nullif email is provided
Account Number
- 1-50 alphanumeric characters
- Case insensitive
- Required field
CUSIP Number
- Exactly 9 alphanumeric characters
- Uppercase letters and numbers only
- Required field
Total Shares
- Minimum value: 0.0001
- Maximum value: 999,999,999
- Must be a positive number
Array Validation
dataarray must contain 1-50 items- Each item must pass individual validation
- No duplicate account numbers within the same request
Error Handling
Common Error Responses
Invalid Broker ID
{
"error": "Invalid brokerId format",
"message": "brokerId must be a 24-character hexadecimal string"
}
Invalid Data Array
{
"error": "Invalid data array",
"message": "data array must contain between 1 and 100 items"
}
Missing Required Fields
{
"error": "Validation failed",
"message": "Missing required field: totalShares"
}
Invalid Email Format
{
"error": "Invalid email format",
"message": "email must be a valid email address or null"
}
Missing Email or Address
{
"error": "Validation failed",
"message": "Either email or address must be provided"
}
Implementation Examples
cURL Example
curl -X POST "https://shareholders-api-dev.govotr.com/api/v1/shareholders" \
-H "Content-Type: application/json" \
-d '{
"brokerId": "681a3f923b07005fdc5b5417",
"eventId": "688a009f3b699e129a64513b",
"data": [
{
"name": "John Doe",
"email": "john.doe@example.com",
"totalShares": 100.5,
"accountNo": "ACC123456",
"cusipNo": "037833100",
"noboObo": "nobo",
"preferredVoting": "E-Delivery",
"address": {
"addressLine1": "123 Main St",
"city": "New York",
"state": "NY",
"zipCode": "10001",
"country": "USA"
}
}
]
}'
JavaScript/Node.js Example
const shareholderData = {
brokerId: "681a3f923b07005fdc5b5417",
eventId: "688a009f3b699e129a64513b",
data: [
{
name: "Jane Smith",
email: "jane.smith@example.com",
totalShares: 250.75,
accountNo: "ACC789012",
cusipNo: "594918104",
noboObo: "obo",
preferredVoting: "Full Set",
naaPreference: true,
managerCode: "MGR001",
repCode: "REP123",
ibdNumber: "IBD123456",
householdingFlag: "true",
introBrokerName: "ABC Securities",
isin: "US0378331005",
proxyFlag: false,
address: {
addressLine1: "456 Oak Avenue",
addressLine2: "Suite 200",
city: "Los Angeles",
state: "CA",
zipCode: "90210",
country: "USA",
},
},
],
}
try {
const response = await fetch(
"https://shareholders-api-dev.govotr.com/api/v1/shareholders",
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(shareholderData),
}
)
const result = await response.json()
if (response.ok) {
console.log("Shareholders data submitted successfully:", result)
} else {
console.error("Error submitting shareholders data:", result)
}
} catch (error) {
console.error("Network error:", error)
}
Python Example
import requests
import json
def submit_shareholders_data():
url = "https://shareholders-api-dev.govotr.com/api/v1/shareholders"
data = {
"brokerId": "681a3f923b07005fdc5b5417",
"eventId": "688a009f3b699e129a64513b",
"data": [
{
"name": "Alice Johnson",
"email": "alice.johnson@example.com",
"totalShares": 500.0,
"accountNo": "ACC345678",
"cusipNo": "68389X105",
"noboObo": "nobo",
"preferredVoting": "E-Delivery",
"managerCode": "MGR001",
"repCode": "REP123",
"ibdNumber": "IBD456789",
"householdingFlag": "false",
"introBrokerName": "XYZ Brokers",
"isin": "US5949181045",
"proxyFlag": true,
"address": {
"addressLine1": "789 Pine Street",
"city": "Chicago",
"state": "IL",
"zipCode": "60601",
"country": "USA"
}
}
]
}
headers = {
"Content-Type": "application/json"
}
try:
response = requests.post(url, json=data, headers=headers)
if response.status_code == 200:
result = response.json()
print("Shareholders data submitted successfully:", result)
return result
else:
print(f"Error: {response.status_code}")
print(response.text)
return None
except requests.exceptions.RequestException as e:
print(f"Network error: {e}")
return None
# Usage
submit_shareholders_data()
Best Practices
Data Quality
- Validate data before submission to avoid API errors
- Use consistent formatting for account numbers and CUSIP codes
- Provide complete address information when available
- Include email addresses for better shareholder communication
Performance
- Batch submissions up to 100 shareholders per request for efficiency
- Implement retry logic for failed requests
- Use appropriate timeouts for network requests
- Log request/response data for debugging
Security
- Validate input data on your server before forwarding to VOTR
- Use HTTPS for all API communications
- Store sensitive data securely and follow data protection regulations
- Implement proper error handling to avoid exposing sensitive information
Error Handling
- Check response status codes before processing responses
- Implement exponential backoff for retry attempts
- Log errors appropriately for monitoring and debugging
- Provide meaningful error messages to end users
Next Steps: After successfully implementing the shareholders endpoint, you can proceed to integrate with the Voting URL API to enable voting functionality for the submitted shareholders.