Skip to main content

REST API

In this document you can find the reference for the TestFairy REST API. This API allows the developer to access and interact with TestFairy data remotely.

Getting Started

Getting started with the REST API can be done via the command line with any programming language. Let's begin with an example: by listing all our projects.

A project is either an iOS app or an Android app (two apps with the same package name but on different platforms are considered two projects.)

curl -u "john@example.com:00001234cafecafe" "https://api.testfairy.com/api/1/projects/"

In the example above, you can see that our user is john@example.com and the API key is 0001234cafecafe. This user authentication token is required for all requests to the REST server.

Your API key is private, do not share it or post it on public code repositories or forums. To find your API key, refer to your preferences page.

Projects

Get All Projects

GET/api/1/projects/

Returns a list of all projects (iOS and Android apps) in this account.

Responses

200Success.
Sample Response
{
"status": "ok",
"projects": [
{
"id": "19-groupshot",
"self": "/projects/19-groupshot",
"name":"GroupShot",
"packageName":"com.groupshot",
"platform":"Android",
"icon":"[URL TO APP ICON]"
}
]
}

Builds

Get All Builds in a Project

GET/api/1/projects/{project-id}/builds/

Get all builds in a specific project. Each build is a distinct version that is either uploaded or created by the TestFairy SDK.

Responses

200Success.
Sample Response
{
"status": "ok",
"builds": [
{
"id":8830728,
"self":"/projects/6806100-myapplication/builds/8830728",
"projectId":"6806100",
"appName":"My Application",
"appVersion":"DemoApp",
"appVersionCode":"20",
"appDisplayName":"My Application - DemoApp (20)",
"iconUrl":"[APP ICON URL]",
"appUrl":"[URL TO APK OR IPA FILE]",
"sessions":6,
"crashes":0,
"testers":0,
"feedbacks":0,
"downloads":1,
"uploadedAt":"2019-04-04 16:03:15",
"uploadedVia":"[UPLOAD DETAILS]",
"hasTestFairySdk":true,
"insightsEnabled":true,
"videoEnabled":true
}
]
}

Get Metadata for a Specific Build

GET/api/1/projects/{project-id}/builds/{build-id}

Get a specific build of a specific project. Query the /api/1/projects/{project-id} API for a list of available builds.

Responses

200Success.
Sample Response
{
"status": "ok",
"build": {
"id":8830728,
"self":"/projects/6806100-myapplication/builds/8830728",
"projectId":"6806100",
"appName":"My Application",
"appVersion":"DemoApp",
"appVersionCode":"20",
"appDisplayName":"My Application - DemoApp (20)",
"iconUrl":"[APP ICON URL]",
"appUrl":"[URL TO APK OR IPA FILE]",
"sessions":6,
"crashes":0,
"testers":0,
"feedbacks":0,
"downloads":1,
"uploadedAt":"2019-04-04 16:03:15",
"uploadedVia":"[UPLOAD DETAILS]",
"hasTestFairySdk":true,
"insightsEnabled":true,
"videoEnabled":true
}
}

Delete a Specific Build

DELETE/api/1/projects/{project-id}/builds/{build-id}

Delete a specific build. When all builds of a project are deleted, the project itself is removed from /api/1/projects API. When deleting a build, all of its artifacts (IPA/APK files), recorded sessions, and crashes are also deleted.

Responses

200Success.
Sample Response
{
"status": "ok"
}

Download the Uploaded Artifact

GET/api/1/projects/{project-id}/builds/{build-id}/download/

Downloads the binary file uploaded to TestFairy.

Responses

200Success.

List All Recorded Sessions in Build

GET/api/1/projects/{project-id}/builds/{build-id}/sessions/

Get metadata for all sessions recorded for a specific build.

Responses

200Success.
Sample Response
{
"status": "ok",
"sessions": [
{
"id": 1,
"self": "/projects/2197059-demoapp/builds/4867553/sessions/1",
"startTime": "2017-01-22 16:42:40",
"duration": "15:01",
"testerEmail": "john@testfairy.com",
"device": "Samsung - Samsung Galaxy S8",
"ipAddress": "23.100.122.175",
"crashed": false,
"countryName": "United States",
"countryCode": "us"
}
]
}

Get Session Data, Events and Logs

GET/api/1/projects/{project-id}/builds/{build-id}/sessions/{session-id}

Get metadata (and optionally data) for a specific session.

Parameters

fields

| OPTIONAL | STRING |

Possible values: meta, logs, events. The default value is meta. Use events to load all events, screenshots, touches, and other metrics. Use logs to fetch only logs. When loading logs, the response is application/text.

Responses

