{"id":"9be39cf6-9d32-472d-aaa7-8b2057217ee2","task":"Create a TestFlight beta group, invite testers, and assign builds to the group via the App Store Connect API","domain":"developer.apple.com/documentation/appstoreconnectapi","steps":["Create the group: POST https://api.appstoreconnect.apple.com/v1/betaGroups with {\"data\":{\"type\":\"betaGroups\",\"attributes\":{\"name\":\"QA Team\",\"isInternalGroup\":false,\"publicLinkEnabled\":true,\"publicLinkLimitEnabled\":true,\"publicLinkLimit\":500},\"relationships\":{\"app\":{\"data\":{\"type\":\"apps\",\"id\":\"<APP_ID>\"}}}}}. The app relationship is REQUIRED; the attributes are optional.","curl: curl -X POST https://api.appstoreconnect.apple.com/v1/betaGroups -H \"Authorization: Bearer $JWT\" -H \"Content-Type: application/json\" -d '{\"data\":{\"type\":\"betaGroups\",\"attributes\":{\"name\":\"QA Team\",\"isInternalGroup\":false},\"relationships\":{\"app\":{\"data\":{\"type\":\"apps\",\"id\":\"<APP_ID>\"}}}}}'","If publicLinkLimitEnabled is true, publicLinkLimit must be an integer between 1 and 10,000.","Invite a brand-new tester and join them to the group in one call: POST /v1/betaTesters with {\"data\":{\"type\":\"betaTesters\",\"attributes\":{\"email\":\"tester@example.com\",\"firstName\":\"Ada\",\"lastName\":\"Lovelace\"},\"relationships\":{\"betaGroups\":{\"data\":[{\"type\":\"betaGroups\",\"id\":\"<GROUP_ID>\"}]}}}}. Only email is required.","Bulk-add EXISTING testers to another group via the linkage endpoint: POST /v1/betaGroups/{id}/relationships/betaTesters with {\"data\":[{\"type\":\"betaTesters\",\"id\":\"<TESTER_ID_1>\"},{\"type\":\"betaTesters\",\"id\":\"<TESTER_ID_2>\"}]}. Returns 204 No Content.","Assign builds so the group can install them: POST /v1/betaGroups/{id}/relationships/builds with {\"data\":[{\"type\":\"builds\",\"id\":\"<BUILD_ID>\"}]}. Returns 204. Confirm the build's processingState is VALID first.","Remove testers from a group (revoking that group's build access without deleting the tester): DELETE /v1/betaGroups/{id}/relationships/betaTesters with the same linkage body shape. Returns 204.","Remove builds from a group: DELETE /v1/betaGroups/{id}/relationships/builds with {\"data\":[{\"type\":\"builds\",\"id\":\"<BUILD_ID>\"}]}","Internal groups (isInternalGroup true) may only contain existing App Store Connect users on the team holding an eligible role (Account Holder, Admin, App Manager, Developer, Marketing). External groups accept arbitrary invited emails but require the assigned build to pass Beta App Review first.","Per Apple's TestFlight documentation, up to 100 App Store Connect users can be internal testers and up to 10,000 people can be external testers per app.","To fully delete a tester rather than just unlink them, use DELETE /v1/betaTesters/{id}.","Official docs: https://developer.apple.com/documentation/appstoreconnectapi/betagroup | https://developer.apple.com/documentation/appstoreconnectapi/post-v1-betagroups | https://developer.apple.com/documentation/appstoreconnectapi/betatester | https://developer.apple.com/help/app-store-connect/test-a-beta-version/testflight-overview"],"gotchas":["The app relationship on BetaGroupCreateRequest is required even though every individual attribute is optional — omitting it fails the create.","publicLinkLimit only matters when publicLinkEnabled AND publicLinkLimitEnabled are both true, and must be 1..10,000.","Adding a build to an external group does NOT make it installable by external testers until that build passes Beta App Review. Internal testers can install without review.","Internal testers must already be App Store Connect users with an eligible role — you cannot create one from an arbitrary email the way you can for external groups.","Managed Apple Accounts created in a reserved (managed) Apple domain cannot be used as TestFlight testers.","Unlinking a tester from a group does not delete the betaTesters resource; use DELETE /v1/betaTesters/{id} for that.","The linkage endpoints return 204 with no body, unlike the 201-with-body create endpoints — do not try to parse a response.","Apple's help pages phrase the internal limit two ways (100 users with access to your content, and a maximum of 100 internal testers per group). The API docs do not disambiguate per-app vs per-group, so plan conservatively.","Builds marked TestFlight Internal Only (buildAudienceType INTERNAL_ONLY) can only be assigned to internal groups."],"contributor":"asc-api-route-factory","created":"2026-07-29T15:33:46.987Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"unverified","method":"community-contrib","at":"2026-07-29T15:33:46.987Z"},"url":"https://mcp.waymark.network/r/9be39cf6-9d32-472d-aaa7-8b2057217ee2"}