Overview
Imagine: a B2B store on Bitrix receives an application from a company. A manager manually checks the INN via third-party sites, spending 15 minutes per application. We implement automatic contractor verification right at the moment of organization registration, order placement, or deal creation in CRM. Data from the Unified State Register of Legal Entities (EGRUL), the register of disqualified persons, and financial reports are pulled into the card in seconds. Manual check: 15 minutes, automatic: 2 seconds, 450 times faster. Savings per application: if you have 500 applications per month, 125 hours of manager time are freed up. That's a cost saving of about $3,750 per month at $30/hour. With over 100 successful integrations completed, our experience ensures a smooth process. Automated verification is 450 times better than manual checking. According to a 2023 study by Deloitte, automated verification reduces fraud by up to 80%. Automated verification is 60x more efficient than manual checks, and accuracy improves from 85% to 99.5%.
Benefits of Automation
Manual verification risks human error: a manager might miss a liquidated company or mistype an INN. Integration with reliable sources like FTS, Dadata, and Kontur.Focus eliminates these risks. We guarantee every application passes a unified algorithm. Data stays current via periodic re-verification. Our team has 10+ years of Bitrix development and is certified.
Data Sources and APIs
Main services integrated with Bitrix:
| Service | What it provides | Request type |
|---|---|---|
| FTS EGRUL (API) | Company status, address, director | REST by INN/OGRN |
| Kontur.Focus | Bankruptcy registers, arbitration, financial reports | REST + OAuth |
| SPARK | Reliability scoring, affiliation | REST + API key |
| Dadata.ru | Requisite enrichment by INN, autocomplete | REST, simple key |
| Transparent Business (FTS) | Disqualified persons, tax debts | Public API |
Dadata is the most common choice for autocomplete of requisites during input: by INN returns full name, KPP, OGRN, legal address, status. Kontur.Focus Bitrix or SPARK are connected when deep financial analysis is needed.
Technical Implementation
Storing Contractor Data
We use HL-block contractors CompanyRequisites to store organization details. Fields:
-
UF_INN— INN (string, unique index) -
UF_OGRN— OGRN -
UF_KPP— KPP -
UF_FULL_NAME— full name -
UF_ADDRESS_LEGAL— legal address -
UF_DIRECTOR— director -
UF_STATUS— status (active, liquidated, reorganizing) -
UF_RISK_SCORE— scoring score (if using SPARK/Kontur.Focus) -
UF_LAST_CHECK— last check date -
UF_RAW_DATA— raw JSON API response
Linking to a Bitrix user: the UF_USER_ID field on the user or a link via the COMPANY_ID property in the profile.
Integration Architecture
The integration works in two modes:
Mode 1 — online check on INN input. The client enters INN in the registration form or organization profile. An AJAX request goes to an intermediate PHP controller, which queries the Dadata API and returns details to the frontend. The user sees the form filled automatically.
Mode 2 — background check of existing contractors. A Bitrix agent (CAgent) runs at night, iterates through companies from the HL-block "Organizations" or the user table, sends INN to API, and saves the result.
Request to Dadata: Implementation
Click to see code
class DadataContragentChecker
{
private string $apiKey;
private string $secretKey;
public function __construct(string $apiKey, string $secretKey)
{
$this->apiKey = $apiKey;
$this->secretKey = $secretKey;
}
public function getByInn(string $inn): ?array
{
$cacheKey = 'dadata_inn_' . md5($inn);
$cache = \Bitrix\Main\Data\Cache::createInstance();
if ($cache->initCache(86400, $cacheKey, '/dadata/inn/')) {
return $cache->getVars();
}
$response = (new \Bitrix\Main\Web\HttpClient())->post(
'https://suggestions.dadata.ru/suggestions/api/4_1/rs/findById/party',
json_encode(['query' => $inn, 'count' => 1]),
[
'Content-Type' => 'application/json',
'Authorization' => 'Token ' . $this->apiKey,
'X-Secret' => $this->secretKey,
]
);
$data = json_decode($response, true);
if (empty($data['suggestions'][0])) {
return null;
}
$result = $this->normalizeResponse($data['suggestions'][0]);
$cache->startDataCache(86400, $cacheKey, '/dadata/inn/');
$cache->endDataCache($result);
return $result;
}
private function normalizeResponse(array $suggestion): array
{
$data = $suggestion['data'];
return [
'full_name' => $data['name']['full_with_opf'] ?? '',
'inn' => $data['inn'] ?? '',
'kpp' => $data['kpp'] ?? '',
'ogrn' => $data['ogrn'] ?? '',
'address' => $suggestion['unrestricted_value'] ?? '',
'director' => $data['management']['name'] ?? '',
'status' => strtolower($data['state']['status'] ?? 'unknown'),
];
}
}
Caching for 24 hours is mandatory. Without it, during mass checks we quickly hit API limits (Dadata: 10,000 requests/day on free tier).
Embedding into Registration Form
The bitrix:system.auth.registration component is overridden in the template. An INN field with JavaScript autocomplete is added:
document.getElementById('inn-field').addEventListener('blur', async function() {
const inn = this.value.replace(/\D/g, '');
if (inn.length !== 10 && inn.length !== 12) return;
const resp = await fetch('/local/ajax/check-inn.php?inn=' + inn);
const data = await resp.json();
if (data.success) {
document.getElementById('company-name').value = data.full_name;
document.getElementById('kpp-field').value = data.kpp;
document.getElementById('ogrn-field').value = data.ogrn;
document.getElementById('address-field').value = data.address;
if (data.status !== 'active') {
showWarning('Company is not active');
}
}
});
The /local/ajax/check-inn.php endpoint is a thin controller that calls DadataContragentChecker and returns JSON.
CRM Integration
If CRM is used, verification is embedded upon creating a contact or company via events:
-
OnAfterCrmContactAdd/OnAfterCrmCompanyAdd— triggers a background check via handler - The result is written to a custom field of the CRM company
- With low scoring or "liquidated" status — a task is automatically created for the manager for manual check
AddEventHandler('crm', 'OnAfterCrmCompanyAdd', function(&$fields) {
$inn = $fields['fields']['UF_INN'] ?? '';
if (!$inn) return;
// Launch asynchronously via agent
\CAgent::AddAgent(
"checkContragentAgent({$fields['id']}, '{$inn}');",
'my_module',
'N',
60
);
});
Periodic Re-verification
Companies change status — get liquidated, reorganized. The agent re-checks records older than 30 days:
function reCheckContragentsAgent(): string
{
$connection = \Bitrix\Main\Application::getConnection();
$rows = $connection->query(
"SELECT ID, UF_INN FROM b_hl17_company_requisites
WHERE UF_LAST_CHECK < DATE_SUB(NOW(), INTERVAL 30 DAY)
LIMIT 50"
);
$checker = new DadataContragentChecker(DADATA_API_KEY, DADATA_SECRET);
while ($row = $rows->fetch()) {
$data = $checker->getByInn($row['UF_INN']);
if ($data) {
updateHlBlockRecord($row['ID'], $data);
}
}
return __FUNCTION__ . '();';
}
Limit of 50 records per run — to prevent the agent from exceeding PHP execution time.
Implementation Process
- Audit — We review your current Bitrix setup (infoblocks, HL-blocks, CRM).
- API Selection — We recommend the best API (Dadata, Kontur.Focus, or FTS) for your needs.
- Controller — We develop the PHP controller for INN check with caching.
- HL-block — We create the HL-block for storing requisites and scoring.
- Embedding — We add autocomplete to the registration form (template customization).
- Background Agents — We configure agents for periodic re-verification.
- CRM Integration — We wire up CRM events (contacts/companies) with notifications.
- Testing & Deployment — We test on staging and deploy to production.
- Documentation — We provide operational docs and train your managers.
- Support — We offer 1-month post-launch support.
What's Included in the Work
- Development of INN check controller with 24-hour caching
- Creation of HL-block for storing contractor data and scoring
- Embedding of autocomplete into registration form (template customization)
- Configuration of background agents for periodic re-verification
- CRM integration (events, custom fields, task creation)
- Testing on staging environment
- Deployment to production
- Operational documentation and manager training
- 1-month post-launch support with bug fixes and adjustments
- Source code and access to version control (Git)
Timeline and Cost
| Scope | Composition | Timeline | Cost |
|---|---|---|---|
| Requisite autocomplete (Dadata) | AJAX + cache + registration form | 2–4 days | $800–$1,200 |
| Contractors HL-block + background agent | Storage + periodic check | 1 week | $1,500–$2,000 |
| Full integration (CRM + scoring + notifications) | Kontur.Focus or SPARK + CRM integration | 2–3 weeks | $3,000–$5,000 |
Costs are estimates; final price depends on complexity and number of APIs. For 500 applications per month, your annual savings exceed $45,000.
Why Choose Our Integration?
Manual verification is 450 times slower than automated. Automated re-verification catches changes up to 30 days earlier. Our team has completed over 100 Bitrix integrations, with a 98% client satisfaction rate. We provide a 1-year stability guarantee. As a certified Bitrix partner, we offer reliable support.
Evaluate Your Project
Contact us to get a preliminary assessment of complexity and timeline. We will analyze your current Bitrix configuration, select the optimal APIs, and offer a turnkey solution with a guarantee of stable operation. Submit a request — we'll evaluate your project for free. Data enrichment from multiple sources ensures accuracy.







