Skip to main content

API Reference Guide

BetaTesting API reference guide to resources, patterns, and conventions.

Updated this week

This guide provides an overview of the BetaTesting API resources, common patterns, and conventions.

For complete up-to-date endpoint specifications including request/response schemas, refer to the interactive Swagger documentation available from your Company Settings > Integrations page.

Base URL

https://betatesting.com/api/external/v2

All endpoints below are relative to this base URL.


Available Resources

Tests

Tests (also known as campaigns) are the core resource on BetaTesting. Each test belongs to your company and contains testers, activities, issues, and messages.

Method

Endpoint

Description

Scope

GET

/tests

List all tests with optional status filtering

read

GET

/tests/{testId}

Get a specific test

read

POST

/tests

Create a new test

write

PATCH

/tests/{testId}

Update test details

write

POST

/tests/{testId}/copy

Copy an existing test

write

POST

/tests/{testId}/stage

Change a test's stage (e.g., launch, pause, close)

write

Filtering tests:

  • status - Filter by test status: draft, pending_review, ready, in_progress, complete, closed, paused

Testers

Manage testers within a specific test - accept applicants, mark them complete, send messages, or remove them.

Method

Endpoint

Description

Scope

GET

/tests/{testId}/testers

List testers in a test

read

GET

/tests/{testId}/testers/{testerId}

Get a specific tester in a test

read

GET

/tests/{testId}/complete-testers

List testers who completed the test

read

POST

/tests/{testId}/testers/accept

Accept testers into a test

write

POST

/tests/{testId}/testers/mark-complete

Mark testers as complete

write

POST

/tests/{testId}/testers/message

Send a message to testers

write

DELETE

/tests/{testId}/testers/{testerId}

Remove a tester from a test

write

Filtering testers:

  • search - Search by name or email

  • status - Filter by tester status: incomplete, complete, pending_review, removed, opt_out, stuck

Issues

Issues (e.g. bug reports) are submitted by testers during a test. You can list, view, update status/priority, or delete them.

Method

Endpoint

Description

Scope

GET

/tests/{testId}/issues

List issues for a test

read

GET

/issues/{issueId}

Get a specific issue

read

PATCH

/tests/{testId}/issues/{issueId}

Update an issue (status, priority, notes)

write

DELETE

/tests/{testId}/issues/{issueId}

Delete an issue

write

Filtering issues:

  • filterStatuses - Comma-separated list: draft, to_do, in_progress, complete, needs_more_info, retest, outside_scope

  • filterPriorities - Comma-separated list: critical, high, medium, low, trivial

  • sortSubmitDate - Sort by submission date: asc or desc

  • sortUpdateDate - Sort by last update: asc or desc

Activities

Activities (surveys and tasks) are distributed to testers within a test. You can create activities, manage their items (questions/tasks), and retrieve results.

Method

Endpoint

Description

Scope

GET

/tests/{testId}/activities

List activities for a test

read

GET

/activities/{activityId}/results

Get activity with response data

read

POST

/tests/{testId}/activities

Create an activity

write

PATCH

/activities/{activityId}

Update an activity

write

DELETE

/activities/{activityId}

Delete an activity

write

POST

/activities/{activityId}/items

Add an item to an activity

write

PATCH

/activities/{activityId}/items/{itemId}

Update an activity item

write

DELETE

/activities/{activityId}/items/{itemId}

Delete an activity item

write

Messages

Method

Endpoint

Description

Scope

GET

/tests/{testId}/messages

List messages for a test

read

Invites

Method

Endpoint

Description

Scope

GET

/tests/{testId}/invite-settings

Get invite settings for a test

read

GET

/tests/{testId}/invites

List invites for a test

read

PATCH

/tests/{testId}/invite-settings

Update invite settings

write

PATCH

/tests/{testId}/invites/{testerId}

Update an invite

write

Shipping

Method

Endpoint

Description

Scope

GET

/tests/{testId}/shipping

List shipments for a test

read

PATCH

/tests/{testId}/shipping/{shipmentId}

