# Get a milestone

> A milestone, with every issue and pull request in it, newest first.

<div class="g1t-endpoint"><span class="g1t-method" data-method="get">GET</span><code>/repos/{owner}/{name}/milestones/{milestone}</code></div>

- **Authentication:** Optional. Public data can be read without a token; send one to see what is private.
- **MCP tool:** [`repository`](/reference/mcp/#repository) with `action` `get_milestone`, and the same inputs
- **Scope:** An access token needs [`repo:read`](/guides/authentication/#scopes).

## Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `owner` | string | Yes | The workspace that owns the repository. |
| `name` | string | Yes | The repository's name. |
| `milestone` | integer | Yes | The milestone's number, from [`list_milestones`](/reference/api/labels-and-milestones/list-milestones/). |

## Example request

```sh
curl https://api.g1t.sh/repos/flagon-io/hello/milestones/3 \
  -H "Authorization: Bearer $G1T_TOKEN"
```

## Example response

A successful request answers `200` with:

```json
{
  "milestone": {
    "number": 3,
    "title": "Launch",
    "description": "Everything that has to land before the launch on October 14.",
    "due_on": "2026-10-14",
    "state": "open",
    "open_items": 5,
    "closed_items": 12,
    "created_at": "2026-09-20T09:00:00.000Z",
    "updated_at": "2026-10-06T16:12:40.118Z",
    "closed_at": null
  },
  "issues": [
    {
      "id": "iss_01m43shrzpfe49x74ga7sj1c6v",
      "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
      "number": 12,
      "title": "Greeting should name the caller",
      "body": "Take a name from the first argument; fall back to world.",
      "labels": [
        "feature",
        "good first issue"
      ],
      "state": "open",
      "reason": null,
      "resolved_by": null,
      "author": {
        "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
        "username": "syntaqx",
        "display_username": "syntaqx",
        "kind": "user",
        "verified": false,
        "workspaces": []
      },
      "requested_by": null,
      "created_at": "2026-10-01T18:04:11.482Z",
      "updated_at": "2026-10-01T18:09:47.305Z",
      "closed_at": null,
      "pull_count": 0,
      "comment_count": 0,
      "assignees": [
        "syntaqx"
      ],
      "blocked_by": [],
      "queued": false,
      "agent": null,
      "milestone": {
        "number": 3,
        "title": "Launch"
      }
    }
  ],
  "pulls": [
    {
      "id": "pr_01m43smh3vexsr5pmp60qwv0vs",
      "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
      "number": 14,
      "issue": 12,
      "title": "Greeting should name the caller",
      "body": "Reads a name from the first argument. `hello ana` prints \"Hello, ana!\".",
      "agent": "claude-code",
      "runtime": "external",
      "status": "open",
      "fork": {
        "namespace": "pulls",
        "name": "pr_01m43smh3vexsr5pmp60qwv0vs"
      },
      "fork_repo_id": "rep_01m43smh5xd7aw2kq9tv0b4c8e",
      "branch": null,
      "head_commit": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
      "merge_base": null,
      "merged_by": null,
      "merged_at": null,
      "superseded_by": null,
      "check_status": "passed",
      "files": [
        {
          "path": "src/main.rs",
          "additions": 6,
          "deletions": 2
        }
      ],
      "assignees": [],
      "reviewers": [
        "ana"
      ],
      "labels": [],
      "milestone": {
        "number": 3,
        "title": "Launch"
      },
      "base": "main",
      "author": {
        "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
        "username": "syntaqx",
        "display_username": "syntaqx",
        "kind": "user",
        "verified": false,
        "workspaces": []
      },
      "requested_by": null,
      "created_at": "2026-10-01T18:20:02.117Z",
      "updated_at": "2026-10-01T18:35:44.902Z",
      "confidence": null
    }
  ]
}
```

## Errors

A failed request answers with one of these statuses and a body like `{"error": {"code": "not_found", "message": "Repository not found."}}`. See [errors](/reference/api/#errors).

| Status | Code | When |
| --- | --- | --- |
| 401 | `unauthenticated` | A token is required, or the one sent is not valid. |
| 403 | `forbidden` | The token is valid but not allowed to do this, such as a member-only change or an agent token outside its repository. |
| 404 | `not_found` | It does not exist, or you cannot see it. |
| 422 | `invalid` | The input is not valid. `message` says which field and why. |