200Success.
Sample Response
{
"status": "ok",
"session": {
"id":4426273741,
"sessionStartTime":"2019-05-20 09:05:30",
"duration":"00:27",
"testerEmail":"blabla@ex.com",
"device":"Xiaomi - Redmi S2",
"ipAddress":"84.94.200.136",
"crashed":false,
"identity":{
"correlationId":"blabla@ex.com",
"attr3":"three",
"attr4":"four",
"attr1":"High",
"attr2":"1.0",
"attr5":"Version 1.0"
}
}

Testers

List All Testers

GET/api/1/testers

List all testers in this account.

Responses

200Success.
Sample Response
{
"status": "ok",
"testers": [
{
"email":"james@example.com",
"groups":[{
id: 100,
name: "friends"
}]
},
{
"email":"alice@testfairy.com",
"groups":[{
id: 100,
name: "friends"
}, {
id: 200,
name: "family"
}]
}
]
}

Add a New Tester

POST/api/1/testers/

Add a new tester to account. Optionally can add them to a group.

Parameters

email

| OPTIONAL | STRING |

One or more emails, separated by commas, to add to your account.

group

| OPTIONAL | STRING |

Assign tester or testers to this tester-group. It creates one if no such group exists. Default value: none.

notify

| OPTIONAL | STRING |

Pass notify=on to send out a welcome email when inviting this tester. The email sent is the "Tester Welcome Email" template and can be configured. Default value is off.

Responses

200Success.
Sample Response
{
"status": "ok"
}

Block a Tester

POST/api/1/testers/{tester-id}/block/

Blocks a single tester. They cannot download the apps they are invited to. However, the data stays. You can later unblock this tester or delete them completely.

Responses

200Success.
Sample Response
{
"status": "ok"
}

Unblock a Tester

DELETE/api/1/testers/{tester-id}/block/

Unblock a single tester. Their invitations are restored. If the user is already unblocked, then nothing happens.

Responses

200Success.
Sample Response
{
"status": "ok"
}

Delete a Tester

DELETE/api/1/testers/{tester-id}

Delete a single tester, remove them from any tester-groups they might be in, and invalidate all invitations that are sent.

Responses

200Success.
Sample Response
{
"status": "ok"
}

Feedbacks

Get Latest Recorded Feedbacks

GET/api/1/feedbacks/

Get metadata for 100 of the latest feedbacks recorded.

Responses

200Success.
Sample Response
{
"status": "ok",
"feedbacks": [
{
"recorded_at": "2018-08-01 04:14:46",
"text": "Feedback working",
"feedbackId": "54321",
"screenshotUrl": "https://s3.amazonaws.com/feedback.jpg",
"buildId": "1234",
"projectId": "23456",
"recordedAt":"2018-08-01 14:14:46",
"source": "shake",
"reported_by": "john@testfairy.com",
"session_id": "8765432"
}
]
}

Audits

Get Recent Audit Trail Items

GET/api/1/audits

Get recent audit trail items.

Responses

200Success.
Sample Response
{
"status": "ok",
"audits": [
{
"id": 23534603,
"timestamp": "2020-04-21 02:31:54",
"ipAddress": "54.235.41.91",
"eventType": "download_app",
"eventData": {
"projectId": 6833287,
"buildId": 9087976,
"appName": "MyApp",
"appVersion": "1.0 (10)",
"testerEmail": "john@example.com",
"filesize": 31348
}
}
]
}

Permissions

Get the List of Admins and Their Permissions

GET/api/1/cpanel/permissions/

Get the list of admins in the account and their permissions.

Responses

200Success.
Sample Response
{
"status": "ok",
admins:
[
{
email: "joe@example.com",
role: "account-owner",
permissions: [
"*:rw"
]
},
{
email: "bob@example.com",
role: "account-manager",
permissions: [
"*:rw"
]
},
{
email: "alice@example.com",
role: "admin",
permissions: [
"*:rw"
]
},
{
email: "michael@example.com",
role: "admin",
permissions: [
"16527:rw",
"16517:rw",
"69237:r"
]
},
]
}

Webhooks

List All Webhooks

GET/api/1/webhooks/

List all webhooks in this account.

Responses

200Success.
Sample Response
{
"status":"ok",
"webhooks":[
{
"id":12,
"status":"0",
"name":"Slack Webhook @vijay",
"url":"https://hooks.slack.com/services/",
"actions":"crash,feedback,upload,new-udid",
"projectIds":"12345,45643"
}
]
}

Add a New Webhook

POST/api/1/webhook/

Add a new webhook to the account.

Parameters

webhook-name

| REQUIRED | STRING |

The name of the webhook.

webhook-url

| REQUIRED | STRING |

The URL for the webhook.

webhook-status

| OPTIONAL | STRING |

Enables or disables the webhook. The values are: true, false. Default value is false.

actions

| OPTIONAL | STRING |

Comma separated list of actions. Options include: crash, feedback, upload, new-udid.

webhook-project-ids

| OPTIONAL | STRING |

Comma separated list of project IDs.

Responses

200Success.
Sample Response
{
"status": "ok"
}

Get a Single Webhook

GET/api/1/webhook/{webhook-id}/

Returns a single webhook.

Responses

200Success.
Sample Response
{
"status": "ok",
"webhook": {
"id":12,
"status":"0",
"name":"Slack Webhook @vijay",
"url":"https://hooks.slack.com/services/",
"actions":"crash,feedback,upload,new-udid",
"projectIds":"12345,45643"
}
}

Modify a Webhook

POST/api/1/webhook/{webhook-id}/

Modifies a single webhook.

Parameters

webhook-name

| REQUIRED | STRING |

The name of the webhook.

webhook-url

| REQUIRED | STRING |

The URL for the webhook.

webhook-status

| OPTIONAL | STRING |

Enables or disables the webhook. The values are: true, false. Default value is false.

actions

| OPTIONAL | STRING |

Comma separated list of actions. Options include: crash, feedback, upload, new-udid.

webhook-project-ids

| OPTIONAL | STRING |

Comma separated list of project IDs.

Responses

200Success.
Sample Response
{
"status": "ok"
}

Delete a Webhook

DELETE/api/1/webhook/{webhook-id}/

Deletes a single webhook.

Responses

200Success.
Sample Response
{
"status": "ok"
}