Skip to main content

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

Fill the gaps

  • Add undeclared beneficial owners
  • Register new officers not yet published
  • Capture temporary governance changes

Fix

Correct mistakes

  • Update outdated addresses
  • Fix misspelled names
  • Repair wrong birth details

Enrich

Attach evidence

  • Upload ID documents or POA
  • Provide UBO declarations
  • Share supporting contracts

Supported Data

Data TypeProviderDescriptionOperations
Company Officerinput_userCompany directorsCreate, Update, Delete
Beneficial Ownerinput_userUltimate beneficial ownersCreate, Update, Delete
Conformity Checkinput_userCompliance verificationsRead-only
Tax Returnocr_serviceTax bundles from PDF uploadCreate
Tax return manual input

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:

  1. The company_legal_fr provider is connected and synchronized
  2. You already have the baseline official data

Configuration

Step 1: Enable the Input User provider

PUT /api/v6/providers/input_user
{
"enable": true
}
PUT /api/v6/providers/input_user/settings
{
"auto_connect": true
}

Step 2: Create the data connection

POST /api/v6/users/{userId}/data-connections
{
"requested_data_types": [
"COMPANY_OFFICER",
"BENEFICIAL_OWNER",
"CONFORMITY_CHECK"
],
"provider_name": "input_user"
}

Managing Beneficial Owners

Add a new beneficial owner declaration

POST /api/v6/input/users/{userId}/beneficial-owners
{
"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"
}
]
}
}
File format

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

PUT /api/v6/input/users/{userId}/beneficial-owners/{declarationInputId}
{
"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

DELETE/api/v6/input/users/{userId}/beneficial-owners/{declarationInputId}

Managing Company Officers

Add a new officer

POST /api/v6/input/users/{userId}/company-officers
{
"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"
}
]
}
]
}
}
POST /api/v6/input/users/{userId}/company-officers
{
"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:

POST /api/v6/input/users/{userId}/company-officers
{
"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

DELETE/api/v6/input/users/{userId}/company-officers/{officerInputId}

Synchronizing after updates

After you add or edit data, trigger a sync to incorporate the changes:

POST /api/v6/users/{userId}/sync
{
"data_types": ["COMPANY_OFFICER", "BENEFICIAL_OWNER"]
}

Validating the data

Retrieve officers (including Input User records)

GET/api/v6/users/{userId}/company-officers

Officers created via Input User appear with provider_name: "input_user".

Retrieve beneficial owners

GET/api/v6/users/{userId}/beneficial-owners

End-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

Monitoring not supported

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

  1. Document your sources: Always attach a supporting document (ID, UBO register, etc.).

  2. Sync regularly: Official data can overwrite or update your manual entries.

  3. Check for duplicates: Before adding an officer, confirm they do not already exist in the official dataset.

  4. Track manual changes: Keep a change log for every manual edit in your system of record.

See also