README.md 19,7 КБ
Newer Older
Evan Read's avatar
Evan Read включено в состав коммита
1
# API Docs
Nihad Abbasov's avatar
Nihad Abbasov включено в состав коммита
2

Evan Read's avatar
Evan Read включено в состав коммита
3
Automate GitLab via a simple and powerful API.
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
4

Evan Read's avatar
Evan Read включено в состав коммита
5
6
The main GitLab API is a [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) API. Therefore, documentation in this section assumes knowledge of REST concepts.

Marcel Amirault's avatar
Marcel Amirault включено в состав коммита
7
## Available API resources
Evan Read's avatar
Evan Read включено в состав коммита
8

Evan Read's avatar
Evan Read включено в состав коммита
9
For a list of the available resources and their endpoints, see
Marcel Amirault's avatar
Marcel Amirault включено в состав коммита
10
[API resources](api_resources.md).
Evan Read's avatar
Evan Read включено в состав коммита
11

Marcel Amirault's avatar
Marcel Amirault включено в состав коммита
12
## SCIM **(SILVER ONLY)**
Marcel Amirault's avatar
Marcel Amirault включено в состав коммита
13
14
15
16

[GitLab.com Silver and above](https://about.gitlab.com/pricing/) provides an [SCIM API](scim.md) that implements [the RFC7644 protocol](https://tools.ietf.org/html/rfc7644) and provides
the `/Users` endpoint. The base URL is: `/api/scim/v2/groups/:group_path/Users/`.

Jacob Schatz's avatar
Jacob Schatz включено в состав коммита
17
18
## Road to GraphQL

Evan Read's avatar
Evan Read включено в состав коммита
19
20
21
22
[GraphQL](graphql/index.md) is available in GitLab, which will
allow deprecation of controller-specific endpoints.

GraphQL has a number of benefits:
Nick Thomas's avatar
Nick Thomas включено в состав коммита
23
24

1. We avoid having to maintain two different APIs.
Evan Read's avatar
Evan Read включено в состав коммита
25
26
1. Callers of the API can request only what they need.
1. It is versioned by default.
Nick Thomas's avatar
Nick Thomas включено в состав коммита
27
28
29
30
31
32
33
34

It will co-exist with the current v4 REST API. If we have a v5 API, this should
be a compatibility layer on top of GraphQL.

Although there were some patenting and licensing concerns with GraphQL, these
have been resolved to our satisfaction by the relicensing of the reference
implementations under MIT, and the use of the OWF license for the GraphQL
specification.
Jacob Schatz's avatar
Jacob Schatz включено в состав коммита
35

Evan Read's avatar
Evan Read включено в состав коммита
36
## Compatibility guidelines
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
37
38

The HTTP API is versioned using a single number, the current one being 4. This
Evan Read's avatar
Evan Read включено в состав коммита
39
number symbolizes the same as the major version number as described by
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
40
41
[SemVer](https://semver.org/). This mean that backward incompatible changes
will require this version number to change. However, the minor version is
Francisco Javier López's avatar
Francisco Javier López включено в состав коммита
42
not explicit. This allows for a stable API endpoint, but also means new
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
43
44
45
features can be added to the API in the same version number.

New features and bug fixes are released in tandem with a new GitLab, and apart
Bruce Szalwinski's avatar
Bruce Szalwinski включено в состав коммита
46
from incidental patch and security releases, are released on the 22nd of each
Francisco Javier López's avatar
Francisco Javier López включено в состав коммита
47
48
49
50
month. Backward incompatible changes (e.g. endpoints removal, parameters
removal etc.), as well as removal of entire API versions are done in tandem
with a major point release of GitLab itself. All deprecations and changes
between two versions should be listed in the documentation. For the changes
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
51
52
between v3 and v4; please read the [v3 to v4 documentation](v3_to_v4.md)

Fabio Busatto's avatar
Fabio Busatto включено в состав коммита
53
### Current status
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
54

Francisco Javier López's avatar
Francisco Javier López включено в состав коммита
55
Currently only API version v4 is available. Version v3 was removed in
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
56
57
[GitLab 11.0](https://gitlab.com/gitlab-org/gitlab-ce/issues/36819).

AJ Jordan's avatar
AJ Jordan включено в состав коммита
58
59
60
## Basic usage

API requests should be prefixed with `api` and the API version. The API version
AJ Jordan's avatar
AJ Jordan включено в состав коммита
61
62
is defined in [`lib/api.rb`][lib-api-url]. For example, the root of the v4 API
is at `/api/v4`.
AJ Jordan's avatar
AJ Jordan включено в состав коммита
63

Douwe Maan's avatar
Douwe Maan включено в состав коммита
64
Example of a valid API request using cURL:
AJ Jordan's avatar
AJ Jordan включено в состав коммита
65
66

```shell
Douwe Maan's avatar
Douwe Maan включено в состав коммита
67
curl "https://gitlab.example.com/api/v4/projects"
AJ Jordan's avatar
AJ Jordan включено в состав коммита
68
69
70
71
72
```

The API uses JSON to serialize data. You don't need to specify `.json` at the
end of an API URL.

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
73
## Authentication
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
74

Douwe Maan's avatar
Douwe Maan включено в состав коммита
75
76
Most API requests require authentication, or will only return public data when
authentication is not provided. For
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
77
78
those cases where it is not required, this will be mentioned in the documentation
for each individual endpoint. For example, the [`/projects/:id` endpoint](projects.md).
dosire's avatar
dosire включено в состав коммита
79

Ben Bodenmiller's avatar
Ben Bodenmiller включено в состав коммита
80
There are four ways to authenticate with the GitLab API:
dosire's avatar
dosire включено в состав коммита
81

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
82
83
1. [OAuth2 tokens](#oauth2-tokens)
1. [Personal access tokens](#personal-access-tokens)
Douwe Maan's avatar
Douwe Maan включено в состав коммита
84
1. [Session cookie](#session-cookie)
Ben Bodenmiller's avatar
Ben Bodenmiller включено в состав коммита
85
1. [GitLab CI job token](#gitlab-ci-job-token-premium) **(PREMIUM)**
Douwe Maan's avatar
Douwe Maan включено в состав коммита
86
87

For admins who want to authenticate with the API as a specific user, or who want to build applications or scripts that do so, two options are available:
Evan Read's avatar
Evan Read включено в состав коммита
88

Douwe Maan's avatar
Douwe Maan включено в состав коммита
89
1. [Impersonation tokens](#impersonation-tokens)
Evan Read's avatar
Evan Read включено в состав коммита
90
1. [Sudo](#sudo)
Nihad Abbasov's avatar
Nihad Abbasov включено в состав коммита
91

Nick Thomas's avatar
Nick Thomas включено в состав коммита
92
93
If authentication information is invalid or omitted, an error message will be
returned with status code `401`:
Nihad Abbasov's avatar
Nihad Abbasov включено в состав коммита
94
95
96
97
98
99
100

```json
{
  "message": "401 Unauthorized"
}
```

Douwe Maan's avatar
Douwe Maan включено в состав коммита
101
### OAuth2 tokens
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
102

Douwe Maan's avatar
Douwe Maan включено в состав коммита
103
104
You can use an [OAuth2 token](oauth2.md) to authenticate with the API by passing it in either the
`access_token` parameter or the `Authorization` header.
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
105

Douwe Maan's avatar
Douwe Maan включено в состав коммита
106
Example of using the OAuth2 token in a parameter:
Nihad Abbasov's avatar
Nihad Abbasov включено в состав коммита
107

Douwe Maan's avatar
Douwe Maan включено в состав коммита
108
109
110
```shell
curl https://gitlab.example.com/api/v4/projects?access_token=OAUTH-TOKEN
```
Timothy Andrew's avatar
Timothy Andrew включено в состав коммита
111

Douwe Maan's avatar
Douwe Maan включено в состав коммита
112
Example of using the OAuth2 token in a header:
Felix Gilcher's avatar
Felix Gilcher включено в состав коммита
113

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
114
```shell
Robert Schilling's avatar
Robert Schilling включено в состав коммита
115
curl --header "Authorization: Bearer OAUTH-TOKEN" https://gitlab.example.com/api/v4/projects
Felix Gilcher's avatar
Felix Gilcher включено в состав коммита
116
117
```

Douwe Maan's avatar
Douwe Maan включено в состав коммита
118
Read more about [GitLab as an OAuth2 provider](oauth2.md).
Timothy Andrew's avatar
Timothy Andrew включено в состав коммита
119

Douwe Maan's avatar
Douwe Maan включено в состав коммита
120
### Personal access tokens
Nihad Abbasov's avatar
Nihad Abbasov включено в состав коммита
121

Douwe Maan's avatar
Douwe Maan включено в состав коммита
122
123
You can use a [personal access token][pat] to authenticate with the API by passing it in either the
`private_token` parameter or the `Private-Token` header.
Valery Sizov's avatar
Valery Sizov включено в состав коммита
124

Douwe Maan's avatar
Douwe Maan включено в состав коммита
125
Example of using the personal access token in a parameter:
Valery Sizov's avatar
Valery Sizov включено в состав коммита
126

Douwe Maan's avatar
Douwe Maan включено в состав коммита
127
```shell
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
128
curl https://gitlab.example.com/api/v4/projects?private_token=<your_access_token>
Douwe Maan's avatar
Douwe Maan включено в состав коммита
129
130
131
```

Example of using the personal access token in a header:
Timothy Andrew's avatar
Timothy Andrew включено в состав коммита
132

Douwe Maan's avatar
Douwe Maan включено в состав коммита
133
```shell
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
134
curl --header "Private-Token: <your_access_token>" https://gitlab.example.com/api/v4/projects
Douwe Maan's avatar
Douwe Maan включено в состав коммита
135
```
Timothy Andrew's avatar
Timothy Andrew включено в состав коммита
136

Steve Abrams's avatar
Steve Abrams включено в состав коммита
137
138
139
140
141
142
You can also use personal access tokens with OAuth-compliant headers:

```shell
curl --header "Authorization: Bearer <your_access_token>" https://gitlab.example.com/api/v4/projects
```

Douwe Maan's avatar
Douwe Maan включено в состав коммита
143
144
145
146
147
148
149
Read more about [personal access tokens][pat].

### Session cookie

When signing in to the main GitLab application, a `_gitlab_session` cookie is
set. The API will use this cookie for authentication if it is present, but using
the API to generate a new session cookie is currently not supported.
Timothy Andrew's avatar
Timothy Andrew включено в состав коммита
150

Douwe Maan's avatar
Douwe Maan включено в состав коммита
151
152
153
The primary user of this authentication method is the web frontend of GitLab itself,
which can use the API as the authenticated user to get a list of their projects,
for example, without needing to explicitly pass an access token.
Nick Thomas's avatar
Nick Thomas включено в состав коммита
154

Ben Bodenmiller's avatar
Ben Bodenmiller включено в состав коммита
155
156
157
158
159
### GitLab CI job token **(PREMIUM)**

With a few API endpoints you can use a [GitLab CI job token](../user/project/new_ci_build_permissions_model.md#job-token)
to authenticate with the API:

Marcel Amirault's avatar
Marcel Amirault включено в состав коммита
160
161
- [Get job artifacts](jobs.md#get-job-artifacts)
- [Pipeline triggers](pipeline_triggers.md)
Ben Bodenmiller's avatar
Ben Bodenmiller включено в состав коммита
162

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
163
### Impersonation tokens
Valery Sizov's avatar
Valery Sizov включено в состав коммита
164

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
165
> [Introduced][ce-9099] in GitLab 9.0. Needs admin permissions.
Valery Sizov's avatar
Valery Sizov включено в состав коммита
166

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
167
Impersonation tokens are a type of [personal access token][pat]
Douwe Maan's avatar
Douwe Maan включено в состав коммита
168
169
that can only be created by an admin for a specific user. They are a great fit
if you want to build applications or scripts that authenticate with the API as a specific user.
Sebastian Ziebell's avatar
Sebastian Ziebell включено в состав коммита
170

Douwe Maan's avatar
Douwe Maan включено в состав коммита
171
172
173
They are an alternative to directly using the user's password or one of their
personal access tokens, and to using the [Sudo](#sudo) feature, since the user's (or admin's, in the case of Sudo)
password/token may not be known or may change over time.
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
174

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
175
For more information, refer to the
Marcel Amirault's avatar
Marcel Amirault включено в состав коммита
176
[users API](users.md#create-an-impersonation-token) docs.
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
177

Douwe Maan's avatar
Douwe Maan включено в состав коммита
178
179
Impersonation tokens are used exactly like regular personal access tokens, and can be passed in either the
`private_token` parameter or the `Private-Token` header.
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
180

Imre Farkas's avatar
Imre Farkas включено в состав коммита
181
182
183
184
185
#### Disable impersonation

> [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/issues/40385) in GitLab
11.6.

Imre Farkas's avatar
Imre Farkas включено в состав коммита
186
By default, impersonation is enabled. To disable impersonation:
Imre Farkas's avatar
Imre Farkas включено в состав коммита
187
188
189
190
191

**For Omnibus installations**

1. Edit `/etc/gitlab/gitlab.rb`:

Marcel Amirault's avatar
Marcel Amirault включено в состав коммита
192
193
194
   ```ruby
   gitlab_rails['impersonation_enabled'] = false
   ```
Imre Farkas's avatar
Imre Farkas включено в состав коммита
195
196
197
198
199
200
201
202
203
204

1. Save the file and [reconfigure](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
   GitLab for the changes to take effect.

To re-enable impersonation, remove this configuration and reconfigure GitLab.

**For installations from source**

1. Edit `config/gitlab.yml`:

Marcel Amirault's avatar
Marcel Amirault включено в состав коммита
205
206
207
208
   ```yaml
   gitlab:
     impersonation_enabled: false
   ```
Imre Farkas's avatar
Imre Farkas включено в состав коммита
209
210
211
212
213
214

1. Save the file and [restart](../administration/restart_gitlab.md#installations-from-source)
   GitLab for the changes to take effect.

To re-enable impersonation, remove this configuration and restart GitLab.

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
215
### Sudo
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
216

Evan Read's avatar
Evan Read включено в состав коммита
217
NOTE: **Note:**
Evan Read's avatar
Evan Read включено в состав коммита
218
Only available to [administrators](../user/permissions.md).
Ciro Santilli's avatar
Ciro Santilli включено в состав коммита
219

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
220
All API requests support performing an API call as if you were another user,
Douwe Maan's avatar
Douwe Maan включено в состав коммита
221
222
223
provided you are authenticated as an administrator with an OAuth or Personal Access Token that has the `sudo` scope.

You need to pass the `sudo` parameter either via query string or a header with an ID/username of
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
224
the user you want to perform the operation as. If passed as a header, the
Francisco Javier López's avatar
Francisco Javier López включено в состав коммита
225
header name must be `Sudo`.
William George's avatar
William George включено в состав коммита
226
227
228

NOTE: **Note:**
Usernames are case insensitive.
Sebastian Ziebell's avatar
Sebastian Ziebell включено в состав коммита
229

Douwe Maan's avatar
Douwe Maan включено в состав коммита
230
If a non administrative access token is provided, an error message will
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
231
be returned with status code `403`:
Izaak Alpert's avatar
Izaak Alpert включено в состав коммита
232
233
234

```json
{
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
235
  "message": "403 Forbidden - Must be admin to use sudo"
Izaak Alpert's avatar
Izaak Alpert включено в состав коммита
236
237
238
}
```

Douwe Maan's avatar
Douwe Maan включено в состав коммита
239
240
241
242
243
244
245
246
247
248
249
If an access token without the `sudo` scope is provided, an error message will
be returned with status code `403`:

```json
{
  "error": "insufficient_scope",
  "error_description": "The request requires higher privileges than provided by the access token.",
  "scope": "sudo"
}
```

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
250
If the sudo user ID or username cannot be found, an error message will be
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
251
returned with status code `404`:
Izaak Alpert's avatar
Izaak Alpert включено в состав коммита
252
253
254

```json
{
Douwe Maan's avatar
Douwe Maan включено в состав коммита
255
  "message": "404 User with ID or username '123' Not Found"
Izaak Alpert's avatar
Izaak Alpert включено в состав коммита
256
257
258
}
```

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
259
260
Example of a valid API call and a request using cURL with sudo request,
providing a username:
Izaak Alpert's avatar
Izaak Alpert включено в состав коммита
261

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
262
```
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
263
GET /projects?private_token=<your_access_token>&sudo=username
Izaak Alpert's avatar
Izaak Alpert включено в состав коммита
264
```
Ciro Santilli's avatar
Ciro Santilli включено в состав коммита
265

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
266
```shell
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
267
curl --header "Private-Token: <your_access_token>" --header "Sudo: username" "https://gitlab.example.com/api/v4/projects"
Izaak Alpert's avatar
Izaak Alpert включено в состав коммита
268
269
```

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
270
271
Example of a valid API call and a request using cURL with sudo request,
providing an ID:
Izaak Alpert's avatar
Izaak Alpert включено в состав коммита
272

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
273
```
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
274
GET /projects?private_token=<your_access_token>&sudo=23
Izaak Alpert's avatar
Izaak Alpert включено в состав коммита
275
```
Ciro Santilli's avatar
Ciro Santilli включено в состав коммита
276

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
277
```shell
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
278
curl --header "Private-Token: <your_access_token>" --header "Sudo: 23" "https://gitlab.example.com/api/v4/projects"
Izaak Alpert's avatar
Izaak Alpert включено в состав коммита
279
```
Sebastian Ziebell's avatar
Sebastian Ziebell включено в состав коммита
280

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
281
282
283
284
285
286
287
288
289
290
291
292
## Status codes

The API is designed to return different status codes according to context and
action. This way, if a request results in an error, the caller is able to get
insight into what went wrong.

The following table gives an overview of how the API functions generally behave.

| Request type | Description |
| ------------ | ----------- |
| `GET`   | Access one or more resources and return the result as JSON. |
| `POST`  | Return `201 Created` if the resource is successfully created and return the newly created resource as JSON. |
Robert Schilling's avatar
Robert Schilling включено в состав коммита
293
| `GET` / `PUT` | Return `200 OK` if the resource is accessed or modified successfully. The (modified) result is returned as JSON. |
Pascal Borreli's avatar
Pascal Borreli включено в состав коммита
294
| `DELETE` | Returns `204 No Content` if the resource was deleted successfully. |
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309

The following table shows the possible return codes for API requests.

| Return values | Description |
| ------------- | ----------- |
| `200 OK` | The `GET`, `PUT` or `DELETE` request was successful, the resource(s) itself is returned as JSON. |
| `204 No Content` | The server has successfully fulfilled the request and that there is no additional content to send in the response payload body. |
| `201 Created` | The `POST` request was successful and the resource is returned as JSON. |
| `304 Not Modified` | Indicates that the resource has not been modified since the last request. |
| `400 Bad Request` | A required attribute of the API request is missing, e.g., the title of an issue is not given. |
| `401 Unauthorized` | The user is not authenticated, a valid [user token](#authentication) is necessary. |
| `403 Forbidden` | The request is not allowed, e.g., the user is not allowed to delete a project. |
| `404 Not Found` | A resource could not be accessed, e.g., an ID for a resource could not be found. |
| `405 Method Not Allowed` | The request is not supported. |
| `409 Conflict` | A conflicting resource already exists, e.g., creating a project with a name that already exists. |
Robert Schilling's avatar
Robert Schilling включено в состав коммита
310
| `412` | Indicates the request was denied. May happen if the `If-Unmodified-Since` header is provided when trying to delete a resource, which was modified in between. |
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
311
312
| `422 Unprocessable` | The entity could not be processed. |
| `500 Server Error` | While handling the request something went wrong server-side. |
Tiago Botelho's avatar
Tiago Botelho включено в состав коммита
313

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
314
## Pagination
Nihad Abbasov's avatar
Nihad Abbasov включено в состав коммита
315

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
316
317
Sometimes the returned result will span across many pages. When listing
resources you can pass the following parameters:
Nihad Abbasov's avatar
Nihad Abbasov включено в состав коммита
318

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
319
320
| Parameter | Description |
| --------- | ----------- |
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
321
322
| `page`    | Page number (default: `1`) |
| `per_page`| Number of items to list per page (default: `20`, max: `100`) |
Nihad Abbasov's avatar
Nihad Abbasov включено в состав коммита
323

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
324
325
326
In the example below, we list 50 [namespaces](namespaces.md) per page.

```bash
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
327
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/namespaces?per_page=50
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
328
329
```

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
330
### Pagination Link header
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
331

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
332
[Link headers](http://www.w3.org/wiki/LinkHeader) are sent back with each
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
333
334
response. They have `rel` set to prev/next/first/last and contain the relevant
URL. Please use these links instead of generating your own URLs.
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
335

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
336
337
338
339
340
In the cURL example below, we limit the output to 3 items per page (`per_page=3`)
and we request the second page (`page=2`) of [comments](notes.md) of the issue
with ID `8` which belongs to the project with ID `8`:

```bash
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
341
curl --head --header "PRIVATE-TOKEN: <your_access_token>" https://gitlab.example.com/api/v4/projects/8/issues/8/notes?per_page=3&page=2
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
342
343
```

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
344
345
346
347
348
349
350
351
The response will then be:

```
HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Length: 1103
Content-Type: application/json
Date: Mon, 18 Jan 2016 09:43:18 GMT
Robert Schilling's avatar
Robert Schilling включено в состав коммита
352
Link: <https://gitlab.example.com/api/v4/projects/8/issues/8/notes?page=1&per_page=3>; rel="prev", <https://gitlab.example.com/api/v4/projects/8/issues/8/notes?page=3&per_page=3>; rel="next", <https://gitlab.example.com/api/v4/projects/8/issues/8/notes?page=1&per_page=3>; rel="first", <https://gitlab.example.com/api/v4/projects/8/issues/8/notes?page=3&per_page=3>; rel="last"
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
353
354
355
356
357
358
359
360
361
362
Status: 200 OK
Vary: Origin
X-Next-Page: 3
X-Page: 2
X-Per-Page: 3
X-Prev-Page: 1
X-Request-Id: 732ad4ee-9870-4866-a199-a9db0cde3c86
X-Runtime: 0.108688
X-Total: 8
X-Total-Pages: 3
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
363
364
365
366
```

### Other pagination headers

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
367
368
369
370
371
372
373
374
375
376
Additional pagination headers are also sent back.

| Header | Description |
| ------ | ----------- |
| `X-Total`       | The total number of items |
| `X-Total-Pages` | The total number of pages |
| `X-Per-Page`    | The number of items per page |
| `X-Page`        | The index of the current page (starting at 1) |
| `X-Next-Page`   | The index of the next page |
| `X-Prev-Page`   | The index of the previous page |
dosire's avatar
dosire включено в состав коммита
377

Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
378
379
CAUTION: **Caution:**
For performance reasons since
Cynthia Ng's avatar
Cynthia Ng включено в состав коммита
380
[GitLab 11.8](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/23931)
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
381
382
383
384
385
and **behind the `api_kaminari_count_with_limit`
[feature flag](../development/feature_flags.md)**, if the number of resources is
more than 10,000, the `X-Total` and `X-Total-Pages` headers as well as the
`rel="last"` `Link` are not present in the response headers.

Dawid Goslawski's avatar
Dawid Goslawski включено в состав коммита
386
387
## Namespaced path encoding

Nathan Friend's avatar
Nathan Friend включено в состав коммита
388
If using namespaced API calls, make sure that the `NAMESPACE/PROJECT_PATH` is
Dawid Goslawski's avatar
Dawid Goslawski включено в состав коммита
389
390
URL-encoded.

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
391
For example, `/` is represented by `%2F`:
Dawid Goslawski's avatar
Dawid Goslawski включено в состав коммита
392
393

```
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
394
395
396
GET /api/v4/projects/diaspora%2Fdiaspora
```

Nathan Friend's avatar
Nathan Friend включено в состав коммита
397
398
NOTE: **Note:**
A project's **path** is not necessarily the same as its **name**.  A
Nourdin el Bacha's avatar
Nourdin el Bacha включено в состав коммита
399
project's path can be found in the project's URL or in the project's settings
Nathan Friend's avatar
Nathan Friend включено в состав коммита
400
401
under **General > Advanced > Change path**.

Athar Hameed's avatar
Athar Hameed включено в состав коммита
402
## Branches and tags name encoding
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
403
404
405
406
407
408
409
410

If your branch or tag contains a `/`, make sure the branch/tag name is
URL-encoded.

For example, `/` is represented by `%2F`:

```
GET /api/v4/projects/1/branches/my%2Fbranch/commits
Dawid Goslawski's avatar
Dawid Goslawski включено в состав коммита
411
412
```

Athar Hameed's avatar
Athar Hameed включено в состав коммита
413
414
## Encoding API parameters of `array` and `hash` types

Alexander's avatar
Alexander включено в состав коммита
415
We can call the API with `array` and `hash` types parameters as shown below:
Athar Hameed's avatar
Athar Hameed включено в состав коммита
416
417
418
419
420

### `array`

`import_sources` is a parameter of type `array`:

Alexander's avatar
Alexander включено в состав коммита
421
```bash
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
422
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
Athar Hameed's avatar
Athar Hameed включено в состав коммита
423
424
-d "import_sources[]=github" \
-d "import_sources[]=bitbucket" \
Nourdin el Bacha's avatar
Nourdin el Bacha включено в состав коммита
425
https://gitlab.example.com/api/v4/some_endpoint
Athar Hameed's avatar
Athar Hameed включено в состав коммита
426
427
428
429
430
431
```

### `hash`

`override_params` is a parameter of type `hash`:

Alexander's avatar
Alexander включено в состав коммита
432
```bash
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
433
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
Athar Hameed's avatar
Athar Hameed включено в состав коммита
434
435
436
437
438
439
440
441
--form "namespace=email" \
--form "path=impapi" \
--form "file=@/path/to/somefile.txt"
--form "override_params[visibility]=private" \
--form "override_params[some_other_param]=some_value" \
https://gitlab.example.com/api/v4/projects/import
```

Alexander's avatar
Alexander включено в состав коммита
442
443
444
445
446
447
448
449
450
451
452
453
454
455
### Array of hashes

`variables` is a parameter of type `array` containing hash key/value pairs `[{ 'key' => 'UPLOAD_TO_S3', 'value' => 'true' }]`:

```bash
curl --globoff --request POST --header "PRIVATE-TOKEN: ********************" \
"https://gitlab.example.com/api/v4/projects/169/pipeline?ref=master&variables[][key]=VAR1&variables[][value]=hello&variables[][key]=VAR2&variables[][value]=world"

curl --request POST --header "PRIVATE-TOKEN: ********************" \
--header "Content-Type: application/json" \
--data '{ "ref": "master", "variables": [ {"key": "VAR1", "value": "hello"}, {"key": "VAR2", "value": "world"} ] }' \
"https://gitlab.example.com/api/v4/projects/169/pipeline"
```

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
456
## `id` vs `iid`
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
457

Evan Read's avatar
Evan Read включено в состав коммита
458
 Some resources have two similarly-named fields. For example, [issues](issues.md), [merge requests](merge_requests.md), and [project milestones](merge_requests.md). The fields are:
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
459

Evan Read's avatar
Evan Read включено в состав коммита
460
461
- `id`: ID that is unique across all projects.
- `iid`: additional, internal ID that is unique in the scope of a single project.
Ciro Santilli's avatar
Ciro Santilli включено в состав коммита
462

Evan Read's avatar
Evan Read включено в состав коммита
463
464
NOTE: **Note:**
The `iid` is displayed in the web UI.
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
465

Evan Read's avatar
Evan Read включено в состав коммита
466
If a resource has the `iid` field and the `id` field, the `iid` field is usually used instead of `id` to fetch the resource.
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
467

Evan Read's avatar
Evan Read включено в состав коммита
468
For example, suppose a project with `id: 42` has an issue with `id: 46` and `iid: 5`. In this case:
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
469

Evan Read's avatar
Evan Read включено в состав коммита
470
471
- A valid API call to retrieve the issue is  `GET /projects/42/issues/5`
- An invalid API call to retrieve the issue is `GET /projects/42/issues/46`.
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
472

Evan Read's avatar
Evan Read включено в состав коммита
473
NOTE: **Note:**
Evan Read's avatar
Evan Read включено в состав коммита
474
Not all resources with the `iid` field are fetched by `iid`. For guidance on which field to use, see the documentation for the specific resource.
jubianchi's avatar
jubianchi включено в состав коммита
475
476
477

## Data validation and error reporting

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
478
When working with the API you may encounter validation errors, in which case
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
479
480
the API will answer with an HTTP `400` status.

jubianchi's avatar
jubianchi включено в состав коммита
481
482
Such errors appear in two cases:

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
483
- A required attribute of the API request is missing, e.g., the title of an
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
484
  issue is not given
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
485
- An attribute did not pass the validation, e.g., user bio is too long
jubianchi's avatar
jubianchi включено в состав коммита
486
487
488

When an attribute is missing, you will get something like:

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
489
```
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
490
491
492
493
494
495
HTTP/1.1 400 Bad Request
Content-Type: application/json
{
    "message":"400 (Bad request) \"title\" not given"
}
```
jubianchi's avatar
jubianchi включено в состав коммита
496

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
497
498
When a validation error occurs, error messages will be different. They will
hold all details of validation errors:
Job van der Voort's avatar
Job van der Voort включено в состав коммита
499

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
500
```
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
501
502
503
504
505
506
507
HTTP/1.1 400 Bad Request
Content-Type: application/json
{
    "message": {
        "bio": [
            "is too long (maximum is 255 characters)"
        ]
jubianchi's avatar
jubianchi включено в состав коммита
508
    }
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
509
510
}
```
jubianchi's avatar
jubianchi включено в состав коммита
511

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
512
513
This makes error messages more machine-readable. The format can be described as
follows:
jubianchi's avatar
jubianchi включено в состав коммита
514

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
515
516
517
518
519
520
521
522
523
```json
{
    "message": {
        "<property-name>": [
            "<error-message>",
            "<error-message>",
            ...
        ],
        "<embed-entity>": {
jubianchi's avatar
jubianchi включено в состав коммита
524
525
526
527
528
529
530
            "<property-name>": [
                "<error-message>",
                "<error-message>",
                ...
            ],
        }
    }
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
531
532
533
}
```

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
534
## Unknown route
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
535

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
536
When you try to access an API URL that does not exist you will receive 404 Not Found.
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
537
538

```
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
539
HTTP/1.1 404 Not Found
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
540
Content-Type: application/json
Imre Farkas's avatar
Imre Farkas включено в состав коммита
541
{
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
542
    "error": "404 Not Found"
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
543
544
545
}
```

Stan Hu's avatar
Stan Hu включено в состав коммита
546
547
548
## Encoding `+` in ISO 8601 dates

If you need to include a `+` in a query parameter, you may need to use `%2B` instead due
Cynthia Ng's avatar
Cynthia Ng включено в состав коммита
549
to a [W3 recommendation](http://www.w3.org/Addressing/URL/4_URI_Recommentations.html) that
Stan Hu's avatar
Stan Hu включено в состав коммита
550
551
552
553
554
555
556
557
558
559
560
561
562
causes a `+` to be interpreted as a space. For example, in an ISO 8601 date, you may want to pass
a time in Mountain Standard Time, such as:

```
2017-10-17T23:11:13.000+05:30
```

The correct encoding for the query parameter would be:

```
2017-10-17T23:11:13.000%2B05:30
```

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
563
564
565
## Clients

There are many unofficial GitLab API Clients for most of the popular
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
566
programming languages. Visit the [GitLab website] for a complete list.
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
567

Michael Kozono's avatar
Michael Kozono включено в состав коммита
568
569
## Rate limits

Russell Dickenson's avatar
Russell Dickenson включено в состав коммита
570
For administrator documentation on rate limit settings, see
Michael Kozono's avatar
Michael Kozono включено в состав коммита
571
572
[Rate limits](../security/rate_limits.md). To find the settings that are
specifically used by GitLab.com, see
Russell Dickenson's avatar
Russell Dickenson включено в состав коммита
573
[GitLab.com-specific rate limits](../user/gitlab_com/index.md#gitlabcom-specific-rate-limits).
Michael Kozono's avatar
Michael Kozono включено в состав коммита
574

Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
575
576
[GitLab website]: https://about.gitlab.com/applications/#api-clients "Clients using the GitLab API"
[lib-api-url]: https://gitlab.com/gitlab-org/gitlab-ce/tree/master/lib/api/api.rb
Timothy Andrew's avatar
Timothy Andrew включено в состав коммита
577
[ce-3749]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/3749
Timothy Andrew's avatar
Timothy Andrew включено в состав коммита
578
[ce-5951]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/5951
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
579
[ce-9099]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/9099
Achilleas Pipinellis's avatar
Achilleas Pipinellis включено в состав коммита
580
[pat]: ../user/profile/personal_access_tokens.md