Skip to main content
Comments are the feedback left on a promotion version, both Adclear AI findings and human review notes. Use the read endpoint to pull feedback into your own workflow, and the import endpoint to push external review comments back into Adclear.

Get comments

Response (200 OK):
Each thread has one top-level 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. Send externalCommentId 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.
Response (200 OK, partial success):

Author identity

Each author needs author.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.
Omit 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 new content, 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.
Response (200 OK, partial success):
An item whose requested state already matches the current comment returns 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).