2020-07-30 08:09:33 -04:00
---
stage: Create
group: Source Code
2020-11-26 01:09:20 -05:00
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
2020-07-30 08:09:33 -04:00
type: reference, api
---
2021-02-09 13:09:59 -05:00
# Repository files API **(FREE)**
2014-05-27 08:12:15 -04:00
2021-09-21 20:09:28 -04:00
You can fetch, create, update, and delete files in your repository with this API.
You can also [configure rate limits ](../user/admin_area/settings/files_api_rate_limits.md )
for this API.
2014-02-18 05:27:02 -05:00
2021-09-21 20:09:28 -04:00
## Available scopes for personal access tokens
2014-02-18 05:27:02 -05:00
2018-12-04 09:32:06 -05:00
The different scopes available using [personal access tokens ](../user/profile/personal_access_tokens.md ) are depicted
2018-12-04 05:57:36 -05:00
in the following table.
| Scope | Description |
| ----- | ----------- |
2018-12-04 09:32:06 -05:00
| `read_repository` | Allows read-access to the repository files. |
| `api` | Allows read-write access to the repository files. |
2018-12-04 05:57:36 -05:00
2014-02-18 05:27:02 -05:00
## Get file from repository
2016-12-16 12:58:24 -05:00
Allows you to receive information about file in repository like name, size,
2021-07-28 17:08:53 -04:00
content. File content is Base64 encoded. This endpoint can be accessed
2016-12-16 12:58:24 -05:00
without authentication if the repository is publicly accessible.
2014-02-18 05:27:02 -05:00
2020-02-27 22:09:04 -05:00
```plaintext
2017-03-01 15:22:29 -05:00
GET /projects/:id/repository/files/:file_path
2014-02-18 05:27:02 -05:00
```
2020-01-30 10:09:15 -05:00
```shell
2020-05-27 20:08:37 -04:00
curl --header "PRIVATE-TOKEN: < your_access_token > " "https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fmodels%2Fkey%2Erb?ref=master"
2016-07-24 18:58:34 -04:00
```
2014-02-18 05:27:02 -05:00
Example response:
```json
{
"file_name": "key.rb",
"file_path": "app/models/key.rb",
"size": 1476,
"encoding": "base64",
"content": "IyA9PSBTY2hlbWEgSW5mb3...",
2018-06-28 02:10:51 -04:00
"content_sha256": "4c294617b60715c1d218e61164a3abd4808a4284cbc30e6728a01ad9aada4481",
2014-02-18 05:27:02 -05:00
"ref": "master",
"blob_id": "79f7bbd25901e8334750839545a9bd021f0e4c83",
2015-11-02 07:14:38 -05:00
"commit_id": "d5a3ff139356ce33e37e73add446f16869741b50",
"last_commit_id": "570e7b2abdd848b95f2f578043fc23bd6f6fd24d"
2014-02-18 05:27:02 -05:00
}
```
Parameters:
2020-04-30 11:09:46 -04:00
- `file_path` (required) - URL encoded full path to new file. Ex. lib%2Fclass%2Erb
2017-03-01 15:22:29 -05:00
- `ref` (required) - The name of branch, tag or commit
2020-12-04 16:09:29 -05:00
NOTE:
2020-06-02 14:08:32 -04:00
`blob_id` is the blob SHA, see [repositories - Get a blob from repository ](repositories.md#get-a-blob-from-repository )
2018-06-28 02:10:51 -04:00
In addition to the `GET` method, you can also use `HEAD` to get just file metadata.
2020-02-27 22:09:04 -05:00
```plaintext
2018-06-28 02:10:51 -04:00
HEAD /projects/:id/repository/files/:file_path
```
2020-01-30 10:09:15 -05:00
```shell
2020-05-27 20:08:37 -04:00
curl --head --header "PRIVATE-TOKEN: < your_access_token > " "https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fmodels%2Fkey%2Erb?ref=master"
2018-06-28 02:10:51 -04:00
```
Example response:
2020-05-19 23:08:04 -04:00
```plaintext
2018-06-28 02:10:51 -04:00
HTTP/1.1 200 OK
...
X-Gitlab-Blob-Id: 79f7bbd25901e8334750839545a9bd021f0e4c83
X-Gitlab-Commit-Id: d5a3ff139356ce33e37e73add446f16869741b50
X-Gitlab-Content-Sha256: 4c294617b60715c1d218e61164a3abd4808a4284cbc30e6728a01ad9aada4481
X-Gitlab-Encoding: base64
X-Gitlab-File-Name: key.rb
X-Gitlab-File-Path: app/models/key.rb
X-Gitlab-Last-Commit-Id: 570e7b2abdd848b95f2f578043fc23bd6f6fd24d
X-Gitlab-Ref: master
X-Gitlab-Size: 1476
...
```
2019-07-04 07:59:10 -04:00
## Get file blame from repository
2020-04-07 23:09:31 -04:00
Allows you to receive blame information. Each blame range contains lines and corresponding commit information.
2019-07-04 07:59:10 -04:00
2020-02-27 22:09:04 -05:00
```plaintext
2019-07-04 07:59:10 -04:00
GET /projects/:id/repository/files/:file_path/blame
```
2020-01-30 10:09:15 -05:00
```shell
2020-05-27 20:08:37 -04:00
curl --header "PRIVATE-TOKEN: < your_access_token > " "https://gitlab.example.com/api/v4/projects/13083/repository/files/path%2Fto%2Ffile.rb/blame?ref=master"
2019-07-04 07:59:10 -04:00
```
Example response:
```json
[
{
"commit": {
"id": "d42409d56517157c48bf3bd97d3f75974dde19fb",
"message": "Add feature\n\nalso fix bug\n",
"parent_ids": [
"cc6e14f9328fa6d7b5a0d3c30dc2002a3f2a3822"
],
"authored_date": "2015-12-18T08:12:22.000Z",
"author_name": "John Doe",
"author_email": "john.doe@example.com",
"committed_date": "2015-12-18T08:12:22.000Z",
"committer_name": "John Doe",
"committer_email": "john.doe@example.com"
},
"lines": [
"require 'fileutils'",
"require 'open3'",
""
]
},
...
]
```
Parameters:
2020-04-30 11:09:46 -04:00
- `file_path` (required) - URL encoded full path to new file. Ex. lib%2Fclass%2Erb
2019-07-04 07:59:10 -04:00
- `ref` (required) - The name of branch, tag or commit
2020-12-04 16:09:29 -05:00
NOTE:
2019-07-04 07:59:10 -04:00
`HEAD` method return just file metadata as in [Get file from repository ](repository_files.md#get-file-from-repository ).
2020-01-30 10:09:15 -05:00
```shell
2020-05-27 20:08:37 -04:00
curl --head --header "PRIVATE-TOKEN: < your_access_token > " "https://gitlab.example.com/api/v4/projects/13083/repository/files/path%2Fto%2Ffile.rb/blame?ref=master"
2019-07-04 07:59:10 -04:00
```
Example response:
2020-05-19 23:08:04 -04:00
```plaintext
2019-07-04 07:59:10 -04:00
HTTP/1.1 200 OK
...
X-Gitlab-Blob-Id: 79f7bbd25901e8334750839545a9bd021f0e4c83
X-Gitlab-Commit-Id: d5a3ff139356ce33e37e73add446f16869741b50
X-Gitlab-Content-Sha256: 4c294617b60715c1d218e61164a3abd4808a4284cbc30e6728a01ad9aada4481
X-Gitlab-Encoding: base64
X-Gitlab-File-Name: file.rb
X-Gitlab-File-Path: path/to/file.rb
X-Gitlab-Last-Commit-Id: 570e7b2abdd848b95f2f578043fc23bd6f6fd24d
X-Gitlab-Ref: master
X-Gitlab-Size: 1476
...
```
2017-03-01 15:22:29 -05:00
## Get raw file from repository
2020-02-27 22:09:04 -05:00
```plaintext
2017-03-01 15:22:29 -05:00
GET /projects/:id/repository/files/:file_path/raw
```
2020-01-30 10:09:15 -05:00
```shell
2020-05-27 20:08:37 -04:00
curl --header "PRIVATE-TOKEN: < your_access_token > " "https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fmodels%2Fkey%2Erb/raw?ref=master"
2017-03-01 15:22:29 -05:00
```
Parameters:
2021-04-08 14:09:32 -04:00
- `file_path` (required) - URL encoded full path to new file, such as lib%2Fclass%2Erb.
- `ref` (optional) - The name of branch, tag or commit. Default is the `HEAD` of the project.
2014-02-18 05:27:02 -05:00
2020-12-04 16:09:29 -05:00
NOTE:
2018-06-28 02:10:51 -04:00
Like [Get file from repository ](repository_files.md#get-file-from-repository ) you can use `HEAD` to get just file metadata.
2014-02-18 05:27:02 -05:00
## Create new file in repository
2020-03-12 02:09:35 -04:00
This allows you to create a single file. For creating multiple files with a single request see the [commits API ](commits.md#create-a-commit-with-multiple-files-and-actions ).
2018-09-24 03:37:24 -04:00
2020-02-27 22:09:04 -05:00
```plaintext
2017-03-01 15:22:29 -05:00
POST /projects/:id/repository/files/:file_path
2014-02-18 05:27:02 -05:00
```
2020-01-30 10:09:15 -05:00
```shell
2021-06-02 11:09:59 -04:00
curl --request POST --header 'PRIVATE-TOKEN: < your_access_token > ' \
--header "Content-Type: application/json" \
--data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname", \
"content": "some content", "commit_message": "create a new file"}' \
"https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"
2016-07-24 18:58:34 -04:00
```
2014-02-18 05:27:02 -05:00
Example response:
```json
{
2018-01-27 17:02:49 -05:00
"file_path": "app/project.rb",
2017-02-02 09:24:30 -05:00
"branch": "master"
2014-02-18 05:27:02 -05:00
}
```
Parameters:
2020-04-30 11:09:46 -04:00
- `file_path` (required) - URL encoded full path to new file. Ex. lib%2Fclass%2Erb
2017-08-04 13:18:07 -04:00
- `branch` (required) - Name of the branch
- `start_branch` (optional) - Name of the branch to start the new commit from
2021-03-12 16:09:12 -05:00
- `encoding` (optional) - Change encoding to `base64` . Default is `text` .
2016-09-08 11:40:07 -04:00
- `author_email` (optional) - Specify the commit author's email address
- `author_name` (optional) - Specify the commit author's name
2014-04-24 18:48:22 -04:00
- `content` (required) - File content
- `commit_message` (required) - Commit message
2014-02-18 05:27:02 -05:00
## Update existing file in repository
2020-03-12 02:09:35 -04:00
This allows you to update a single file. For updating multiple files with a single request see the [commits API ](commits.md#create-a-commit-with-multiple-files-and-actions ).
2018-09-24 03:37:24 -04:00
2020-02-27 22:09:04 -05:00
```plaintext
2017-03-01 15:22:29 -05:00
PUT /projects/:id/repository/files/:file_path
2014-02-18 05:27:02 -05:00
```
2020-01-30 10:09:15 -05:00
```shell
2021-06-02 11:09:59 -04:00
curl --request PUT --header 'PRIVATE-TOKEN: < your_access_token > ' \
--header "Content-Type: application/json" \
--data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname", \
"content": "some content", "commit_message": "update file"}' \
"https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"
2016-07-24 18:58:34 -04:00
```
2014-02-18 05:27:02 -05:00
Example response:
```json
{
2018-01-27 17:02:49 -05:00
"file_path": "app/project.rb",
2017-02-02 09:24:30 -05:00
"branch": "master"
2014-02-18 05:27:02 -05:00
}
```
Parameters:
2020-04-30 11:09:46 -04:00
- `file_path` (required) - URL encoded full path to new file. Ex. lib%2Fclass%2Erb
2017-08-04 13:18:07 -04:00
- `branch` (required) - Name of the branch
- `start_branch` (optional) - Name of the branch to start the new commit from
2021-03-12 16:09:12 -05:00
- `encoding` (optional) - Change encoding to `base64` . Default is `text` .
2016-09-08 11:40:07 -04:00
- `author_email` (optional) - Specify the commit author's email address
- `author_name` (optional) - Specify the commit author's name
2014-04-24 18:48:22 -04:00
- `content` (required) - New file content
- `commit_message` (required) - Commit message
2020-05-07 02:09:38 -04:00
- `last_commit_id` (optional) - Last known file commit ID
2014-02-18 05:27:02 -05:00
2014-08-06 08:28:22 -04:00
If the commit fails for any reason we return a 400 error with a non-specific
error message. Possible causes for a failed commit include:
2019-02-22 08:17:10 -05:00
2014-08-06 08:28:22 -04:00
- the `file_path` contained `/../` (attempted directory traversal);
2020-02-27 04:09:01 -05:00
- the new file contents were identical to the current file contents. That is, the
2014-08-06 08:28:22 -04:00
user tried to make an empty commit;
- the branch was updated by a Git push while the file edit was in progress.
2021-05-25 14:10:42 -04:00
GitLab Shell has a boolean return code, preventing GitLab from specifying the error.
2014-08-06 11:44:57 -04:00
2014-02-18 05:27:02 -05:00
## Delete existing file in repository
2020-03-12 02:09:35 -04:00
This allows you to delete a single file. For deleting multiple files with a single request, see the [commits API ](commits.md#create-a-commit-with-multiple-files-and-actions ).
2018-09-24 03:37:24 -04:00
2020-02-27 22:09:04 -05:00
```plaintext
2017-03-01 15:22:29 -05:00
DELETE /projects/:id/repository/files/:file_path
2014-02-18 05:27:02 -05:00
```
2020-01-30 10:09:15 -05:00
```shell
2021-06-02 11:09:59 -04:00
curl --request DELETE --header 'PRIVATE-TOKEN: < your_access_token > ' \
--header "Content-Type: application/json" \
--data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname", \
"commit_message": "delete file"}' \
"https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"
2016-07-24 18:58:34 -04:00
```
2014-02-18 05:27:02 -05:00
Parameters:
2020-04-30 11:09:46 -04:00
- `file_path` (required) - URL encoded full path to new file. Ex. lib%2Fclass%2Erb
2017-08-04 13:18:07 -04:00
- `branch` (required) - Name of the branch
- `start_branch` (optional) - Name of the branch to start the new commit from
2016-09-08 11:40:07 -04:00
- `author_email` (optional) - Specify the commit author's email address
- `author_name` (optional) - Specify the commit author's name
2014-04-24 18:48:22 -04:00
- `commit_message` (required) - Commit message
2020-05-07 02:09:38 -04:00
- `last_commit_id` (optional) - Last known file commit ID