Last date modified: 2026-Jun-12
Relativity Transfer Service
Transfer Service API enables Relativity users to integrate with transfer orchestration systems, providing flexible automation for fast and reliable data delivery.
Transfer Service API currently supports Azure DataLake Blob Storage to Relativity transfers only.
Authentication
All endpoints require Bearer JWT authentication unless otherwise noted. Include an Authorization: Bearer <token> header in each request. For token generation instructions, refer to Relativity REST API authentication/Bearer token authentication.
Users assigned to OAuth2 Client cannot be assigned to the System Administrator Group and has to have access to the fileshare using default or client domain workflow.
How to start Azure to R1 transfer
Azure to Relativity transfers enable server-side data copying, providing high speed, low error rates, and minimal client configuration. The process requires no additional client machine setup.
The Transfer Service API is available at:
https://{relativity_instance}/transfer-service/api/v2
For example, https://production.relativity.one/transfer-service/api/v2
Source requirements
Review the following source requirements for working with this service:
- Transfer Service requires sourcePath to be a valid SAS Url token from Azure DataLake Blob Storage that is publicly accessible.
ADLS storage gen1 does not support directory-level SAS tokens. SAS tokens can only be created at the container level. For more information, see Generate a SAS token in ADLS storage gen1.
- Token lifetime should be at least 7 days (token must be valid for the duration of whole copy).
- Token has to be provided with List and Read permissions.
Generate a SAS token in ADLS storage gen1
If applicable, complete the following steps to generate a SAS token in ADLS storage gen1:
- Navigate to the folder in storage.
- Click on the three menu dots to the right of the folder.
- Click Copy URL.
- Navigate to the Blob container.
- Click on the three menu dots to the right of the folder.
- Click Generate SAS token.
- Add necessary permission to the token.
- Click Generate.
- Copy the token, not the full URL provided.
- Combine the folder path URL from step 3, and the SAS token from step 9 with a "?" delimiter in between.
Workflow
The following describes the workflow to transfer Azure to Relativity:
- Register the transfer job using POST v2/transfer/jobs. A successful request queues the copy job.
- Monitor job status by calling GET v2/transfer/jobs/. Status updates approximately every 10 seconds.
- Retrieve the QC report after completion using GET v2/transfer/jobs//qc.
Job stages
Jobs progress through six stages based on the EnumerationStatistics.Status and TransferStatus fields:
- EnumerationStatistics.Status = queued- copy operation is queued, waiting for agent pickup.
- EnumerationStatistics.Status = inprogress and TransferStatus = InProgress- transfer and enumeration are ongoing. Transfer progress fields (successfulFiles, failedFiles, successfulBytes, failedBytes) update during this stage.
- EnumerationStatistics.Status = failed- enumeration failed. The transfer will fail regardless of TransferStatus.
- EnumerationStatistics.Status = completed and TransferStatus = InProgress- enumeration completed successfully. Data validation begins. During this stage, we will verify only unique file paths.
- EnumerationStatistics.Status = completed and TransferStatus = Completed- transfer finished successfully. All enumerated files were transferred. QC report starts to generate.
- EnumerationStatistics.Status = completed and TransferStatus = Failed- transfer finished with failures. All enumerated files were processed, but some failed. Failed paths are available in the QC report.
To access the QC report, EnumerationStatistics.Status must be completed and TransferStatus must be either Failed or Completed.
How to get QC report
After a transfer completes, a QC report is generated containing relative paths, sizes, and status for all transferred files. Call GET v2/transfer/jobs//qc to retrieve a SAS URL for downloading the report.
Report generation time varies with data size. If the endpoint returns 404, the report is not yet ready. Generation may take a few minutes.
QC report structure
The QC report is a CSV file with comma delimiters. Each row represents one file with the following columns:
| Column | Nullable? | Description |
|---|---|---|
| file | No | Relative path of the transferred file |
| size | No | Size of the transferred file in bytes |
| status | No | Transfer status: completed or failed (for filtering purposes) |
| error_code | Yes | Error code if the file failed (see Error codes for details) |
Error codes
The following section describes the possible Azure error codes. Error codes are organized into the following ranges:
- ER_0xxxx- common and general errors (authentication, authorization)
- ER_1xxxx- blob state and preconditions
- ER_2xxxx - copy mechanics and limits
- ER_9xxxx - fallback/unknown errors
| Code | Azure error code(s) | Description |
|---|---|---|
| ER_00001 | AuthenticationFailed | Invalid credentials or SAS token. |
| ER_00002 | AuthorizationFailure | General authorization failure. |
| ER_00003 | AuthorizationPermissionMismatch | Missing RBAC role or SAS permissions for source/destination. |
| ER_00004 | InvalidAuthenticationInfo | Malformed authentication headers or token. |
| ER_00005 | CannotVerifyCopySource | Source URI or SAS inaccessible (firewall, endpoint, or expired SAS). |
| ER_10001 | BlobNotFound | Source or destination blob does not exist. |
| ER_10002 | BlobImmutableDueToPolicy | Immutability policy or legal hold prevents overwrite. |
| ER_10003 | InvalidBlobType | Incompatible blob types (block/page/append). |
| ER_10004 | InvalidMetadata | Invalid metadata values. |
| ER_10005 | InvalidHeaderValue | Invalid header values. |
| ER_20001 | BlockCountExceedsLimit | Too many blocks for large blob (exceeds 50,000 block limit). |
| ER_20002 | InvalidResourceName | Invalid blob name or path. |
| ER_20003 | SnapshotsPresent | Snapshot/version conflicts prevent copy. |
| ER_20004 | BlobArchived | Source blob is in Archive tier and must be rehydrated before copy. |
| ER_20005 | PathValidationFailed | Destination blob name does not comply with Relativity File and Folder naming rules. |
| ER_99999 | Unknown/uncategorized non-transient error. |
API endpoints
POST v2/transfer/jobs
The following section describes how to use POST to create and queue a new transfer job.
CreateTransferRequestv2
The following section describes the request fields and how to create a transfer request:
| Field | Type | Format | Nullable |
|---|---|---|---|
| destinationPath | string | Relativity fileshare format | No |
| sourcePath | string | Full SasUrl with Read and List (sp=rl) permissions | No |
| tags | object | Key-Value Dictionary | Yes |
| transferJobID | string | uuid | No |
1
2
3
4
5
6
7
8
{
"destinationPath": "string",
"sourcePath": "string",
"tags": {
"key": "value"
},
"transferJobID": "00000000-0000-0000-0000-000000000000"
}
Responses
- 200 - Success
- 400 - Bad Request
Copy
1 2 3 4 5
{
"statusCode": 400,
"title": "string",
"message": "string"
}
GET v2/transfer/jobs/
The following section describes how to use GET to retrieve the current status and statistics for a transfer job.
Parameters
The following table lists the parameters:
| Name | In | Type | Format | Required |
|---|---|---|---|---|
| jobId | path | string | uuid | Yes |
| correlation-id | header | string | uuid | No |
Responses
200 - Success
GetJobResultv2
The following section describes the response fields and how to use GetJobResultv2() to get a job result:
| Field | Type | Format | Nullable |
|---|---|---|---|
| transferStatus | string | Yes | |
| transferJobID | string | uuid | No |
| destinationFullPath | string | Yes | |
| sourceFullPath | string | Yes | |
| tags | object | Yes | |
| transferStatistics | TransferStatistics | Yes | |
| enumerationStatistics | EnumerationStatistics | Yes | |
| transferType | string | Yes |
TransferStatistics
The following table lists the TransferStatistics fields:
| Field | Type | Format | Nullable |
|---|---|---|---|
| successfulFiles | integer | int64 | No |
| failedFiles | integer | int64 | No |
| skippedFiles | integer | int64 | No |
| successfulBytes | integer | int64 | No |
| failedBytes | integer | int64 | No |
| skippedBytes | integer | int64 | No |
| successfulEmptyDirectories | integer | int64 | No |
| failedEmptyDirectories | integer | int64 | No |
| skippedEmptyDirectories | integer | int64 | No |
EnumerationStatistics
The following table lists the EnumerationStatistics fields:
| Field | Type | Format | Nullable |
|---|---|---|---|
| totalFiles | integer | int64 | No |
| italicize | integer | int64 | No |
| totalEmptyDirectories | integer | int64 | No |
| status | string | Yes | |
| error | string | Yes |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"transferStatus": "string",
"transferJobID": "00000000-0000-0000-0000-000000000000",
"destinationFullPath": "string",
"sourceFullPath": "string",
"tags": {
"key": "value"
},
"transferStatistics": {
"successfulFiles": 0,
"failedFiles": 0,
"skippedFiles": 0,
"successfulBytes": 0,
"failedBytes": 0,
"skippedBytes": 0,
"successfulEmptyDirectories": 0,
"failedEmptyDirectories": 0,
"skippedEmptyDirectories": 0
},
"enumerationStatistics": {
"totalFiles": 0,
"totalSize": 0,
"totalEmptyDirectories": 0,
"status": "string",
"error": "string"
},
"transferType": "AzureToR1"
}
DELETE v2/transfer/jobs/{job_id}
The following section describes how to use DELETE to cancel an in-progress Cloud transfer job.
Parameters
The following table lists the parameters:
| Name | In | Type | Format | Required |
|---|---|---|---|---|
| jobId | path | string | uuid | Yes |
| correlation-id | header | string | uuid | No |
Responses
- 200 — Success - cancels the job. Response body is empty.
- 400 — Bad Request - returned when:
- jobId is empty (00000000-0000-0000-0000-000000000000)
- The job is not a Cloud transfer job
- The job is already finished
- The job is already cancelled
Copy
{
"statusCode": 400,
"title": "string",
"message": "string"
}
- 404 — Not Found - the job does not exist.
GET v2/transfer/jobs/{jobId}/qc
The following section describes how to use GET to retrieve a SAS URL for downloading the QC report for a finished transfer job:
Parameters
The following table lists the parameters:
| Name | In | Type | Format | Required |
|---|---|---|---|---|
| jobId | path | string | uuid | Yes |
| correlation-id | header | string | uuid | No |
Responses
200 - Success
GetTokenResult
The following section describes how to use GetTokenResult() to get a transfer request:
| Field | Type | Format | Nullable |
|---|---|---|---|
| sasUrl | string | uri | Yes |
404 - Not Found - the QC report has not been generated yet. Wait for the transfer to complete and retry.
On this page