Получить таймлайн задачи или запроса на слияние

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)

Параметры запроса

ПараметрГде передатьТипОбязательныйОписание
pagequeryintegerНетНомер страницы для пагинации (начиная с 1). По умолчанию: 1.
per_pagequeryintegerНетКоличество записей на странице. По умолчанию: 30.
sincequerystringНетВозвращать только события после указанного времени (формат RFC 3339)
beforequerystringНетВозвращать только события до указанного времени (формат 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 события. На корневом уровне общий набор полей:

ПолеТипОписание
idintegerИдентификатор события
typestringТип события (comment, change_title, label и др.)
userobjectИнициатор события (см. User)
bodystringТекст события
created_at, updated_atstring (date-time)Даты создания и обновления
labelobject / nullМетка (см. Label)
assigneeobject / nullИсполнитель (см. User)
milestoneobject / nullВеха (см. Milestone)
old_title, new_title, old_ref, new_refstringЗначения до/после
ref_issueobject / nullСвязанная задача (см. Issue
ref_commentobject / nullСвязанный комментарий
dependent_issueobject / nullЗависимая задача (см. Issue
html_url, issue_url, pull_request_urlstringСсылки

Особенности различных типов событий описаны ниже.

Особенности структуры событий

Набор заполненных полей зависит от type: например, у события метки заполнен label, у назначения исполнителя — assignee и removed_assignee, у ссылки на другую задачу — ref_issue или ref_comment. Недоступные ссылки на внешние репозитории не включаются в ответ.

Важно: для обычной задачи endpoint отдает события, только когда на инстансе включен новый трекер задач. Для pull request это ограничение не применяется. Swagger заявляет 404 Not Found для несуществующей задачи, однако текущий обработчик преобразует ошибку поиска задачи в 500 Internal Server Error; это поведение сервера, а не рекомендуемый контракт для клиента.

Коды ответа

КодСтатусОписание
200OKТаймлайн успешно получен.
400Bad RequestНекорректные параметры запроса.
401UnauthorizedНе передан или невалиден токен авторизации.
403ForbiddenНет прав на доступ к репозиторию.
404Not FoundЗадача, запрос или репозиторий не найдены.
500Internal Server ErrorВнутренняя ошибка сервера GitVerse.