Skip to Content

Beta

Run private beta programs and manage their tester roster. Requires the beta feature to be enabled for the project.

Programs

GET/v1/beta/programs

ParameterTypeDescription
statusstringFilter by status: draft, active, or closed.
limitintegerPage size. Defaults to 25.
offsetintegerNumber of items to skip. Defaults to 0.

GET/v1/beta/programs/:id

POST/v1/beta/programs

ParameterTypeDescription
namerequiredstringProgram name. The URL slug is derived from it and made unique within the project.
versionstringSemver version under test (X.Y.Z).
summarystringShort description of the beta.
access_urlstringWhere testers access the build (e.g. a TestFlight link).
access_instructionsstringHow testers get set up.
statusstringdraft, active, or closed. Defaults to draft.
allow_public_signupbooleanAllow public opt-in via the portal link. Defaults to false.
feedback_deadlinestringISO-8601 timestamp after which feedback closes.

PATCH/v1/beta/programs/:id

ParameterTypeDescription
namestringProgram name.
versionstringSemver version under test (X.Y.Z).
summarystringShort description of the beta.
access_urlstringWhere testers access the build.
access_instructionsstringHow testers get set up.
statusstringdraft, active, or closed.
allow_public_signupbooleanAllow public opt-in via the portal link.
feedback_deadlinestringISO-8601 timestamp after which feedback closes.

DELETE/v1/beta/programs/:id

Testers

GET/v1/beta/programs/:programId/testers

ParameterTypeDescription
statusstringFilter by status: invited, joined, declined, or revoked.
limitintegerPage size. Defaults to 25.
offsetintegerNumber of items to skip. Defaults to 0.

GET/v1/beta/programs/:programId/testers/:id

POST/v1/beta/programs/:programId/testers

ParameterTypeDescription
emailrequiredstringEmail of the tester to enroll.

DELETE/v1/beta/programs/:programId/testers/:id

Writes require paid-plan API access Pro. The slug is derived from the program name and made unique within the project. Enrolling a tester is idempotent on email and returns the accept token — the API sends no email, so use it to build the portal join link (/beta/join?token=...) and deliver it yourself. DELETE returns 204; deleting a program cascades its testers and feedback, and deleting a tester is permanent.

List programs

curl "https://api.supdesk.app/v1/beta/programs?status=active&limit=10" \ -H "Authorization: Bearer sd_live_..."
{ "data": [ { "id": "bp_abc123", "project_id": "prj_9f2a", "name": "Mobile App v2", "version": "2.0.0", "slug": "mobile-app-v2", "summary": "Early access to the new mobile experience.", "access_url": "https://testflight.apple.com/join/abcd", "access_instructions": "Install TestFlight, then open the invite link.", "status": "active", "allow_public_signup": true, "feedback_deadline": "2026-08-01T00:00:00Z", "created_at": "2026-07-01T09:12:00Z" } ], "pagination": { "limit": 25, "offset": 0, "has_more": false } }

Create a program

curl -X POST https://api.supdesk.app/v1/beta/programs \ -H "Authorization: Bearer sd_live_..." \ -H "Content-Type: application/json" \ -d '{ "name": "Mobile App v2", "version": "2.0.0", "summary": "Early access to the new mobile experience.", "status": "active", "allow_public_signup": true }'
{ "data": { "id": "bp_abc123", "project_id": "prj_9f2a", "name": "Mobile App v2", "version": "2.0.0", "slug": "mobile-app-v2", "summary": "Early access to the new mobile experience.", "access_url": null, "access_instructions": null, "status": "active", "allow_public_signup": true, "feedback_deadline": null, "created_at": "2026-07-01T09:12:00Z" } }

Update a program

Only the fields you send are changed; omitted fields are left untouched.

curl -X PATCH https://api.supdesk.app/v1/beta/programs/bp_abc123 \ -H "Authorization: Bearer sd_live_..." \ -H "Content-Type: application/json" \ -d '{ "status": "closed" }'
{ "data": { "id": "bp_abc123", "project_id": "prj_9f2a", "name": "Mobile App v2", "version": "2.0.0", "slug": "mobile-app-v2", "summary": "Early access to the new mobile experience.", "access_url": null, "access_instructions": null, "status": "closed", "allow_public_signup": true, "feedback_deadline": null, "created_at": "2026-07-01T09:12:00Z" } }

Delete a program

curl -X DELETE https://api.supdesk.app/v1/beta/programs/bp_abc123 \ -H "Authorization: Bearer sd_live_..."

Returns 204 No Content. Cascades the program’s testers and their feedback.

List testers

curl "https://api.supdesk.app/v1/beta/programs/bp_abc123/testers?status=invited" \ -H "Authorization: Bearer sd_live_..."
{ "data": [ { "id": "bt_def456", "beta_program_id": "bp_abc123", "email": "jamie@example.com", "token": "9d8c7b...", "source": "invite", "status": "invited", "end_user_id": null, "invited_at": "2026-07-02T10:00:00Z", "joined_at": null } ], "pagination": { "limit": 25, "offset": 0, "has_more": false } }

Enroll a tester

Idempotent on email: enrolling an address already on the program returns its existing row with 200 instead of 201.

curl -X POST https://api.supdesk.app/v1/beta/programs/bp_abc123/testers \ -H "Authorization: Bearer sd_live_..." \ -H "Content-Type: application/json" \ -d '{ "email": "jamie@example.com" }'
{ "data": { "id": "bt_def456", "beta_program_id": "bp_abc123", "email": "jamie@example.com", "token": "9d8c7b...", "source": "invite", "status": "invited", "end_user_id": null, "invited_at": "2026-07-02T10:00:00Z", "joined_at": null } }

Use the returned token to build the portal join link (/beta/join?token=...) and email it yourself.

Remove a tester

curl -X DELETE https://api.supdesk.app/v1/beta/programs/bp_abc123/testers/bt_def456 \ -H "Authorization: Bearer sd_live_..."

Returns 204 No Content. Removing a tester is permanent and deletes their beta feedback.

Last updated on