Group and project migration by direct transfer API
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
Use this API to migrate groups and projects by using direct transfer.
Prerequisites:
Start a group or project migration
Starts a new group or project migration.
To migrate a project, specify entities[project_entity].
POST /bulk_imports| Attribute | Type | Required | Description |
|---|---|---|---|
configuration | Hash | Yes | The source GitLab instance configuration. |
configuration[url] | String | Yes | Source GitLab instance URL. |
configuration[access_token] | String | Yes | Access token to the source GitLab instance. |
entities | Array | Yes | List of entities to import. |
entities[source_type] | String | Yes | Source entity type. Valid values are group_entity and project_entity. |
entities[source_full_path] | String | Yes | Source full path of the entity to import. For example, gitlab-org/gitlab. |
entities[destination_slug] | String | Yes | Destination slug for the entity. GitLab uses the slug as the URL path to the entity. The name of the imported entity is copied from the name of the source entity and not the slug. |
entities[destination_namespace] | String | Yes | Full path of the destination group namespace for the entity. For project_entity, this value must be an existing group on the destination instance. For group_entity, this value can be an existing group on the destination instance or an empty string "" to create a top-level group on the destination instance (on GitLab Self-Managed and GitLab Dedicated). Personal namespaces are not supported. |
entities[destination_name] | String | No | Deprecated: Use destination_slug instead. Destination slug for the entity. |
entities[migrate_memberships] | Boolean | No | Import user memberships. Defaults to true. |
entities[migrate_projects] | Boolean | No | Also import all nested projects of the group (if source_type is group_entity). Defaults to true. |
curl --request POST \
--url "https://destination-gitlab-instance.example.com/api/v4/bulk_imports" \
--header "PRIVATE-TOKEN: <your_access_token_for_destination_gitlab_instance>" \
--header "Content-Type: application/json" \
--data '{
"configuration": {
"url": "https://source-gitlab-instance.example.com",
"access_token": "<your_access_token_for_source_gitlab_instance>"
},
"entities": [
{
"source_full_path": "source/full/path",
"source_type": "group_entity",
"destination_slug": "destination_slug",
"destination_namespace": "destination/namespace/path"
}
]
}'{
"id": 1,
"status": "created",
"source_type": "gitlab",
"source_url": "https://gitlab.example.com",
"created_at": "2021-06-18T09:45:55.358Z",
"updated_at": "2021-06-18T09:46:27.003Z",
"has_failures": false
}List all group or project migrations
Lists all group or project migrations.
GET /bulk_imports| Attribute | Type | Required | Description |
|---|---|---|---|
per_page | integer | no | Number of records to return per page. |
page | integer | no | Page to retrieve. |
sort | string | no | Return records sorted in asc or desc order by creation date. Default is desc |
status | string | no | Import status. |
The status can be one of the following:
createdstartedfinishedfailed
curl --request GET \
--header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/bulk_imports?per_page=2&page=1"[
{
"id": 1,
"status": "finished",
"source_type": "gitlab",
"source_url": "https://gitlab.example.com",
"created_at": "2021-06-18T09:45:55.358Z",
"updated_at": "2021-06-18T09:46:27.003Z",
"has_failures": false
},
{
"id": 2,
"status": "started",
"source_type": "gitlab",
"source_url": "https://gitlab.example.com",
"created_at": "2021-06-18T09:47:36.581Z",
"updated_at": "2021-06-18T09:47:58.286Z",
"has_failures": false
}
]List all group or project migration entities
Lists all group or project migration entities.
GET /bulk_imports/entities| Attribute | Type | Required | Description |
|---|---|---|---|
per_page | integer | no | Number of records to return per page. |
page | integer | no | Page to retrieve. |
sort | string | no | Return records sorted in asc or desc order by creation date. Default is desc |
status | string | no | Import status. |
The status can be one of the following:
createdstartedfinishedfailed
curl --request GET \
--header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/bulk_imports/entities?per_page=2&page=1&status=started"[
{
"id": 1,
"bulk_import_id": 1,
"status": "finished",
"entity_type": "group",
"source_full_path": "source_group",
"destination_full_path": "destination/full_path",
"destination_name": "destination_slug",
"destination_slug": "destination_slug",
"destination_namespace": "destination_path",
"parent_id": null,
"namespace_id": 1,
"project_id": null,
"created_at": "2021-06-18T09:47:37.390Z",
"updated_at": "2021-06-18T09:47:51.867Z",
"failures": [],
"migrate_projects": true,
"migrate_memberships": true,
"has_failures": false,
"stats": {
"labels": {
"source": 10,
"fetched": 10,
"imported": 10
},
"milestones": {
"source": 10,
"fetched": 10,
"imported": 10
}
}
},
{
"id": 2,
"bulk_import_id": 2,
"status": "failed",
"entity_type": "group",
"source_full_path": "another_group",
"destination_full_path": "destination/full_path",
"destination_name": "destination_slug",
"destination_slug": "another_slug",
"destination_namespace": "another_namespace",
"parent_id": null,
"namespace_id": null,
"project_id": null,
"created_at": "2021-06-24T10:40:20.110Z",
"updated_at": "2021-06-24T10:40:46.590Z",
"failures": [
{
"relation": "group",
"step": "extractor",
"exception_message": "Error!",
"exception_class": "Exception",
"correlation_id_value": "dfcf583058ed4508e4c7c617bd7f0edd",
"created_at": "2021-06-24T10:40:46.495Z",
"pipeline_class": "BulkImports::Groups::Pipelines::GroupPipeline",
"pipeline_step": "extractor"
}
],
"migrate_projects": true,
"migrate_memberships": true,
"has_failures": false,
"stats": { }
}
]Retrieve a group or project migration
Retrieves details of a group or project migration.
GET /bulk_imports/:idcurl --request GET \
--header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/bulk_imports/1"{
"id": 1,
"status": "finished",
"source_type": "gitlab",
"source_url": "https://gitlab.example.com",
"created_at": "2021-06-18T09:45:55.358Z",
"updated_at": "2021-06-18T09:46:27.003Z"
}List group or project migration entities
Lists group or project migration entities for a specific migration.
GET /bulk_imports/:id/entities| Attribute | Type | Required | Description |
|---|---|---|---|
per_page | integer | no | Number of records to return per page. |
page | integer | no | Page to retrieve. |
sort | string | no | Return records sorted in asc or desc order by creation date. Default is desc |
status | string | no | Import status. |
The status can be one of the following:
createdstartedfinishedfailed
curl --request GET \
--header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/bulk_imports/1/entities?per_page=2&page=1&status=finished"[
{
"id": 1,
"bulk_import_id": 1,
"status": "finished",
"entity_type": "group",
"source_full_path": "source_group",
"destination_full_path": "destination/full_path",
"destination_name": "destination_slug",
"destination_slug": "destination_slug",
"destination_namespace": "destination_path",
"parent_id": null,
"namespace_id": 1,
"project_id": null,
"created_at": "2021-06-18T09:47:37.390Z",
"updated_at": "2021-06-18T09:47:51.867Z",
"failures": [
{
"relation": "group",
"step": "extractor",
"exception_message": "Error!",
"exception_class": "Exception",
"correlation_id_value": "dfcf583058ed4508e4c7c617bd7f0edd",
"created_at": "2021-06-24T10:40:46.495Z",
"pipeline_class": "BulkImports::Groups::Pipelines::GroupPipeline",
"pipeline_step": "extractor"
}
],
"migrate_projects": true,
"migrate_memberships": true,
"has_failures": true,
"stats": {
"labels": {
"source": 10,
"fetched": 10,
"imported": 10
},
"milestones": {
"source": 10,
"fetched": 10,
"imported": 10
}
}
}
]Retrieve a group or project migration entity
Retrieves details of a group or project migration entity.
GET /bulk_imports/:id/entities/:entity_idcurl --request GET \
--header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/bulk_imports/1/entities/2"{
"id": 1,
"bulk_import_id": 1,
"status": "finished",
"entity_type": "group",
"source_full_path": "source_group",
"destination_full_path": "destination/full_path",
"destination_name": "destination_slug",
"destination_slug": "destination_slug",
"destination_namespace": "destination_path",
"parent_id": null,
"namespace_id": 1,
"project_id": null,
"created_at": "2021-06-18T09:47:37.390Z",
"updated_at": "2021-06-18T09:47:51.867Z",
"failures": [
{
"relation": "group",
"step": "extractor",
"exception_message": "Error!",
"exception_class": "Exception",
"correlation_id_value": "dfcf583058ed4508e4c7c617bd7f0edd",
"created_at": "2021-06-24T10:40:46.495Z",
"pipeline_class": "BulkImports::Groups::Pipelines::GroupPipeline",
"pipeline_step": "extractor"
}
],
"migrate_projects": true,
"migrate_memberships": true,
"has_failures": true,
"stats": {
"labels": {
"source": 10,
"fetched": 10,
"imported": 10
},
"milestones": {
"source": 10,
"fetched": 10,
"imported": 10
}
}
}List failed import records for a migration entity
Lists failed import records for a group or project migration entity.
GET /bulk_imports/:id/entities/:entity_id/failurescurl --request GET \
--header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/bulk_imports/1/entities/2/failures"{
"relation": "issues",
"exception_message": "Error!",
"exception_class": "StandardError",
"correlation_id_value": "06289e4b064329a69de7bb2d7a1b5a97",
"source_url": "https://gitlab.example/project/full/path/-/issues/1",
"source_title": "Issue title"
}Cancel a migration
Cancels a direct transfer migration.
POST /bulk_imports/:id/cancelcurl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/bulk_imports/1/cancel"{
"id": 1,
"status": "canceled",
"source_type": "gitlab",
"created_at": "2021-06-18T09:45:55.358Z",
"updated_at": "2021-06-18T09:46:27.003Z",
"has_failures": false
}Possible response status codes:
| Status | Description |
|---|---|
| 200 | Migration successfully canceled |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Migration not found |
| 503 | Service unavailable |