Спецификация партнёрского источника данных (Partner Data Endpoint) v1.1.1
Дата: 2026-01-26 | Статус: Стабильная версия
Содержание
Введение
Это техническая спецификация источника данных (Data Endpoint) — точки доступа к данным в формате связанных данных (Linked Data), которую должны реализовать партнёрские организации для интеграции с экосистемой Граф филармоний.
Архитектура: граф-ориентированный программный интерфейс с навигацией по ссылкам (Graph-native Hypermedia API)
Граф филармоний использует граф-ориентированную архитектуру, которая объединяет:
- JSON-LD (формат структурированных данных) — семантические данные с контекстом Schema.org (международного словаря описания данных)
- HATEOAS (принцип, при котором сервер указывает доступные действия через ссылки в ответе) — навигация через блок
linksв каждом ресурсе - Slash URIs (адреса-идентификаторы) — каждый
@idявляется разыменовываемым адресом
Это позволяет ИИ-агентам и приложениям автоматически обнаруживать и навигировать по всем данным организации.
Принцип работы
Федеративная архитектура с двойным присутствием:
- Партнёрская организация хранит все свои данные в собственной базе данных
- Партнёр реализует Data Endpoint по данной спецификации и выбирает базовый путь для размещения
- Централизованный реестр Граф филармоний периодически синхронизируется с партнёрским источником данных
- Реестр хранит только метаданные (ссылки, статусы, дата синхронизации)
- Полные данные остаются у партнёра и всегда актуальны
Универсальность источника данных
Data Endpoint — это единая точка доступа к данным организации для всех потребителей:
- Централизованный реестр — синхронизация метаданных
- Чат-боты и ИИ-ассистенты — информация о концертах, исполнителях
- Поисковые системы — индексация для графа знаний (Knowledge Graph)
- Мобильные приложения — афиша, расписание, билеты
- Агрегаторы — Яндекс.Афиша, Культура.РФ, Kassir.ru
- Виджеты — встраиваемые календари событий
- Разработчики — открытые данные культурной сферы
Базовый путь эндпоинтов
Партнёр самостоятельно выбирает базовый путь для размещения Data Endpoint.
Рекомендуемые варианты
Вариант 1: Папка /id/ (рекомендуется)
https://{partner-domain}/id/
Примеры:
https://filarmonia.online/id/organization.jsonldhttps://rostov-filarmoniya.ru/id/events.jsonld
Вариант 2: Папка /data/
https://{partner-domain}/data/
Вариант 3: Поддомен
https://data.{partner-domain}/
Требования к базовому пути
- ✅ HTTPS обязателен с валидным SSL-сертификатом
- ✅ Постоянный адрес — не должен меняться (постоянные адреса надёжнее)
- ✅ Без версионирования в пути — версия указывается в
@context - ✅ Все эндпоинты размещаются относительно базового пути
Slash URIs — формат идентификаторов
В версии 1.1 все @id являются разыменовываемыми URL (Slash URIs):
✅ Правильно (Slash URI):
{
"@id": "https://filarmonia.online/id/organization.jsonld",
"@type": "PerformingGroup",
"name": "Пермская краевая филармония"
}
❌ Устарело (Hash URI):
{
"@id": "https://filarmonia.online#organization"
}
Преимущества Slash URIs
- Разыменовываемость — GET-запрос по
@idвозвращает данные ресурса - Навигация — AI-агенты могут переходить по ссылкам
- Кеширование — каждый ресурс кешируется отдельно
- Соответствие HATEOAS — ссылки ведут на реальные ресурсы
Формат @id для разных сущностей
| Сущность | Формат @id |
|---|---|
| Организация | https://{domain}/{base}/organization.jsonld |
| Площадка | https://{domain}/{base}/places/{uuid}.jsonld |
| Событие | https://{domain}/{base}/events/{uuid}.jsonld |
| Исполнитель | https://{domain}/{base}/performers/{uuid}.jsonld |
Формат данных
- Формат: JSON-LD (формат структурированных данных)
- Кодировка: UTF-8
- Content-Type:
application/ld+json - Стандарт: Граф филармоний 1.1
- Контекст:
https://id.filarmonia.online/spec/1.1/context.jsonld
Блок links (HATEOAS навигация)
Каждый ресурс должен содержать блок links для навигации:
{
"@id": "https://filarmonia.online/id/organization.jsonld",
"@type": "PerformingGroup",
"name": "Пермская краевая филармония",
"links": [
{
"rel": "self",
"href": "https://filarmonia.online/id/organization.jsonld"
},
{
"rel": "places",
"href": "https://filarmonia.online/id/places.jsonld",
"title": "Все залы организации"
},
{
"rel": "events",
"href": "https://filarmonia.online/id/events.jsonld",
"title": "Все события организации"
},
{
"rel": "performers",
"href": "https://filarmonia.online/id/performers.jsonld",
"title": "Исполнители организации"
}
]
}
Стандартные значения rel
| rel | Описание |
|---|---|
self | Ссылка на текущий ресурс |
alternate | Альтернативное представление (HTML-страница) |
collection | Ссылка на коллекцию (список) |
organization | Ссылка на организацию |
places | Ссылка на список залов |
events | Ссылка на список событий |
performers | Ссылка на список исполнителей |
performer | Ссылка на конкретного исполнителя |
spec | Ссылка на спецификацию |
UUID и Slug — идентификаторы
UUID (обязательное поле)
Все сущности должны иметь поле uuid (уникальный идентификатор записи) в теле JSON-LD:
{
"@id": "https://filarmonia.online/id/organization.jsonld",
"@type": "PerformingGroup",
"uuid": "5b11f4ce-a62d-471e-81fc-a69a8278c7da",
"name": "Пермская краевая филармония"
}
Формат: UUID v4 (случайный)
Генерация:
// JavaScript
const uuid = crypto.randomUUID();
// PHP
$uuid = \Ramsey\Uuid\Uuid::uuid4()->toString();
Slug (опциональное поле)
Slug (читаемый идентификатор в адресной строке) — необязательное дополнение к UUID для поисковой оптимизации:
{
"uuid": "5b11f4ce-a62d-471e-81fc-a69a8278c7da",
"slug": "permskaya-filarmonia"
}
Использование:
- Удобные адреса страниц
- Читаемые ссылки в документации
- Альтернативные URL с редиректом на UUID
Обязательный эндпоинт
Для регистрации в централизованном реестре достаточно одного источника данных — профиля организации.
GET /{base}/organization.jsonld Обязательный
Назначение: Получение полного профиля организации
Пример запроса:
GET https://filarmonia.online/id/organization.jsonld
Ответ (200 OK):
{
"@context": [
"https://schema.org",
"https://id.filarmonia.online/spec/1.1/context.jsonld"
],
"@type": "PerformingGroup",
"@id": "https://filarmonia.online/id/organization.jsonld",
"uuid": "5b11f4ce-a62d-471e-81fc-a69a8278c7da",
"slug": "permskaya-filarmonia",
"orgType": "philharmonia",
"name": "Пермская краевая филармония",
"legalName": "ГКБУК «Пермская краевая филармония»",
"url": "https://filarmonia.online",
"description": "Ведущее концертное учреждение Прикамья, основанное в 1936 году.",
"foundingDate": "1936-07-01",
"logo": "https://filarmonia.online/logo.png",
"address": {
"@type": "PostalAddress",
"streetAddress": "ул. Сибирская, 11",
"addressLocality": "Пермь",
"addressRegion": "Пермский край",
"postalCode": "614015",
"addressCountry": "RU"
},
"telephone": "+7 (342) 212-91-23",
"email": "office@kf.perm.ru",
"sameAs": [
"https://vk.com/filarmoniaperm",
"https://t.me/filarmoniaperm"
],
"links": [
{"rel": "self", "href": "https://filarmonia.online/id/organization.jsonld"},
{"rel": "alternate", "href": "https://filarmonia.online/about/", "type": "text/html"}
]
}
@type": "PerformingGroup" вместо Organization.
Опциональные эндпоинты
Следующие эндпоинты реализуются по желанию партнёра в зависимости от возможностей и потребностей.
GET /{base}/health.jsonld Опционально
Назначение: Сервисный источник данных для мониторинга и обнаружения ресурсов
{
"@context": ["https://schema.org", "https://id.filarmonia.online/spec/1.1/context.jsonld"],
"@type": "WebAPI",
"name": "Пермская краевая филармония Data API",
"status": "healthy",
"version": "1.1",
"timestamp": "2026-01-26T10:30:00+05:00",
"links": [
{"rel": "organization", "href": "https://filarmonia.online/id/organization.jsonld"}
]
}
GET /{base}/places.jsonld Опционально
Назначение: Список площадок (залов) организации
{
"@context": [
"https://schema.org",
"https://id.filarmonia.online/spec/1.1/context.jsonld"
],
"@type": "ItemList",
"numberOfItems": 2,
"itemListElement": [
{
"@type": "MusicVenue",
"@id": "https://filarmonia.online/id/places/7c9e6679-7425-40de-944b-e07fc1f90ae7.jsonld",
"uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "Большой зал",
"maximumAttendeeCapacity": 820
}
],
"links": [
{"rel": "self", "href": "https://filarmonia.online/id/places.jsonld"},
{"rel": "organization", "href": "https://filarmonia.online/id/organization.jsonld"}
]
}
GET /{base}/events.jsonld Опционально
Назначение: Получение списка событий (концертов, спектаклей)
Параметры (опциональные):
limit— количество записей (по умолчанию 50, макс 100)offset— смещение для пагинацииfrom— дата начала диапазона (ISO 8601:2026-01-01)to— дата окончания диапазонаplace— фильтр по UUID площадкиperformer— фильтр по UUID исполнителя
Пример запроса:
GET https://filarmonia.online/id/events.jsonld?from=2026-01-01&limit=10
GET /{base}/performers.jsonld Опционально
Назначение: Получение списка исполнителей (персоны и коллективы)
Поле additionalType для исполнителей
| @type | additionalType | Описание |
|---|---|---|
Person | Conductor | Дирижёр |
Person | Soloist | Солист |
Person | Composer | Композитор |
Person | Musician | Музыкант |
MusicGroup | Orchestra | Оркестр |
MusicGroup | Choir | Хор |
MusicGroup | Ensemble | Ансамбль |
MusicGroup | Band | Группа |
Обработка ошибок
Коды ответов
- 200 OK — успешный запрос
- 400 Bad Request — некорректные параметры
- 404 Not Found — ресурс не найден
- 429 Too Many Requests — превышен rate limit
- 500 Internal Server Error — ошибка сервера
Формат ошибки
{
"@context": "https://schema.org",
"@type": "Error",
"statusCode": 404,
"error": "Not Found",
"message": "Event with uuid 'abc123' not found",
"timestamp": "2026-01-23T10:30:00+05:00"
}
Требования
Производительность
/{base}/health.jsonld— не более 500ms/{base}/organization.jsonld— не более 1s- Списки (
places,events,performers) — не более 2s - Минимум 99% uptime
Безопасность
- ✅ HTTPS обязателен
- ✅ Валидный SSL-сертификат
- ✅ Поддержка CORS (механизм разграничения доступа между доменами):
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, OPTIONS
Access-Control-Allow-Headers: Content-Type
Кеширование
Cache-Control: public, max-age=3600
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Рекомендуемое время кеша:
/organization.jsonld,/places.jsonld,/performers.jsonld— 1 час/events.jsonld— 5-15 минут
Краткая справка по эндпоинтам
| Источник данных | Статус | Описание |
|---|---|---|
/{base}/organization.jsonld |
Обязательный | Профиль организации (главная точка входа) |
/{base}/health.jsonld |
Опционально | Источник данных для мониторинга |
/{base}/places.jsonld |
Опционально | Список площадок |
/{base}/places/{uuid}.jsonld |
Опционально | Площадка по UUID |
/{base}/events.jsonld |
Опционально | Список событий |
/{base}/events/{uuid}.jsonld |
Опционально | Событие по UUID |
/{base}/performers.jsonld |
Опционально | Исполнители |
/{base}/performers/{uuid}.jsonld |
Опционально | Исполнитель по UUID |
Чек-лист перед публикацией
Минимальные требования (для реестра)
- ☐ Базовый путь выбран (например,
/id/) - ☐ HTTPS с валидным SSL-сертификатом
- ☐
/{base}/organization.jsonldвозвращает валидный JSON-LD - ☐
@id— Slash URI (разыменовываемый URL) - ☐ Поле
uuidприсутствует - ☐ Блок
linksс rel="self" - ☐ Контекст указывает на версию 1.1
- ☐ CORS настроен корректно
Дополнительно (для расширенной интеграции)
- ☐ Реализованы нужные опциональные endpoints
- ☐ Время ответа < 2 секунд
Инструменты валидации
- Онлайн-валидатор JSON-LD: https://json-ld.org/playground/
- Валидатор Schema.org (международного словаря описания данных): https://validator.schema.org/
Примеры тестовых запросов
# Получение профиля организации (обязательный endpoint)
curl https://filarmonia.online/id/organization.jsonld
# Опционально: проверка health
curl https://filarmonia.online/id/health.jsonld
# Опционально: события с фильтром
curl "https://filarmonia.online/id/events.jsonld?from=2026-01-01&limit=10"
# Опционально: исполнители типа Person
curl "https://filarmonia.online/id/performers.jsonld?type=person"
Поддержка
Документация: https://id.filarmonia.online/spec/1.1/
Контакты: https://id.filarmonia.online/contact/
Версия документа: 1.1.1 |
Последнее обновление: 2026-01-26
© 2025-2026 Граф филармоний. Открытый стандарт.