TesterArmyTesterArmy

Mobile Apps

Use the mobile apps API to upload project binaries for mobile runs and webhook-triggered batches.

Upload a mobile app

POST /projects/{projectId}/mobile

Send multipart/form-data with:

FieldTypeRequiredDescription
filebinaryYes.app.zip, .app.tar.gz, .zip, .tgz, or .apk
removeAfterinteger secondsNoAuto-delete the upload after this many seconds

Example

curl -X POST https://tester.army/api/v1/projects/{projectId}/mobile \
  -H "Authorization: Bearer <YOUR API KEY>" \
  -F "file=@MyApp.app.zip" \
  -F "removeAfter=3600"

Response

{
  "app": {
    "id": "<YOUR APP UPLOAD ID>",
    "platform": "ios",
    "filename": "MyApp",
    "bundleId": "com.example.app",
    "appVersion": "1.2.3",
    "buildVersion": "45",
    "fileSize": 123456789,
    "source": "api_upload",
    "expiresAt": "2026-04-05T12:34:56.000Z",
    "removeAfter": 3600,
    "createdAt": "2026-04-05T11:34:56.000Z"
  }
}

If removeAfter is omitted, the upload is permanent.

If the expiration time is reached while queued or running tests are still using the app, cleanup waits until those runs finish.

List mobile apps

GET /projects/{projectId}/mobile

Example

curl https://tester.army/api/v1/projects/{projectId}/mobile \
  -H "Authorization: Bearer <YOUR API KEY>"

Response

{
  "apps": [
    {
      "id": "<YOUR APP UPLOAD ID>",
      "platform": "ios",
      "filename": "MyApp",
      "bundleId": "com.example.app",
      "appVersion": "1.2.3",
      "buildVersion": "45",
      "fileSize": 123456789,
      "source": "api_upload",
      "expiresAt": null,
      "removeAfter": null,
      "createdAt": "2026-04-05T11:34:56.000Z"
    }
  ]
}

Delete a mobile app

DELETE /projects/{projectId}/mobile/{appId}

Example

curl -X DELETE https://tester.army/api/v1/projects/{projectId}/mobile/{appId} \
  -H "Authorization: Bearer <YOUR API KEY>"

Response

{
  "deleted": true
}

Use with group webhooks

After uploading, trigger a mobile group webhook with the uploaded app's appId or bundleId.

By app ID (recommended when multiple builds share the same bundle ID):

curl -X POST https://tester.army/api/v1/groups/webhook/{id}/{secret} \
  -H "Content-Type: application/json" \
  -d '{
    "mobile": {
      "appId": "<YOUR APP UPLOAD ID>"
    }
  }'

By bundle ID (resolves to the latest upload matching that identifier):

curl -X POST https://tester.army/api/v1/groups/webhook/{id}/{secret} \
  -H "Content-Type: application/json" \
  -d '{
    "mobile": {
      "bundleId": "com.example.app"
    }
  }'

Only one of appId, bundleId, or artifactUrl can be provided per request. See Group Webhooks for full details.

On this page