Календарь и встречи
Календарь позволяет планировать встречи с кандидатами: собеседования, звонки и другие события. Со встречей можно связать кандидатов, вакансии и менеджеров, а также создать внешнюю видеоконференцию (Telemost, Zoom, Google Meet) или событие во внешнем календаре (Google, Outlook, Yandex, Bitrix).
Ниже приведены запросы для получения справочника временных зон, чтения календаря и встреч, а также создания, обновления и удаления встреч.
Формат даты и времени
В операциях календаря дата и время представлены двумя способами:
- Timestamp в UTC — количество миллисекунд, прошедших с 1 января 1970 года. В этом формате возвращаются поля
startDate,endDate,createdAt,updatedAtи передаются аргументыstartиendзапросаcalendarMeetings. - Локальное время — период встречи при создании и обновлении (
period.start,period.end) в формате ISO-8601 без смещения (YYYY-MM-DDThh:mm:ss, например2024-02-15T10:00:00). Временную зону, в которой интерпретируются эти значения, указываетperiod.timezoneIdиз справочника временных зон; сервер сам переводит время в UTC.
Справочник временных зон
Допустимые значения timezoneId для периода встречи возвращает запрос timezones.
- graphql
- cURL
query Timezones {
timezones {
items {
id
name
}
}
}
curl https://api.talantix.ru/graphql \
-X POST \
-H "Content-Type: application/json" \
-H "User-Agent: api-doc-agent" \
-H "Authorization: Bearer <your access token>" \
-d "{\"query\":\"query Timezones {\\n timezones {\\n items {\\n id\\n name\\n }\\n }\\n}\"}"
При успешном выполнении запрос вернёт
{
"data": {
"timezones": {
"items": [
{
"id": "europe/moscow",
"name": "(UTC+03:00) Москва, Санкт-Петербург"
},
{
"id": "europe/kaliningrad",
"name": "(UTC+02:00) Калининград"
},
{
"id": "asia/yekaterinburg",
"name": "(UTC+05:00) Екатеринбург"
}
]
}
}
}
Идентификатор временной зоны (id) — это строковое значение вида europe/moscow, а не числовой идентификатор.
Этот же идентификатор возвращается в поле timezone.id встречи.
Информация о календаре
Запрос calendar возвращает общую информацию о календаре текущего менеджера.
Поле hasMeetings показывает, есть ли у менеджера хотя бы одна встреча.
- graphql
- cURL
query Calendar {
calendar {
hasMeetings
}
}
curl https://api.talantix.ru/graphql \
-X POST \
-H "Content-Type: application/json" \
-H "User-Agent: api-doc-agent" \
-H "Authorization: Bearer <your access token>" \
-d "{\"query\":\"query Calendar {\\n calendar {\\n hasMeetings\\n }\\n}\"}"
При успешном выполнении запрос вернёт
{
"data": {
"calendar": {
"hasMeetings": true
}
}
}
Получение списка встреч
Запрос calendarMeetings возвращает встречи за указанный диапазон дат.
Границы периода start и end передаются как timestamp в UTC (см. Формат даты и времени).
Максимальный диапазон между start и end — 93 дня. При превышении вернётся ошибка VALIDATION.
Кандидаты (persons) и вакансии (vacancies) встречи возвращаются в виде union-типов:
для доступных текущему менеджеру сущностей возвращается полный объект (PersonItem, VacancyItem),
для недоступных — объект с ограниченным набором полей (PersonPublicItem, VacancyPublicItem),
а если сущность не найдена — ошибка (PersonError, VacancyError).
- graphql
- cURL
query CalendarMeetings {
calendarMeetings(start: 1706745600000, end: 1709251200000) {
__typename
... on CalendarMeetingsItem {
items {
id
topic
place
startDate
endDate
canEdit
timezone {
id
name
}
externalVideoConference {
type
url
}
persons {
__typename
... on PersonItem {
id
firstName
lastName
}
... on PersonPublicItem {
id
firstName
lastName
}
... on PersonError {
errorType
}
}
vacancies {
__typename
... on VacancyItem {
id
title
}
... on VacancyPublicItem {
id
title
}
... on VacancyError {
errorType
}
}
creatorManager {
id
firstName
lastName
}
}
}
... on CalendarMeetingsError {
errorType
}
}
}
curl https://api.talantix.ru/graphql \
-X POST \
-H "Content-Type: application/json" \
-H "User-Agent: api-doc-agent" \
-H "Authorization: Bearer <your access token>" \
-d "{\"query\":\"query CalendarMeetings {\\n calendarMeetings(start: 1706745600000, end: 1709251200000) {\\n __typename\\n ... on CalendarMeetingsItem {\\n items {\\n id\\n topic\\n place\\n startDate\\n endDate\\n canEdit\\n timezone {\\n id\\n name\\n }\\n externalVideoConference {\\n type\\n url\\n }\\n persons {\\n __typename\\n ... on PersonItem {\\n id\\n firstName\\n lastName\\n }\\n ... on PersonPublicItem {\\n id\\n firstName\\n lastName\\n }\\n ... on PersonError {\\n errorType\\n }\\n }\\n vacancies {\\n __typename\\n ... on VacancyItem {\\n id\\n title\\n }\\n ... on VacancyPublicItem {\\n id\\n title\\n }\\n ... on VacancyError {\\n errorType\\n }\\n }\\n creatorManager {\\n id\\n firstName\\n lastName\\n }\\n }\\n }\\n ... on CalendarMeetingsError {\\n errorType\\n }\\n }\\n}\"}"
При успешном выполнении запрос вернёт
{
"data": {
"calendarMeetings": {
"__typename": "CalendarMeetingsItem",
"items": [
{
"id": 321,
"topic": "Собеседование с кандидатом",
"place": "Офис, переговорная №3",
"startDate": 1707980400000,
"endDate": 1707984000000,
"canEdit": true,
"timezone": {
"id": "europe/moscow",
"name": "(UTC+03:00) Москва, Санкт-Петербург"
},
"externalVideoConference": {
"type": "TELEMOST",
"url": "https://telemost.yandex.ru/j/00000000000000"
},
"persons": [
{
"__typename": "PersonItem",
"id": 123456,
"firstName": "Иван",
"lastName": "Иванов"
}
],
"vacancies": [
{
"__typename": "VacancyItem",
"id": 50000,
"title": "Java-разработчик"
}
],
"creatorManager": {
"id": 789,
"firstName": "Пётр",
"lastName": "Петров"
}
}
]
}
}
}
В случае возникновения ошибки вернётся ответ в формате JSON с типом ошибки
{
"data": {
"calendarMeetings": {
"__typename": "CalendarMeetingsError",
"errorType": "VALIDATION"
}
}
}
Возможные значения errorType:
VALIDATION— ошибка валидации данных (например, превышен максимальный диапазон дат)
Получение встречи по идентификатору
Запрос calendarMeeting возвращает одну встречу по её идентификатору.
В дополнение к полям из списка можно запросить комментарий, информацию о событии во внешнем календаре,
список приглашённых менеджеров и другие поля.
- graphql
- cURL
query CalendarMeeting {
calendarMeeting(id: 321) {
__typename
... on CalendarMeetingItem {
id
topic
place
comment
startDate
endDate
createdAt
updatedAt
canEdit
timezone {
id
name
}
externalVideoConference {
externalId
type
url
}
externalCalendarMeeting {
eventId
calendarType
}
persons {
__typename
... on PersonItem {
id
firstName
lastName
}
... on PersonPublicItem {
id
firstName
lastName
}
... on PersonError {
errorType
}
}
vacancies {
__typename
... on VacancyItem {
id
title
}
... on VacancyPublicItem {
id
title
}
... on VacancyError {
errorType
}
}
managers {
id
firstName
lastName
}
creatorManager {
id
firstName
lastName
}
}
... on CalendarMeetingError {
errorType
}
}
}
curl https://api.talantix.ru/graphql \
-X POST \
-H "Content-Type: application/json" \
-H "User-Agent: api-doc-agent" \
-H "Authorization: Bearer <your access token>" \
-d "{\"query\":\"query CalendarMeeting {\\n calendarMeeting(id: 321) {\\n __typename\\n ... on CalendarMeetingItem {\\n id\\n topic\\n place\\n comment\\n startDate\\n endDate\\n createdAt\\n updatedAt\\n canEdit\\n timezone {\\n id\\n name\\n }\\n externalVideoConference {\\n externalId\\n type\\n url\\n }\\n externalCalendarMeeting {\\n eventId\\n calendarType\\n }\\n persons {\\n __typename\\n ... on PersonItem {\\n id\\n firstName\\n lastName\\n }\\n ... on PersonPublicItem {\\n id\\n firstName\\n lastName\\n }\\n ... on PersonError {\\n errorType\\n }\\n }\\n vacancies {\\n __typename\\n ... on VacancyItem {\\n id\\n title\\n }\\n ... on VacancyPublicItem {\\n id\\n title\\n }\\n ... on VacancyError {\\n errorType\\n }\\n }\\n managers {\\n id\\n firstName\\n lastName\\n }\\n creatorManager {\\n id\\n firstName\\n lastName\\n }\\n }\\n ... on CalendarMeetingError {\\n errorType\\n }\\n }\\n}\"}"
При успешном выполнении запрос вернёт
{
"data": {
"calendarMeeting": {
"__typename": "CalendarMeetingItem",
"id": 321,
"topic": "Собеседование с кандидатом",
"place": "Офис, переговорная №3",
"comment": "<p>Просьба подготовить тестовое задание</p>",
"startDate": 1707980400000,
"endDate": 1707984000000,
"createdAt": 1707900000000,
"updatedAt": 1707900000000,
"canEdit": true,
"timezone": {
"id": "europe/moscow",
"name": "(UTC+03:00) Москва, Санкт-Петербург"
},
"externalVideoConference": {
"externalId": "00000000000000",
"type": "TELEMOST",
"url": "https://telemost.yandex.ru/j/00000000000000"
},
"externalCalendarMeeting": null,
"persons": [
{
"__typename": "PersonItem",
"id": 123456,
"firstName": "Иван",
"lastName": "Иванов"
}
],
"vacancies": [
{
"__typename": "VacancyItem",
"id": 50000,
"title": "Java-разработчик"
}
],
"managers": [
{
"id": 789,
"firstName": "Пётр",
"lastName": "Петров"
}
],
"creatorManager": {
"id": 789,
"firstName": "Пётр",
"lastName": "Петров"
}
}
}
}
В случае возникновения ошибки вернётся ответ в формате JSON с типом ошибки
{
"data": {
"calendarMeeting": {
"__typename": "CalendarMeetingError",
"errorType": "MEETING_NOT_FOUND"
}
}
}
Возможные значения errorType:
MEETING_NOT_FOUND— встреча не найдена
Создание встречи
Создать встречу можно с помощью следующего запроса.
Период проведения (period) задаётся в локальном времени — см. Формат даты и времени.
Дополнительно при создании можно:
- создать внешнюю видеоконференцию, указав
externalVideoConferenceType(TELEMOST,ZOOM,GOOGLE_MEET); - создать событие во внешнем календаре, указав
externalCalendarType(GOOGLE,OUTLOOK,YANDEX,BITRIX); - отправить кандидатам Email-уведомление (
personEmail) и/или СМС (personSmsText); - отправить Email-уведомление менеджерам (
sendEmailToManagers, по умолчаниюtrue).
Создание внешней видеоконференции или события во внешнем календаре требует предварительно подключённой интеграции.
- graphql
- cURL
mutation CreateCalendarMeeting {
createCalendarMeeting(
input: {topic: "Собеседование с кандидатом", place: "Офис, переговорная №3", comment: "<p>Просьба подготовить тестовое задание</p>", period: {start: "2024-02-15T10:00:00", end: "2024-02-15T11:00:00", timezoneId: "europe/moscow"}, personIds: [123456], vacancyIds: [50000], managerIds: [789], externalVideoConferenceType: TELEMOST, personEmail: {subject: "Приглашение на собеседование", text: "<p>Здравствуйте! Приглашаем вас на собеседование.</p>"}, sendEmailToManagers: true}
) {
__typename
... on CalendarMeetingItem {
id
topic
startDate
endDate
externalVideoConference {
type
url
}
}
... on CalendarMeetingCreateError {
errorType
message
fieldErrors {
field
violatedConstraints
}
integrationError {
__typename
... on YandexTelemostError {
yandexTelemostErrorType
}
... on ZoomError {
zoomErrorType
}
... on GoogleMeetError {
googleMeetErrorType
}
}
}
}
}
curl https://api.talantix.ru/graphql \
-X POST \
-H "Content-Type: application/json" \
-H "User-Agent: api-doc-agent" \
-H "Authorization: Bearer <your access token>" \
-d "{\"query\":\"mutation CreateCalendarMeeting {\\n createCalendarMeeting(\\n input: {topic: \\\"Собеседование с кандидатом\\\", place: \\\"Офис, переговорная №3\\\", comment: \\\"<p>Просьба подготовить тестовое задание</p>\\\", period: {start: \\\"2024-02-15T10:00:00\\\", end: \\\"2024-02-15T11:00:00\\\", timezoneId: \\\"europe/moscow\\\"}, personIds: [123456], vacancyIds: [50000], managerIds: [789], externalVideoConferenceType: TELEMOST, personEmail: {subject: \\\"Приглашение на собеседование\\\", text: \\\"<p>Здравствуйте! Приглашаем вас на собеседование.</p>\\\"}, sendEmailToManagers: true}\\n ) {\\n __typename\\n ... on CalendarMeetingItem {\\n id\\n topic\\n startDate\\n endDate\\n externalVideoConference {\\n type\\n url\\n }\\n }\\n ... on CalendarMeetingCreateError {\\n errorType\\n message\\n fieldErrors {\\n field\\n violatedConstraints\\n }\\n integrationError {\\n __typename\\n ... on YandexTelemostError {\\n yandexTelemostErrorType\\n }\\n ... on ZoomError {\\n zoomErrorType\\n }\\n ... on GoogleMeetError {\\n googleMeetErrorType\\n }\\n }\\n }\\n }\\n}\"}"
При успешном выполнении запрос вернёт созданную встречу
{
"data": {
"createCalendarMeeting": {
"__typename": "CalendarMeetingItem",
"id": 321,
"topic": "Собеседование с кандидатом",
"startDate": 1707980400000,
"endDate": 1707984000000,
"externalVideoConference": {
"type": "TELEMOST",
"url": "https://telemost.yandex.ru/j/00000000000000"
}
}
}
}
В случае ошибки валидации вернётся тип ошибки и список полей с нарушенными ограничениями
{
"data": {
"createCalendarMeeting": {
"__typename": "CalendarMeetingCreateError",
"errorType": "VALIDATION",
"message": null,
"fieldErrors": [
{
"field": "period.timezoneId",
"violatedConstraints": ["ValidTimezone"]
}
],
"integrationError": null
}
}
}
Если ошибка возникла на стороне внешнего сервиса (видеоконференция или внешний календарь),
тип ошибки будет INTEGRATION_ERROR, а детали — в поле integrationError.
Его конкретный тип зависит от интеграции (например, ZoomError, YandexTelemostError, GoogleMeetError)
{
"data": {
"createCalendarMeeting": {
"__typename": "CalendarMeetingCreateError",
"errorType": "INTEGRATION_ERROR",
"message": null,
"fieldErrors": null,
"integrationError": {
"__typename": "YandexTelemostError",
"yandexTelemostErrorType": "ACCOUNT_NOT_FOUND"
}
}
}
}
Возможные значения errorType:
VALIDATION— ошибка валидации данныхACCESS_DENIED— нет прав на создание встречINTEGRATION_ERROR— ошибка интеграции с внешней системой (детали в полеintegrationError)SEND_SMS_ACCESS_DENIED— нет прав для отправки СМС кандидатамEMAIL_SERVER_NOT_AVAILABLE— почтовый сервер недоступен
Обновление встречи
Обновить встречу можно с помощью следующего запроса.
В поле id передаётся идентификатор изменяемой встречи. Встреча перезаписывается переданными значениями, поэтому передавайте все поля, которые нужно сохранить.
- graphql
- cURL
mutation UpdateCalendarMeeting {
updateCalendarMeeting(
input: {id: 321, topic: "Собеседование с кандидатом (перенесено)", place: "Онлайн", period: {start: "2024-02-16T14:00:00", end: "2024-02-16T15:00:00", timezoneId: "europe/moscow"}, personIds: [123456], vacancyIds: [50000], managerIds: [789]}
) {
__typename
... on CalendarMeetingItem {
id
topic
startDate
endDate
updatedAt
}
... on CalendarMeetingUpdateError {
errorType
message
fieldErrors {
field
violatedConstraints
}
}
}
}
curl https://api.talantix.ru/graphql \
-X POST \
-H "Content-Type: application/json" \
-H "User-Agent: api-doc-agent" \
-H "Authorization: Bearer <your access token>" \
-d "{\"query\":\"mutation UpdateCalendarMeeting {\\n updateCalendarMeeting(\\n input: {id: 321, topic: \\\"Собеседование с кандидатом (перенесено)\\\", place: \\\"Онлайн\\\", period: {start: \\\"2024-02-16T14:00:00\\\", end: \\\"2024-02-16T15:00:00\\\", timezoneId: \\\"europe/moscow\\\"}, personIds: [123456], vacancyIds: [50000], managerIds: [789]}\\n ) {\\n __typename\\n ... on CalendarMeetingItem {\\n id\\n topic\\n startDate\\n endDate\\n updatedAt\\n }\\n ... on CalendarMeetingUpdateError {\\n errorType\\n message\\n fieldErrors {\\n field\\n violatedConstraints\\n }\\n }\\n }\\n}\"}"
При успешном выполнении запрос вернёт обновлённую встречу
{
"data": {
"updateCalendarMeeting": {
"__typename": "CalendarMeetingItem",
"id": 321,
"topic": "Собеседование с кандидатом (перенесено)",
"startDate": 1708081200000,
"endDate": 1708084800000,
"updatedAt": 1707950000000
}
}
}
В случае возникновения ошибки вернётся ответ в формате JSON с типом ошибки
{
"data": {
"updateCalendarMeeting": {
"__typename": "CalendarMeetingUpdateError",
"errorType": "MEETING_NOT_FOUND",
"message": null,
"fieldErrors": null
}
}
}
Возможные значения errorType:
VALIDATION— ошибка валидации данныхMEETING_NOT_FOUND— встреча не найденаACCESS_DENIED— нет прав на изменение встречи
Удаление встречи
Удалить встречу можно с помощью следующего запроса.
В поле id передаётся идентификатор удаляемой встречи.
- graphql
- cURL
mutation DeleteCalendarMeeting {
deleteCalendarMeeting(id: 321) {
__typename
... on CalendarMeetingDeleteSuccess {
id
}
... on CalendarMeetingDeleteError {
errorType
}
}
}
curl https://api.talantix.ru/graphql \
-X POST \
-H "Content-Type: application/json" \
-H "User-Agent: api-doc-agent" \
-H "Authorization: Bearer <your access token>" \
-d "{\"query\":\"mutation DeleteCalendarMeeting {\\n deleteCalendarMeeting(id: 321) {\\n __typename\\n ... on CalendarMeetingDeleteSuccess {\\n id\\n }\\n ... on CalendarMeetingDeleteError {\\n errorType\\n }\\n }\\n}\"}"
При успешном выполнении запрос вернёт идентификатор удалённой встречи
{
"data": {
"deleteCalendarMeeting": {
"__typename": "CalendarMeetingDeleteSuccess",
"id": 321
}
}
}
В случае возникновения ошибки вернётся ответ в формате JSON с типом ошибки
{
"data": {
"deleteCalendarMeeting": {
"__typename": "CalendarMeetingDeleteError",
"errorType": "MEETING_NOT_FOUND"
}
}
}
Возможные значения errorType:
MEETING_NOT_FOUND— встреча не найденаACCESS_DENIED— нет прав на удаление встречи