Получить таймлайн задачи или запроса на слияние
GET /repos/{owner}/{repo}/issues/{issue_number}/timeline
Описание
Метод GET возвращает таймлайн событий задачи или запроса на слияние в указанном репозитории. Он включает комментарии и системные события изменения (назначение исполнителей, изменение меток, вех, ссылки на коммиты и другие задачи и т. д.), упорядоченные в хронологическом порядке. Это не только текстовые комментарии: тип события указан в поле type.
Поддерживается пагинация через параметры page и per_page, а также фильтрация по диапазону времени через параметры since и before.
Метод применяется для отображения истории изменений объекта в интерфейсе, аудита действий участников и интеграции с внешними системами аналитики.
Важно: учитывается приватность репозитория. Если репозиторий приватный, а запрос выполняется не владельцем, соавтором или участником команды с доступом к репозиторию, возвращается ошибка 404.
Заголовки
| Параметр | Обязательный | Описание |
|---|---|---|
Accept | Нет | Тип содержимого ответа. Рекомендуется установить значение application/vnd.gitverse.object+json;version=1 |
Authorization | Да | Токен доступа. Формат: Bearer <YOUR-TOKEN> или token <YOUR-TOKEN> |
Параметры пути
| Параметр | Где передать | Тип | Обязательный | Описание |
|---|---|---|---|---|
owner | путь | string | Да | Владелец репозитория (логин пользователя или имя организации) |
repo | путь | string | Да | Название репозитория (без расширения .git) |
issue_number | путь | integer | Да | Номер задачи или запроса на слияние (в v3 — параметр index) |
Параметры запроса
| Параметр | Где передать | Тип | Обязательный | Описание |
|---|---|---|---|---|
page | query | integer | Нет | Номер страницы для пагинации (начиная с 1). По умолчанию: 1. |
per_page | query | integer | Нет | Количество записей на странице. По умолчанию: 30. |
since | query | string | Нет | Возвращать только события после указанного времени (формат RFC 3339) |
before | query | string | Нет | Возвращать только события до указанного времени (формат RFC 3339) |
Тело запроса
Данный метод не требует тела запроса. Все параметры передаются через URL и query-строку.
Пример запроса
curl -X GET "https://api.gitverse.ru/repos/user/my-repo/issues/18/timeline?per_page=30&page=1" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Accept: application/vnd.gitverse.object+json;version=1"
Замените YOUR_TOKEN на ваш личный токен доступа.
Пример запроса с фильтрацией по диапазону времени:
curl "https://api.gitverse.ru/repos/acme/demo/issues/42/timeline?page=1&per_page=20&since=2026-09-01T00:00:00Z" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Accept: application/vnd.gitverse.object+json;version=latest"Пример ответа (200 OK)
При успешном выполнении сервер возвращает массив объектов таймлайна. Для пагинации доступны заголовки Link и X-Total-Count.
[
{
"id": 863153,
"type": "change_title",
"html_url": "https://gitverse.ru/user_42/neo2/issues/1#issuecomment-863153",
"pull_request_url": "",
"issue_url": "https://gitverse.ru/user_42/neo2/issues/1",
"user": {
"id": 516,
"name": "",
"login": "user_42",
"type": "User",
"bio": "",
"email": "user_42@mail.org",
"avatar_url": "https://gitverse.ru/avatars/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"html_url": "https://gitverse.ru/user_42",
"url": "https://api.gitverse.ru/users/user_42",
"followers_url": "https://api.gitverse.ru/users/user_42/followers",
"following_url": "https://api.gitverse.ru/users/user_42/following{/other_user}",
"repos_url": "https://api.gitverse.ru/users/user_42/repos",
"organizations_url": "https://api.gitverse.ru/users/user_42/orgs",
"site_admin": false,
"location": null,
"is_verified": false,
"followers": 3,
"following": 0,
"public_repos": 45,
"stars_count": 0,
"created_at": "2024-01-24T20:34:11Z",
"updated_at": "2026-08-06T11:16:52Z"
},
"body": "",
"created_at": "2026-09-10T06:26:29Z",
"updated_at": "2026-09-10T06:26:29Z",
"old_project_id": 0,
"project_id": 0,
"old_milestone": null,
"milestone": null,
"tracked_time": null,
"old_title": "ssdf",
"new_title": "Первая",
"old_ref": "",
"new_ref": "",
"ref_issue": null,
"ref_comment": null,
"ref_action": "none",
"ref_commit_sha": "",
"review_id": 0,
"label": null,
"assignee": null,
"assignee_team": null,
"removed_assignee": false,
"resolve_doer": null,
"dependent_issue": null
},
{
"id": 863154,
"type": "add_issue_link",
"html_url": "https://gitverse.ru/user_42/neo2/issues/1#issuecomment-863154",
"pull_request_url": "",
"issue_url": "https://gitverse.ru/user_42/neo2/issues/1",
"user": {
"id": 516,
"name": "",
"login": "user_42",
"type": "User",
"bio": "",
"email": "user_42@mail.org",
"avatar_url": "https://gitverse.ru/avatars/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"html_url": "https://gitverse.ru/user_42",
"url": "https://api.gitverse.ru/users/user_42",
"followers_url": "https://api.gitverse.ru/users/user_42/followers",
"following_url": "https://api.gitverse.ru/users/user_42/following{/other_user}",
"repos_url": "https://api.gitverse.ru/users/user_42/repos",
"organizations_url": "https://api.gitverse.ru/users/user_42/orgs",
"site_admin": false,
"location": null,
"is_verified": false,
"followers": 3,
"following": 0,
"public_repos": 45,
"stars_count": 0,
"created_at": "2024-01-24T20:34:11Z",
"updated_at": "2026-08-06T11:16:52Z"
},
"body": "{\"link_type_id\":2,\"source_issue_id\":163025,\"destination_issue_id\":146287}",
"created_at": "2026-09-10T06:27:06Z",
"updated_at": "2026-09-10T06:27:06Z",
"old_project_id": 0,
"project_id": 0,
"old_milestone": null,
"milestone": null,
"tracked_time": null,
"old_title": "",
"new_title": "",
"old_ref": "",
"new_ref": "",
"ref_issue": null,
"ref_comment": null,
"ref_action": "none",
"ref_commit_sha": "",
"review_id": 0,
"label": null,
"assignee": null,
"assignee_team": null,
"removed_assignee": false,
"resolve_doer": null,
"dependent_issue": {
"id": 163025,
"node_id": null,
"url": "http://gitverse-backend-http:3000/api/v1/repos/user_42/neo2/issues/3",
"repository_url": "",
"labels_url": "",
"comments_url": "",
"events_url": null,
"html_url": "http://gitverse-backend-http:3000/user_42/neo2/issues/3",
"number": 3,
"user": {
"id": 516,
"name": "",
"login": "user_42",
"type": "User",
"bio": "",
"email": "user_42@mail.org",
"avatar_url": "https://gitverse.ru/avatars/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"html_url": "https://gitverse.ru/user_42",
"url": "https://api.gitverse.ru/users/user_42",
"followers_url": "https://api.gitverse.ru/users/user_42/followers",
"following_url": "https://api.gitverse.ru/users/user_42/following{/other_user}",
"repos_url": "https://api.gitverse.ru/users/user_42/repos",
"organizations_url": "https://api.gitverse.ru/users/user_42/orgs",
"site_admin": false,
"location": "",
"is_verified": false,
"followers": 3,
"following": 0,
"public_repos": 0,
"stars_count": 2,
"created_at": "2024-01-24T20:34:11Z",
"updated_at": ""
},
"original_author": "",
"original_author_id": 0,
"title": "Третья",
"body": "Третья задача",
"ref": "",
"assets": [],
"labels": [],
"milestone": null,
"assignee": null,
"assignees": [],
"state": "open",
"locked": false,
"comments": 0,
"created_at": "2026-09-10T06:26:56Z",
"updated_at": "2026-09-10T06:27:25Z",
"closed_at": null,
"due_date": null,
"timeline_url": "",
"pull_request": null,
"repository": {
"id": 309057,
"name": "neo2",
"owner": "user_42",
"full_name": "user_42/neo2"
}
}
}
]
Пример ответа с разными типами событий
[
{
"id": 314,
"type": "comment",
"html_url": "https://gitverse.ru/acme/demo/issues/42#issuecomment-314",
"issue_url": "https://api.gitverse.ru/repos/acme/demo/issues/42",
"user": { "id": 17, "login": "alex" },
"body": "Исправление готово, прошу проверить.",
"created_at": "2026-09-08T10:30:00Z",
"updated_at": "2026-09-08T10:30:00Z",
"label": null,
"assignee": null
},
{
"id": 315,
"type": "label",
"html_url": "https://gitverse.ru/acme/demo/issues/42#event-315",
"issue_url": "https://api.gitverse.ru/repos/acme/demo/issues/42",
"user": { "id": 9, "login": "maria" },
"body": "",
"created_at": "2026-09-08T11:00:00Z",
"updated_at": "2026-09-08T11:00:00Z",
"label": { "id": 12, "name": "bug", "color": "d73a4a" }
}
]Структура ответа
Ответ — массив объектов TimelineEvent (события таймлайна). Полная структура описана в графе объектов, раздел «Объект TimelineEvent».
Набор заполненных полей зависит от type события. На корневом уровне общий набор полей:
| Поле | Тип | Описание |
|---|---|---|
id | integer | Идентификатор события |
type | string | Тип события (comment, change_title, label и др.) |
user | object | Инициатор события (см. User) |
body | string | Текст события |
created_at, updated_at | string (date-time) | Даты создания и обновления |
label | object / null | Метка (см. Label) |
assignee | object / null | Исполнитель (см. User) |
milestone | object / null | Веха (см. Milestone) |
old_title, new_title, old_ref, new_ref | string | Значения до/после |
ref_issue | object / null | Связанная задача (см. Issue |
ref_comment | object / null | Связанный комментарий |
dependent_issue | object / null | Зависимая задача (см. Issue |
html_url, issue_url, pull_request_url | string | Ссылки |
Особенности различных типов событий описаны ниже.
Особенности структуры событий
Набор заполненных полей зависит от type: например, у события метки заполнен label, у назначения исполнителя — assignee и removed_assignee, у ссылки на другую задачу — ref_issue или ref_comment. Недоступные ссылки на внешние репозитории не включаются в ответ.
Важно: для обычной задачи endpoint отдает события, только когда на инстансе включен новый трекер задач. Для pull request это ограничение не применяется. Swagger заявляет
404 Not Foundдля несуществующей задачи, однако текущий обработчик преобразует ошибку поиска задачи в500 Internal Server Error; это поведение сервера, а не рекомендуемый контракт для клиента.
Коды ответа
| Код | Статус | Описание |
|---|---|---|
200 | OK | Таймлайн успешно получен. |
400 | Bad Request | Некорректные параметры запроса. |
401 | Unauthorized | Не передан или невалиден токен авторизации. |
403 | Forbidden | Нет прав на доступ к репозиторию. |
404 | Not Found | Задача, запрос или репозиторий не найдены. |
500 | Internal Server Error | Внутренняя ошибка сервера GitVerse. |