> For the complete documentation index, see [llms.txt](https://argos-ci.com/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://argos-ci.com/docs/api-reference/reference/comments.md).

# Comments

Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions.

## List the comments on a media

> List the comments on an uploaded media, oldest first. A comment may carry an \`anchor\` pinning it to a point on the image, which is how reviewers mark up a screenshot.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:read"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/media/{mediaId}/comments":{"get":{"operationId":"listMediaComments","summary":"List the comments on a media","description":"List the comments on an uploaded media, oldest first. A comment may carry an `anchor` pinning it to a point on the image, which is how reviewers mark up a screenshot.","tags":["Comments"],"parameters":[{"in":"path","name":"mediaId","schema":{"type":"string","description":"The media ID"},"required":true,"description":"The media ID"}],"responses":{"200":{"description":"Comments, oldest first. Replies carry a threadId pointing at their root comment.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Post a comment (or reply) on a media

> Post a comment on an uploaded media. Start a new thread, or reply to an existing one with \`threadId\`. Pass an \`anchor\` to pin the comment to a point on the image — normalized coordinates, so it survives any scaling — which is how a reviewer marks up a screenshot.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/media/{mediaId}/comments":{"post":{"operationId":"createMediaComment","summary":"Post a comment (or reply) on a media","description":"Post a comment on an uploaded media. Start a new thread, or reply to an existing one with `threadId`. Pass an `anchor` to pin the comment to a point on the image — normalized coordinates, so it survives any scaling — which is how a reviewer marks up a screenshot.","tags":["Comments"],"parameters":[{"in":"path","name":"mediaId","schema":{"type":"string","description":"The media ID"},"required":true,"description":"The media ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}],"description":"Comment content. Either Markdown text or the JSON representation of a rich-text document."},"threadId":{"description":"Public ID of the root comment to reply to (e.g. `comment-xf23d`).","type":"string"},"anchor":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"]},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"]}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"}},"required":["body"]}}}},"responses":{"201":{"description":"Comment created successfully — returns the comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Get a single comment on a media

> Retrieve a single comment on a media by its ID.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:read"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"CommentId":{"type":"string","description":"The public ID of the comment (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/media/{mediaId}/comments/{commentId}":{"get":{"operationId":"getMediaComment","summary":"Get a single comment on a media","description":"Retrieve a single comment on a media by its ID.","tags":["Comments"],"parameters":[{"in":"path","name":"mediaId","schema":{"type":"string","description":"The media ID"},"required":true,"description":"The media ID"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/CommentId"},"required":true,"description":"The public ID of the comment (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Delete a comment on a media

> Delete a comment on a media. Only the comment's author can delete it.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"CommentId":{"type":"string","description":"The public ID of the comment (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/media/{mediaId}/comments/{commentId}":{"delete":{"operationId":"deleteMediaComment","summary":"Delete a comment on a media","description":"Delete a comment on a media. Only the comment's author can delete it.","tags":["Comments"],"parameters":[{"in":"path","name":"mediaId","schema":{"type":"string","description":"The media ID"},"required":true,"description":"The media ID"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/CommentId"},"required":true,"description":"The public ID of the comment (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Comment deleted successfully — returns the comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Update a comment on a media

> Update the body of a comment on a media. Only the comment's author can edit it.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"CommentId":{"type":"string","description":"The public ID of the comment (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/media/{mediaId}/comments/{commentId}":{"patch":{"operationId":"updateMediaComment","summary":"Update a comment on a media","description":"Update the body of a comment on a media. Only the comment's author can edit it.","tags":["Comments"],"parameters":[{"in":"path","name":"mediaId","schema":{"type":"string","description":"The media ID"},"required":true,"description":"The media ID"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/CommentId"},"required":true,"description":"The public ID of the comment (e.g. `comment-xf23d`)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}],"description":"Comment content. Either Markdown text or the JSON representation of a rich-text document."}},"required":["body"]}}}},"responses":{"200":{"description":"Comment updated successfully — returns the comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Add an emoji reaction to a comment on a media

> Add an emoji reaction to a comment on a media, on behalf of the authenticated user.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"CommentId":{"type":"string","description":"The public ID of the comment (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/media/{mediaId}/comments/{commentId}/reactions":{"post":{"operationId":"addMediaCommentReaction","summary":"Add an emoji reaction to a comment on a media","description":"Add an emoji reaction to a comment on a media, on behalf of the authenticated user.","tags":["Comments"],"parameters":[{"in":"path","name":"mediaId","schema":{"type":"string","description":"The media ID"},"required":true,"description":"The media ID"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/CommentId"},"required":true,"description":"The public ID of the comment (e.g. `comment-xf23d`)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji to react with."}},"required":["emoji"]}}}},"responses":{"200":{"description":"Reaction added — returns the comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Remove an emoji reaction from a comment on a media

> Remove an emoji reaction previously added by the authenticated user from a comment on a media.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"CommentId":{"type":"string","description":"The public ID of the comment (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/media/{mediaId}/comments/{commentId}/reactions":{"delete":{"operationId":"removeMediaCommentReaction","summary":"Remove an emoji reaction from a comment on a media","description":"Remove an emoji reaction previously added by the authenticated user from a comment on a media.","tags":["Comments"],"parameters":[{"in":"path","name":"mediaId","schema":{"type":"string","description":"The media ID"},"required":true,"description":"The media ID"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/CommentId"},"required":true,"description":"The public ID of the comment (e.g. `comment-xf23d`)"},{"in":"query","name":"emoji","schema":{"type":"string","description":"The emoji reaction to remove."},"required":true,"description":"The emoji reaction to remove."}],"responses":{"200":{"description":"Reaction removed — returns the comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Mark a media comment thread as resolved

> Mark a comment thread on a media as resolved.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"ThreadCommentId":{"type":"string","description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/media/{mediaId}/comments/{commentId}/resolve":{"post":{"operationId":"resolveMediaCommentThread","summary":"Mark a media comment thread as resolved","description":"Mark a comment thread on a media as resolved.","tags":["Comments"],"parameters":[{"in":"path","name":"mediaId","schema":{"type":"string","description":"The media ID"},"required":true,"description":"The media ID"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/ThreadCommentId"},"required":true,"description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Thread resolved — returns the root comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Reopen a resolved media comment thread

> Reopen a previously resolved comment thread on a media.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"ThreadCommentId":{"type":"string","description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/media/{mediaId}/comments/{commentId}/unresolve":{"post":{"operationId":"unresolveMediaCommentThread","summary":"Reopen a resolved media comment thread","description":"Reopen a previously resolved comment thread on a media.","tags":["Comments"],"parameters":[{"in":"path","name":"mediaId","schema":{"type":"string","description":"The media ID"},"required":true,"description":"The media ID"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/ThreadCommentId"},"required":true,"description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Thread reopened — returns the root comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Subscribe to a media comment thread's notifications

> Subscribe the authenticated user to a comment thread on a media to receive notifications about new replies.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"ThreadCommentId":{"type":"string","description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/media/{mediaId}/comments/{commentId}/subscription":{"post":{"operationId":"subscribeMediaCommentThread","summary":"Subscribe to a media comment thread's notifications","description":"Subscribe the authenticated user to a comment thread on a media to receive notifications about new replies.","tags":["Comments"],"parameters":[{"in":"path","name":"mediaId","schema":{"type":"string","description":"The media ID"},"required":true,"description":"The media ID"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/ThreadCommentId"},"required":true,"description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Subscribed — returns the root comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Unsubscribe from a media comment thread's notifications

> Unsubscribe the authenticated user from a media comment thread's notifications.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"ThreadCommentId":{"type":"string","description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/media/{mediaId}/comments/{commentId}/subscription":{"delete":{"operationId":"unsubscribeMediaCommentThread","summary":"Unsubscribe from a media comment thread's notifications","description":"Unsubscribe the authenticated user from a media comment thread's notifications.","tags":["Comments"],"parameters":[{"in":"path","name":"mediaId","schema":{"type":"string","description":"The media ID"},"required":true,"description":"The media ID"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/ThreadCommentId"},"required":true,"description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Unsubscribed — returns the root comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## List the comments on a build

> List the comments on a build.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:read"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"BuildNumber":{"description":"The build number","type":"string"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/builds/{buildNumber}/comments":{"get":{"operationId":"listBuildComments","summary":"List the comments on a build","description":"List the comments on a build.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"buildNumber","schema":{"$ref":"#/components/schemas/BuildNumber"},"required":true,"description":"The build number"}],"responses":{"200":{"description":"Comments, oldest first. Replies carry a threadId pointing at their root comment.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Post a comment (or reply) on a build

> Post a comment on a build. Start a new thread, reply to an existing one with \`threadId\`, optionally anchor the comment to a screenshot diff, or attach it to your pending review with \`addToReview\`.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"BuildNumber":{"description":"The build number","type":"string"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/builds/{buildNumber}/comments":{"post":{"operationId":"createBuildComment","summary":"Post a comment (or reply) on a build","description":"Post a comment on a build. Start a new thread, reply to an existing one with `threadId`, optionally anchor the comment to a screenshot diff, or attach it to your pending review with `addToReview`.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"buildNumber","schema":{"$ref":"#/components/schemas/BuildNumber"},"required":true,"description":"The build number"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}],"description":"Comment content. Either Markdown text or the JSON representation of a rich-text document."},"threadId":{"description":"Public ID of the root comment to reply to (e.g. `comment-xf23d`).","type":"string"},"screenshotDiffId":{"description":"Screenshot diff to anchor the comment to. Required when anchor is set.","type":"string"},"anchor":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"]},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"]}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},"addToReview":{"description":"Attach the comment to your pending review (created if needed) instead of posting it immediately. Ignored for replies, which inherit their thread's review.","type":"boolean"}},"required":["body"]}}}},"responses":{"201":{"description":"Comment created successfully — returns the comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Get a single comment on a build

> Retrieve a single comment on a build by its ID.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:read"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"BuildNumber":{"description":"The build number","type":"string"},"CommentId":{"type":"string","description":"The public ID of the comment (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/builds/{buildNumber}/comments/{commentId}":{"get":{"operationId":"getBuildComment","summary":"Get a single comment on a build","description":"Retrieve a single comment on a build by its ID.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"buildNumber","schema":{"$ref":"#/components/schemas/BuildNumber"},"required":true,"description":"The build number"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/CommentId"},"required":true,"description":"The public ID of the comment (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Delete a comment on a build

> Delete a comment on a build. Only the comment's author can delete it.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"BuildNumber":{"description":"The build number","type":"string"},"CommentId":{"type":"string","description":"The public ID of the comment (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/builds/{buildNumber}/comments/{commentId}":{"delete":{"operationId":"deleteBuildComment","summary":"Delete a comment on a build","description":"Delete a comment on a build. Only the comment's author can delete it.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"buildNumber","schema":{"$ref":"#/components/schemas/BuildNumber"},"required":true,"description":"The build number"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/CommentId"},"required":true,"description":"The public ID of the comment (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Comment deleted successfully — returns the comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Update a comment on a build

> Update the body of a comment on a build. Only the comment's author can edit it.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"BuildNumber":{"description":"The build number","type":"string"},"CommentId":{"type":"string","description":"The public ID of the comment (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/builds/{buildNumber}/comments/{commentId}":{"patch":{"operationId":"updateBuildComment","summary":"Update a comment on a build","description":"Update the body of a comment on a build. Only the comment's author can edit it.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"buildNumber","schema":{"$ref":"#/components/schemas/BuildNumber"},"required":true,"description":"The build number"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/CommentId"},"required":true,"description":"The public ID of the comment (e.g. `comment-xf23d`)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}],"description":"Comment content. Either Markdown text or the JSON representation of a rich-text document."}},"required":["body"]}}}},"responses":{"200":{"description":"Comment updated successfully — returns the comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Add an emoji reaction to a comment on a build

> Add an emoji reaction to a comment on a build, on behalf of the authenticated user.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"BuildNumber":{"description":"The build number","type":"string"},"CommentId":{"type":"string","description":"The public ID of the comment (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/builds/{buildNumber}/comments/{commentId}/reactions":{"post":{"operationId":"addBuildCommentReaction","summary":"Add an emoji reaction to a comment on a build","description":"Add an emoji reaction to a comment on a build, on behalf of the authenticated user.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"buildNumber","schema":{"$ref":"#/components/schemas/BuildNumber"},"required":true,"description":"The build number"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/CommentId"},"required":true,"description":"The public ID of the comment (e.g. `comment-xf23d`)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji to react with."}},"required":["emoji"]}}}},"responses":{"200":{"description":"Reaction added — returns the comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Remove an emoji reaction from a comment on a build

> Remove an emoji reaction previously added by the authenticated user from a comment on a build.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"BuildNumber":{"description":"The build number","type":"string"},"CommentId":{"type":"string","description":"The public ID of the comment (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/builds/{buildNumber}/comments/{commentId}/reactions":{"delete":{"operationId":"removeBuildCommentReaction","summary":"Remove an emoji reaction from a comment on a build","description":"Remove an emoji reaction previously added by the authenticated user from a comment on a build.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"buildNumber","schema":{"$ref":"#/components/schemas/BuildNumber"},"required":true,"description":"The build number"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/CommentId"},"required":true,"description":"The public ID of the comment (e.g. `comment-xf23d`)"},{"in":"query","name":"emoji","schema":{"type":"string","description":"The emoji reaction to remove."},"required":true,"description":"The emoji reaction to remove."}],"responses":{"200":{"description":"Reaction removed — returns the comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Mark a build comment thread as resolved

> Mark a comment thread on a build as resolved.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"BuildNumber":{"description":"The build number","type":"string"},"ThreadCommentId":{"type":"string","description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/builds/{buildNumber}/comments/{commentId}/resolve":{"post":{"operationId":"resolveBuildCommentThread","summary":"Mark a build comment thread as resolved","description":"Mark a comment thread on a build as resolved.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"buildNumber","schema":{"$ref":"#/components/schemas/BuildNumber"},"required":true,"description":"The build number"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/ThreadCommentId"},"required":true,"description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Thread resolved — returns the root comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Reopen a resolved build comment thread

> Reopen a previously resolved comment thread on a build.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"BuildNumber":{"description":"The build number","type":"string"},"ThreadCommentId":{"type":"string","description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/builds/{buildNumber}/comments/{commentId}/unresolve":{"post":{"operationId":"unresolveBuildCommentThread","summary":"Reopen a resolved build comment thread","description":"Reopen a previously resolved comment thread on a build.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"buildNumber","schema":{"$ref":"#/components/schemas/BuildNumber"},"required":true,"description":"The build number"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/ThreadCommentId"},"required":true,"description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Thread reopened — returns the root comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Subscribe to a build comment thread's notifications

> Subscribe the authenticated user to a comment thread on a build to receive notifications about new replies.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"BuildNumber":{"description":"The build number","type":"string"},"ThreadCommentId":{"type":"string","description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/builds/{buildNumber}/comments/{commentId}/subscription":{"post":{"operationId":"subscribeBuildCommentThread","summary":"Subscribe to a build comment thread's notifications","description":"Subscribe the authenticated user to a comment thread on a build to receive notifications about new replies.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"buildNumber","schema":{"$ref":"#/components/schemas/BuildNumber"},"required":true,"description":"The build number"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/ThreadCommentId"},"required":true,"description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Subscribed — returns the root comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Unsubscribe from a build comment thread's notifications

> Unsubscribe the authenticated user from a build comment thread's notifications.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"BuildNumber":{"description":"The build number","type":"string"},"ThreadCommentId":{"type":"string","description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/builds/{buildNumber}/comments/{commentId}/subscription":{"delete":{"operationId":"unsubscribeBuildCommentThread","summary":"Unsubscribe from a build comment thread's notifications","description":"Unsubscribe the authenticated user from a build comment thread's notifications.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"buildNumber","schema":{"$ref":"#/components/schemas/BuildNumber"},"required":true,"description":"The build number"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/ThreadCommentId"},"required":true,"description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Unsubscribed — returns the root comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## List the comments on a test

> List the comments on a test.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:read"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"TestId":{"type":"string","description":"The test identifier, as returned in a diff's `test.id`"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/tests/{testId}/comments":{"get":{"operationId":"listTestComments","summary":"List the comments on a test","description":"List the comments on a test.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"testId","schema":{"$ref":"#/components/schemas/TestId"},"required":true,"description":"The test identifier, as returned in a diff's `test.id`"}],"responses":{"200":{"description":"Comments, oldest first. Replies carry a threadId pointing at their root comment.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Post a comment (or reply) on a test

> Post a comment on a test. Start a new thread, or reply to an existing one with \`threadId\`.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"TestId":{"type":"string","description":"The test identifier, as returned in a diff's `test.id`"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/tests/{testId}/comments":{"post":{"operationId":"createTestComment","summary":"Post a comment (or reply) on a test","description":"Post a comment on a test. Start a new thread, or reply to an existing one with `threadId`.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"testId","schema":{"$ref":"#/components/schemas/TestId"},"required":true,"description":"The test identifier, as returned in a diff's `test.id`"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}],"description":"Comment content. Either Markdown text or the JSON representation of a rich-text document."},"threadId":{"description":"Public ID of the root comment to reply to (e.g. `comment-xf23d`).","type":"string"}},"required":["body"]}}}},"responses":{"201":{"description":"Comment created successfully — returns the comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Get a single comment on a test

> Retrieve a single comment on a test by its ID.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:read"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"TestId":{"type":"string","description":"The test identifier, as returned in a diff's `test.id`"},"CommentId":{"type":"string","description":"The public ID of the comment (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/tests/{testId}/comments/{commentId}":{"get":{"operationId":"getTestComment","summary":"Get a single comment on a test","description":"Retrieve a single comment on a test by its ID.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"testId","schema":{"$ref":"#/components/schemas/TestId"},"required":true,"description":"The test identifier, as returned in a diff's `test.id`"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/CommentId"},"required":true,"description":"The public ID of the comment (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Delete a comment on a test

> Delete a comment on a test. Only the comment's author can delete it.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"TestId":{"type":"string","description":"The test identifier, as returned in a diff's `test.id`"},"CommentId":{"type":"string","description":"The public ID of the comment (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/tests/{testId}/comments/{commentId}":{"delete":{"operationId":"deleteTestComment","summary":"Delete a comment on a test","description":"Delete a comment on a test. Only the comment's author can delete it.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"testId","schema":{"$ref":"#/components/schemas/TestId"},"required":true,"description":"The test identifier, as returned in a diff's `test.id`"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/CommentId"},"required":true,"description":"The public ID of the comment (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Comment deleted successfully — returns the comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Update a comment on a test

> Update the body of a comment on a test. Only the comment's author can edit it.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"TestId":{"type":"string","description":"The test identifier, as returned in a diff's `test.id`"},"CommentId":{"type":"string","description":"The public ID of the comment (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/tests/{testId}/comments/{commentId}":{"patch":{"operationId":"updateTestComment","summary":"Update a comment on a test","description":"Update the body of a comment on a test. Only the comment's author can edit it.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"testId","schema":{"$ref":"#/components/schemas/TestId"},"required":true,"description":"The test identifier, as returned in a diff's `test.id`"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/CommentId"},"required":true,"description":"The public ID of the comment (e.g. `comment-xf23d`)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}],"description":"Comment content. Either Markdown text or the JSON representation of a rich-text document."}},"required":["body"]}}}},"responses":{"200":{"description":"Comment updated successfully — returns the comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Add an emoji reaction to a comment on a test

> Add an emoji reaction to a comment on a test, on behalf of the authenticated user.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"TestId":{"type":"string","description":"The test identifier, as returned in a diff's `test.id`"},"CommentId":{"type":"string","description":"The public ID of the comment (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/tests/{testId}/comments/{commentId}/reactions":{"post":{"operationId":"addTestCommentReaction","summary":"Add an emoji reaction to a comment on a test","description":"Add an emoji reaction to a comment on a test, on behalf of the authenticated user.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"testId","schema":{"$ref":"#/components/schemas/TestId"},"required":true,"description":"The test identifier, as returned in a diff's `test.id`"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/CommentId"},"required":true,"description":"The public ID of the comment (e.g. `comment-xf23d`)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji to react with."}},"required":["emoji"]}}}},"responses":{"200":{"description":"Reaction added — returns the comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Remove an emoji reaction from a comment on a test

> Remove an emoji reaction previously added by the authenticated user from a comment on a test.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"TestId":{"type":"string","description":"The test identifier, as returned in a diff's `test.id`"},"CommentId":{"type":"string","description":"The public ID of the comment (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/tests/{testId}/comments/{commentId}/reactions":{"delete":{"operationId":"removeTestCommentReaction","summary":"Remove an emoji reaction from a comment on a test","description":"Remove an emoji reaction previously added by the authenticated user from a comment on a test.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"testId","schema":{"$ref":"#/components/schemas/TestId"},"required":true,"description":"The test identifier, as returned in a diff's `test.id`"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/CommentId"},"required":true,"description":"The public ID of the comment (e.g. `comment-xf23d`)"},{"in":"query","name":"emoji","schema":{"type":"string","description":"The emoji reaction to remove."},"required":true,"description":"The emoji reaction to remove."}],"responses":{"200":{"description":"Reaction removed — returns the comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Mark a test comment thread as resolved

> Mark a comment thread on a test as resolved.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"TestId":{"type":"string","description":"The test identifier, as returned in a diff's `test.id`"},"ThreadCommentId":{"type":"string","description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/tests/{testId}/comments/{commentId}/resolve":{"post":{"operationId":"resolveTestCommentThread","summary":"Mark a test comment thread as resolved","description":"Mark a comment thread on a test as resolved.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"testId","schema":{"$ref":"#/components/schemas/TestId"},"required":true,"description":"The test identifier, as returned in a diff's `test.id`"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/ThreadCommentId"},"required":true,"description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Thread resolved — returns the root comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Reopen a resolved test comment thread

> Reopen a previously resolved comment thread on a test.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"TestId":{"type":"string","description":"The test identifier, as returned in a diff's `test.id`"},"ThreadCommentId":{"type":"string","description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/tests/{testId}/comments/{commentId}/unresolve":{"post":{"operationId":"unresolveTestCommentThread","summary":"Reopen a resolved test comment thread","description":"Reopen a previously resolved comment thread on a test.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"testId","schema":{"$ref":"#/components/schemas/TestId"},"required":true,"description":"The test identifier, as returned in a diff's `test.id`"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/ThreadCommentId"},"required":true,"description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Thread reopened — returns the root comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Subscribe to a test comment thread's notifications

> Subscribe the authenticated user to a comment thread on a test to receive notifications about new replies.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"TestId":{"type":"string","description":"The test identifier, as returned in a diff's `test.id`"},"ThreadCommentId":{"type":"string","description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/tests/{testId}/comments/{commentId}/subscription":{"post":{"operationId":"subscribeTestCommentThread","summary":"Subscribe to a test comment thread's notifications","description":"Subscribe the authenticated user to a comment thread on a test to receive notifications about new replies.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"testId","schema":{"$ref":"#/components/schemas/TestId"},"required":true,"description":"The test identifier, as returned in a diff's `test.id`"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/ThreadCommentId"},"required":true,"description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Subscribed — returns the root comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Unsubscribe from a test comment thread's notifications

> Unsubscribe the authenticated user from a test comment thread's notifications.

````json
{"openapi":"3.2.0","info":{"title":"Argos API","version":"2.0.0"},"tags":[{"name":"Comments","description":"Collaborate on builds with threaded comments: post and edit comments, react with emojis, resolve threads, and manage notification subscriptions."}],"servers":[{"url":"https://api.argos-ci.com/v2","description":"API Endpoint"}],"security":[{"personalAccessToken":[]},{"oauth2":["comments:write"]}],"components":{"securitySchemes":{"personalAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"Personal Access Token","description":"Authenticate as a **user** with a personal access token.\n\nSend it as a bearer token in the `Authorization` header:\n\n```http\nAuthorization: Bearer <personal-access-token>\n```\n\nPersonal access tokens act on behalf of the user that created them\nand are required by endpoints that perform user actions, such as\nreviewing builds and posting comments."},"oauth2":{"type":"oauth2","description":"Authenticate as a **user** via an OAuth 2.1 access token obtained\nthrough the authorization-code (+ PKCE) flow. Used by the CLI and by\nMCP clients/agents. The token acts on behalf of the authorizing user,\nlimited to the granted scopes and organizations.","flows":{"authorizationCode":{"authorizationUrl":"https://app.argos-ci.com/oauth/authorize","tokenUrl":"https://app.argos-ci.com/oauth/token","refreshUrl":"https://app.argos-ci.com/oauth/token","scopes":{"profile":"Read your Argos profile and the list of teams you belong to.","projects:read":"Read your projects, builds, screenshots, diffs, tests, and analytics.","projects:write":"Create and configure projects and their settings.","builds:write":"Create and upload builds and screenshots.","reviews:write":"Approve, reject, or dismiss build reviews and ignore changes.","comments:read":"Read build comments and threads.","comments:write":"Post, edit, and delete comments, add reactions, and manage subscriptions.","media:read":"Read the images and videos uploaded to your teams.","media:write":"Upload images and videos, and delete the ones already uploaded.","account:admin":"Manage organization settings and members."}}}}},"schemas":{"TestId":{"type":"string","description":"The test identifier, as returned in a diff's `test.id`"},"ThreadCommentId":{"type":"string","description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Public ID of the comment (e.g. `comment-xf23d`) — the one the app links to, and the one every endpoint taking a comment ID expects."},"buildId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Build this comment is posted on, null when it is posted on a test."},"testId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Test this comment is posted on, null when it is posted on a build."},"mediaId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Media this comment is posted on, null when it is posted on a build or a test."},"mediaVersionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version of the media the comment was written against. A pin describes a spot on the bytes its author was looking at, so feedback on an older upload has to be read against that upload — match this id against `GET /media/{mediaId}/versions` to get the right file."},"threadId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Root comment ID when this comment is a reply."},"body":{"description":"Rich-text JSON content of the comment."},"text":{"type":"string","description":"Plain-text rendering of the comment content."},"author":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"agent":{"anyOf":[{"$ref":"#/components/schemas/Agent"},{"type":"null"}],"description":"The coding agent that posted the comment on the author's behalf. Null when the author posted it directly."},"screenshotDiffId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Screenshot diff this comment is anchored to, if any."},"anchor":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"x":{"type":"number"},"y":{"type":"number"}},"required":["type","x","y"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"lines"},"from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","from","to"],"additionalProperties":false}],"description":"Where on the referenced screenshot diff the comment points. A point uses normalized (0–1) coordinates; lines is a 1-based inclusive range.","type":"object"},{"type":"null"}],"description":"Where the comment points on its screenshot diff. Null means the whole diff."},"pending":{"type":"boolean","description":"Whether the comment belongs to a pending (unsubmitted) review and is only visible to its author."},"resolvedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the thread was resolved, null if not resolved. Only set on a root comment."},"editedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date the comment was last edited, null if never edited."},"createdAt":{"type":"string","description":"Date the comment was posted."},"reactions":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string","description":"The emoji used for the reaction."},"count":{"type":"number","description":"Number of users who reacted with this emoji."},"users":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"The users who reacted with this emoji."}},"required":["emoji","count","users"],"additionalProperties":false,"description":"Reactions of a single emoji on a comment."}}},"required":["id","buildId","testId","mediaId","mediaVersionId","threadId","body","text","author","agent","screenshotDiffId","anchor","pending","resolvedAt","editedAt","createdAt","reactions"],"additionalProperties":false,"description":"A comment posted on a build or on a test."},"User":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name"],"additionalProperties":false,"description":"A user."},"Agent":{"type":"object","properties":{"id":{"type":"string","description":"Stable id of the agent, e.g. `claude-code`. `unknown` when it could not be identified."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name to display, e.g. `Claude Code`. Null for an agent we cannot name."}},"required":["id","name"],"additionalProperties":false,"description":"A coding agent acting on behalf of a user."},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["error"],"additionalProperties":false,"description":"Error response"}}},"paths":{"/projects/{owner}/{project}/tests/{testId}/comments/{commentId}/subscription":{"delete":{"operationId":"unsubscribeTestCommentThread","summary":"Unsubscribe from a test comment thread's notifications","description":"Unsubscribe the authenticated user from a test comment thread's notifications.","tags":["Comments"],"parameters":[{"in":"path","name":"owner","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"project","schema":{"type":"string","minLength":1},"required":true},{"in":"path","name":"testId","schema":{"$ref":"#/components/schemas/TestId"},"required":true,"description":"The test identifier, as returned in a diff's `test.id`"},{"in":"path","name":"commentId","schema":{"$ref":"#/components/schemas/ThreadCommentId"},"required":true,"description":"Public ID of any comment in the thread (e.g. `comment-xf23d`)"}],"responses":{"200":{"description":"Unsubscribed — returns the root comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://argos-ci.com/docs/api-reference/reference/comments.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