Update a shipment

write

ID Verification

Method

Endpoint

Description

Scope

POST

/tests/{testId}/require-id-verification

Require ID verification for a test

write

DELETE

/tests/{testId}/require-id-verification

Remove ID verification requirement

write

Community

Manage your tester community, the pool of testers available across all your tests.

Method

Endpoint

Description

Scope

GET

/community/custom-fields

List company custom fields

read

GET

/community/testers

List community testers

read

GET

/community/testers/{testerId}

Get a specific community tester

read

PATCH

/community/testers/{testerId}

Update a community tester

write

POST

/community/testers/bulk

Bulk create community testers

write

POST

/community/testers/{testerId}/tags

Add tags to a tester

write

DELETE

/community/testers/{testerId}/tags

Remove tags from a tester

write

POST

/community/testers/{testerId}/require-id-verification

Require ID verification

write

DELETE

/community/testers/{testerId}/require-id-verification

Remove ID verification requirement

write


Pagination

List endpoints return paginated results. Control pagination with these query parameters:

Parameter

Description

Default

page

Page number (1-based)

1

pageSize

Number of items per page

Varies by endpoint

Response format:

{   
"data": [ ... ],
"meta": {
"current_page": 1,
"last_page": 5,
"per_page": 20,
"total": 98
}
}

Use the meta fields to navigate through pages of results.


Rate Limiting

API requests are rate-limited per client to ensure fair usage and platform stability.

Scope

Default Limit

Read (GET requests)

Per-client limit (configured by BetaTesting)

Write (POST, PATCH, DELETE requests)

30 requests per minute

Rate limit status is communicated via response headers:

Header

Description

X-RateLimit-Limit

Maximum requests allowed in the current window

X-RateLimit-Remaining

Requests remaining in the current window

Retry-After

Seconds until the rate limit resets (only on 429 responses)

When you exceed the rate limit, the API returns a 429 Too Many Requests response. Wait for the duration specified in Retry-After before retrying.


Idempotency

For write operations (POST, PATCH, DELETE), you can include an Idempotency Key to prevent duplicate actions caused by network retries or client errors.

How to use it:

Include the Idempotency-Key header with a unique value (e.g., a UUID) on any write request:

POST /api/external/v2/tests 
Authorization: Bearer btst_your_key
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000
Content-Type: application/json

{ "name": "Mobile App Beta" }

Behavior:

  • If the same Idempotency-Key is sent again within 24 hours, the API returns the cached response from the original request instead of processing the request again

  • The replayed response includes the header X-Idempotency-Replayed: true so you can distinguish it from a fresh response

  • Each idempotency key is scoped to your company — different companies can use the same key without conflict

Best practice: Use idempotency keys for any operation where a duplicate would be problematic, such as creating tests, accepting testers, or sending messages.


Error Responses

The API uses standard HTTP status codes:

Status

Meaning

200

Success

201

Resource created successfully

204

Resource deleted successfully (no body)

401

Unauthorized — invalid, missing, or expired credentials

403

Forbidden — insufficient scope, IP not allowed, or API access not enabled

404

Resource not found (or does not belong to your company)

422

Validation error — invalid or missing request parameters

429

Rate limit exceeded

500

Internal server error

Error responses include a descriptive message:

{   
"error": "Validation failed",
"message": "The status field must be one of: draft, to_do, in_progress, complete."
}

Best Practices

  1. Use pagination - Always iterate through pages for list endpoints rather than assuming all data fits in one response

  2. Handle rate limits gracefully - Implement exponential backoff when you receive a 429 response

  3. Use idempotency keys - Always include an Idempotency-Key for write operations, especially in automated pipelines

  4. Request minimal scopes - If your OAuth2 client only reads data, request only api:read

  5. Cache when appropriate - For data that doesn't change frequently (e.g., test details, custom fields), cache responses on your end to reduce API calls

  6. Check the Swagger docs - For complete request/response schemas, parameter details, and example payloads, refer to the interactive documentation on your Integrations page

Did this answer your question?