Skip to main content
Version: 1.0.8

Apps & Files

The app catalog and file repository at /devicer/files.

Files

Tabs​

TabContents
All FilesEverything in the repository
App CatalogApps, grouped by application with their versions
Other FilesFiles that are not app binaries

Each tab carries a count badge.

App Catalog​

The catalog groups uploads into applications so you can track versions over time instead of a flat list of binaries.

Each app card shows the platform, the latest version label, the number of versions, and the automation reference for the latest version — a df://app-version/{versionId} URL.

ActionDescription
Copy LatestCopies the latest version's df:// reference
View VersionsOpens the app's version history
Use in ConfigOpens the config generator with this app preselected
Delete AppSoft-deletes every cataloged file, removes all versions from the catalog, and hides the app

Version History​

The app detail page lists every version with its label, and marks the latest one. For each version you can copy its df:// reference, download the binary, or delete the version.

Building the Catalog from Existing Files​

If you uploaded binaries before the catalog existed, the page offers a backfill action that scans existing files and catalogs them. It reports how many files it scanned and how many it cataloged.

File Types​

CategoryAccepted extensions
App.apk, .ipa, .aab, .app, .zip
Screenshot.png, .jpg, .jpeg, .webp, .gif
Log.log, .txt, .json, .xml, .csv
AttachmentAny other type

Executable and script extensions are blocked, including .exe, .bat, .cmd, .msi, .dll, .vbs, .js, .ps1, and .reg.

A macOS .app bundle is zipped in the browser before upload; the progress indicator shows both the zipping and the upload stage.

Uploading​

Upload by dragging files onto the page or with the upload dialog. A progress bar reports the upload, and an upload in progress can be cancelled.

Size Limits​

LimitValue
Maximum file size5 GB
Single-request upload up to100 MB
Multipart chunk size50 MB

Anything over 100 MB is uploaded in 50 MB parts automatically.

Search and Filters​

Search matches file names. The filter menu narrows the list by file type, and the active search and type filters are shown as removable chips.

File Actions​

ActionDescription
DownloadDownloads the file
DeleteRemoves the file from the repository

App files also show their automation reference, which can be copied in one step.

Referencing a File from Automation​

Use a df:// URL in appium:app.

FormPoints at
df://app-version/{versionId}A specific version in the app catalog — the preferred form
df://{fileId}A raw file in the repository
df://firebase/{connectionId}/{projectNumber}/{appId}/{releaseId}A Firebase App Distribution release
{
"platformName": "Android",
"appium:automationName": "UiAutomator2",
"appium:app": "df://app-version/YOUR_VERSION_ID",
"df:apiKey": "YOUR_API_KEY"
}
Config Generator

The Config Generator picks the app and version from a dropdown and writes the correct df:// URL for you.

Upload API​

Uploads go directly to storage through a presigned URL, so the API server only issues and confirms them. All paths below are relative to the gateway host, for example https://api.rabbitqa.com.

Single Upload​

For files of 100 MB or less.

1. POST /df/api/files/presigned-upload
2. PUT {uploadUrl}
3. POST /df/api/files/{fileId}/confirm

Step 1 — request the upload URL.

{
"filename": "app-debug.apk",
"category": "APP",
"contentType": "application/vnd.android.package-archive",
"sizeBytes": 15728640,
"description": "Debug build for QA testing",
"tags": ["android", "debug"]
}
FieldDescription
filenameFile name with extension
categoryAPP, SCREENSHOT, LOG, or ATTACHMENT
contentTypeMIME type
sizeBytesFile size in bytes
descriptionOptional description
tagsOptional tags

The response carries the fileId and the uploadUrl.

Step 2 — upload the bytes with a PUT to uploadUrl, setting the same Content-Type.

Step 3 — confirm with POST /df/api/files/{fileId}/confirm. The file is not usable until it has been confirmed.

Multipart Upload​

For files over 100 MB, in 50 MB parts.

StepRequest
InitiatePOST /df/api/files/multipart/initiate
Get part URLGET /df/api/files/multipart/{fileId}/part/{partNumber}
Upload partPUT {uploadUrl} — keep the ETag from each response
CompletePOST /df/api/files/multipart/{fileId}/complete
AbortDELETE /df/api/files/multipart/{fileId}

The initiate body takes the same fields as the presigned request, with totalSizeBytes in place of sizeBytes plus partSizeBytes. The complete body sends every part back:

{
"parts": [
{ "partNumber": 1, "eTag": "etag-from-the-part-response" },
{ "partNumber": 2, "eTag": "etag-from-the-part-response" }
]
}

If an upload fails partway through, abort it so the incomplete parts are discarded.

Authentication​

Presigned upload and confirm accept an API key in the X-Api-Key header, or a bearer token. Every other file endpoint uses a bearer token.

Keep credentials out of your repository

Store the API key and any auth token as secrets in your CI/CD platform rather than in a script.

See API Reference for the rest of the module's endpoints.