Get comments
comment and its replies in chronological order. Threads are ordered oldest first. The promotionId and versionId in the path must belong to your workspace, or the request returns 404.
Query parameters
Page through with
offset. Keep requesting until pagination.hasMore is false.
Comment fields
Author
Pagination fields
For cross-cutting errors (401, 403, 429, 502), see Errors & rate limits.
Import comments
Use this endpoint to push external review feedback (roots, replies, and action responses) onto the current latest version of a promotion. Each item is processed independently: one failure does not roll back the rest. SendexternalCommentId on every item if you need safe sequential retries. If you omit it, a retry after an ambiguous failure may create duplicates. Two simultaneous duplicate requests can still race.
Imported comments may not appear in Get comments immediately. Wait briefly before using GET to resolve parentCommentId.
Author identity
Each author needsauthor.email, author.externalUserId, or both.
We try the email first. If it matches an active member of your organization, the comment is theirs and uses their real Adclear permissions. Members ignore displayName and role.
Attributing a comment or action to a member is acting on their behalf, so it needs a key with act-on-behalf enabled. An ordinary key can only attribute to its own user. On an ordinary key, an item whose email matches any other member is imported as an external author instead (authorResolution: "external"). It shows in Adclear as “Name · Integration” and never gets that member’s permissions. Update comments has no external authors, so there the item is rejected with AUTHOR_NOT_PERMITTED.
If the email matches no member, or you send only externalUserId, the comment is imported as an external author. Adclear records the person once per organization, with the email and externalUserId you sent, their displayName, and their role. They show in Adclear as “Name · Integration”, for example “Jane Doe · Workfront”. The same email always maps to the same person. Without an email, the same externalUserId does. displayName falls back to the email, then externalUserId.
Set author.role to reviewer or author (default author). An external reviewer counts as compliance review only on keys enabled for external reviewers. Ask your Adclear contact to enable this. On other keys every external author is treated as an author. Your integration declares the role and Adclear does not verify it. The latest role you send for a person is the one Adclear keeps.
sourceUserId still works as an older name for externalUserId. If you send both, externalUserId wins. sourceRole is logged but never stored or used for permissions.
Each result includes authorResolution: member or external.
Item types
Supported
action values: agree_to_action, agree_will_action, dismiss, dispute, relevant_not_required, reply.
To reply to an AI evaluation finding, use the commentId that each comment-backed issue carries in the evaluation-completed webhook as parentCommentId. Comment indexing is asynchronous, so a reply sent immediately after the webhook may be rejected with PARENT_NOT_FOUND; wait briefly and retry.
Location (roots only)
location must already be collapsed to a single point, timestamp, or exact text snippet. The server does not accept rectangles or time ranges, so collapse them before sending:
- A region or bounding box → its centre point, as
xRatio/yRatio. - A time range → its start, as
timeSeconds.
location entirely to create an unanchored thread, which appears in the comment sidebar rather than on the asset.
Per-item result codes
Whole-request errors use the standard envelope:
404 when the promotion or version is not found, 409 when the version is not the latest, and 502 when author identity lookup is temporarily unavailable (no items are written).
Update comments
Use this endpoint to change an existing comment when its body is edited or its action changes in your integration. Send the newcontent, a new action, or both. Fields you omit are left unchanged. Each item is processed independently, and updates keep the comment’s identity and thread. They never create a duplicate or a reply.
An update becomes visible in Get comments after a short sync delay, with editedAt set on the changed comment.
status: "skipped" with reason: "not_modified", and nothing is written for it.
Identify the comment
Give each item one identifier. When both are present,commentId is used.
externalCommentId is not guaranteed unique within a version. If one matches more than one comment, the item is rejected with COMMENT_AMBIGUOUS. Target it by commentId instead.
What you can change
Changing an action does not clear an existing content. Resend
content alongside the action to keep it. Clearing an action back to none is not supported in this version.
Per-item result codes
Whole-request errors use the standard envelope:
404 when the promotion or version is not found, and 502 when author identity lookup is temporarily unavailable (no items are written).