[GH-ISSUE #775] Add Resolution Center thread/message read support (web/iris) #212

Closed
opened 2026-02-26 21:34:01 +03:00 by kerem · 0 comments
Owner

Originally created by @rudrankriyam on GitHub (Feb 25, 2026).
Original GitHub issue: https://github.com/rudrankriyam/App-Store-Connect-CLI/issues/775

Problem

After identifying a rejected or unresolved submission, we still need a structured way to traverse:

  • submission -> resolution center thread(s)
  • thread -> message(s)
  • thread -> rejection reason(s)

Without this, users must manually inspect App Store Connect UI.

Scope

Add read-only Resolution Center retrieval commands in web/iris mode, including thread, message, and rejection reason surfaces.

Endpoint Contract (Observed)

Thread discovery:

  • GET /iris/v1/apps/{appId}/resolutionCenterThreads?include=appStoreVersions,app,appMessageThreadDetail,build,betaBackgroundAssetReviewSubmission&limit[appStoreVersions]=2000&filter[threadType]=REJECTION_BINARY,REJECTION_METADATA,REJECTION_REVIEW_SUBMISSION,APP_MESSAGE_ARC,APP_MESSAGE_ARB,APP_MESSAGE_COMM,APP_MESSAGE_INFORMATIONAL
  • GET /iris/v1/resolutionCenterThreads?filter[reviewSubmission]={reviewSubmissionId}&include=reviewSubmission

Thread details / messages:

  • GET /iris/v1/resolutionCenterThreads/{threadId}/resolutionCenterMessages?include=fromActor,rejections,resolutionCenterMessageAttachments&limit[rejections]=2000&limit[resolutionCenterMessageAttachments]=1000
  • GET /iris/v1/resolutionCenterThreads/{threadId}/resolutionCenterDraftMessage?include=resolutionCenterMessageAttachments,fromActor&limit[resolutionCenterMessageAttachments]=1000

Rejections:

  • GET /iris/v1/reviewRejections?filter[resolutionCenterMessage.resolutionCenterThread]={threadId}&include=appCustomProductPageVersion,appEvent,appStoreVersion,appStoreVersionExperiment,backgroundAssetVersions,gameCenterAchievementVersions,gameCenterLeaderboardVersions,gameCenterLeaderboardSetVersions,gameCenterChallengeVersions,gameCenterActivityVersions,build,appBundleVersion,rejectionAttachments&limit=2000&limit[rejectionAttachments]=1000

Important API Nuance

Some include shapes return 400. Example observed:

  • include=fromActor,rejections,resolutionCenterThread on resolutionCenterMessages -> 400

Implementation should use known-good include sets above and avoid unsupported expansions.

Proposed Command UX

  • asc web review threads list --app <app-id>
  • asc web review threads list --submission <review-submission-id>
  • asc web review messages list --thread <thread-id>
  • asc web review rejections list --thread <thread-id>
  • asc web review draft show --thread <thread-id>

Output Expectations

Thread output:

  • thread.id
  • threadType
  • state
  • createdDate
  • lastMessageResponseDate
  • canDeveloperAddNote
  • linked app store version ids

Message output:

  • message.id
  • createdDate
  • fromActor.actorType
  • messageBody (raw HTML + optional plain-text projection)
  • related rejection IDs / attachment IDs

Rejection output:

  • reviewRejection.id
  • reasons[] including:
    • reasonSection (e.g. 2.1)
    • reasonDescription
    • reasonCode (e.g. 2.1.0)

Parsing / UX Considerations

  • Message body is HTML; preserve raw body in JSON.
  • Optional helper: --plain-text to strip tags for table/markdown outputs.
  • Keep multi-line formatting stable for markdown output.

Error Handling

  • 401/403: unauthenticated/unauthorized web session
  • 404: invalid thread/submission ids
  • 400: unsupported include/filter combinations
  • return actionable messages, not raw provider stack traces

Test Plan (RED -> GREEN)

  1. cmdtest threads list --app with fixture containing multiple thread types.
  2. cmdtest threads list --submission mapping correctness.
  3. cmdtest messages list --thread verifies actor/body/date fields.
  4. cmdtest rejections list --thread verifies reason mapping.
  5. cmdtest unsupported/invalid ids and malformed flags -> exit 2 where appropriate.
  6. unit tests for HTML->plain text projection (if added).
  7. regression tests ensuring no accidental include sets that trigger 400.

Definition of Done

  • Commands above available and documented.
  • Output stable across JSON/table/markdown modes.
  • Thread/message/rejection traversal works for unresolved and rejected submissions.
  • Test coverage includes success + edge + error paths.
Originally created by @rudrankriyam on GitHub (Feb 25, 2026). Original GitHub issue: https://github.com/rudrankriyam/App-Store-Connect-CLI/issues/775 ## Problem After identifying a rejected or unresolved submission, we still need a structured way to traverse: - submission -> resolution center thread(s) - thread -> message(s) - thread -> rejection reason(s) Without this, users must manually inspect App Store Connect UI. ## Scope Add read-only Resolution Center retrieval commands in web/iris mode, including thread, message, and rejection reason surfaces. ## Endpoint Contract (Observed) Thread discovery: - `GET /iris/v1/apps/{appId}/resolutionCenterThreads?include=appStoreVersions,app,appMessageThreadDetail,build,betaBackgroundAssetReviewSubmission&limit[appStoreVersions]=2000&filter[threadType]=REJECTION_BINARY,REJECTION_METADATA,REJECTION_REVIEW_SUBMISSION,APP_MESSAGE_ARC,APP_MESSAGE_ARB,APP_MESSAGE_COMM,APP_MESSAGE_INFORMATIONAL` - `GET /iris/v1/resolutionCenterThreads?filter[reviewSubmission]={reviewSubmissionId}&include=reviewSubmission` Thread details / messages: - `GET /iris/v1/resolutionCenterThreads/{threadId}/resolutionCenterMessages?include=fromActor,rejections,resolutionCenterMessageAttachments&limit[rejections]=2000&limit[resolutionCenterMessageAttachments]=1000` - `GET /iris/v1/resolutionCenterThreads/{threadId}/resolutionCenterDraftMessage?include=resolutionCenterMessageAttachments,fromActor&limit[resolutionCenterMessageAttachments]=1000` Rejections: - `GET /iris/v1/reviewRejections?filter[resolutionCenterMessage.resolutionCenterThread]={threadId}&include=appCustomProductPageVersion,appEvent,appStoreVersion,appStoreVersionExperiment,backgroundAssetVersions,gameCenterAchievementVersions,gameCenterLeaderboardVersions,gameCenterLeaderboardSetVersions,gameCenterChallengeVersions,gameCenterActivityVersions,build,appBundleVersion,rejectionAttachments&limit=2000&limit[rejectionAttachments]=1000` ## Important API Nuance Some include shapes return 400. Example observed: - `include=fromActor,rejections,resolutionCenterThread` on `resolutionCenterMessages` -> 400 Implementation should use known-good include sets above and avoid unsupported expansions. ## Proposed Command UX - `asc web review threads list --app <app-id>` - `asc web review threads list --submission <review-submission-id>` - `asc web review messages list --thread <thread-id>` - `asc web review rejections list --thread <thread-id>` - `asc web review draft show --thread <thread-id>` ## Output Expectations Thread output: - `thread.id` - `threadType` - `state` - `createdDate` - `lastMessageResponseDate` - `canDeveloperAddNote` - linked app store version ids Message output: - `message.id` - `createdDate` - `fromActor.actorType` - `messageBody` (raw HTML + optional plain-text projection) - related rejection IDs / attachment IDs Rejection output: - `reviewRejection.id` - `reasons[]` including: - `reasonSection` (e.g. `2.1`) - `reasonDescription` - `reasonCode` (e.g. `2.1.0`) ## Parsing / UX Considerations - Message body is HTML; preserve raw body in JSON. - Optional helper: `--plain-text` to strip tags for table/markdown outputs. - Keep multi-line formatting stable for markdown output. ## Error Handling - 401/403: unauthenticated/unauthorized web session - 404: invalid thread/submission ids - 400: unsupported include/filter combinations - return actionable messages, not raw provider stack traces ## Test Plan (RED -> GREEN) 1) cmdtest `threads list --app` with fixture containing multiple thread types. 2) cmdtest `threads list --submission` mapping correctness. 3) cmdtest `messages list --thread` verifies actor/body/date fields. 4) cmdtest `rejections list --thread` verifies reason mapping. 5) cmdtest unsupported/invalid ids and malformed flags -> exit 2 where appropriate. 6) unit tests for HTML->plain text projection (if added). 7) regression tests ensuring no accidental include sets that trigger 400. ## Definition of Done - Commands above available and documented. - Output stable across JSON/table/markdown modes. - Thread/message/rejection traversal works for unresolved and rejected submissions. - Test coverage includes success + edge + error paths.
kerem closed this issue 2026-02-26 21:34:02 +03:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/App-Store-Connect-CLI#212
No description provided.