Configuring Yandex Business Directory for 1C-Bitrix
Yandex Business Directory is a data source for an organization card in Yandex Maps, search, and other services. The problem with most Bitrix sites: organization data is scattered — phone in one template place, address in another, working hours nowhere, and NAP (Name, Address, Phone) on the site doesn't match Directory data. Search engines use NAP consistency as a local ranking signal.
Structured Data LocalBusiness in Bitrix
Before working with the Directory, you need to handle markup on the site itself. Schema.org LocalBusiness is what the search engine scans and compares with aggregator data. In Bitrix, markup is added to template or component.
Organization data is best stored in site settings or a "Contacts" infoblock — not hardcoded in template:
// Get data from "Contacts" infoblock
$contacts = \CIBlockElement::GetList(
[],
['IBLOCK_CODE' => 'contacts', 'ACTIVE' => 'Y'],
false,
['nTopCount' => 1],
['ID', 'NAME', 'PROPERTY_PHONE', 'PROPERTY_ADDRESS', 'PROPERTY_HOURS']
)->GetNextElement()->GetFields();
JSON-LD in template's footer.php:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "<?= htmlspecialcharsEx($siteName) ?>",
"telephone": "<?= htmlspecialcharsEx($contacts['PROPERTY_PHONE_VALUE']) ?>",
"address": {
"@type": "PostalAddress",
"streetAddress": "<?= htmlspecialcharsEx($contacts['PROPERTY_ADDRESS_VALUE']) ?>",
"addressLocality": "Moscow",
"addressCountry": "RU"
},
"openingHours": "<?= htmlspecialcharsEx($contacts['PROPERTY_HOURS_VALUE']) ?>",
"url": "https://<?= SITE_SERVER_NAME ?>"
}
</script>
Automatic Synchronization with Directory API
Yandex Business Directory has an API for bulk organization management. For a site with one location, this is excessive, but for a network of stores — mandatory. The API works via REST:
POST https://api.business.yandex.net/v1/companies/{company_id}
Authorization: OAuth {token}
Content-Type: application/json
{
"name": "Name",
"phones": [{"number": "+7 495 123-45-67"}],
"address": {
"country_code": "RU",
"locality": "Moscow",
"street": "Tverskaya",
"housenumber": "1"
},
"work_intervals": [
{"day": "MON", "time_minutes_begin": 540, "time_minutes_end": 1200}
]
}
In Bitrix, synchronization runs via agent when data in the infoblock changes — via OnAfterIBlockElementUpdate event.
Map Widget on Site
Yandex Maps are embedded via API or standard iframe widget. For Bitrix, it's recommended to use Yandex Maps JavaScript API with lazy loading — map loads only when user scrolls to it:
const mapSection = document.getElementById('yandex-map');
const observer = new IntersectionObserver((entries) => {
if (entries[0].isIntersecting) {
loadYandexMap();
observer.disconnect();
}
}, { threshold: 0.1 });
observer.observe(mapSection);
function loadYandexMap() {
const script = document.createElement('script');
script.src = 'https://api-maps.yandex.ru/2.1/?lang=en_US&apikey=YOUR_KEY';
script.onload = initMap;
document.head.appendChild(script);
}
This prevents loading 300KB of Yandex Maps JavaScript API on every "Contacts" page visit.
Monitoring Data Relevance
After synchronization, Directory data passes moderation — from several hours to several days. To automatically check alignment between the site and Directory, use https://yandex.com/maps/org/{company_id}/info/ — compare data programmatically or manually once a month. Discrepancy in phone, address, or working hours between site and Directory negatively affects local SEO.







