Manual Data Entry
This guide shows you how to use the input_user provider to manually add or edit company officer and ultimate beneficial owner data.
Goal
Enable manual data entry when:
- Official records are incomplete or outdated
- The company is too recent to have published data
- You have fresher information on hand
- You want to enrich data with supporting documents
Use Cases
Input User actions
Patch missing or incorrect officer/UBO data directly from your back-office.
Complete
- Add undeclared beneficial owners
- Register new officers not yet published
- Capture temporary governance changes
Fix
- Update outdated addresses
- Fix misspelled names
- Repair wrong birth details
Enrich
- Upload ID documents or POA
- Provide UBO declarations
- Share supporting contracts
Supported Data
| Data Type | Provider | Description | Operations |
|---|---|---|---|
| Company Officer | input_user | Company directors | Create, Update, Delete |
| Beneficial Owner | input_user | Ultimate beneficial owners | Create, Update, Delete |
| Conformity Check | input_user | Compliance verifications | Read-only |
| Tax Return | ocr_service | Tax bundles from PDF upload | Create |
To manually submit tax bundles (liasses fiscales) as PDF documents, use the ocr_service provider. The OCR service extracts structured financial data from your uploads automatically. See the OCR Service use case for full implementation details.
Prerequisites
Before using input_user, make sure:
- The
company_legal_frprovider is connected and synchronized - You already have the baseline official data
Configuration
Step 1: Enable the Input User provider
{
"enable": true
}
{
"auto_connect": true
}
Step 2: Create the data connection
{
"requested_data_types": [
"COMPANY_OFFICER",
"BENEFICIAL_OWNER",
"CONFORMITY_CHECK"
],
"provider_name": "input_user"
}
Managing Beneficial Owners
Add a new beneficial owner declaration
{
"data": {
"document_date": "2024-01-15",
"date": "2024-01-15",
"file": "JVBERi0xLjQKJeLjz9...",
"beneficial_owners": [
{
"type": "NATURAL",
"first_name": "Jean",
"last_name": "DUPONT",
"patronym": "MARTIN",
"birth_date": "1975-06-15",
"birth_city": "Paris",
"birth_country": "FR",
"nationality": "FR",
"address": {
"address_line1": "10 rue de la Paix",
"address_line2": "Building A",
"city": "Paris",
"postal_code": "75001"
},
"start_date": "2020-01-01",
"is_legal_representative": true,
"total_owned_parts": "60",
"direct_owned_part": "40",
"indirect_owned_part": "20",
"total_vote": "60",
"direct_vote": "40",
"indirect_vote": "20"
},
{
"type": "NATURAL",
"first_name": "Marie",
"last_name": "DURAND",
"birth_date": "1980-03-22",
"birth_city": "Lyon",
"birth_country": "FR",
"nationality": "FR",
"address": {
"address_line1": "25 avenue des Champs",
"city": "Lyon",
"postal_code": "69001"
},
"start_date": "2022-06-01",
"is_legal_representative": false,
"total_owned_parts": "40",
"direct_owned_part": "40",
"total_vote": "40",
"direct_vote": "40"
}
]
}
}
The file field accepts a base64-encoded PDF. The document is stored and can be downloaded later via the returned file_id.
Update an existing declaration
{
"data": {
"document_date": "2024-06-01",
"date": "2024-06-01",
"beneficial_owners": [
{
"type": "NATURAL",
"first_name": "Jean",
"last_name": "DUPONT",
"birth_date": "1975-06-15",
"total_owned_parts": "70",
"direct_owned_part": "50",
"indirect_owned_part": "20"
}
]
}
}
Delete a declaration
/api/v6/input/users/{userId}/beneficial-owners/{declarationInputId}Managing Company Officers
Add a new officer
{
"file": "JVBERi0xLjQK...",
"data": {
"type": "NATURAL",
"first_name": "Pierre",
"last_name": "MARTIN",
"patronym": "BERNARD",
"birth_date": "1968-09-10",
"birth_city": "Marseille",
"birth_country": "FR",
"birth_postal_code": "13001",
"nationality": "FR",
"address": {
"address_line1": "5 boulevard du Port",
"city": "Marseille",
"postal_code": "13001",
"country": "FR"
},
"companies": [
{
"name": "My Company SAS",
"siren": "123456789",
"roles": [
{
"name": "President",
"start_date": "2024-01-01"
}
]
}
]
}
}
Add a legal entity officer
{
"data": {
"type": "LEGAL",
"name": "Holding ABC SAS",
"siren": "987654321",
"address": {
"address_line1": "100 avenue des Affaires",
"city": "Paris",
"postal_code": "75008",
"country": "FR"
},
"companies": [
{
"name": "My Company SAS",
"siren": "123456789",
"roles": [
{
"name": "Administrateur",
"start_date": "2024-02-15"
}
]
}
]
}
}
Update an existing officer
Include the officer_id to edit an officer:
{
"officer_id": "550e8400-e29b-41d4-a716-446655440000",
"data": {
"type": "NATURAL",
"first_name": "Pierre",
"last_name": "MARTIN",
"address": {
"address_line1": "Nouvelle adresse",
"city": "Nice",
"postal_code": "06000",
"country": "FR"
},
"companies": [
{
"name": "My Company SAS",
"siren": "123456789",
"roles": [
{
"name": "President",
"start_date": "2024-01-01"
},
{
"name": "Chief Executive Officer",
"start_date": "2024-06-01"
}
]
}
]
}
}
Delete an officer
/api/v6/input/users/{userId}/company-officers/{officerInputId}Synchronizing after updates
After you add or edit data, trigger a sync to incorporate the changes:
{
"data_types": ["COMPANY_OFFICER", "BENEFICIAL_OWNER"]
}
Validating the data
Retrieve officers (including Input User records)
/api/v6/users/{userId}/company-officersOfficers created via Input User appear with provider_name: "input_user".
Retrieve beneficial owners
/api/v6/users/{userId}/beneficial-ownersEnd-to-end workflow: Complete an onboarding
async function completeOnboardingWithManualData(userId, manualData) {
// 1. Make sure company_legal_fr is synchronized
const syncStatus = await qardApi.getSyncLatest(userId);
const companyLegalSync = syncStatus.find(s =>
s.provider_name === 'company_legal_fr' &&
s.status === 'SUCCESS'
);
if (!companyLegalSync) {
throw new Error('company_legal_fr synchronization required before Input User');
}
// 2. Create the Input User connection if needed
const connections = await qardApi.getDataConnections(userId);
const inputUserConnection = connections.find(c =>
c.provider_name === 'input_user'
);
if (!inputUserConnection) {
await qardApi.createDataConnection(userId, {
requested_data_types: ['COMPANY_OFFICER', 'BENEFICIAL_OWNER'],
provider_name: 'input_user'
});
}
// 3. Add missing beneficial owners
if (manualData.beneficialOwners) {
await qardApi.post(`/input/users/${userId}/beneficial-owners`, {
data: {
document_date: new Date().toISOString().split('T')[0],
date: new Date().toISOString().split('T')[0],
file: manualData.beneficialOwnersDocument, // Base64 PDF
beneficial_owners: manualData.beneficialOwners
}
});
}
// 4. Add missing officers
for (const officer of manualData.officers || []) {
await qardApi.post(`/input/users/${userId}/company-officers`, {
file: officer.identityDocument, // Optional base64 PDF
data: officer
});
}
// 5. Sync to integrate the new data
await qardApi.sync(userId, {
data_types: ['COMPANY_OFFICER', 'BENEFICIAL_OWNER']
});
// 6. Wait for the sync to finish
await waitForSyncCompletion(userId);
// 7. Retrieve the full data set
const [officers, beneficialOwners] = await Promise.all([
qardApi.getCompanyOfficers(userId),
qardApi.getBeneficialOwners(userId)
]);
return {
officers,
beneficialOwners,
complete: officers.length > 0 && beneficialOwners.length > 0
};
}
Data merging
When you combine Input User with company_legal_fr, the data merges seamlessly:
Merged snapshot
Official data remains, manual overrides fill the gaps.
Company Officers
- Jean DUPONT company_legal_fr · Official data
- Marie DURAND company_legal_fr · Official data
- Pierre MARTIN input_user · Added manually
Beneficial Owners
- INPI declaration company_legal_fr
- Manual declaration input_user · Most recent
Limitations
Officers and beneficial owners created via input_user cannot be tracked by the monitoring system. Only data coming from company_legal_fr is monitored.
Best practices
Document your sources: Always attach a supporting document (ID, UBO register, etc.).
Sync regularly: Official data can overwrite or update your manual entries.
Check for duplicates: Before adding an officer, confirm they do not already exist in the official dataset.
Track manual changes: Keep a change log for every manual edit in your system of record.
See also
- Input User - Concept overview
- Input User Provider - Provider configuration
- Beneficial Owner - Data format
- Company Officer - Data format
- OCR Service - Manual tax return upload and extraction
- Tax Bundles - Complete tax bundle collection guide
- KYB / Onboarding - Full onboarding use case