# Get comments Source: https://docs.adclear.ai/api-reference/api/evaluation/get-comments /openapi/integration-api.json get /v1/promotions/{promotionId}/versions/{versionId}/comments Returns comments on a version — AI-generated and human review — grouped into paginated threads. Each thread has one top-level comment plus its replies in chronological order. # Get evaluation Source: https://docs.adclear.ai/api-reference/api/evaluation/get-evaluation /openapi/integration-api.json get /v1/promotions/{promotionId}/versions/{versionId}/evaluation # Import comments Source: https://docs.adclear.ai/api-reference/api/evaluation/import-comments /openapi/integration-api.json post /v1/promotions/{promotionId}/versions/{versionId}/comments Import external review comments, replies, and action responses onto the latest version. Returns per-item results in request order. Send externalCommentId on every item for safe sequential retries; concurrent duplicate requests may race. Location anchors must already be collapsed: send the centre point of a region, and the start timestamp of a time range. Omit location entirely for an unanchored (sidebar) thread. Newly imported comments may not appear in GET immediately — allow a short delay before using GET to resolve parentCommentId. # Trigger evaluation Source: https://docs.adclear.ai/api-reference/api/evaluation/trigger-evaluation /openapi/integration-api.json post /v1/promotions/{promotionId}/versions/{versionId}/evaluate # Update comments Source: https://docs.adclear.ai/api-reference/api/evaluation/update-comments /openapi/integration-api.json patch /v1/promotions/{promotionId}/versions/{versionId}/comments Update existing comments on a version — edit the body (content), change the action response, or both. Identify each comment by its Adclear commentId or your own externalCommentId. Fields you omit are left unchanged. Returns per-item results in request order. Action changes must target a reply on an Adclear AI thread and require author. A newly imported reply may take a short moment to become resolvable by externalCommentId — use commentId to update it immediately. # Get link import status Source: https://docs.adclear.ai/api-reference/api/links/get-link-import-status /openapi/integration-api.json get /v1/links/{uploadId} Returns the status of a link submitted via POST /v1/links. Poll the statusUrl from that response rather than building this URL yourself — it carries the source query parameter that tells the poll which provider to check. When status is "completed", pass finalUploadId in uploadIds when creating a promotion or version, using the fileFormat returned by the capture call. # List Figma frames Source: https://docs.adclear.ai/api-reference/api/links/list-figma-frames /openapi/integration-api.json post /v1/links/figma/frames Lists the pages and frames of a Figma file so a frame can be selected for import via POST /v1/links. The file must be shared with "anyone with the link". This endpoint is limited to 10 requests per minute per API key. # Submit a link Source: https://docs.adclear.ai/api-reference/api/links/submit-a-link /openapi/integration-api.json post /v1/links Captures a link as an upload that can be used in promotions. Generic http(s) URLs are captured synchronously as a full-page screenshot — the call can take up to 2 minutes, so set a generous client timeout; returns 201 with an uploadId. Figma links (figma.com) are imported asynchronously via the Figma API — the file must be shared with "anyone with the link"; returns 202 with an uploadId to poll via the returned statusUrl. A frame must be identified via the node-id query parameter in the URL ("copy link to frame" in Figma) or the figmaFrameId field; discover frame IDs via POST /v1/links/figma/frames. Google Drive and Google Docs links (drive.google.com, docs.google.com) are imported asynchronously via the Google Drive API — the file must be shared with "anyone with the link"; returns 202 with an uploadId to poll via the returned statusUrl. Native Docs, Sheets and Slides are converted to PDF, so check the returned fileFormat rather than assuming "image". Always poll the statusUrl exactly as returned — it carries the source the poll needs. This endpoint is limited to 10 requests per minute per API key. # List channels Source: https://docs.adclear.ai/api-reference/api/list-channels /openapi/integration-api.json get /v1/channels # List jurisdictions Source: https://docs.adclear.ai/api-reference/api/list-jurisdictions /openapi/integration-api.json get /v1/jurisdictions # List products Source: https://docs.adclear.ai/api-reference/api/list-products /openapi/integration-api.json get /v1/products # List target markets Source: https://docs.adclear.ai/api-reference/api/list-target-markets /openapi/integration-api.json get /v1/target-markets # Create promotion Source: https://docs.adclear.ai/api-reference/api/promotions/create-promotion /openapi/integration-api.json post /v1/promotions Creates a new promotion and its first version. For file-based formats (pdf, image, video, etc.), upload files first via the File API and provide uploadIds. For text format, provide inline content instead of uploadIds. Returns 409 if any referenced upload has not finished uploading to storage. # Create version Source: https://docs.adclear.ai/api-reference/api/promotions/create-version /openapi/integration-api.json post /v1/promotions/{promotionId}/versions Creates a new version. Inherits promotionName, channel, product, and jurisdiction from the existing promotion. For file-based formats, provide uploadIds. For text format, provide inline content instead. Returns 409 if any referenced upload has not finished uploading to storage. # Get promotion Source: https://docs.adclear.ai/api-reference/api/promotions/get-promotion /openapi/integration-api.json get /v1/promotions/{promotionId} Returns the promotion's latest version and where it stands in review. Versions can be created through the API or in the Adclear app, so use this to find the latest version rather than tracking it yourself. The latest version is the one with the highest version number. # Submit version for review Source: https://docs.adclear.ai/api-reference/api/promotions/submit-version-for-review /openapi/integration-api.json post /v1/promotions/{promotionId}/versions/{versionId}/submit Submits a saved single-review version for compliance review. Optionally assigns a reviewer by email and overrides the version deadline. When the version is already pending or approved, returns its current status and ignores any reviewer or deadline fields (safe retry behaviour). # Assign or change reviewer Source: https://docs.adclear.ai/api-reference/api/review/assign-or-change-reviewer /openapi/integration-api.json put /v1/promotions/{promotionId}/versions/{versionId}/reviewer Assigns or changes the reviewer on a version. The reviewer must be an Adclear user with review access to the promotion's country. # Get decision Source: https://docs.adclear.ai/api-reference/api/review/get-decision /openapi/integration-api.json get /v1/promotions/{promotionId}/versions/{versionId}/decision Returns the current review decision for a promotion version. Once a decision has been made on the version, the response also includes who made the decision, when, and the reason if one was recorded. The decision describes this version only. isLatestVersion and latestVersionId say whether a newer version exists, including one created in the Adclear app; read the decision of latestVersionId to keep tracking the promotion. # Record decision Source: https://docs.adclear.ai/api-reference/api/review/record-decision /openapi/integration-api.json post /v1/promotions/{promotionId}/versions/{versionId}/decision Records the authoritative human review decision on a version: approve, reject, or request changes. The decision is permission-gated on the reviewer's access to the promotion's country. # Unassign reviewer Source: https://docs.adclear.ai/api-reference/api/review/unassign-reviewer /openapi/integration-api.json delete /v1/promotions/{promotionId}/versions/{versionId}/reviewer Removes the currently assigned reviewer from a version. # Comment created Source: https://docs.adclear.ai/api-reference/api/webhooks/comment-created /openapi/integration-api.json webhook comment.created Sent when a comment is added to a promotion version. # Evaluation completed Source: https://docs.adclear.ai/api-reference/api/webhooks/evaluation-completed /openapi/integration-api.json webhook evaluation-completed Sent when a compliance evaluation finishes (success or failure). Comment-backed issues normally include a commentId that can be sent as parentCommentId when posting a reply; replayed deliveries may omit it. If the reply briefly returns PARENT_NOT_FOUND, retry because comment indexing is asynchronous. # Review approved Source: https://docs.adclear.ai/api-reference/api/webhooks/review-approved /openapi/integration-api.json webhook review.approved Sent when a promotion version receives a terminal approval decision. # Review changes requested Source: https://docs.adclear.ai/api-reference/api/webhooks/review-changes-requested /openapi/integration-api.json webhook review.changes_requested Sent when a reviewer requests changes on a promotion version. # Review rejected Source: https://docs.adclear.ai/api-reference/api/webhooks/review-rejected /openapi/integration-api.json webhook review.rejected Sent when a promotion version is rejected. # Review submitted Source: https://docs.adclear.ai/api-reference/api/webhooks/review-submitted /openapi/integration-api.json webhook review.submitted Sent when a promotion version is submitted for review. # Delete upload Source: https://docs.adclear.ai/api-reference/file-api/upload/delete-upload /openapi/file-api.json delete /v1/uploads/{uploadId} Deletes the GCS file (primary + display variant if present), cleans up any lingering upload session, and hard-deletes the upload record from the database. Returns 404 if the upload does not exist or does not belong to the authenticated user. # Get upload status Source: https://docs.adclear.ai/api-reference/file-api/upload/get-upload-status /openapi/file-api.json get /v1/uploads/{uploadId} Returns the current status and metadata of an upload. # Initiate upload Source: https://docs.adclear.ai/api-reference/file-api/upload/initiate-upload /openapi/file-api.json post /v1/uploads Creates a GCS resumable upload session behind our domain. The caller PUTs file chunks to the returned uploadUrl with Content-Range headers. # Upload chunk Source: https://docs.adclear.ai/api-reference/file-api/upload/upload-chunk /openapi/file-api.json put /v1/uploads/{uploadId} Streams a chunk of file data to the underlying storage. Include a Content-Range header (e.g. `bytes 0-1048575/5242880`) and send the raw bytes as the request body. When the total is known and this is the final chunk, the upload completes and the status becomes `completed`. # What's new Source: https://docs.adclear.ai/changelog New features and improvements to Adclear ## Teams A reviewer preset with the Tone of Voice Reviewers team first, followed by the UK Compliance team. You can now organise people into teams in Adclear. Create a team for a department or a group of reviewers, then use it to filter work and set up review flows. Filter promotions by team to see what needs reviewing, or filter metrics to see how work is moving through each team. Team filters are also available for claims, policies, website monitors, and users. If you use [multi-level approval](/multi-level-approval), you can add teams to your reviewer presets. For example, send a promotion to Marketing first, then Compliance. When submitting, choose the reviewers from each team. Create your first team in [Settings → Organisation → Teams](/settings#teams). Add members manually or automatically using email patterns, with a preview of who joins or leaves before you confirm. ## Configurable tables Table settings showing row density options and the Reviewer column being dragged into a new position. Make tables your own in [Promotions](/marketing/promotion-dashboard#columns-at-a-glance), [My Tasks](/compliance/tasks-and-dashboard), and across Adclear. Open the sliders icon at the top right to choose your columns, drag them into order, and switch between Comfortable and Compact rows. Resize columns by dragging their edges in the table. Adclear remembers your layout for each table. It works alongside saved views and only affects what you see. ## Promotion lifecycle dates Record when a promotion was published, taken down, or recalled, including the reason for a recall. You can find these dates in the Info tab on a promotion. ## Configurable review reminders Admins can now set the first reminder from 1 to 90 days before a claim expires or a claim or promotion needs reviewing. Configure it per workspace in [compliance settings](/settings#compliance). The final reminder still arrives one day before the date. ## Improvements * Find promotions by ID or name in the Promotion dashboard. Search also supports disclaimer IDs. * Unsent comments stay as drafts when you navigate away and return. * Drop a mix of file types into the new promotion input in one go. * Service incidents now appear as a banner inside Adclear. ## External submissions The external submission form asking a partner for their name, email, and promotion type. Share one link and your agencies, affiliates, and influencers can submit straight into your review workflow. No Adclear account needed. Partners open your link, add their content, and submit without logging in, taking a seat, or seeing the rest of your workspace. After submitting, each partner gets their own [My Submissions](/my-submissions) page tracking everything they've sent you, with status, submission date, and review deadline. Fewer people email you asking where their promotion is. You can make the form your own. In **Settings → External**, add your logo and intro text, choose which questions submitters see, set defaults for the ones you hide, and limit the products and channels they can pick using your own labels. To try it, open Settings → External, customise the form, then copy the link and send it to one partner. Full detail in [External submission form](/external-submission-form) and [My Submissions](/my-submissions). # Chrome extension Source: https://docs.adclear.ai/chrome-extension Review ad copy from any web page in a side panel, then save drafts and feedback back to Adclear. The Adclear Chrome extension checks ad copy against your workspace rules without leaving the page you are working on. Highlight or paste text, run an evaluation in a side panel, and save the result to Adclear as a draft promotion when it is ready. The extension is in closed beta. See [Get access](#get-access) to request it for your team. ## What you can do Highlight text on any page, or paste it into the panel, and scan it against your workspace rules. Evaluations are visible only to you. Reviewers see nothing until you save a draft to Adclear. Turn a checked version into a draft promotion in your workspace with one click. To Action, Dispute, and Reply actions on issues appear as comments on the promotion in the web app. ## Get access The extension is in closed beta. The Chrome Web Store listing stays hidden until Adclear adds your email address. Speak to your Adclear contact about enabling the extension. Share the work email address of each person who needs it. Access is granted per person, so list everyone. Adclear adds each address to the beta list and confirms once it's done. Open the [Adclear listing](https://chromewebstore.google.com/detail/adclear/aefhleocgebknippbakgdlicjjoijjem) in Chrome, signed in to the browser with your added work email, and click **Add to Chrome**. Click the puzzle icon in the Chrome toolbar and pin **Adclear** so the icon stays visible. If the listing shows "item not found", the Google account signed in to Chrome does not match an added email. Switch accounts or speak to your Adclear contact. ## Sign in Click the **Adclear** icon in the Chrome toolbar. The side panel opens. Click **Sign in**. A browser tab opens where you sign in with your Adclear account. After "You're logged in!" appears, the tab closes on its own and the panel is ready to use. Your session ends when you close the browser, and periodically for security. When the panel shows "Your Adclear session expired", sign in again. ## Choose your organization and workspace The bar at the top of the panel shows your current organization and workspace. Click **Switch** to change them, or open **Settings** and use the **Organization** and **Workspace** dropdowns. Evaluations run against the rules of the selected workspace. The extension remembers your choice, and your scope picks per workspace, until you sign out. ## Evaluate copy The panel walks you through three steps: **Add copy**, **Pick scope**, and **Results**. Get text into the editor in either way: * Highlight text on any web page, right-click, and choose **Evaluate with Adclear**. The panel opens with the selection loaded. * Open the panel and paste or write the copy directly into the editor. Copy must be between 5 and 20,000 characters. Select the **Channel**, **Product**, and **Jurisdiction** the copy is for, and adjust **Targeting** if it applies. All three concrete picks are required. Adclear uses them to apply the right rules. Click **Evaluate**. Progress streams into the panel while the evaluation runs. You can start another draft in the meantime; running evaluations continue under **Evaluations** in the header. Issues appear as cards from Adclear AI. Each card quotes the affected text, suggests a fix, and explains **Why this matters**, with the rules it relates to. Use **Copy all** to take every suggestion with you, or the copy button on a single card. ## Drafts, versions, and saving to Adclear Everything you evaluate stays private to you until you save it. The status dot above the editor shows where a draft stands. | Status | Meaning | | - | - | | Unsaved | Text in the editor that has not been evaluated yet. | | Private | Evaluated in the extension. Visible only to you, including in your History. | | Saved | Saved to Adclear as a draft promotion. Visible to your team like any other draft. | To iterate, click **+** to add a new version of the copy and evaluate again. The version picker shows V1, V2, and so on, with **Latest** marking the newest. When a version is ready: Edit the title field above the results. It defaults to the first line of your copy. Click **Save to Adclear**. The button requires a complete scope (product, channel, and jurisdiction). Click **Go to Promotion** to open the new draft in the web app. Every version you evaluated in the extension carries over as a version of the promotion. ## Feedback and comment sync Once a version is saved to Adclear, each issue card offers three actions: **To Action** (you will make the change), **Dispute** (you disagree), and **Reply** (add a comment). * Actions and replies from the extension appear as comments on the promotion in the web app, in the same threads your team already uses. * Responses made in the web app flow back the other way. Click **Refresh from Adclear** in the results view, or reopen the draft from History, to pull them in. * A decision made in the web app locks that issue's buttons in the extension and shows who saved it. Feedback buttons stay disabled on Private drafts. The panel prompts "Save to Adclear before giving feedback." ## History Click **History** in the header to see your 20 most recent drafts for the selected organization and workspace, with their versions and statuses. History is tied to your Adclear account, not the browser, so it survives reinstalling the extension. Reopen any draft to keep iterating on it. ## Supported content and limits | | Supported | | - | - | | Content | Text only | | Length | 5 to 20,000 characters | | Promotion created on save | Single, text format | Image, video, and file evaluation are not available in the extension. Upload those through the web app instead. See [Upload types](/upload-types). ## What the extension can read The extension reads a page's content only when you highlight text and choose **Evaluate with Adclear**. It does not track your browsing, and it talks only to Adclear. It stores your sign-in for the browser session and remembers your workspace and scope choices. ## Troubleshooting Your Google account has not been added to the beta yet, or Chrome is signed in with a different account. Check the account, or speak to your Adclear contact. The copy needs at least 5 characters, and Channel, Product, and Jurisdiction must all be selected. Your account has no workspace access in the selected organization. Ask your workspace admin to grant it. Too many requests at once. Wait a moment and try again. ## Related pages Every Adclear feature in one place, including this one. What happens after your draft becomes a promotion. How to make sure Adclear can assess what you upload. Why your To Action and Dispute responses matter. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Reviewing claims Source: https://docs.adclear.ai/compliance/claims How to review, version, and archive claims in Adclear. ## Overview Claims are substantiated marketing statements reviewed separately from promotions. They follow the same review workflow. Reviewing a claim on its own lets your reviewers approve a marketing statement and its substantiation once, then link that claim to each promotion that uses it. The claim keeps its versions and review comments together, so you can see what was approved and on what evidence. Every claim is scoped to a product, jurisdiction, and communication type, set when the claim is created. If your organisation has several workspaces, Adclear can enable sharing of claims across them. Speak to your Adclear contact if you'd like this turned on. ## Claim review actions | Action | Resulting status | Notification sent | | - | - | - | | Approve | Approved | Claim approved email to owner | | Reject | Rejected | Claim rejected email to owner | | Request Changes | Changes Needed | Changes requested email to owner | After any action, you are assigned as reviewer on the claim. ## Assigned reviewer on claims A specific reviewer can be assigned when a claim is created. The assigned reviewer receives the notification, and other reviewers with permission for the relevant market can still pick it up. ## Claim versions Claims can have multiple versions. Comments are version-specific - V2 comments are not visible on V1. Use the version switcher to move between versions. Each shows its own data, status, and comments. ## Archiving claims Claims can be archived by Compliance Admin and Marketing Admin users. If you need a claim archived and don't have those permissions, ask an admin to do so from the three-dot menu on the Claims page. See [How Roles Work](/how-roles-work) for the full permission breakdown. The Owner and Reviewer filters on the Claims list and claim tasks let you select a team. Choosing a team shows every claim owned or reviewed by any of that team's current members, including unassigned claims when you select **Unassigned**. See [Teams](/settings#teams) for how teams are created and managed. ## Exporting claims You can export claims data from Adclear as a CSV file. This is separate from the promotion export on the [Compliance dashboard](/compliance/tasks-and-dashboard#exporting), which covers promotions only. Exporting claims is an add-on enabled per organisation. If you don't see the option, speak to your Adclear contact. Compliance Admin users have access where the add-on is enabled. ### Where to find it Open the [Claims](/marketing/claims) page. The **Export** button sits in the top-right of the page, alongside **New Claim**. ### What's included The export uses the current filters, search, and sort on the Claims page. It includes the latest version of every claim that matches, across all statuses, and excludes archived and deleted claims. Exports are capped at 10,000 claims per run; if you exceed the limit, narrow the filters and try again. ### File format A CSV file named `claims-export-YYYY-MM-DD.csv`, where the date is the day of the export in UTC. ### Columns | Column | Contents | | - | - | | ID | The claim's public reference, prefixed with `#` | | Name | The claim's display name | | Content | The claim statement | | Additional Details | The free-text detail field on the claim, if set | | Status | Saved, Pending, In Review, Approved, Rejected, Changes Needed, Escalated, Reviewing Risk, or Risk Accepted | | Products | Linked product names, semicolon-separated, or `All` | | Jurisdictions | Linked jurisdiction names, semicolon-separated, or `All` | | Channels | Linked channel names, semicolon-separated, or `All` | | Owner | The claim owner's full name | | Reviewer | The assigned reviewer's full name | | Created At | Date the current version of the claim was created (YYYY-MM-DD) | | Review Date | Next review date (YYYY-MM-DD) | | Approval Date | Date the current version was approved (YYYY-MM-DD). Blank until the current version is approved | | Adclear URL | Direct link back to the claim in Adclear | ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Commenting on promotions Source: https://docs.adclear.ai/compliance/commenting How to annotate text, images, videos, and PDFs during review. The mechanics below cover how to leave comments on each asset type. For how to respond effectively to AI-generated comments, including the difference between Agree, Please Action, Relevant Not Required, and Dismiss, see [Helping Adclear learn](/how-you-help-adclear-learn). ## Adding comments Pick the asset type you're reviewing. Highlight any portion of the text on the Submit for review page. A `+` button appears next to the highlighted text. Click it to attach a comment to that passage. The text becomes highlighted and clickable in the right-hand panel. Click Locate in the right panel to jump back to any comment. Click `+` to enter comment mode, then click the area of the image you want to annotate. A marker with your initials appears on the image, and the comment shows in the right panel. Tick the timestamp checkbox on the video timer before sending. The timestamp is attached to the comment and a tooltip appears on the video timeline at that moment. Click `+` to enter comment mode, then click on any page to place a marker. Each comment shows its page number and has a Locate button. ## Flagging something Adclear missed If Adclear should have raised an issue and did not, flag it from the comment box. A flagged comment goes to the Adclear team as a missed issue, and what you pin tells them where to look. Flagging is being rolled out gradually. If the flag button is not in your comment box yet, add a sticky comment and tag `@Adclear Support` instead, as described in [Helping Adclear learn](/how-you-help-adclear-learn#add-a-sticky-comment-for-something-adclear-missed). In the right-hand panel, click the flag button next to the comment box before you post. Its tooltip reads "Flag something Adclear missed". Only a new comment can be flagged, not a reply. Write the comment as you normally would and post it. The posted comment carries a purple flag, so everyone can see it reports a missed issue. Click "Pin where Adclear missed it" on the comment, then click the spot on the image, page or slide. On a video or audio promotion, click the timeline at the moment it happens. On a text promotion, click a word or select the passage. You can drag the marker afterwards to adjust it. A comment you post with the flag on from the asset itself (a marker on an image or a PDF page, a highlighted passage, or a comment with a timestamp attached) is pinned already. To change a flagged comment, use "Edit flag" from its menu. "Delete flag" removes the comment and withdraws the report. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Escalations Source: https://docs.adclear.ai/compliance/escalations Escalating to legal and handling risk acceptance flows. Escalate to Legal when you need specialist input before you decide. A [risk escalation](#risk-escalations) is different: an uploader sends a Rejected or Changes Needed promotion to a risk acceptor for their view. A risk acceptance response doesn't approve the promotion. ## Before you start Escalate sits in the Review menu with Approve, Reject and Request Changes, so you only see it when you've been asked to review the promotion. If you don't see it, check that you're the assigned reviewer on the current review step. Reviewers escalate promotions to Legal users, so make sure at least one Legal user is assigned. Legal responds with a comment, and the decision comes back to you. See [How roles work](/how-roles-work). ## Escalating to legal Reviewers escalate to Legal when specialist input is needed before a decision can be made. In the "You've been asked to review this promotion" banner, click **Review** and choose **Escalate**. Select a Legal user from the list. Status changes to Escalated. On multi-level approval reviews, the status stays In Review. The Legal user sees the promotion in their tasks and responds. Their reply appears as a comment prefixed "Legal Escalation:". After Legal responds, the promotion returns to your tasks in the status it had before you escalated it. You make the final decision. Legal responds to escalations and disputes. They don't make the final review decision. It comes back to the reviewer once Legal has weighed in. ## Risk escalations If an uploader escalates a Rejected or Changes Needed decision to an Uploader user with Risk Accepting permissions, the status changes through Escalated then Reviewing Risk. The Uploader user with Risk Accepting permissions responds with a comment prefixed "Risk Acceptance:" and, if they accept the risk, the promotion moves to Risk Accepted. For the full risk acceptance flow, see [Promotion Statuses](/promotion-statuses). ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # FAQs Source: https://docs.adclear.ai/compliance/faqs Common questions from reviewers using Adclear. ## Visibility and assignment The most likely cause is that the promotion was submitted with a specific reviewer assigned, and that reviewer is someone other than you. The promotion surfaces in their tasks, though anyone with permission for the relevant market can still pick it up. Check the promotion's Info tab to confirm the assigned reviewer. Another possibility: you may not have permission for the relevant market. Permissions to review are scoped by jurisdiction. Speak to your site admin if you think you should be assigned to that market. Yes. Assigning a reviewer surfaces the promotion in their tasks, but it doesn't lock the promotion to them. Anyone with reviewer permissions for the relevant market can pick it up (for example, when the assigned reviewer is out of office). ## Decisions Reject signals the promotion has failed review and isn't suitable as submitted. It's a final outcome. Request Changes signals that specific amendments are needed before it can be approved. It's a collaborative step. Both result in the promotion appearing on the uploader's tasks with your comments visible. No. A carousel is reviewed as a single unit. One decision applies to all frames. If one frame has an issue, your options are to request changes on the whole set, or reject it. The uploader can then resubmit a corrected version of the full carousel. See [Upload types](/upload-types). On an individual review, the reviewer can change their decision from the promotion's Info tab. Under [multi-level approval](/multi-level-approval), a recorded decision cannot be changed this way. In that case, the uploader submits a new version that addresses the comments, or escalates for risk acceptance review if appropriate. ## Upload quality and AI comments Yes. Poor-quality uploads are a common cause of inaccurate AI comments. Blurry images, missing disclaimers from cropped screenshots, and multiple promotions merged in one file can all cause Adclear to comment on things incorrectly. If the upload looks low quality or incomplete, request changes and ask the uploader to resubmit with a cleaner, complete file. See the [Upload quality guide](/marketing/upload-quality-guide). ## Evergreens and claims Adclear blocks the approval and shows a pop-up requiring a new date if the current review date is today or has passed. You can't skip this step. Contact support and they'll update it manually. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Overview Source: https://docs.adclear.ai/compliance/overview Everything you need to review, approve, and manage promotional content in Adclear. ## What this guide covers As a reviewer, your role is to assess promotional content submitted by uploaders and make review decisions. This section follows the full journey, from getting oriented with your tasks and the dashboard, through understanding what's been uploaded and why it matters, to making decisions, handling escalations, and managing claims and policies. New to Adclear? See [Getting started](/overview) to set up your account before continuing. ## How this section is organised This guide is split into focused pages so you can jump straight to what you need. Your working queue, the promotion dashboard, filtering, and exports. How to review a promotion and apply Approve, Reject, or Request Changes. How to annotate text, images, videos, and PDFs. Escalating to legal and handling risk acceptance flows. Reviewing, versioning, and archiving claims. Managing compliance policies and reusable disclaimer text. ## Two pages worth reading first These two are referenced repeatedly throughout this guide, and reading them up front will save time later. The four upload types and how decisions apply to each. Why your responses to comments train the agents and shape future AI suggestions. ## Understanding upload types Before reviewing a promotion, it's worth understanding how it was uploaded. The upload type determines what you're approving and how your decision is applied. For full definitions and decision-application detail per type, see [Upload types](/upload-types). A short summary follows. | Upload type | What it contains | How decisions apply | | - | - | - | | Single | 1 asset | 1 approval covers the whole promotion | | Carousel | One or more frames as 1 promotion | 1 approval covers all frames. You can't approve frames individually | | Variations | Multiple linked promotions | Each variation reviewed independently. You can also approve them all at once if appropriate | | Batch | Each item is reviewed as a Single | Each item independent. Once uploaded, you handle them as Singles | ## Upload quality: what to look out for The quality of what the uploader submits directly affects what Adclear can assess, and therefore the accuracy of what you're reviewing. Poor-quality uploads are one of the most common causes of inaccurate AI comments. For a full breakdown of upload quality issues, what causes inaccurate comments, and when to request a higher-quality resubmission, see the [Upload quality guide](/marketing/upload-quality-guide). The "For reviewers" section at the bottom of that page is written specifically for reviewers. If you suspect a comment was caused by a poor upload rather than a genuine compliance issue, request changes and ask the uploader to resubmit a higher-quality or more complete version of the file. You aren't required to make a final decision on an upload that is clearly incomplete. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Policies & disclaimers Source: https://docs.adclear.ai/compliance/policies Managing compliance policies and reusable disclaimer text in Adclear. ## Policies Policies are compliance documents (URLs or uploaded files) that define the rules promotions must follow. Compliance Admins and Marketing Admins can create policies, and only Compliance Admins can edit, version, or delete them. Policies inform the AI suggestions Adclear generates during review. ### Creating a policy Compliance Admins and Marketing Admins can create policies. Only Compliance Admins can edit, version, or delete an existing one. See [How roles work](/how-roles-work) for the full picture. Fill in the policy name, products, channels, and jurisdictions. Either paste a website URL or upload a document (such as a PDF, Word document, text file, image, CSV, or Excel spreadsheet). Uploaded documents can be up to 30 MB. Website URLs display as clickable links in both the list and detail view. Pick a date for the policy's next review. Reminder emails go to the person who uploaded the current version of the policy, even if someone else sets the date. A Compliance Admin can change it later from the policy sidebar. The policy appears in the Policies list. Click the row to open the Policy View page with full details. ### Viewing a policy Open a policy from the Policies list to see its details, sidebar metadata, and the content you added. Click a document in the Content section to open it in a new browser tab. PDFs open directly; Word documents are converted to PDF automatically for viewing. Spreadsheets (CSV and Excel) download instead of opening, because they cannot be previewed. Website URLs open in a new tab. When a rule links to a policy, opening the policy from that rule takes you to the same Policy View page. Policies are searchable when you link them to other items. When linking a policy to a rule, you can search the picker by name. The results are automatically filtered to the rule's products, channels, and jurisdictions. ### Review dates and reminders Give a policy a next review date so it is not forgotten. You can set the date when you add the policy, and a Compliance Admin can change or clear it later from the **Next review date** field in the policy sidebar. Adclear emails a reminder seven days before the next review date and again on the day itself. Reminders go to the person who uploaded the current version of the policy. Turn them on or off from **Settings → Notifications → Email**, under **Next Review Date Reminders**. The **Advance reminder timing** setting on that page applies to claims and promotions only; policy reminders always go out seven days ahead. See [Settings](/settings) for the full list of email preferences. ### Deleting a policy Compliance Admins can delete policies from the row context menu on the Policies list or from the Policy View page. A confirmation message appears and the policy is removed. You cannot see a list of deleted policies in Adclear yourself. If you need to check whether a policy was deleted, contact [support@adclear.ai](mailto:support@adclear.ai). ### Policy comments Open any policy from the list to add comments. Newer comments appear at the top. You can delete individual comments from the comment menu. Anyone you @-mention in a policy comment receives a notification. Each person can turn mention notifications on or off from their own [notification preferences](/settings). Policies feed directly into the rules Adclear applies during review. To understand how this surfaces to your team, see [Rules](/compliance/rules). Reviewers can also see the Changelog on each rule to track how rules have evolved over time. The Uploader filter on the Policies list lets you select a team. Choosing a team shows every policy uploaded by any of that team's current members. See [Teams](/settings#teams) for how teams are created and managed. ## Disclaimers Disclaimers are reusable legal text snippets that can be linked to promotions, claims, and rules. They are scoped to specific products, jurisdictions, and communication types. Disclaimers let you keep your approved legal wording in one place and link it to the promotions, claims and rules that need it, rather than copying the text into each one. During review, the rules that reference a disclaimer use it to check whether a promotion includes the required wording. Compliance Admins can create, edit, and manage disclaimers from the Disclaimers page in the workspace. Once created, a disclaimer becomes available to link from claims and is referenced by relevant rules during review. To link an existing disclaimer to a claim, open the claim's Submit Claim page, go to Linked Disclaimers, and select from the available disclaimers. ### Creating a disclaimer Only Compliance Admins can create disclaimers. See [How roles work](/how-roles-work). Open the Disclaimers page in the workspace and start a new disclaimer. Paste the approved legal wording into the **Disclaimer Content** field. This is the exact text that will be linked from claims, promotions, and rules. Choose the **Products**, **Channels**, **Jurisdictions**, and **Content Types** the disclaimer applies to. If your workspace uses more than one communication type, pick the **Communication Types** it applies to as well. Use **Apply to all** on any field where the disclaimer applies everywhere in that dimension. The disclaimer appears in the Disclaimers list and is available to link from claims and to be referenced by rules. ### Disclaimer versions When wording needs to change, add a new version instead of editing in place, so earlier wording is preserved. Open the disclaimer from the Disclaimers list. The version selector at the top of the page shows the current version. From the version selector, choose **Add version**. Update the content and scope, then confirm to create the next version. Earlier versions stay accessible from the version selector on the disclaimer page. Select any version to view its content and scope as they were at the time. ### Prominence Prominence is a check that flags disclaimers that are too small compared with the main text on a promotion. Prominence checks are turned on for your workspace by Adclear. Once they are on, the check is on by default for every new disclaimer, and you can switch it off for a specific disclaimer. Compliance Admins can open a disclaimer and use the **Check Prominence** toggle in the sidebar to switch the check on or off for that disclaimer. When it is on, Adclear flags the disclaimer during review if it does not meet the minimum size against the promotion's main text. When it is off, no prominence check runs for that disclaimer. The **Check Prominence** toggle only appears when prominence checks are turned on for your workspace. To have prominence turned on, contact [support@adclear.ai](mailto:support@adclear.ai). ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai) if you have questions about policies or disclaimers. # Rejection & changes-requested reasons Source: https://docs.adclear.ai/compliance/rejection-reasons Configure reusable reasons for promotions and claims, and apply them when rejecting or requesting changes. Reviewers can attach one or more standard reasons when they **Reject** or **Request Changes** on a promotion or a claim. Reasons are managed per workspace and kept as separate lists for promotions and claims. ## Managing reasons Go to **Settings → Compliance → Rejection Reasons**. Use the **Promotions / Claims** toggle in the top-right to switch between the two lists — each type has its own reasons. Toggle between **Promotions** and **Claims**. The table shows only that type's reasons. Click **Add Reason**, give it a name and (optionally) a description. The new reason is scoped to the current workspace and reason type. Use the row actions to edit or delete a reason. Built-in default reasons are marked **Default** and cannot be deleted. ## Applying reasons at review time When you choose **Reject** or **Request Changes** on a promotion or claim, a dialog lists the reasons for that item type. Select one or more; choosing **Other** lets you type a custom reason. The selected reasons are recorded against the item and added to its comment thread for audit. Promotions and claims have independent reason lists — a reason created under Promotions is not offered when reviewing a claim, and vice versa. # Making review decisions Source: https://docs.adclear.ai/compliance/review-decisions How to review a promotion and apply Approve, Conditionally Approve, Reject, or Request Changes. ## Making a review decision From My Tasks or the Promotion Dashboard, click the promotion to open it. The Submit for Review page shows the promotion alongside AI-generated compliance suggestions. Review both carefully. Check the upload quality before proceeding. If the asset appears blurry, cropped, or incomplete, consider requesting a higher-quality resubmission rather than making a final decision. Each AI comment needs an action: agree, dismiss, or mark as relevant but not required. Click **Reasoning** on a comment to see why it was flagged and the rules it cites. If your organization uses the Rules page, each cited rule links to the rule itself. The substance of how you respond shapes how Adclear's agents calibrate over time. See [Helping Adclear Learn](/how-you-help-adclear-learn) for the full mechanics, and what strong responses look like. Leave a comment explaining your decision, especially for rejections, change requests, or dismissed AI suggestions. Be specific about what needs to change and where. The uploader will see this. Click Approve, Conditionally Approve, Reject, or Request Changes. ## Decision outcomes | Decision | Resulting status | Who is notified | | - | - | - | | Approve | Approved | Uploader and collaborators receive an email | | Conditionally Approve | Conditionally Approved | Uploader and collaborators receive the condition as a comment | | Reject | Rejected | Uploader and collaborators receive an email; promotion appears on their tasks | | Request Changes | Changes Needed | Uploader receives a changes requested email; promotion appears on their tasks | After any decision, you are recorded as the reviewer on the promotion. When you select **Conditionally Approve**, enter a clear condition in the dialog. Adclear adds it to the promotion as your comment, so the uploader can see what must change. The next version may be eligible for self-approval after the uploader addresses that condition. See [Self-approval](/self-approval) to understand the eligibility rules. That last point is worth being deliberate about. Where your workspace has a self-approval rule covering conditionally approved resubmissions, the uploader can approve their own next version even if they cannot self-approve ordinary submissions. Your condition is then the last review step on that promotion, so write it precisely enough to act on without a follow-up conversation. Choosing **Request Changes** instead removes that extra path, but it does not guarantee another reviewer sees the next version: an uploader covered by an ordinary self-approval rule can still approve their own resubmission. Whether any decision forces a second reviewer depends on your workspace's self-approval rules, which your compliance admin can see on the Self Approval settings page. **Conditionally Approve** is a decision for a reviewer, not for an uploader. It records a change you expect someone else to make, so it does not appear on a promotion you uploaded yourself, even where you can otherwise approve your own work. Approve it or leave it unapproved instead. Reject signals the promotion has failed review and is not suitable as submitted. Request Changes signals that specific amendments are needed before it can be approved. Both result in the promotion appearing on the uploader's tasks with your comments visible, but they communicate different things about the path forward. ## Reviewing variations Each variation appears separately and can be reviewed independently or together. * You can apply different decisions to each variation. For example, approve one and request changes on another. * You can also approve all variations at once if appropriate. Use the bulk approval option from the variation group view. * If a specific reviewer was assigned to a variation, the variation surfaces in their tasks. Other reviewers with permission for the relevant market can still pick it up. * Uploaders may submit variations individually or all at once. You may see them arrive in your tasks separately or together. Apply comments and decisions per variation so Adclear can learn from each one individually. ## Evergreen promotions Evergreen promotions require periodic re-review. When you approve one, Adclear will prompt you to set the next review date. * If the next review date is today or has passed, a pop-up will appear requiring you to set a new date before approval can complete. You cannot skip this step. * If the next review date is in the future, approval proceeds normally. The uploader can see the evergreen toggle and the next review date but cannot edit it. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Rules Source: https://docs.adclear.ai/compliance/rules What rules are, how they come from your policies, how to edit them, and how to read their history. Every comment Adclear raises during a review traces back to a rule. Rules are how your organisation's policies (regulatory obligations, internal standards, tone-of-voice guidelines) get translated into something the platform applies consistently across every promotion. Compliance Admins and Marketing Admins can see every rule in the workspace and change where each one applies. The check itself (what a rule looks for) is managed by Adclear and refined over time based on reviewer feedback. The Rules page is an add-on enabled per organisation. If you don't see Rules in your navigation, speak to your Adclear contact. ## What a rule is A rule is a single applied check the platform runs against the content of a promotion. It has three parts. | Part | What it does | | - | - | | Trigger | The condition that determines when the rule applies, for example a specific product, channel, jurisdiction, or communication type | | Check | The thing the rule looks for, for example the presence of a required risk warning, or the absence of a prohibited claim | | Source | The policy, regulation, or internal standard the rule comes from | When a rule is triggered and the check fails, Adclear raises a comment on the promotion. The reviewer sees the comment, the reasoning, and the source, and decides how to respond. Rules are shown as summaries in Adclear, not the full underlying detail. The summary covers what the rule does, the scope shows when it applies, and the [Changelog](#the-changelog) shows how it has changed. The detailed check logic isn't shown, and only Adclear can edit the summary. ## How rules are applied to a promotion When a promotion is reviewed, Adclear selects the rules in scope for it based on product, channel, jurisdiction, content type, and targeting. The review surfaces the issues it finds as comments on the promotion, each with its reasoning and the source rule. Adclear does not record a pass or fail against every rule in scope, so there is no per-rule record of every rule checked on a promotion. To see which rules are active for a given product, channel and jurisdiction, use the filters on the Rules page. ## How rules come from policies Each rule is grounded in a regulatory framework your business operates under (for example, FCA financial promotions guidance) or in your organisation's own standards (for example, claim substantiation requirements or tone-of-voice principles). Once a policy is in place, Adclear works with your Compliance team to translate the relevant requirements into rules. ## How rules link to your wider compliance setup Each rule is connected to the broader compliance content in your workspace. Adding or removing a link doesn't create a new version of the rule and doesn't need a reason. The promotions the rule has been raised against during review. Compliance Admins and Marketing Admins can also link promotions to a rule manually. Claims the rule relates to, for example a substantiation requirement. Compliance Admins and Marketing Admins can link and unlink them. Disclaimers the rule requires. Compliance Admins and Marketing Admins can link and unlink them. The wording itself is managed from the [Policies & disclaimers page](/compliance/policies). The source policies and handbook references the rule implements. Compliance Admins and Marketing Admins can link and unlink them from the rule's sidebar. ## Edit a rule Compliance Admins and Marketing Admins can change the parts of a rule that decide when it applies. Every change is recorded in the [Changelog](#the-changelog). | Change | Creates a new version | Reason required | | - | :-: | :-: | | Rule name and scope | ✓ | ✓ | | Archive or restore | ✕ | ✓ | | Tags | ✕ | ✕ | To edit a rule shared into your workspace, open it in the workspace it belongs to. See [Shared rules](#shared-rules). Open the rule from the Rules page. You can only add a version from the rule's latest version. Click **+** next to the version selector, or open the version selector and choose **Add version**. The **Add New Version** dialog opens with the current name and scope filled in. Update the **Rule Name**, **Products**, **Channels**, **Jurisdictions**, or **Content Types**. **Communication Types** and **Targeting Exclusions** appear when your workspace uses them. Explain the change in **Reason for change** (up to 500 characters), then click **Create Version**. The new version is active straight away. The check, linked items, and other settings carry over unchanged. If someone else saves a newer version while you have the dialog open, Adclear won't overwrite it. Refresh the page and make your change again. Archiving removes a rule from reviews. Nothing is deleted. Open the rule, or find it on the Rules page. Turn on the **Archived** filter to find archived rules. Click **Archive** or **Restore** at the top of the rule page, or choose it from the row's actions menu on the Rules page. Enter the **Reason for archiving** or **Reason for restoring**, then confirm. Restore an archived rule before adding a new version to it. Tags are labels for organising and filtering rules. Add them from the **Tags** field in the rule's sidebar: pick existing tags or create a new one. Changes take effect straight away. ## The changelog The Changelog on each rule records how it has changed. A new entry is added each time a version is published, and each time the rule is archived or restored. It's visible to everyone who can see the Rules page. | Label | What it means | | - | - | | **Created** | The first version of the rule | | **AI Improvement** | A later version where Adclear AI improved the rule, for example after learning from reviewer feedback | | **Scope change** | A later version where someone in your team changed the rule's name or where it applies | | **Archived** / **Restored** | Someone archived or restored the rule | Entries also show who made the change, the date, and the reason where one was given. A **Scope change** entry shows what changed in each scope field: removed items in red and struck through, added items in green, and **All** or **Custom** when a field switches between every item and a custom selection. The three newest entries show by default. Expand the section to see the full history. If you need a fuller history for an audit, speak to your Adclear contact. ## Where to see rules From the main navigation, open Rules. This shows the rules currently active for your workspace. Filter by product, ad type (channel), jurisdiction, content type, targeting, rule type, or rule tag. Rule tags are separate from the campaign tags used on the promotion dashboard. Turn on **Archived** to see archived rules. Click any rule to see its summary, scope, tags, linked items, and Changelog. Rules are visible to Compliance Admin and Marketing Admin roles. Other roles see the outcome of a rule (the comment on a promotion) but not the Rules page. See [How roles work](/how-roles-work). ## How rules get refined Every reviewer response to a comment (agree, disagree, dismiss with context) feeds into how the rule is calibrated over time. A rule that comments too aggressively gets tightened; a rule that misses cases gets adjusted. The substance of the comment matters as much as the click. See [Helping Adclear learn](/how-you-help-adclear-learn). ## Evidencing your rule coverage The Changelog lists every version, archive, and restore with its date, author, and, where available, what changed and why. See [The changelog](#the-changelog). Filter the Rules page by product, channel, jurisdiction, content type, rule type, or rule tag. See [Where to see rules](#where-to-see-rules). Each rule links to the source policy it implements, and to any related claims and disclaimers. See [How rules link to your wider compliance setup](#how-rules-link-to-your-wider-compliance-setup). ## Shared rules Sharing rules across workspaces is turned on per organisation. Speak to your Adclear contact to set it up. A rule belongs to the workspace it was created in. Where sharing is turned on, Compliance Admins and Marketing Admins can share a rule into other workspaces in the organisation from the **Sharing** field in the rule's sidebar. * In the workspaces it's shared into, the rule is applied in reviews and is marked **Shared from another workspace**. It's read-only there. * To change a shared rule, open it in the workspace it belongs to. Changes apply in every workspace it's shared into. * Reviewer feedback from every workspace the rule is shared into shapes how it's refined. ## Frequently asked questions No. The check is managed by Adclear. You can change where a rule applies (see [Edit a rule](#edit-a-rule)). If a rule is checking for the wrong thing, or a rule is missing, raise it through the Get Help bot or tag @Adclear Support on a specific comment. You need the Compliance Admin or Marketing Admin role, and the rule must belong to your workspace rather than be [shared into it](#shared-rules). To add a version, you also need to be viewing the latest version of a rule that isn't archived. Add another version that puts the scope back, with a reason. Both versions stay in the Changelog. Rules can be over-applied, especially early on. Have the reviewer click Relevant, Not Required or Dismiss with a comment explaining the context. This is how the rule gets recalibrated, and the next Changelog entry will reflect it. Use a sticky comment on the promotion (the + icon at the top right of the asset viewer) to mark what was missed, and tag @Adclear Support. Adclear uses these signals to expand the rule. No. Each organisation has its own rule set, and workspaces within an organisation can have different rules. Where sharing is turned on, a rule can be shared across workspaces. See [Shared rules](#shared-rules). ## Related pages How reviewer responses calibrate rules over time. Who can see and edit rules. Where source policies and disclaimers are managed. Every Adclear feature in one place. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Tasks & dashboard Source: https://docs.adclear.ai/compliance/tasks-and-dashboard Your working queue, the promotion dashboard, filtering, saved views, and exporting. ## My Tasks My Tasks is your primary working queue. It shows promotions that are ready for you to act on: * Pending Review and unassigned (visible to all reviewers with permission for the relevant market) * Pending Review and specifically assigned to you * Returned to you after escalation A reviewer assigned to a colleague does not lock the promotion to that colleague. Anyone with reviewer permissions for the relevant market can pick it up. ## The Promotion Dashboard The Promotion Dashboard shows all promotions across your workspace. Unlike My Tasks, it gives a full picture of all content regardless of status, useful for tracking in-flight reviews, checking workload across the team, or finding a specific promotion. ## Promotions across workspaces For internal users, if your organisation has more than one workspace and your Adclear contact has turned on the cross-workspace view, the Promotion Dashboard lists promotions from every workspace you can access. This lets you review the work outstanding for more than one client or team in one place, including promotions in each status such as Changes Needed and Rejected. External reviewers and uploaders continue to see only promotions in their current workspace. The cross-workspace view and Workspace filter are unavailable to them. * A **Workspace** column shows which workspace each promotion belongs to. * The **Workspace** filter narrows the list to one or more workspaces and shows how many promotions each workspace has. If you select no workspace, the list covers every workspace you can access. * Open a promotion from another workspace and Adclear switches you to that workspace. You can only change a promotion's reviewer or tags, and archive, restore, or delete it, while you are in that promotion's workspace. For a promotion in another workspace these controls are unavailable. Open the promotion to switch to its workspace first. AI search looks only at the workspace you are currently in. You can use it while the list shows that workspace alone, so select your current workspace in the Workspace filter first. If the list covers more than one workspace, Adclear turns AI search off and clears any AI search results. If Adclear cannot confirm the cross-workspace setting within a few seconds (for example, because of a slow or failing connection), the dashboard shows only your current workspace. It switches to the cross-workspace view if the setting arrives later. Export downloads promotions from the workspace you are currently in. ## Columns at a glance | Column | What it shows | | - | - | | Name | The promotion title | | Jurisdiction | The market the promotion applies to | | Status | Where the promotion is in the review workflow | | Reviewer | The reviewer assigned to it | | Uploader | The uploader who submitted it | | Deadline | The date requested for a decision | | Tags | Labels for grouping or internal notes | | Last Upload | When it was last submitted | | Workspace | The workspace the promotion belongs to (only when the cross-workspace view is on) | You can resize, reorder, sort, and hide columns. You can also turn on a **Times reviewed** badge beside the Pending Review status. See [Spotting resubmissions](#spotting-resubmissions). ## Promotion statuses For a full breakdown of every status and what it means, including who acts next at each stage, see [Promotion Statuses](/promotion-statuses). ## Filtering and saved views Click Add Filter and choose criteria: status, jurisdiction, product, channel, uploader, reviewer, date, tags, times reviewed, or workspace (when the cross-workspace view is on). Multiple filters combine with AND logic. Click Save, name the view, and confirm. It appears as a tab for quick access. Use the more options menu on any view tab to rename, edit, or delete. Click Clear to remove active filters without deleting the view. Saved views are shared across your organisation. When you save a view, everyone in your organisation sees it as a tab on their Promotion Dashboard. Use clear, descriptive names so colleagues can tell at a glance what the view is for. Build saved views for your most common filter combinations. For example, a view scoped to your jurisdiction filtered to Pending Review status. The Uploader and Reviewer filters on My Tasks and the Promotion Dashboard also let you select a team. Choosing a team shows every promotion uploaded or reviewed by any of that team's current members. See [Teams](/settings#teams) for how teams are created and managed. Every filter list has **Select all** and **Clear** buttons at the bottom. Select all ticks every option currently shown, so you can type to narrow the list first, or select everything and untick the few you want to leave out. The Tags filter also offers **No tag**, which matches promotions that carry no tag at all. ## Spotting resubmissions Adclear tracks how many times each promotion has been reviewed. Use this to tell first-time submissions apart from work that has come back after a review, such as a promotion resubmitted after Changes Needed. A multi-level approval chain counts as one review round. ### Times reviewed filter On My Tasks and the Promotion Dashboard, and in the inbox sidebars, add the **Times reviewed** filter and choose an option: | Option | Shows | | - | - | | 0 | Promotions not previously reviewed | | 1+ | Promotions previously reviewed at least once | You can save the filter as part of a view, like any other filter. ### Times reviewed badge The Times reviewed badge appears beside the Pending Review status on promotions that have been reviewed at least once. Hover over it to see the count, for example "Reviewed 2 times". The badge is off by default. To turn it on: On My Tasks or the Promotion Dashboard, open the table settings menu. Under **Status badges**, select **Times reviewed**. The setting applies only to you. One switch covers My Tasks, the Promotion Dashboard, and both inbox sidebars. ## Exporting Click Export to download all promotion data as an Excel file. The export includes two fields not visible in the UI: Status History (a full log of every status change with timestamps) and Number of Versions. The Adclear URL column provides a direct link back to each promotion. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Authentication Source: https://docs.adclear.ai/developer/authentication The headers every request needs, how API keys are scoped, and how to choose between staging and production. Both the File API and the Adclear API authenticate with the same bearer key. Every request needs two headers. ## Required headers | Header | Required | Description | | - | - | - | | `Authorization` | Yes | `Bearer `. Generate a key in [Settings > Organisation > API keys](/settings#api-keys), or use the key Adclear provided during onboarding | | `X-External-User-ID` | Yes | A stable identifier for the acting user in your system, such as an employee ID. Recorded against every audited action the request performs. Requests without it are rejected with 400 | | `X-External-User-Email` | See below | The acting user's email. Only meaningful on keys with act-on-behalf enabled | The API key is scoped to a single Adclear organisation and workspace. Rate limits apply per key (see [Errors & rate limits](/developer/errors)). ## Key expiry Keys generated in Settings stop working at the expiry you chose when you generated them: 30 days by default, or 90 days, 1 year, or never. Keys Adclear provided during onboarding don't expire. Once a key expires, the File API and the Adclear API reject every request made with it with `401` and a message ending in `Code: KEY_EXPIRED`. You can't extend an expiry. Generate a replacement before the date, switch your integration to it, then revoke the old key. ## Keys tied to their creator A key generated in Settings acts as the person who generated it. On every request, the Adclear API checks that this person is still a member of your organisation in a role that can hold a key. If they have left the organisation, or now hold an external role (external uploader or reviewer), the Adclear API rejects every request made with the key with `403` and the message `API key is not configured for public API access`. Keys Adclear provided during onboarding are not affected. Generate integration keys from a long-lived account. Before the person who generated a key leaves or changes role, generate a replacement from another account, switch your integration to it, then revoke the old key. ## Acting on behalf of Adclear users By default, actions performed through the API are attributed to the key's service account, with your `X-External-User-ID` value recorded alongside for audit purposes. The ID is stored as supplied. Adclear does not verify it. Keys can instead be issued with act-on-behalf enabled, for integrations whose users also have Adclear accounts. On these keys, `X-External-User-Email` is resolved to the Adclear user with that email, and the action is performed and audited as that person, with their own role and permissions. Two rules apply: * The email header is mandatory on every write (`POST`, `PUT`, `PATCH`, `DELETE`). Writes without it are rejected with 400. * An email that does not match an active member of your organisation is rejected with 403. The action is never silently attributed to the service account. On ordinary keys the email header is ignored. The same rule covers `author.email` when [importing or updating comments](/developer/comments#author-identity): only act-on-behalf keys can attribute a comment or action to another member. On ordinary keys, an imported comment from another member's email is recorded as an external author. Ask your Adclear contact if you are unsure which kind of key you hold. ## Environments | Environment | File API | Adclear API | Purpose | | - | - | - | - | | Staging | `https://files-staging.adclear.ai` | `https://public-api-staging.adclear.ai` | Integration testing with sandbox data | | Production | `https://files.adclear.ai` | `https://public-api.adclear.ai` | Live | API keys are environment-specific. A staging key won't authenticate against production, and vice versa. Build and test your integration against staging before switching to production. ## Interactive API reference Explore and try endpoints in Swagger UI: * Adclear API: [https://public-api.adclear.ai/v1/docs](https://public-api.adclear.ai/v1/docs) * File API: [https://files.adclear.ai/v1/docs](https://files.adclear.ai/v1/docs) Machine-readable OpenAPI 3.1 specs: * `GET https://public-api.adclear.ai/v1/openapi.json` * `GET https://files.adclear.ai/v1/openapi.json` ## Generate types from the spec Generate TypeScript types directly from the specs with [openapi-typescript](https://openapi-ts.dev/): ```bash theme={null} npx openapi-typescript https://public-api.adclear.ai/v1/openapi.json -o adclear-api.d.ts npx openapi-typescript https://files.adclear.ai/v1/openapi.json -o adclear-files.d.ts ``` # Comments Source: https://docs.adclear.ai/developer/comments Read, import, and update AI and human review comments on a promotion version. 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 ```bash curl theme={null} curl -s "$API_BASE/v1/promotions/$PROMOTION_ID/versions/$VERSION_ID/comments?limit=20&offset=0" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" \ -H "X-External-User-ID: $USER_ID" ``` ```typescript TypeScript theme={null} const res = await fetch( `${API_BASE}/v1/promotions/${promotionId}/versions/${versionId}/comments?limit=20&offset=0`, { headers }, ); const { threads, pagination } = await res.json(); ``` ```python Python theme={null} res = requests.get( f"{API_BASE}/v1/promotions/{promotion_id}/versions/{version_id}/comments", headers=headers, params={"limit": 20, "offset": 0}, ) threads = res.json()["threads"] ``` **Response (200 OK):** ```json theme={null} { "threads": [ { "id": "thread-uuid-...", "createdAt": "2026-08-10T12:00:00.000Z", "comment": { "id": "comment-uuid-...", "author": { "type": "ai", "userId": "adclear-ai", "name": "Adclear AI" }, "content": "This claim needs a risk disclaimer.", "createdAt": "2026-08-10T12:00:00.000Z", "editedAt": null }, "replies": [ { "id": "comment-uuid-2", "author": { "type": "reviewer", "userId": "user-...", "name": "Jane Doe" }, "content": "Agreed, disclaimer added in the next version.", "createdAt": "2026-08-10T12:05:00.000Z", "editedAt": null } ] } ], "pagination": { "limit": 20, "offset": 0, "totalThreads": 1, "hasMore": false }, "correlationId": "corr-uuid-..." } ``` 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 | Parameter | Default | Description | | - | - | - | | `limit` | `20` | Maximum threads to return, 1 to 100 | | `offset` | `0` | Number of threads to skip | Page through with `offset`. Keep requesting until `pagination.hasMore` is `false`. ## Comment fields | Field | Description | | - | - | | `id` | Comment identifier | | `author` | Who wrote it (see below) | | `content` | The comment text | | `createdAt` | When it was posted (ISO 8601) | | `editedAt` | When it was last edited, or `null` if never edited | ### Author | Field | Description | | - | - | | `type` | `ai` for Adclear AI, `reviewer` for a human with review permission, `author` for the person who submitted the promotion | | `userId` | Author identifier. Always `"adclear-ai"` for AI comments | | `name` | Display name, or `null` if the user has not been synced yet. Fall back to `userId` when `null` | | `externalAuthor` | Only on comments imported for someone outside your organization: the `email` and `externalUserId` you sent, and `sourceLabel` (your integration's name). `type` follows the role recorded for them | ## Pagination fields | Field | Description | | - | - | | `limit` | Maximum threads returned in this page | | `offset` | Threads skipped before this page | | `totalThreads` | Total threads on this version | | `hasMore` | `true` when more threads exist after this page | For cross-cutting errors (401, 403, 429, 502), see [Errors & rate limits](/developer/errors). ## 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](#get-comments) immediately. Wait briefly before using GET to resolve `parentCommentId`. ```bash curl theme={null} curl -s -X POST "$API_BASE/v1/promotions/$PROMOTION_ID/versions/$VERSION_ID/comments" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" \ -H "Content-Type: application/json" \ -H "X-External-User-ID: $USER_ID" \ -d '{ "comments": [ { "externalCommentId": "wf-100", "author": { "email": "reviewer@brand.com" }, "content": "Please add the required disclaimer.", "uploadId": "00000000-0000-4000-8000-000000000099" } ] }' ``` ```typescript TypeScript theme={null} const res = await fetch( `${API_BASE}/v1/promotions/${promotionId}/versions/${versionId}/comments`, { method: 'POST', headers: { ...headers, 'Content-Type': 'application/json' }, body: JSON.stringify({ comments: [ { externalCommentId: 'wf-100', author: { email: 'reviewer@brand.com' }, content: 'Please add the required disclaimer.', uploadId: '00000000-0000-4000-8000-000000000099', }, ], }), }, ); const { results, summary } = await res.json(); ``` **Response (200 OK, partial success):** ```json theme={null} { "results": [ { "index": 0, "externalCommentId": "wf-100", "status": "created", "threadId": "th_...", "commentId": "cm_...", "authorResolution": "member" } ], "summary": { "created": 1, "skipped": 0, "rejected": 0 }, "correlationId": "corr-uuid-..." } ``` ### 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](/developer/authentication#acting-on-behalf-of-adclear-users). 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](#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 | Kind | Required fields | Notes | | - | - | - | | Root comment | `content`, `author.email` or `author.externalUserId` | On multi-upload versions, also send `uploadId`. Optional `location` anchors the thread. | | Ordinary reply | `content`, one parent field | Use `parentCommentId` for an existing Adclear comment, or `parentExternalCommentId` for a root imported earlier (including later in the same batch). Replies must not send `uploadId` or `location`. | | Action response | `action`, one parent field | Targets an Adclear AI thread. Canned actions may omit `content`; `action: "reply"` requires `content`. | 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](/developer/webhooks#reply-to-an-issue) 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. | `location.type` | Fields | Upload format | | - | - | - | | `image` | `xRatio`, `yRatio` (0–1) | Image | | `pdf` | `pageNumber` (1-based), `xRatio`, `yRatio` | PDF | | `timecode` | `timeSeconds` | Video or audio | | `text` | `textToFind` | Text | ### Per-item result codes | Code | Meaning | | - | - | | `PARENT_NOT_FOUND` | Parent id unresolved or belongs to another version | | `UPLOAD_NOT_FOUND` | `uploadId` is not attached to this version | | `LOCATION_INVALID` | Location shape or values invalid for the upload format | | `ACTION_TARGET_INVALID` | Action response aimed at a non-AI thread | | `DEDUP_CAPACITY_EXCEEDED` | Retry metadata capacity reached on the target thread | | `INVALID_ITEM` | Shape violation for this item only | | `WRITE_FAILED` | Persist failed for this item; other items may still succeed | 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](#get-comments) after a short sync delay, with `editedAt` set on the changed comment. ```bash curl theme={null} curl -s -X PATCH "$API_BASE/v1/promotions/$PROMOTION_ID/versions/$VERSION_ID/comments" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" \ -H "Content-Type: application/json" \ -H "X-External-User-ID: $USER_ID" \ -d '{ "comments": [ { "externalCommentId": "wf-100", "content": "Updated: add the risk disclaimer." }, { "commentId": "cm_reply_123", "action": "dismiss", "author": { "email": "reviewer@brand.com" } } ] }' ``` ```typescript TypeScript theme={null} const res = await fetch( `${API_BASE}/v1/promotions/${promotionId}/versions/${versionId}/comments`, { method: 'PATCH', headers: { ...headers, 'Content-Type': 'application/json' }, body: JSON.stringify({ comments: [ { externalCommentId: 'wf-100', content: 'Updated: add the risk disclaimer.' }, { commentId: 'cm_reply_123', action: 'dismiss', author: { email: 'reviewer@brand.com' }, }, ], }), }, ); const { results, summary } = await res.json(); ``` **Response (200 OK, partial success):** ```json theme={null} { "results": [ { "index": 0, "commentId": "cm_root_1", "externalCommentId": "wf-100", "status": "updated", "threadId": "th_..." }, { "index": 1, "commentId": "cm_reply_123", "externalCommentId": null, "status": "updated", "threadId": "th_..." } ], "summary": { "updated": 2, "skipped": 0, "rejected": 0 }, "correlationId": "corr-uuid-..." } ``` 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. | Identifier | Resolves | | - | - | | `commentId` | Any comment (root or reply), using the id returned by import or [Get comments](#get-comments) | | `externalCommentId` | Your own id. A root resolves as soon as its import returns. A reply becomes resolvable after the short sync delay, so use `commentId` to update a reply straight away | `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 | Field | Effect | | - | - | | `content` | Replaces the comment body. With `action`, it is appended to the canned decision text. On its own, it replaces the whole body | | `action` | Sets or changes the action response. The target must be a reply on an Adclear AI thread, and `author.email` is required. Supported values match [Import comments](#item-types). `action: "reply"` requires `content` | 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 | Code | Meaning | | - | - | | `COMMENT_NOT_FOUND` | No comment on this version matches the identifier | | `COMMENT_AMBIGUOUS` | The `externalCommentId` matches more than one comment; target it by `commentId` | | `ACTION_TARGET_INVALID` | Action aimed at a comment that is not a reply on an Adclear AI thread | | `AUTHOR_UNAVAILABLE` | Author email unknown, deleted, or not a member of this org | | `AUTHOR_NOT_PERMITTED` | Author email matches another member of your organization, and the key cannot act on behalf of users | | `INVALID_ITEM` | Shape violation for this item only (for example, an action without `author`) | | `WRITE_FAILED` | Persist failed for this item; other items may still succeed | 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). # Errors & rate limits Source: https://docs.adclear.ai/developer/errors The shared error envelope, every error code, rate limits, and fixes for the issues integrators hit most. Every error from both services follows one envelope, so you can handle failures the same way everywhere. ## Error envelope ```json theme={null} { "error": { "code": "VALIDATION_ERROR", "message": "Human-readable description", "details": [ { "type": "field_error", "field": "uploadIds", "message": "Required" } ] }, "correlationId": "uuid-for-support" } ``` The `details` array is present on some errors and identifies what to fix. Its entries take one of these shapes: `field_error` (a bad field), `constraint_violation` (a limit exceeded), `retry_info` (when to retry), or `upload_not_ready` (an upload still processing). ## Error codes | Code | HTTP status | Meaning | Action | | - | - | - | - | | `VALIDATION_ERROR` | 400 | Request body failed schema validation | Fix the payload per the `details` array | | `INVALID_REQUEST` | 400 / 409 | Request isn't valid for the resource's state (for example, an upload that already completed) | Check the request against the current resource state | | `UNAUTHORIZED` | 401 | Missing, invalid, revoked, or expired API key | Check the `Authorization` header. The `Code:` at the end of the message says why the key was refused | | `FORBIDDEN` | 403 | API key lacks permission for this resource | Contact Adclear to adjust key scoping | | `NOT_FOUND` | 404 | Resource does not exist | Verify the resource ID. It may have been deleted | | `CONFLICT` | 409 | Resource not in the expected state (uploads not ready, version not editable) | Retry with back-off | | `PAYLOAD_TOO_LARGE` | 413 | File exceeds the size limit for its format | Check the format limits in [Introduction](/developer/introduction#supported-file-formats) | | `RATE_LIMITED` | 429 | Too many requests | Honour the `Retry-After` header | | `INTERNAL_ERROR` | 500 | Unexpected server error | Retry once. If it persists, contact support | | `UPSTREAM_ERROR` | 502 / 503 | A dependency failed transiently, or is temporarily unavailable | Retry after a short delay | ## Rate limits | Service | Scope | Limit | | - | - | - | | Adclear API | All `/v1/*` endpoints | 60 requests/minute per API key | | File API | `POST /v1/uploads` (initiation only) | 30 requests/minute per API key | Chunk uploads (`PUT /v1/uploads/{id}`) and status checks (`GET /v1/uploads/{id}`) are not rate-limited. When you are rate-limited, the response includes a `Retry-After` header telling you how many seconds to wait. The Adclear API's 60/minute budget is **shared across every `/v1/*` endpoint**, so frequent polling of evaluation status competes with your `create` and `evaluate` calls. Prefer [webhooks](/developer/webhooks) to receive results without spending the budget. ## Common issues * Verify the `Authorization` header is `Bearer ` (note the space after `Bearer`). * Confirm you're using the correct key for the environment. Staging and production keys are not interchangeable. * A message ending in `Code: KEY_DISABLED` means the key was revoked. A message ending in `Code: KEY_EXPIRED` means it expired (see [Key expiry](/developer/authentication#key-expiry)). Generate a new key in **Settings > Organisation > API keys**. * The API key authenticates but isn't fully configured for your organisation. * If the message is `API key is not configured for public API access` and you generated the key in Settings, check that the person who generated it is still a member of your organisation and doesn't hold an external role (external uploader or reviewer). If they have left or changed role, generate a new key from another account (see [Keys tied to their creator](/developer/authentication#keys-tied-to-their-creator)). * Otherwise, contact Adclear support with the `correlationId` from the error response. Honour the `Retry-After` header. If you're regularly hitting the limit, batch requests or contact support to discuss your usage. A transient upstream issue. Retry after 2 to 5 seconds. If it persists, contact support with the `correlationId`. ## General tips * Pass your own trace ID in the `X-Correlation-ID` request header. Adclear echoes it back in every response. * Always include the `correlationId` in support requests. It lets us trace the full request lifecycle. * Test against staging before production. * Cache reference data (products, channels, jurisdictions, target markets) and refresh daily. # Evaluation Source: https://docs.adclear.ai/developer/evaluation Trigger an asynchronous compliance evaluation of a promotion version and read the results. Evaluation is an asynchronous compliance review of one promotion version. You trigger it, then receive the result via [webhook](/developer/webhooks) or by polling. Each evaluation returns per-file results, each with a set of issues and their cited rules. ## Trigger evaluation Evaluation runs asynchronously. The endpoint returns immediately with `202 Accepted`. ```bash curl theme={null} curl -s -X POST \ "$API_BASE/v1/promotions//versions//evaluate" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" \ -H "X-External-User-ID: $USER_ID" ``` ```typescript TypeScript theme={null} const res = await fetch( `${API_BASE}/v1/promotions/${promotionId}/versions/${versionId}/evaluate`, { method: "POST", headers }); const { evaluationId } = await res.json(); ``` ```python Python theme={null} res = requests.post( f"{API_BASE}/v1/promotions/{promotion_id}/versions/{version_id}/evaluate", headers=headers) evaluation_id = res.json()["evaluationId"] ``` **Response (202 Accepted):** ```json theme={null} { "evaluationId": "eval-uuid-...", "status": "processing", "correlationId": "uuid-..." } ``` Typical processing time is 30 to 90 seconds, depending on content size and complexity. ## Poll evaluation status Fetch the current status and results for a version. The response includes per-file results, so single-file promotions return an array of one. ```http theme={null} GET https://public-api.adclear.ai/v1/promotions/{promotionId}/versions/{versionId}/evaluation ``` **Response (200 OK), succeeded:** ```json theme={null} { "status": "succeeded", "results": [ { "evaluationId": "eval-uuid-1", "uploadId": "upload-uuid-1", "fileName": "brochure.pdf", "status": "succeeded", "result": { "reviewRequired": true, "overallAssessment": "Requires review", "issues": [ { "recommendation": "Consider adding a risk warning.", "rationale": "Financial promotions must include risk warnings per FCA guidelines.", "severity": "HIGH", "citedRules": [ { "id": "rule-uuid-...", "name": "Risk Warning Requirement", "product": "Investment", "channel": "Digital" } ], "location": { "type": "text", "content": "Invest now for guaranteed returns", "pageNumber": 1 } } ] } } ], "correlationId": "uuid-..." } ``` While processing, a file's `status` is `pending` and its `result` is absent. When a file fails, its `status` is `failed` and no `result` is returned. A `404` means no evaluation exists for the version yet; trigger one first. **Aggregate status:** | Aggregate `status` | Condition | | - | - | | `processing` | Any individual evaluation is still `pending` | | `succeeded` | All evaluations have `succeeded` | | `failed` | At least one `failed`, none `pending` | ## Recommended flow 1. **Trigger** the evaluation with `POST .../evaluate`. 2. **Receive the result via a [webhook](/developer/webhooks).** This is the recommended approach: Adclear pushes the result to your endpoint as soon as it's ready, with no polling. Polling is a simpler option for low volume, or a fallback when a webhook is delayed: call `GET .../evaluation` every 5 to 10 seconds until `status` is `succeeded` or `failed`. Polling counts against the rate limit of **60 requests per minute per API key, shared across all `/v1/*` endpoints**. Polling one evaluation every 5 seconds uses 12 of those requests a minute; polling several at once will exhaust the budget and return `429`, including for your `create` and `evaluate` calls. Use webhooks once you evaluate at any volume. See [Errors & rate limits](/developer/errors). ### Polling example ```bash curl theme={null} while true; do STATUS=$(curl -s "$API_BASE/v1/promotions/$PROMO/versions/$VERSION/evaluation" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" -H "X-External-User-ID: $USER_ID" | jq -r .status) echo "status: $STATUS" [ "$STATUS" = "succeeded" ] || [ "$STATUS" = "failed" ] && break sleep 5 done ``` ```typescript TypeScript theme={null} async function pollEvaluation(promotionId: string, versionId: string) { const url = `${API_BASE}/v1/promotions/${promotionId}/versions/${versionId}/evaluation`; for (let i = 0; i < 30; i++) { await new Promise((r) => setTimeout(r, 5000)); const data = await (await fetch(url, { headers })).json(); if (data.status === "succeeded") { for (const r of data.results) console.log(r.fileName, r.result.issues.length, "issue(s)"); return data; } if (data.status === "failed") throw new Error("Evaluation failed"); } throw new Error("Polling timed out"); } ``` ```python Python theme={null} import time, requests def poll_evaluation(promotion_id, version_id): url = f"{API_BASE}/v1/promotions/{promotion_id}/versions/{version_id}/evaluation" for _ in range(30): # ~150s at 5s intervals time.sleep(5) data = requests.get(url, headers=headers).json() if data["status"] == "succeeded": for r in data["results"]: print(r["fileName"], len(r["result"]["issues"]), "issue(s)") return data if data["status"] == "failed": raise RuntimeError("Evaluation failed") raise TimeoutError("Polling timed out") ``` ## Troubleshooting Typical evaluation time is 30 to 90 seconds. Continue polling every 5 to 10 seconds for up to 5 minutes. If it's still processing after that, re-trigger with `POST .../evaluate`. If it persists, contact support with the `correlationId` and `evaluationId`. Configure a [webhook](/developer/webhooks) to receive results asynchronously and avoid timeout concerns entirely. Yes. Each `POST .../evaluate` creates a new evaluation, and `GET .../evaluation` always returns the most recent result for that version. Previous results are retained internally for audit. For cross-cutting errors (401, 403, 429, 502), see [Errors & rate limits](/developer/errors). # File upload Source: https://docs.adclear.ai/developer/file-upload Upload files to the File API with the resumable chunked protocol, then reference them when creating a promotion. **Text promotions skip this step entirely.** If your content is plain text or HTML, provide it inline via the `content` field when [creating a promotion](/developer/promotions). **Reviewing a web page or Figma frame?** You don't need a file. Submit the URL via [Link submission](/developer/links) and Adclear captures it for you. Uploads use a resumable chunked protocol. You initiate the upload, then send the file in one or more chunks using `Content-Range` headers. **Request:** ```http theme={null} POST https://files.adclear.ai/v1/uploads { "fileName": "summer-campaign-v1.pdf", "fileSize": 2048576, "contentType": "application/pdf" } ``` **Response:** ```json theme={null} { "uploadId": "a1b2c3d4-...", "uploadUrl": "/v1/uploads/a1b2c3d4-...", "maxChunkSize": 52428800 } ``` * `uploadUrl` is the relative path for chunk uploads. * `maxChunkSize` is the maximum bytes per chunk (default 50 MB). The final chunk may be smaller. Send the file bytes as one or more `PUT` requests with a `Content-Range` header. ```http theme={null} PUT https://files.adclear.ai/v1/uploads/{uploadId} Content-Type: application/pdf Content-Range: bytes 0-2048575/2048576 ``` **Content-Range format:** `bytes -/`, where `start` and `end` are zero-based inclusive byte offsets and `total` is the full file size. For a multi-chunk upload, repeat with the next byte range until the response `status` is `completed`. You can poll upload status at any time: ```http theme={null} GET https://files.adclear.ai/v1/uploads/{uploadId} ``` ```json theme={null} { "uploadId": "a1b2c3d4-...", "status": "completed", "fileName": "summer-campaign-v1.pdf", "fileSize": 2048576, "createdAt": "2026-02-16T12:00:00.000Z" } ``` Status transitions: `pending` → `uploading` → `completed` | `failed`. ## Full upload example The curl tab covers the single-chunk happy path. The TypeScript and Python tabs handle chunking for large files. ```bash curl theme={null} # Initiate UPLOAD=$(curl -s -X POST "$FILES_BASE/v1/uploads" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" \ -H "X-External-User-ID: $USER_ID" \ -H "Content-Type: application/json" \ -d '{ "fileName": "ad.pdf", "fileSize": 2048576, "contentType": "application/pdf" }') UPLOAD_ID=$(echo "$UPLOAD" | jq -r .uploadId) # Send the bytes (single chunk) curl -s -X PUT "$FILES_BASE/v1/uploads/$UPLOAD_ID" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" \ -H "Content-Type: application/pdf" \ -H "Content-Range: bytes 0-2048575/2048576" \ --data-binary @ad.pdf ``` ```typescript TypeScript theme={null} import { readFile } from "node:fs/promises"; import { basename } from "node:path"; const FILES_BASE = "https://files.adclear.ai"; const API_KEY = process.env.ADCLEAR_API_KEY!; const auth = { Authorization: `Bearer ${API_KEY}`, "X-External-User-ID": process.env.USER_ID! }; async function upload(filePath: string, contentType = "application/pdf") { const file = await readFile(filePath); // 1 — initiate const init = await fetch(`${FILES_BASE}/v1/uploads`, { method: "POST", headers: { ...auth, "Content-Type": "application/json" }, body: JSON.stringify({ fileName: basename(filePath), fileSize: file.byteLength, contentType }), }); if (!init.ok) throw new Error(`Initiate failed (${init.status})`); const { uploadId, maxChunkSize } = await init.json(); // 2 — send chunks for (let offset = 0; offset < file.byteLength; ) { const end = Math.min(offset + maxChunkSize, file.byteLength) - 1; const res = await fetch(`${FILES_BASE}/v1/uploads/${uploadId}`, { method: "PUT", headers: { ...auth, "Content-Type": contentType, "Content-Range": `bytes ${offset}-${end}/${file.byteLength}` }, body: file.subarray(offset, end + 1), }); if (!res.ok) throw new Error(`Chunk failed (${res.status})`); offset = end + 1; } return uploadId; } ``` ```python Python theme={null} import os, requests from pathlib import Path FILES_BASE = "https://files.adclear.ai" auth = {"Authorization": f"Bearer {os.environ['ADCLEAR_API_KEY']}", "X-External-User-ID": os.environ["USER_ID"]} def upload(file_path: str, content_type: str = "application/pdf") -> str: data = Path(file_path).read_bytes() # 1 — initiate init = requests.post(f"{FILES_BASE}/v1/uploads", headers={**auth, "Content-Type": "application/json"}, json={"fileName": Path(file_path).name, "fileSize": len(data), "contentType": content_type}) init.raise_for_status() upload_id, max_chunk = init.json()["uploadId"], init.json()["maxChunkSize"] # 2 — send chunks offset = 0 while offset < len(data): end = min(offset + max_chunk, len(data)) - 1 res = requests.put(f"{FILES_BASE}/v1/uploads/{upload_id}", headers={**auth, "Content-Type": content_type, "Content-Range": f"bytes {offset}-{end}/{len(data)}"}, data=data[offset:end + 1]) res.raise_for_status() offset = end + 1 return upload_id ``` ## Implementation notes * A promotion references exactly one upload. To review several files, create a separate promotion for each. * If a chunk fails due to a network error, check the upload status to see how many bytes were received, then resume from that offset. * Uploading to an already-completed upload returns `409 Conflict`. ## Common error scenarios | Scenario | HTTP status | Error code | What to do | | - | - | - | - | | File too large for its format | 413 | `PAYLOAD_TOO_LARGE` | Check the size limits in [Introduction](/developer/introduction#supported-file-formats) | | Missing `Content-Range` header | 400 | `VALIDATION_ERROR` | Add `Content-Range: bytes -/` | | Chunk body size doesn't match the range span | 400 | `VALIDATION_ERROR` | Ensure the body's byte length equals `end - start + 1` | | `Content-Range` total doesn't match declared `fileSize` | 400 | `VALIDATION_ERROR` | Use the same total in every chunk as the `fileSize` from initiation | | Upload already completed | 409 | `INVALID_REQUEST` | The file is already uploaded; proceed to create the promotion | | Upload not found | 404 | `NOT_FOUND` | The upload ID is invalid or the session expired; initiate a new upload | | Network failure mid-upload | N/A | N/A | `GET` the upload status to check `bytesReceived`, then resume from that offset | For cross-cutting errors (401, 403, 429, 502), see [Errors & rate limits](/developer/errors). ## Frequently asked questions No. A promotion references exactly one upload. To review several files, create a separate promotion for each. Yes. Upload IDs aren't consumed. The same upload can be referenced by multiple promotions or versions. Completed uploads are stored indefinitely. If you initiate an upload and never send any chunks, the upload session may eventually become unusable, so complete uploads promptly after initiation. # Introduction Source: https://docs.adclear.ai/developer/introduction How the Adclear API works, the two services it exposes, and the core concepts you need before integrating. Adclear runs automated compliance evaluation on promotional content. You upload a file (or submit text), classify it against your organisation's regulatory rules, and receive an evaluation: specific findings, each with a recommendation and cited rules. Results arrive via webhook, or you can poll for them. ## How it works Send the file to the File API. It returns an `uploadId`. Skip this step for inline text or HTML. Reference the `uploadId` and classify the content by product, channel, and jurisdiction on the Adclear API. Start the asynchronous compliance review for that version of the promotion. Adclear posts the result to your webhook endpoint when the evaluation finishes, or you can poll for it. ## The two services Your integration talks to two services that share a single API key. `files.adclear.ai` Resumable chunked file upload and upload-status tracking. `public-api.adclear.ai` Promotions, evaluations, reference data, and outbound webhooks. ## Key concepts | Concept | Description | | - | - | | Promotion | A piece of promotional content submitted for compliance review | | Version | An immutable snapshot of the uploaded files within a promotion. Version 1 is created with the promotion; later versions are revisions | | Evaluation | An asynchronous compliance review of one version. Produces a set of issues, each with cited rules | | Webhook | An outbound HTTP POST from Adclear to your endpoint when an event occurs, such as an evaluation completing | | Metadata | An arbitrary string key-value map you attach at promotion creation. Adclear stores it and echoes it back in every webhook, so you can correlate events to your own records | ## Supported file formats | Format | MIME type | Max size | | - | - | - | | PDF | `application/pdf` | 30 MB | | PNG | `image/png` | 30 MB | | JPEG | `image/jpeg` | 30 MB | | WebP | `image/webp` | 30 MB | | MP4 | `video/mp4` | 2 GB | | MOV | `video/quicktime` | 2 GB | | MP3 | `audio/mpeg` | 2 GB | | WAV | `audio/wav` | 2 GB | | DOCX | `application/vnd.openxmlformats-officedocument.wordprocessingml.document` | 10 MB | | XLSX | `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` | 10 MB | | Inline text or HTML | N/A | Submitted via the `content` field as `fileFormat: "text"`, no upload required | Files over the size limit are rejected at upload initiation with `413 Payload Too Large`. Run your first evaluation end to end in under 10 minutes. Set up your API key, headers, and environment. # Link submission Source: https://docs.adclear.ai/developer/links Submit a URL, a Figma frame, or a Google Drive file instead of uploading a file. Adclear captures it and gives you an upload ID to reference when creating a promotion. Not everything you need reviewed exists as a file. A landing page, a live promotion, a design still in Figma, or a document in Google Drive can be submitted as a link. Adclear captures it and hands back an `uploadId`, which you use exactly like one from the [File API](/developer/file-upload). Create the promotion with the `fileFormat` value from the capture response, not a fixed one. A screenshot and a Figma frame are always `"image"`, but a Google Drive file can be any supported format, and native Google Docs, Sheets and Slides arrive as `"pdf"`. ## Which links are supported | Link | How it is captured | Response | | - | - | - | | Any `http(s)` page | Full-page screenshot | `201` — ready immediately | | A Figma frame | Exported through the Figma API | `202` — poll until ready | | A Google Drive file, or a Google Doc, Sheet or Slides deck | Imported through the Google Drive API | `202` — poll until ready | Figma files and Google files must be shared with **anyone with the link**. Adclear cannot read private files submitted through the API, because the API has no connected Figma or Google account of its own. Always poll the `statusUrl` returned by `POST /v1/links` exactly as given. It carries the information the poll needs to find your import. Building the URL yourself can return a misleading `completed` before the file has finished importing. ## Capturing a web page A capture runs while you wait and can take up to two minutes, so set a generous client timeout. **Request:** ```http theme={null} POST https://public-api.adclear.ai/v1/links { "url": "https://example.com/summer-campaign" } ``` **Response:** ```json theme={null} { "uploadId": "a1b2c3d4-...", "status": "completed", "fileFormat": "image", "source": "screenshot", "sourceUrl": "https://example.com/summer-campaign", "originalFileName": "screenshot-example.com.png", "previewUrl": "https://storage.googleapis.com/...", "correlationId": "..." } ``` `previewUrl` is a time-limited signed link for previewing the capture. Don't store it — it expires. The `uploadId` does not. ```bash curl theme={null} curl -s -X POST "$API_BASE/v1/links" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" \ -H "X-External-User-ID: $USER_ID" \ -H "Content-Type: application/json" \ -d '{ "url": "https://example.com/summer-campaign" }' ``` ```typescript TypeScript theme={null} const res = await fetch(`${API_BASE}/v1/links`, { method: "POST", headers, body: JSON.stringify({ url: "https://example.com/summer-campaign" }), signal: AbortSignal.timeout(180_000), }); if (!res.ok) throw new Error(`Capture failed (${res.status})`); const { uploadId } = await res.json(); ``` ```python Python theme={null} res = requests.post( f"{API_BASE}/v1/links", headers=headers, json={"url": "https://example.com/summer-campaign"}, timeout=180, ) res.raise_for_status() upload_id = res.json()["uploadId"] ``` ## Capturing a Figma frame A Figma link identifies a *file*; Adclear needs to know which **frame** to import. Provide it either way: * Paste a frame link — in Figma, right-click a frame and choose **Copy link to selection**. The URL carries a `node-id`, which Adclear reads automatically. * Or send the file URL plus an explicit `figmaFrameId`, discovered with [frame lookup](#discovering-frames). Sending a file-level URL with no frame returns `400`, pointing you at the frame lookup endpoint. **Request:** ```http theme={null} POST https://public-api.adclear.ai/v1/links { "url": "https://www.figma.com/design/AbC123/Campaign?node-id=1-2" } ``` **Response:** ```json theme={null} { "uploadId": "e5f6a7b8-...", "status": "processing", "fileFormat": "image", "source": "figma", "sourceUrl": "https://www.figma.com/design/AbC123/Campaign?node-id=1-2", "frameId": "1:2", "frameName": "Hero Banner", "statusUrl": "/v1/links/e5f6a7b8-...", "correlationId": "..." } ``` Unlike a web page, a Figma import runs in the background and returns `202`. Request the `statusUrl` from the previous response. ```http theme={null} GET https://public-api.adclear.ai/v1/links/{uploadId} ``` ```json theme={null} { "uploadId": "e5f6a7b8-...", "status": "completed", "finalUploadId": "c3d4e5f6-...", "correlationId": "..." } ``` Poll every couple of seconds while `status` is `processing`. When it reaches `completed`, use **`finalUploadId`** when creating the promotion. It can differ from the ID you polled. On `failed`, `errorMessage` explains why. ### Discovering frames To let someone choose a frame, list what the file contains: **Request:** ```http theme={null} POST https://public-api.adclear.ai/v1/links/figma/frames { "url": "https://www.figma.com/design/AbC123/Campaign" } ``` **Response:** ```json theme={null} { "fileName": "Campaign", "pages": [ { "id": "0:1", "name": "Page 1", "frames": [ { "frameId": "1:2", "name": "Hero Banner", "width": 1200, "height": 628 } ] } ], "correlationId": "..." } ``` Pass any `frameId` back as `figmaFrameId` when submitting the link. ## Importing from Google Drive or Docs Submit a `drive.google.com` or `docs.google.com` link and Adclear downloads the file itself, rather than screenshotting the Drive preview page. Native Google Docs, Sheets and Slides are converted to PDF. Images, video, audio and PDFs are imported in their original format. Plain text files (`.txt`) are the one exception: they return `422`. A text promotion takes its content inline rather than as an upload, so fetch the text yourself and pass it as `content` with `"fileFormat": "text"`. See [Promotions](/developer/promotions). The file must be shared with **anyone with the link**. The API has no connected Google account, so a private file, or one shared only with named people, cannot be reached. See [Which Google files can I import?](#frequently-asked-questions) below. **Request:** ```http theme={null} POST https://public-api.adclear.ai/v1/links { "url": "https://docs.google.com/document/d/AbC123xyz/edit" } ``` **Response:** ```json theme={null} { "uploadId": "f7a8b9c0-...", "status": "processing", "fileFormat": "pdf", "source": "gdrive", "sourceUrl": "https://docs.google.com/document/d/AbC123xyz/edit", "originalFileName": "Q3 brief.pdf", "sizeBytes": 245760, "previewUrl": "https://lh3.googleusercontent.com/...", "statusUrl": "/v1/links/f7a8b9c0-...?source=gdrive", "correlationId": "..." } ``` Note the `fileFormat` here is `"pdf"`, because the link points at a native Google Doc. Read it from the response rather than assuming a value. Request the `statusUrl` exactly as returned, including its query string. ```http theme={null} GET https://public-api.adclear.ai/v1/links/{uploadId}?source=gdrive ``` ```json theme={null} { "uploadId": "f7a8b9c0-...", "status": "completed", "finalUploadId": "f7a8b9c0-...", "correlationId": "..." } ``` Poll every couple of seconds while `status` is `processing`. Large files take longer, since Adclear downloads the whole file. For a Google import `finalUploadId` matches the ID you polled, but read it from the response so the same code works for every link type. Importing one tab of a multi-tab Google Doc is not yet available through the API. If you share a link that already points at a tab (the URL contains `?tab=`), that tab is imported on its own. Otherwise the whole document is imported. ## Creating a promotion from a captured link Identical to a file upload. The capture is just another `uploadId`: ```http theme={null} POST https://public-api.adclear.ai/v1/promotions { "uploadIds": ["a1b2c3d4-..."], "fileFormat": "image", "promotionName": "Summer campaign landing page", "channelIds": ["..."], "productIds": ["..."], "jurisdictionId": "..." } ``` Use the `fileFormat` from the capture response. For a screenshot or a Figma frame that is always `"image"`, so the example above holds. For a Google Drive file it varies, and a native Google Doc needs `"fileFormat": "pdf"`. Wait for `status` to reach `completed` before creating the promotion. An upload that is still importing has no file behind it yet. From here, [trigger an evaluation](/developer/evaluation) as usual. The submitted URL is not stored on the promotion. To keep it alongside the review, pass it in [`metadata`](/developer/promotions) — it is echoed back in webhook payloads. ## Rate limits Captures call third-party services, so they are limited more tightly than the rest of the API: **10 requests per minute per API key** across `POST /v1/links` and `POST /v1/links/figma/frames`, whatever kind of link you submit. Polling `GET /v1/links/{uploadId}` is not affected and falls under the standard 60/minute limit. A `429` includes a `Retry-After` header. See [Errors & rate limits](/developer/errors). ## Common error scenarios | Scenario | HTTP status | Error code | What to do | | - | - | - | - | | Page not found, or the domain doesn't resolve | 400 | `INVALID_REQUEST` | The message carries the reason from the capture service — check the URL | | Site blocks automated access | 400 | `INVALID_REQUEST` | The page can't be captured; upload a screenshot via the [File API](/developer/file-upload) instead | | Non-`http(s)` URL | 400 | `VALIDATION_ERROR` | Only `http` and `https` are supported | | Figma link with no frame | 400 | `VALIDATION_ERROR` | Use a "copy link to selection" URL, or supply `figmaFrameId` | | Figma file is private | 403 | `FORBIDDEN` | Share it with "anyone with the link" | | Figma file or frame missing | 404 | `NOT_FOUND` | Check the URL and that the frame still exists | | Google link Adclear can't read a file ID from | 400 | `INVALID_REQUEST` | Copy the link from Google's **Share** dialog rather than the browser address bar | | Google file access refused | 403 | `FORBIDDEN` | Check the sharing settings on the file | | Google file is not public | 404 | `NOT_FOUND` | Set sharing to "anyone with the link". A file shared only with named people can't be reached | | Google file type unsupported, or too large | 422 | `INVALID_REQUEST` | The message names the limit or the type. Convert the file, or upload it via the [File API](/developer/file-upload) | | Google Drive file is plain text (`.txt`) | 422 | `INVALID_REQUEST` | Fetch the text and pass it as `content` with `"fileFormat": "text"` instead | | Google import temporarily unavailable | 503 | `UPSTREAM_ERROR` | Retry after a short delay | | Capture took too long | 504 | `UPSTREAM_ERROR` | Retry; if it persists the page is likely too heavy to capture | For cross-cutting errors (401, 403, 429, 502), see [Errors & rate limits](/developer/errors). ## Frequently asked questions No. The capture happens once, when you call `POST /v1/links`. The promotion references that stored image, so a later change to the page does not alter what was reviewed. Yes. The returned upload ID behaves like any other — reference it from as many promotions or versions as you like. A screenshot is captured inline while the request is open. Figma frames and Google Drive files are fetched from their provider and processed in the background, so they return `202` with a `statusUrl` to poll. Any file shared with **anyone with the link**: images, video, audio and PDFs come across in their original format, and native Google Docs, Sheets and Slides are converted to PDF. Plain text files return `422`, because a text promotion takes its content inline rather than as an upload. Private files, and files shared only with named people, cannot be imported. Adclear's API has no Google account of its own to authenticate as, so it can only reach files that are public to anyone holding the link. To review a private file, download it and upload it via the [File API](/developer/file-upload). Only by sharing a link that already points at the tab. Google puts a `?tab=` parameter in the URL when you copy a link to a specific tab, and Adclear imports just that tab. Choosing a tab through the API is not supported yet, so any other Docs link imports the whole document. Very large frames (over roughly 6 megapixels) need a conversion step that isn't available through the API yet. Export the frame as an image and upload it via the [File API](/developer/file-upload), or import it through the Adclear app. A link to a PDF is captured as a screenshot of the rendered page, not downloaded as a PDF. To have the PDF itself reviewed, fetch it yourself and upload it via the [File API](/developer/file-upload). # MCP for developers Source: https://docs.adclear.ai/developer/mcp Connect your own agent to the Adclear MCP server. OAuth, workspaces, file uploads, retries, rate limits and errors. This page is for developers who connect their own agent or MCP client to Adclear. To connect Claude, ChatGPT or Cursor, read [Connect Adclear to your AI assistant](/mcp/connect). For the list of tools, read [Tools and permissions](/mcp/tools-and-permissions). MCP is in closed beta. To get access, contact your Adclear account manager. ## Endpoint | | | | - | - | | Server URL | `https://mcp.adclear.ai/mcp` | | Transport | MCP Streamable HTTP | | Protected resource metadata | `https://mcp.adclear.ai/.well-known/oauth-protected-resource/mcp` | The server sends instructions at `initialize`, and each tool describes its own input. MCP SDK clients read both automatically. ## Authentication The server is an OAuth 2.1 protected resource. Adclear sign-in is the authorization server. Every token acts as the user who signed in, with that user's role and permissions. * **Client:** use the client ID that your Adclear account manager gives you. The client is public, so there is no client secret. Adclear does not support dynamic client registration. * **Flow:** authorization code with PKCE. * **Resource:** send `resource=https://mcp.adclear.ai/mcp` on the authorization request and the token request. Adclear rejects a token issued for a different resource. * **Scopes:** `openid profile email offline_access user:org:read`. The `user:org:read` scope puts the organisation in the token. * **Organisation:** the user chooses one organisation on the consent screen. To use a different organisation, the user signs in again. * **Refresh tokens:** `offline_access` gives a refresh token. Refresh the access token when it expires. Do not ask the user to sign in again. Send the access token on every request as `Authorization: Bearer `. ### Authentication errors When Adclear rejects a request, the `WWW-Authenticate` header tells the client what to do. | Status | Header | What to do | | - | - | - | | 401 | `Bearer scope="...", resource_metadata="..."` | No token. Start the sign-in flow. | | 401 | `error="invalid_token"` | The token is expired, not valid or for another resource. `error_description` gives the reason. Refresh the token or sign in again. | | 403 | `error="insufficient_scope", scope="user:org:read"` | The token has no organisation. Sign in again and choose an organisation. | ## Workspaces Each request uses one workspace. Adclear chooses it in this order: 1. The `X-Adclear-Workspace-Id` request header, if you send it. 2. The workspace the user chose with `selectWorkspace`, if the user can still use it. 3. The organisation's default workspace, if the user can use it. 4. The first workspace the user can use, by name. If the user can use no workspace, the request fails with 403. The workspace in the header must belong to the token's organisation, and the user must have access to it. ## Upload a local file An agent can create a promotion from a public `https` link with `sourceUrls` on `createPromotion`. To upload a local file, use three steps. Call `createUpload` with the file name, MIME type and exact size in bytes. The result has an `uploadId`, an `uploadUrl` on `https://files.adclear.ai`, the headers to send and a `curlExample` you can run. Send the file to `uploadUrl` with HTTP `PUT`. Send `Content-Type` and `Content-Range` headers. A file of 50 MB or less goes in one request. A larger file goes in the chunks listed in `chunks`. Each chunk is 50 MB or less, and each chunk except the last is a multiple of 256 KiB. The link works for 2 hours and only for this upload. Call `completeUpload` with the `uploadId`. Adclear checks that the file content matches the declared type. Then pass the `uploadId` in `uploadIds` to `createPromotion` or `createPromotionVersion`. | Format | Types | Maximum size | | - | - | - | | Image | PNG, JPEG, GIF, WEBP | 30 MB | | Document | PDF, DOC, DOCX, PPTX | 30 MB | | Video | MP4, MOV | 2 GB | | Audio | MP3, M4A, WAV | 2 GB | If the agent runs in a sandbox with a network allowlist, the allowlist must include `files.adclear.ai`. The agent never needs access to any other storage domain. ## Retries and idempotency `createPromotion`, `createPromotionVersion`, `submitPromotion` and `precheckPromotion` accept an `idempotencyKey`. Send a new key for each new action. Send the same key when you retry. A retry with the same key returns the first result and does not create a duplicate. Adclear keeps each key for 24 hours. If a tool times out or loses its connection, the result says that the outcome is unknown and whether a retry is safe. ## Paging List tools return `hasMore`. While `hasMore` is `true`, call the tool again with the `nextPage` or `nextOffset` value from the result. ## Rate limits | Limit | Applies to | | - | - | | 120 requests per minute | Each signed-in user. A large `getDashboardMetrics` request can count as up to 6 requests. | | 30 requests per minute | Each IP address, for requests that need a new check of the user's membership. | | 1,000 requests per minute | Each IP address, for all requests. | When a request goes over a limit, the server returns `429` with a `Retry-After` header in seconds. Wait for that time, then retry. ## Errors and support Every response has an `X-Correlation-ID` header. A failed tool result includes a `correlationId`. A protocol error has it in `error.data.correlationId`. Give this ID to Adclear support when you report a problem. # Creating promotions Source: https://docs.adclear.ai/developer/promotions Create a promotion from uploaded files or inline text, and create new versions when content is revised. A promotion is a piece of content submitted for compliance review. You create one by combining your uploaded files (or inline text) with classification: the products, channels, and jurisdiction that determine which rules apply. ## Create a promotion ```bash curl theme={null} curl -s -X POST "$API_BASE/v1/promotions" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" \ -H "X-External-User-ID: $USER_ID" \ -H "Content-Type: application/json" \ -d '{ "uploadIds": ["a1b2c3d4-..."], "fileFormat": "pdf", "promotionName": "Summer Campaign 2026", "channelIds": [""], "productIds": [""], "jurisdictionId": "", "metadata": { "workfrontProjectId": "PROJ-123", "workfrontTaskId": "TASK-456" } }' ``` ```typescript TypeScript theme={null} const res = await fetch(`${API_BASE}/v1/promotions`, { method: "POST", headers, body: JSON.stringify({ uploadIds: ["a1b2c3d4-..."], fileFormat: "pdf", promotionName: "Summer Campaign 2026", channelIds: [""], productIds: [""], jurisdictionId: "", metadata: { workfrontProjectId: "PROJ-123", workfrontTaskId: "TASK-456" }, }), }); const { promotionId, versionId } = await res.json(); ``` ```python Python theme={null} res = requests.post(f"{API_BASE}/v1/promotions", headers=headers, json={ "uploadIds": ["a1b2c3d4-..."], "fileFormat": "pdf", "promotionName": "Summer Campaign 2026", "channelIds": [""], "productIds": [""], "jurisdictionId": "", "metadata": {"workfrontProjectId": "PROJ-123", "workfrontTaskId": "TASK-456"}, }) promotion_id, version_id = res.json()["promotionId"], res.json()["versionId"] ``` **Response (201 Created):** ```json theme={null} { "promotionId": "promo-uuid-...", "versionId": "version-uuid-...", "version": 1, "publicId": "42", "metadata": { "workfrontProjectId": "PROJ-123", "workfrontTaskId": "TASK-456" }, "correlationId": "corr-uuid-..." } ``` Required fields are `fileFormat`, `promotionName`, `channelIds` (at least one), `productIds` (at least one), and `jurisdictionId`. `publicId` is the short, human-readable identifier shown to reviewers (for example `42`). Use it when referencing a promotion in support requests or your own UI. ### Metadata The `metadata` field accepts an arbitrary string-to-string map (up to 20 keys). Use it to pass through your own reference IDs, such as Workfront project and task IDs. Adclear stores it with the promotion and echoes it back in **every** webhook payload, so you can correlate Adclear events to your system without maintaining a separate mapping. Do not store PII, credentials, or sensitive data. ### Text promotions When `fileFormat` is `"text"`, provide the `content` field instead of `uploadIds`. The `content` field accepts plain text or HTML. ```json theme={null} { "content": "

Summer savings: earn up to 5% AER on our fixed-rate ISA.

", "fileFormat": "text", "promotionName": "ISA Summer Campaign 2026", "channelIds": [""], "productIds": [""], "jurisdictionId": "" } ``` ### Handling upload conflicts If a referenced file hasn't finished uploading, the request returns `409 Conflict` with a `details` entry of type `upload_not_ready`. Poll `GET /v1/uploads/{uploadId}` until each upload's `status` is `completed`, then retry. Use exponential back-off (1s, 2s, 4s, up to \~30s). Small files complete within seconds; files over 100 MB may take longer. ## Create a variation set Variations are linked promotions that share a core message but differ by format, channel, or jurisdiction (for example the same ad localised for several markets). Each variation is reviewed independently, and they are grouped so a reviewer sees them together. Create a whole set in one call by sending a `variations` array instead of a single content set. ```bash curl theme={null} curl -s -X POST "$API_BASE/v1/promotions" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" \ -H "X-External-User-ID: $USER_ID" \ -H "Content-Type: application/json" \ -d '{ "promotionName": "Spring Campaign 2026", "productIds": [""], "deadline": "2026-09-01T00:00:00Z", "paidPromotion": false, "isFinancialPromotion": true, "variations": [ { "fileFormat": "image", "uploadId": "", "channelIds": [""], "jurisdictionId": "" }, { "fileFormat": "image", "uploadId": "", "channelIds": [""], "jurisdictionId": "" } ] }' ``` **Response (201 Created):** ```json theme={null} { "variations": [ { "promotionId": "promo-uuid-a", "versionId": "version-uuid-a", "version": 1, "publicId": "45-A" }, { "promotionId": "promo-uuid-b", "versionId": "version-uuid-b", "version": 1, "publicId": "45-B" } ], "correlationId": "corr-uuid-..." } ``` Each entry in the response is a full promotion, in the same order you sent it. The shared `publicId` base with letter suffixes (`45-A`, `45-B`) marks them as one group. ### Shared vs per-variation fields | Field | Where | Notes | | - | - | - | | `promotionName`, `productIds`, `deadline`, `paidPromotion`, `isFinancialPromotion`, `evergreen`, `metadata` | Top level | Shared by every variation | | `fileFormat` | Per variation | Required on each entry | | `uploadId` or `content` | Per variation | `content` for `fileFormat: "text"`, otherwise a single `uploadId` | | `channelIds`, `jurisdictionId` | Per variation | Each variation can target different channels and a different jurisdiction | | `caption`, `details`, `linkedClaimIds`, `targetMarketIds` | Per variation | Optional | * Send 2 to 20 variations per request. * `variations` cannot be combined with top-level `uploadIds`, `content`, `fileFormat`, `channelIds`, or `jurisdictionId`. * One file per variation. For multiple files in a single promotion, use a [carousel](/upload-types/carousel) instead. * All or nothing: if any variation fails validation, the whole request is rejected and nothing is created. Trigger [evaluation](/developer/evaluation) on each variation's `versionId`, the same as a single promotion. To revise one variation after review, create a new version on that variation's `promotionId` (see below). The other variations are untouched. ## Submit a revision If a promotion needs changes after review, upload the new file(s) (see [File upload](/developer/file-upload)), then create a new version on the same promotion. The new version inherits the promotion's name, channels, products, and jurisdiction. Supply only the new files and any fields you want to override. ```http theme={null} POST https://public-api.adclear.ai/v1/promotions/{promotionId}/versions { "uploadIds": [""], "fileFormat": "pdf" } ``` The response mirrors create, with an incremented `version`. Then trigger [evaluation](/developer/evaluation) on the new version. Each version is evaluated independently, and previous results are retained for audit. ### Create-version fields | Field | Required | Description | | - | - | - | | `uploadIds` | Conditional | Upload IDs for the revised content. Required for file-based formats; omit when `fileFormat` is `"text"` | | `content` | Conditional | Inline text or HTML. Required when `fileFormat` is `"text"`; omit for file-based formats | | `fileFormat` | Yes | `pdf`, `image`, `video`, `audio`, `text`, or `document` | | `deadline` | No | Updated deadline (ISO 8601). Retained if omitted | | `caption`, `details` | No | Updated caption and details. Retained if omitted | | `type` | No | `single`, `carousel`, or `variations`. Inherited if omitted | | `linkedClaimIds`, `targetMarketIds` | No | Updated claim IDs and target market IDs. Retained if omitted | | `applyToAllTargetMarkets` | No | Applies to all target markets regardless of `targetMarketIds` | | `metadata` | No | Updated metadata. The original is retained and echoed in webhooks if omitted | **Inherited vs. overridable.** `promotionName`, `channelIds`, `productIds`, and `jurisdictionId` are set once at promotion creation and can't change per version. Everything else above can be overridden; omitted fields carry forward from the previous version. ## Track the latest version A promotion can gain new versions outside your integration. A reviewer or teammate can upload a revision in the Adclear app, so the version you created through the API may no longer be the newest. To find the latest version and where it stands in review, call `GET /v1/promotions/{promotionId}`. It returns `404` if the promotion doesn't exist, belongs to another workspace, or has been deleted. ```bash curl theme={null} curl -s "$API_BASE/v1/promotions/$PROMOTION_ID" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" \ -H "X-External-User-ID: $USER_ID" ``` **Response (200 OK):** ```json theme={null} { "promotionId": "promo-uuid-...", "latestVersionId": "version-uuid-...", "latestVersion": 2, "status": "pending", "versionCount": 2, "correlationId": "corr-uuid-..." } ``` ### Spot a superseded decision `GET /v1/promotions/{promotionId}/versions/{versionId}/decision` describes the version you ask about, so a version you already approved keeps returning `approved` after a newer version appears. The response also tells you whether that version is still the latest: ```json theme={null} { "decision": "approved", "isLatestVersion": false, "latestVersionId": "version-uuid-..." } ``` | Field | Description | | - | - | | `latestVersionId` | ID of the latest version: the one with the highest version number, whether it was created through the API or in the Adclear app. Use it with the version-level endpoints, such as the decision endpoint. In the decision response it equals `versionId` when `isLatestVersion` is `true` | | `status` | Review status of the latest version (promotion response only). Same values as `decision`: `none`, `pending`, `in_review`, `approved`, `rejected`, `changes_requested`, `conditionally_approved`, or `expired` (approved earlier but past its next review date, so it needs re-review) | | `latestVersion`, `versionCount` | Version number of the latest version, and how many versions the promotion has (promotion response only) | | `isLatestVersion` | Decision response only. Whether this version is the promotion's latest version. `false` once a newer version exists, whether it was created through the API or in the Adclear app. `decision` still describes this version | When you poll a decision, check `isLatestVersion` before you act on it. If it is `false`, the decision is for an older version (an approved older version stays approved): follow `latestVersionId` and read that version's decision to keep tracking the promotion. `latestVersionId` always matches the one returned by `GET /v1/promotions/{promotionId}`. ## Frequently asked questions | File type | `fileFormat` | | - | - | | `.pdf` | `pdf` | | `.jpg`, `.png`, `.gif`, `.webp`, `.svg`, `.bmp`, `.tiff` | `image` | | `.mp4`, `.mov`, `.avi`, `.webm`, `.mkv`, `.wmv` | `video` | | `.mp3`, `.wav`, `.aac`, `.ogg`, `.flac`, `.m4a` | `audio` | | `.doc`, `.docx`, `.xls`, `.xlsx`, `.ppt`, `.pptx`, `.txt`, `.csv`, `.rtf` | `document` | | Inline text or HTML (no file upload) | `text` (use the `content` field instead of `uploadIds`) | The `fileFormat` must match the file you uploaded. A `.pdf` upload uses `fileFormat: "pdf"`, not `"document"`. No. The API doesn't support deleting or archiving promotions. They're retained for compliance audit purposes. For cross-cutting errors (401, 403, 429, 502), see [Errors & rate limits](/developer/errors). # Quickstart Source: https://docs.adclear.ai/developer/quickstart Upload a file, create a promotion, and get your first compliance evaluation back in under 10 minutes. This walks the full happy path: authenticate, fetch reference IDs, upload a file, create a promotion, trigger an evaluation, and read the result. Each step links to the page with the full detail. You need an API key (provided during onboarding) and a file to test with. Run against staging first by swapping the hosts below for their `-staging` equivalents (see [Authentication](/developer/authentication)). Every request needs your API key and a stable identifier for the acting user in your system. ```bash curl theme={null} export ADCLEAR_API_KEY="your-api-key" export API_BASE="https://public-api.adclear.ai" export FILES_BASE="https://files.adclear.ai" export USER_ID="your-internal-user-id" ``` ```typescript TypeScript theme={null} const API_KEY = process.env.ADCLEAR_API_KEY!; const API_BASE = "https://public-api.adclear.ai"; const FILES_BASE = "https://files.adclear.ai"; const headers = { Authorization: `Bearer ${API_KEY}`, "X-External-User-ID": "your-internal-user-id", "Content-Type": "application/json", }; ``` ```python Python theme={null} import os API_KEY = os.environ["ADCLEAR_API_KEY"] API_BASE = "https://public-api.adclear.ai" FILES_BASE = "https://files.adclear.ai" headers = { "Authorization": f"Bearer {API_KEY}", "X-External-User-ID": "your-internal-user-id", "Content-Type": "application/json", } ``` Classification drives which rules apply. Fetch the IDs for one product, channel, and jurisdiction. See [Reference data](/developer/reference-data) for all four endpoints. ```bash curl theme={null} curl -s "$API_BASE/v1/products" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" \ -H "X-External-User-ID: $USER_ID" # → { "products": [ { "id": "...", "name": "..." } ], "correlationId": "..." } ``` ```typescript TypeScript theme={null} const res = await fetch(`${API_BASE}/v1/products`, { headers }); const { products } = await res.json(); const productId = products[0].id; ``` ```python Python theme={null} res = requests.get(f"{API_BASE}/v1/products", headers=headers) product_id = res.json()["products"][0]["id"] ``` Initiate the upload, then send the file in a single `PUT` (small files) or several chunks. See [File upload](/developer/file-upload) for chunking and resume. Reviewing a web page or a Figma frame instead? Submit it as a link with `POST /v1/links` and use the upload ID it returns — see [Link submission](/developer/links). ```bash curl theme={null} # Initiate curl -s -X POST "$FILES_BASE/v1/uploads" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" \ -H "X-External-User-ID: $USER_ID" \ -H "Content-Type: application/json" \ -d '{ "fileName": "ad.pdf", "fileSize": 2048576, "contentType": "application/pdf" }' # → { "uploadId": "...", "uploadUrl": "/v1/uploads/...", "maxChunkSize": 52428800 } # Send the bytes curl -s -X PUT "$FILES_BASE/v1/uploads/" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" \ -H "Content-Type: application/pdf" \ -H "Content-Range: bytes 0-2048575/2048576" \ --data-binary @ad.pdf ``` ```typescript TypeScript theme={null} const init = await fetch(`${FILES_BASE}/v1/uploads`, { method: "POST", headers, body: JSON.stringify({ fileName: "ad.pdf", fileSize: bytes.length, contentType: "application/pdf" }), }); const { uploadId } = await init.json(); await fetch(`${FILES_BASE}/v1/uploads/${uploadId}`, { method: "PUT", headers: { Authorization: `Bearer ${API_KEY}`, "Content-Type": "application/pdf", "Content-Range": `bytes 0-${bytes.length - 1}/${bytes.length}` }, body: bytes, }); ``` ```python Python theme={null} data = open("ad.pdf", "rb").read() init = requests.post(f"{FILES_BASE}/v1/uploads", headers=headers, json={"fileName": "ad.pdf", "fileSize": len(data), "contentType": "application/pdf"}) upload_id = init.json()["uploadId"] requests.put(f"{FILES_BASE}/v1/uploads/{upload_id}", headers={"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/pdf", "Content-Range": f"bytes 0-{len(data)-1}/{len(data)}"}, data=data) ``` Combine the upload with your classification. See [Creating promotions](/developer/promotions) for every field and for text promotions. ```bash curl theme={null} curl -s -X POST "$API_BASE/v1/promotions" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" \ -H "X-External-User-ID: $USER_ID" \ -H "Content-Type: application/json" \ -d '{ "uploadIds": [""], "fileFormat": "pdf", "promotionName": "Summer Campaign", "channelIds": [""], "productIds": [""], "jurisdictionId": "" }' # → 201 { "promotionId": "...", "versionId": "...", "version": 1, "correlationId": "..." } ``` ```typescript TypeScript theme={null} const res = await fetch(`${API_BASE}/v1/promotions`, { method: "POST", headers, body: JSON.stringify({ uploadIds: [uploadId], fileFormat: "pdf", promotionName: "Summer Campaign", channelIds: [channelId], productIds: [productId], jurisdictionId }), }); const { promotionId, versionId } = await res.json(); ``` ```python Python theme={null} res = requests.post(f"{API_BASE}/v1/promotions", headers=headers, json={ "uploadIds": [upload_id], "fileFormat": "pdf", "promotionName": "Summer Campaign", "channelIds": [channel_id], "productIds": [product_id], "jurisdictionId": jurisdiction_id}) promotion_id, version_id = res.json()["promotionId"], res.json()["versionId"] ``` A `409` means an upload is still processing. Retry with back-off. See [Creating promotions](/developer/promotions#handling-upload-conflicts). Evaluation runs asynchronously and returns immediately with `202 Accepted`. ```bash curl theme={null} curl -s -X POST "$API_BASE/v1/promotions//versions//evaluate" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" \ -H "X-External-User-ID: $USER_ID" # → 202 { "evaluationId": "...", "status": "processing", "correlationId": "..." } ``` ```typescript TypeScript theme={null} await fetch(`${API_BASE}/v1/promotions/${promotionId}/versions/${versionId}/evaluate`, { method: "POST", headers }); ``` ```python Python theme={null} requests.post(f"{API_BASE}/v1/promotions/{promotion_id}/versions/{version_id}/evaluate", headers=headers) ``` Poll until the aggregate `status` is `succeeded` or `failed`. Each result carries the findings for one file. See [Evaluation](/developer/evaluation) for the full response shape. ```bash curl theme={null} curl -s "$API_BASE/v1/promotions//versions//evaluation" \ -H "Authorization: Bearer $ADCLEAR_API_KEY" \ -H "X-External-User-ID: $USER_ID" # → { "status": "succeeded", "results": [ { "result": { "issues": [ ... ] } } ], "correlationId": "..." } ``` ```typescript TypeScript theme={null} const poll = await fetch( `${API_BASE}/v1/promotions/${promotionId}/versions/${versionId}/evaluation`, { headers }); const data = await poll.json(); if (data.status === "succeeded") for (const r of data.results) console.log(r.fileName, r.result.issues.length, "issue(s)"); ``` ```python Python theme={null} poll = requests.get( f"{API_BASE}/v1/promotions/{promotion_id}/versions/{version_id}/evaluation", headers=headers) data = poll.json() if data["status"] == "succeeded": for r in data["results"]: print(r["fileName"], len(r["result"]["issues"]), "issue(s)") ``` ## Next steps Receive results automatically instead of polling, and verify signatures. Handle the error envelope, status codes, and rate limits. # Reference data Source: https://docs.adclear.ai/developer/reference-data Fetch the product, channel, jurisdiction, and target-market IDs your organisation uses to classify a promotion. Before you create a promotion, fetch the IDs for your organisation's products, channels, jurisdictions, and target markets. You pass these IDs when you create the promotion, and they determine which regulatory rules apply during evaluation. Classification drives the rules. The products, channels, and jurisdiction you set decide which rules run during evaluation. Incorrect classification produces irrelevant findings. ## Endpoints Each endpoint returns its items under a named key alongside a `correlationId`, sorted alphabetically by name. See the full request, response schema, and a live request in the API reference: These values change infrequently. Cache them and refresh daily rather than fetching them on every request. Combine these IDs with your uploaded files. # Webhooks Source: https://docs.adclear.ai/developer/webhooks Receive evaluation and review lifecycle events automatically, verify signatures, and handle payloads. Webhooks deliver Adclear events to your endpoint as soon as they happen, so you do not have to poll. You provide an HTTPS URL during onboarding. If signing is enabled for your organisation, you also receive a shared secret to verify that requests came from Adclear. ## Overview and configuration Webhooks are configured per organisation by the Adclear team during onboarding. | Event | Trigger | | - | - | | `evaluation-completed` | An evaluation finishes (success or failure) | | `comment.created` | A comment is added to a promotion version | | `review.submitted` | A promotion version is submitted for review | | `review.approved` | A terminal approval decision is recorded | | `review.changes_requested` | A reviewer requests changes | | `review.rejected` | A promotion version is rejected | **Delivery:** * Sent as `application/json` via `POST`. * Treat delivery as best-effort, and expect occasional repeats. Acknowledge quickly with `2xx`, then process asynchronously. For `evaluation-completed`, see [Missed or failed deliveries](#missed-or-failed-deliveries). * Deduplicate lifecycle events on `deliveryId`. Deduplicate `evaluation-completed` on `evaluationId`. ## Common lifecycle envelope The five review lifecycle events share this envelope. `evaluation-completed` keeps its existing flat payload (documented below). ```json theme={null} { "event": "review.approved", "deliveryId": "uuid", "occurredAt": "2026-01-15T10:00:00.000Z", "promotionId": "uuid", "versionId": "uuid", "data": {} } ``` | Field | Description | | - | - | | `event` | Event name (matches `X-Adclear-Event`) | | `deliveryId` | Unique delivery ID for idempotency | | `occurredAt` | ISO timestamp for when the action happened | | `promotionId` | Parent promotion (campaign) ID | | `versionId` | Specific promotion version ID | | `data` | Event-specific payload (see below) | ### Lifecycle `data` fields | Event | `data` fields | | - | - | | `comment.created` | `commentId`, `threadId`, `authorUserId`, `content`, `isComplianceComment` | | `review.submitted` | `submittedByUserId`, optional `reviewerUserId` | | `review.approved` | `decidedByUserId`, `decision` (`approved` or `conditionally_approved`), optional `rationale` | | `review.changes_requested` | `decidedByUserId`, `decision` (`changes_requested`), optional `rationale` | | `review.rejected` | `decidedByUserId`, `decision` (`rejected`), optional `rationale` | ## Signature verification If Adclear has set a signing secret for your organisation, each request includes an `X-Webhook-Signature` header: an HMAC-SHA256 hex digest of the raw request body, prefixed with `sha256=`. Verify it before processing the payload. Use the raw bytes, not a re-serialised object. Headers on webhook requests: | Header | Description | | - | - | | `Content-Type` | `application/json` | | `X-Webhook-Signature` | `sha256=` HMAC-SHA256 of the raw body. Present when a signing secret is set | | `X-Adclear-Event` | Event type, for example `review.submitted` | | `X-Correlation-ID` | Internal trace ID for support requests | ## Evaluation payload reference `evaluation-completed` uses the legacy payload shape below (not the lifecycle envelope). It may include routing metadata such as `organizationId` and `workspaceId`. Example: ```json theme={null} { "promotionId": "promo-uuid-...", "promotionVersionId": "version-uuid-...", "evaluationId": "eval-uuid-...", "status": "succeeded", "reviewRequired": true, "overallAssessment": "This promotion requires review", "issues": [ { "recommendation": "Consider adding a risk warning.", "rationale": "Financial promotions must include risk warnings per FCA guidelines.", "severity": "HIGH", "commentId": "comment-uuid-...", "citedRules": [ { "id": "rule-uuid-...", "name": "Risk Warning Requirement", "product": "Investment", "channel": "Digital" } ], "location": { "type": "text", "content": "Invest now for guaranteed returns", "pageNumber": 1 } } ], "metadata": { "workfrontProjectId": "PROJ-123" } } ``` ### Issue fields | Field | Description | | - | - | | `recommendation` | Suggested change to resolve the issue | | `rationale` | Why the issue was raised | | `severity` | `LOW`, `MEDIUM`, or `HIGH` | | `commentId` | Optional. Root comment ID of the issue's thread. Use it to [reply to the issue](#reply-to-an-issue) | | `citedRules` | Optional. Rules the issue is based on | | `location` | Optional. Where the issue was found in the content | ### Reply to an issue Comment-backed issues normally include a `commentId`: the ID of the root comment that anchors the issue's thread. Send it as `parentCommentId` when [importing a reply](/developer/comments#import-comments) with `POST /v1/promotions/{promotionId}/versions/{versionId}/comments`. Your reply threads onto the issue instead of creating a new thread. Two caveats: * Treat `commentId` as optional. A replayed delivery may omit it. When it is absent, resolve the thread with [Get comments](/developer/comments#get-comments) instead. * Comment indexing is asynchronous. If a reply sent immediately after the webhook is rejected with `PARENT_NOT_FOUND`, wait briefly and retry. ## Missed or failed deliveries ### Evaluation results An `evaluation-completed` webhook can arrive late, arrive with a failed result, or not arrive at all. Each situation below says what you see and what to do. | Situation | What you see | What to do | | - | - | - | | The evaluation failed | A webhook with `status: "failed"`, an empty `issues` array and `reviewRequired: false` | Treat it as no result, not a pass. [Re-trigger the evaluation](/developer/evaluation#trigger-evaluation) or send the version for manual review | | Your endpoint returned a non-`2xx` response, took longer than 30 seconds, or could not be reached | No result in your system | Adclear does not send the webhook again. [Poll the evaluation](/developer/evaluation#poll-evaluation-status) to get the result | | Adclear could not send the webhook on the first attempt | A late webhook, sometimes more than once | Adclear tries again every 10 minutes. Deduplicate on `evaluationId` | | The evaluation has not finished | No webhook. Adclear sends it only when the evaluation finishes | Poll the evaluation. If it is still `processing` after 5 minutes, follow [evaluation troubleshooting](/developer/evaluation#troubleshooting) | | Adclear set a signing secret, but the request has no `X-Webhook-Signature` header | An unsigned request | Reject it and contact Adclear | Only treat a result as a pass when `status` is `succeeded` and `reviewRequired` is `false`. An empty `issues` array is not enough on its own, because a succeeded result can require review with no issues listed. ### Recovery endpoints If you miss a webhook, get the current state from the Public API. These endpoints return the latest state, not a replay of missed events. | Resource | Endpoint | | - | - | | Latest version | `GET /v1/promotions/{promotionId}` | | Comments | `GET /v1/promotions/{promotionId}/versions/{versionId}/comments` | | Decision | `GET /v1/promotions/{promotionId}/versions/{versionId}/decision` | | Evaluation | `GET /v1/promotions/{promotionId}/versions/{versionId}/evaluation` | ### Reporting a failure to Adclear Send these details so that Adclear can trace the webhook: * `evaluationId`, plus the `correlationId` from the evaluate response * `promotionId` and `promotionVersionId` * The `X-Correlation-ID` header, if you received the request * When you expected the webhook (in UTC), and what your endpoint returned ## Endpoint requirements | Requirement | Detail | | - | - | | Protocol | HTTPS only | | Response time | Respond `2xx` within 30 seconds | | Idempotency | Deduplicate lifecycle events on `deliveryId`; deduplicate evaluations on `evaluationId` | | Signature | If Adclear gave you a signing secret, verify `X-Webhook-Signature` before processing | For cross-cutting errors (401, 403, 429, 502), see [Errors & rate limits](/developer/errors). # External affiliate access Source: https://docs.adclear.ai/external-influencer-access How to link affiliates and agencies as External Uploaders so they can view their own monitored channels and compliance status. ## Who this page is for This page is for internal admins who want to give an affiliate, or the agency managing them, sight of their own monitoring and compliance status. Read this end to end so you can guide your partners through the invitation. External affiliate access is an add-on feature. Speak to your Adclear contact to have it enabled for your organisation. ## What it is External affiliate access lets people with the External Uploader role sign in to Adclear and view the affiliates they have been linked to. A linked partner sees that affiliate's monitored channels and compliance status without gaining access to the rest of your workspace. ## Inviting an External Uploader You link external users from the affiliate's own page. Go to the affiliate's page. Click the info button in the top-right to open the details sidebar, then find the **External Access** section. The sidebar is collapsed by default. A dialog opens asking for the person's email address. Adclear checks the address as you type and tells you whether they are already in your organisation, an existing Adclear user, or new to Adclear. Pick **Affiliate** (the affiliate themselves) or **Agency** (an agency managing the affiliate). This describes their relationship to the affiliate. Click **Link user** for someone already in your organisation, or **Invite & link** for anyone else. What happens next depends on the email address: * **Already a member of your organisation.** They are linked immediately and can see the affiliate the next time they open Adclear. * **Not yet a member.** They receive an Adclear invitation email, and appear in the External Access section with a **Pending** badge. Their access is granted automatically once they accept the invitation and sign up. ## What the partner experiences After you send an invitation, your partner receives an email inviting them to join your organisation on Adclear. If they don't already have an Adclear account, they create one as part of accepting. Once signed in, the sidebar lists every affiliate they have been given access to. Clicking an affiliate's name opens its page. ## Managing access The External Access section lists everyone linked to the affiliate, with an **Affiliate** or **Agency** badge and a **Pending** badge for invitations that have not been accepted yet. To remove someone, hover over their row and click the remove button: * For a **pending invitation**, this revokes the invitation so the person never receives access. * For an **active user**, this removes their access to this affiliate. If they are linked to other affiliates, those links are unaffected. ## What External Uploaders can see and do Access is read-only for the affiliate itself. Linked partners can: * View the affiliate's monitored channels and the compliance status of the content found there. * Open any promotion that monitoring has picked up. * Reply to comments. They cannot edit the affiliate or its settings, add or change monitors, or see other affiliates, your promotions, policies, workspace settings, or team member information. ## Related pages Permissions and role definitions, including the External Uploader role. The separate workflow for outside partners who approve assigned promotions. How external partners track promotions they have submitted for review. How external partners submit promotional content for review. How Adclear monitors affiliate channels for compliance. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # External reviewer access Source: https://docs.adclear.ai/external-reviewer Invite an external reviewer, assign promotions, and complete reviews from the restricted external queue. External reviewer access lets someone outside your organisation review only the promotions assigned to them. Use it when a partner, agency, bank, or other third party must approve content before it can progress. External reviewer access is an add-on feature. Speak to your Adclear contact to have it enabled for your organisation. ## How external reviewer access works Invite the reviewer, wait for them to join, grant their jurisdictions, and assign them directly or through a reviewer preset. Sign in to a restricted Promotions queue, open assigned work, comment, and record a review decision. External Reviewer and External Uploader are separate roles. An External Uploader submits their own promotions. An External Reviewer approves promotions submitted by other people. Each organisation member has one role at a time. Changing an External Uploader to External Reviewer removes their uploader experience for that organisation. ## Set up an external reviewer You need permission to manage team roles before you can complete these steps. Go to **Settings > Organisation > Users**. Select **Invite team members**, enter their email address, and choose **External Reviewer**. Adclear sends an invitation by email. The person appears as a pending member until they accept the invitation and sign in. They must become an active member before you can set their review permissions. Go to **Settings > Workspace > Compliance > Review Permissions**. Switch to the workspace where the reviewer will work and find their email address. If they are not listed, return to **Users** and add the active member to that workspace. Set **Reviewable Jurisdictions** to the countries the person may review. You can only assign them promotions for those jurisdictions. If they need to review promotions without a country, select **All Jurisdictions**. Adclear displays external reviewers by email address. The email domain helps your team distinguish people from different partner organisations. ## Assign an external reviewer Choose between direct assignment and a reviewer preset. Open the promotion and select the external reviewer's email in the reviewer field. The reviewer receives the normal assignment notification, and the promotion appears in their queue. The reviewer must have permission for the promotion's jurisdiction. Adclear blocks the assignment if the jurisdiction does not match. Open **Settings > Organisation > Reviewer Presets** and add an **External Reviewer** step to a sequential or parallel flow. Save the preset with the **External Reviewer** role. A preset defines the role and step order, but it does not store named reviewers. When you apply the preset to a promotion, expand the External Reviewer group and select one or more named external reviewers. **Anyone in role** is unavailable because access must always come from an explicit assignment. Each selected reviewer must have permission for the promotion's jurisdiction. See [Multi-level approval](/multi-level-approval) for the full preset workflow. Internal users can reassign the reviewer or change the review flow using the same controls they use for internal reviewers, including after a decision has been recorded. An external reviewer cannot reassign the promotion or edit its review flow. See [Edit the review flow during and after review](/multi-level-approval#edit-the-review-flow-during-and-after-review). ## Complete an external review After accepting the invitation, the external reviewer signs in to Adclear and follows these steps. The Promotions page is your review queue. It shows your current and earlier review assignments. Search by title or filter by status. The queue also shows the promotion ID, deadline, and current status. Select a row or choose **View details** from its actions menu. Read the promotion, AI findings, claims, and comments available on the assigned promotion. Add a comment when the internal team needs more detail. Choose **Approve**, **Reject**, or **Request Changes**. Add the required reason or comment when prompted. In a sequential preset, an approval moves the promotion to the next step. In a parallel preset, every required reviewer must approve before the promotion is fully approved. See [Review decisions](/compliance/review-decisions) for decision guidance. ## What an external reviewer can access | Can access | Cannot access | | - | - | | Promotions assigned to them | Promotions that were never assigned to them | | Review context on an assigned promotion | Organisation or workspace settings | | Comments on an assigned promotion | Policies, metrics, or team management | | Review decision controls during their active step | Reviewer assignment or review-flow controls | Access remains scoped to explicit assignments. Adding someone to the External Reviewer role does not give them access to every promotion in the organisation. Your team can't choose which comments an external reviewer sees on a promotion assigned to them, so write every comment on the assumption that the reviewer can read it. If your organisation hides comments from external uploaders, that setting doesn't apply to external reviewers. ## Common questions Confirm that your organisation has external reviewer access. The person must also accept the invitation and have permission for the promotion's country. You must name each external reviewer candidate when you apply a preset to a promotion. This keeps promotion access limited to the people your team explicitly selected. No. External Reviewer and External Uploader are separate roles. Use [External submission form](/external-submission-form) and [My Submissions](/my-submissions) for external upload workflows. Their queue can include earlier review assignments. They cannot discover promotions that were never assigned to them. ## Related pages Compare External Reviewer with the other Adclear roles. Add external reviewers to sequential or parallel reviewer presets. Choose between Approve, Reject, and Request Changes. Add feedback and collaborate on a promotion. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # External submission form Source: https://docs.adclear.ai/external-submission-form How agencies, affiliates, and influencers submit promotional content to Adclear for review. ## Who this page is for This page serves two audiences: * Internal admins sharing the link with external partners. Read this end to end so you understand what your partners will experience and what edge cases to watch for. * External submitters who have received the link. Focus on the submission flow and what happens after they submit. See [My Submissions](/my-submissions) for how to track your promotions. See [Helping Adclear learn](/how-you-help-adclear-learn) for how your responses to AI comments shape future reviews. ## What it's for The external form is a simple web page used by agencies, affiliates, influencers, or anyone else outside your organisation to submit promotional content into Adclear for review. Submitters don't need an Adclear account to use the form. Their first submission adds them to your organisation as an external member, and they can sign in afterwards to track their promotions. They never gain access to your organisation's workspace beyond their own submitted promotions. This upload workflow is separate from [External reviewer access](/external-reviewer). External reviewers sign in to review promotions your team assigned to them. This is the same feature referenced as the External Submission Form in the Features Guide. ## Choosing the right route for a partner Adclear has four ways to bring a partner into your workflow. Pick the one that matches how they will work with you, then set it up in the linked page. Routes that use the same role can be combined. An affiliate with external affiliate access can also submit through the submission form and follow those submissions in My Submissions. Each person holds one role in your organisation, though, so the same person cannot be both an External Uploader and an External Reviewer. | Route | Use it when | Where to set it up | | - | - | - | | External submission form | A partner needs to send you promotional content without signing in. | Described on this page. See [How someone gets the link](#how-someone-gets-the-link). | | External Reviewer access | A partner must approve promotions your team has assigned to them. | See [External reviewer access](/external-reviewer). | | External affiliate access | An affiliate or influencer needs to view the compliance status of their own promotions. | See [External affiliate access](/external-influencer-access). | | A separate workspace in your organisation | A partner needs a self-contained space for their own promotions, users, and settings. | Speak to your Adclear contact about adding a workspace. | Partners are always set up inside your existing organisation. Adclear does not create a separate organisation for them. ### Inviting a partner to sign in The submission form itself needs no account. When a partner needs to sign in, invite them to your organisation with one of two roles: * **External Uploader** for a partner who submits and tracks their own promotions. * **External Reviewer** for a partner who reviews promotions assigned to them. External members can also belong to teams used in review flows. See [How roles work](/how-roles-work) for the role definitions and [Multi-level approval](/multi-level-approval) for how external members fit into team and reviewer stages. ## How someone gets the link Your team copies a submission link from your settings page (in the External section) and shares it with the right third parties. The link determines which organisation and workspace the submission lands in. If the link doesn't specify a workspace, it goes to the default workspace for that organisation. The submission link is public. Anyone who has it can submit through it without signing in, so share it only with the partners you intend. Having the link gives no access beyond submitting a promotion. ## The submission flow The internal admin copies the submission link from the settings page and sends it to the external partner. The submitter opens the link and fills in the form with the required details. They add their creative content (an image, a PDF, pasted text, or a website URL). They agree to the terms and conditions and submit. If your workspace has lockdown enabled and this is a first-time external submitter, your organisation or workspace admin will receive a notification email asking them to grant access to the external user. The admin clicks the email link to approve access before the external user can see their submission. The first time a submission adds someone to your organisation, Adclear sends them a separate email titled "You've been invited to \{organisation} on Adclear". It explains that they can sign in to track their promotions and respond to feedback from your compliance team, and includes a **Sign in to Adclear** button. Adclear sends this email even if that first submission then fails validation. If the email fails to send, Adclear retries it on their next submission. The external user receives an email confirming their submission was received. The reviewer is notified, the submission appears in their tasks, and they review it through the standard workflow. Once reviewed, the external user receives a notification email with a link to the review on the promotion page. They can add a new version if changes are required, and the flow continues as usual. If your organisation has jurisdiction autoapply enabled and your admin has configured a preset for the submission's jurisdiction, that preset is applied automatically before the submission reaches review. See [Jurisdiction autoapply](/multi-level-approval#jurisdiction-autoapply) for more detail. ## What the person filling it in does They fill in the form with the required details, then add their creative content in one of three ways. An image, PDF, or other supported format uploaded directly from their device. Copy-paste the ad copy or content body directly into the form. Adclear visits the page and captures what's on it as the asset. External submitters submit one promotion at a time. They don't have access to the full range of upload types described in Upload Types. ## What happens after they submit The external user has access only to their own uploaded promotions on your Adclear site, and nothing else. They cannot see internal promotions, policies, settings, or other team members' content. ### Signing in after submitting Submitters sign in with the email address they used on the form, using the **Sign in to Adclear** button in their invitation email. * Submitters without an Adclear password receive a one-time code by email each time they sign in. No password is needed. * Submitters who already had an Adclear account with a password can sign in with that password. External users also get a [My Submissions](/my-submissions) page listing every promotion they have submitted, with status, deadline, and search and filter controls. Once their submission has gone through review: * They receive an email notification with a link to the review. * They can open the promotion and see the reviewer's decision. Unless your organisation hides comments from external uploaders, they can also read the comments and any requested changes. If comments are hidden, share the requested changes with them another way. Hiding comments is an optional setting in the External section of your settings. Speak to your Adclear contact to have it enabled for your organisation. For what "comments" covers here, see [Which comments you can see](/my-submissions#which-comments-you-can-see). * They can upload a new version if changes have been requested. Subsequent versions follow the same flow. ## Workspace lockdown Workspace lockdown is a configurable setting that adds an admin-approval step before any new external user can see their submitted promotions. When workspace lockdown is enabled, the first time an external user submits a promotion: * The submission goes through normally and the reviewer can review it as usual. * The organisation or workspace admin receives an email notification asking them to grant the external user access to the workspace. * The admin clicks Grant Workspace Access in the email to approve. * The external user can then access their own submitted promotion in Adclear. Until access is granted, the external user cannot see their submission, even if it has been reviewed. Reviewers can still complete their review in the meantime. If workspace lockdown is not enabled, this admin-approval step does not apply and external users can see their own submitted promotions immediately. ## Edge case: An internal user uses the external link If someone who works inside your organisation uses the external link by mistake, they may end up restricted to the external view and miss their normal tools and visibility. In that case your admins usually need to adjust their role so they behave as a proper internal user again. ## Related pages Every Adclear feature, including the external submission form. Permissions and role definitions, including the External Uploader role. How external partners track their submitted promotions after the initial submission. How comments and decisions calibrate the AI agents over time. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Feature catalog Source: https://docs.adclear.ai/feature-catalog Every Adclear feature in one place, grouped into Included and Add-on. The catalog lists every feature available in Adclear, split into Included (available to all clients) and Add-on (enabled per plan or feature flag). Open any feature for a short summary; follow the link inside for the full guide where one exists. Speak to your Adclear contact if you'd like to discuss enabling any add-ons. ## Included features Available to all clients and toggleable in your site settings. A reviewer can route a promotion to a specific person, typically someone in legal or senior compliance, when a decision needs specialist input. Escalation history is stored against every promotion for audit. Started by Compliance or Compliance Admin during review. See [Compliance escalations](/compliance/escalations) for the full workflow. Set a next review date on any approved promotion. When the date arrives, the promotion returns to the review queue with a "Due for re-review" status so your team can confirm it's still accurate. Useful for time-sensitive claims (client numbers, AUM figures), expiring regulatory permissions, and always-on content like social bios or partner landing pages. A unique upload link you share with external partners (affiliates, influencers, agencies). Submissions land in your Adclear review queue and follow the same workflow as internal promotions. External users only see their own submitted promotions. Each partner also gets a [My Submissions](/my-submissions) page listing everything they've sent you, so they can track status and start a new submission without needing a fresh link. Customise the form in Settings under External: add your logo and intro text, choose which questions submitters see, and limit the products and channels they can pick. See [External submission form](/external-submission-form) for setup, sharing, and edge cases. Tag a single promotion against multiple products and channels at upload. Adclear applies the relevant rules for every combination so nothing falls through the gaps (different channels often have different disclaimer requirements). Prevents the same creative being submitted four times across product and channel pairings. Reviewers attach a structured reason every time they reject or request changes (either from a preset list or custom). Aggregated in your dashboard so you can see which reasons come up most often, by product, channel, or team. Surfaces systemic gaps in upload briefings and feeds the patterns the AI agents learn from. See [Rejection reasons](/compliance/rejection-reasons) for the reviewer workflow, and [Settings](/settings#compliance) for customising the list. The uploader designates a reviewer or collaborator at upload, so promotions go straight to the right person instead of a general queue. Different from Escalations: a reviewer is assigned at upload before review begins; escalations happen during review when a decision needs to be pushed upward. Assigning a reviewer surfaces the promotion in their tasks but doesn't lock it. Other reviewers with permission can still pick it up. Connect Slack channels (or use email) to receive notifications when a promotion is uploaded, reviewed, commented on, or escalated. Each promotion gets its own Slack thread, keeping conversations tidy and searchable. Pairs with reviewer-on-upload and escalations for a fully connected workflow. The Get Help button (top right of any promotion) opens the Adclear support bot with three intake flows: question, bug, or feature idea. Separately, tag `@Adclear Support` on any specific comment to tie a support request to that asset. Use `@Adclear Support` for issues tied to a specific asset; use the Get Help bot for everything else. See [Helping Adclear learn](/how-you-help-adclear-learn) for which route to use when. We no longer recommend the platform's integrated Figma link import. It will be removed soon. Use the official Adclear plugin for Figma instead. Send single frames, carousels, batches, and customer journey flows from Figma to Adclear. See [Adclear plugin for Figma](/marketing/figma-plugin). Import a video by pasting a Frame.io link, or send it from Frame.io using the **Send to Adclear** custom action. Workspace admins configure brand presets and invite external users where the action is enabled. See [Importing from Frame.io](/marketing/importing-from-frameio). ## Add-on features Available with upgraded plans or per feature flag. Speak to your Adclear contact about enabling these. An eligible uploader approves their own promotion, while still requiring an active click. Approval is never automatic. Configurable workspaces can scope eligibility by channel, product, jurisdiction, users, roles, and AI requirement. Legacy workspaces use the self-approver and market permissions in review settings. See [Self-approval](/self-approval) for the full operational detail. Configure a chain of reviewers a promotion must pass through before final sign-off. Sequential (A → B → C), parallel (A and B at once), or a combination. Without MLA, teams achieve a similar outcome by manually reassigning the reviewer at each step. Includes **jurisdiction autoapply** (add-on): link a jurisdiction to a preset so the correct review flow is enforced automatically whenever that jurisdiction is selected. Review flows stay editable mid-review: Compliance Admins and Marketing Admins can reassign the reviewer on any stage, swap the preset, or switch to single review, even after decisions have been recorded. Adclear asks for confirmation before discarding any recorded decision. See [Multi-level approval](/multi-level-approval) for the full operational detail. The Included Multi-select feature above. Currently feature-flagged: speak to your Adclear contact about enabling it for your organisation. A centralised library of pre-approved claims (statements, statistics, marketing language). Adclear scans every uploaded promotion against the library and raises a comment if an unapproved or outdated claim is used. Picks up near-miss variants too (e.g. "2 million traders" vs. an approved "2 million clients"). Claims live as versions in a version chain. To put a claim back through review, create a new version (preferred for the audit trail) or extend the next review date on the current version. See [Marketing claims](/marketing/claims) and [Reviewing claims](/compliance/claims) for the day-to-day workflow. Invite someone outside your organisation to review promotions your team assigns to them. External reviewers use a restricted queue and cannot browse unassigned promotions or internal settings. Assign them directly or add the **External Reviewer** role to a sequential or parallel reviewer preset. Select the named reviewers when you apply the preset to a promotion. Jurisdiction permissions still control which promotions they can review. See [External reviewer access](/external-reviewer) for setup and the reviewer experience. Review ad copy from any web page in a Chrome side panel. Highlight or paste text, evaluate it against your workspace rules, and save the result to Adclear as a draft promotion. Feedback on issues syncs with the promotion's comments in the web app. In closed beta: speak to your Adclear contact about enabling it, sharing the work email of each person who needs access. See [Chrome extension](/chrome-extension) for setup and the full workflow. Tracks post-publication content on websites, Discord, and social media for compliance issues and deviations from Approved Copy. Builds an audit trail over time. See [Affiliate monitoring](/monitoring/overview) for workflows, configuration, and operating cadence. A view of the rules Adclear applies during review, together with the policies they come from. Gives your Compliance and Marketing leads a clear picture of what the platform is checking. Adclear manages what each rule checks for. Compliance Admins and Marketing Admins can change where a rule applies, archive and restore rules, and manage linked items, with every change recorded in the rule's Changelog. See [Rules](/compliance/rules) for what a rule is, how to edit one, and how to read its Changelog. ## Related pages How reviewer responses calibrate features like rejection reasons and rules. Operational detail on self-approval eligibility, toggles, and audit. Route promotions through multiple reviewers in parallel or sequential flows using reviewer presets. Sharing an upload link with external partners. Give outside partners a restricted queue for assigned reviews. Tracking post-publication content for compliance. # How roles work Source: https://docs.adclear.ai/how-roles-work Understand the different roles in Adclear and what each one can do. Roles determine what each member of your team can see and do. Every person who joins your organisation is assigned a role, and that role decides which areas of the platform they can access (creating promotions, reviewing claims, managing the team). Not sure which role someone needs? Skip to [Choosing the right role](#choosing-the-right-role) for a decision guide. ## Roles at a glance Senior compliance leaders who configure policies and oversee the review process. Day-to-day compliance reviewers who approve or reject promotions. Marketing leaders who manage promotions, team members, and integrations. Uploaders who build and submit promotions for review. Legal reviewers who handle escalations and create claims when needed. Outside collaborators who create and submit their own promotions through a restricted experience. Outside partners who review only the promotions explicitly assigned to them. ## Roles in detail **Who it's for**: senior compliance leaders responsible for setting up and overseeing the compliance programme. **Can do**: * Configure compliance settings, policies, and review workflows * Reassign reviewers and change a promotion's review flow mid-review, including after decisions are recorded * Create, archive, and review promotions * Review submitted promotions and claims * Archive claims * Manage team members and role assignments * Connect Slack for notifications * View metrics and reporting dashboards * Create, edit, and manage disclaimers * View rules, change where a rule applies, archive and restore rules, and link policies, handbook references, disclaimers, claims, and promotions to rules **Can't do**: * Change what a rule checks for (managed by Adclear) **Who it's for**: compliance team members handling day-to-day review of promotions and claims. **Can do**: * Review and approve or reject submitted promotions and claims * Create, archive, and export promotions * Submit promotions for review * View disclaimers **Can't do**: * Configure compliance settings or rules * Manage policies or disclaimers * Delete or archive claims * Manage organisation members or change role assignments **Who it's for**: marketing leaders overseeing the upload team with broader control over promotions and team management. **Can do**: * Create, archive, delete, and export promotions * Submit promotions and claims for review * Reassign reviewers and change a promotion's review flow mid-review, including after decisions are recorded * Review submitted claims * Archive claims * Manage team members and role assignments * Connect Slack * View metrics, rules, and disclaimers * Change where a rule applies, archive and restore rules, and link policies, handbook references, disclaimers, claims, and promotions to rules * Create compliance policies Marketing Admins can't change what a rule checks for. See [Rules](/compliance/rules#edit-a-rule). **Who it's for**: uploaders who build promotions and submit them for compliance review. **Can do**: * Create, archive, and export promotions * Submit promotions and claims for review * Delete promotions when needed * View disclaimers **Can't do**: * Approve or reject promotions (reviewer responsibility) * Access compliance settings or policies * Manage team members **Who it's for**: legal team members who respond to escalations from reviewers and disputes raised on promotions. **Can do**: * Respond to escalations and disputes raised by the reviewer team * Create claims and submit promotions * Export promotion data * View disclaimers Reviewers escalate promotions to Legal users, so make sure at least one Legal user is assigned if your workflow includes escalation steps. Legal responds with a comment, and the promotion returns to the status it had before it was escalated. Uploaders can also send a rejected promotion to a risk acceptor. See [Risk acceptance](#risk-acceptance). **Who it's for**: outside collaborators, agencies, or influencer partners who need limited access to create content for review. **Can do**: * Create promotions * Submit promotions for review **Can't do**: * Review, approve, or reject anything * Access internal settings, policies, or team management * View metrics or disclaimers Use this role for external partners who submit their own work. See [External submission form](/external-submission-form) and [My Submissions](/my-submissions). **Who it's for**: outside partners whose approval is required for promotions your team submits. **Can do**: * Open promotions explicitly assigned to them * Read the available review context and comments * Comment on assigned promotions * Approve, reject, or request changes when it is their turn **Can't do**: * Browse promotions that were never assigned to them * Create or submit promotions * Assign reviewers or change a review flow * Access internal settings, policies, metrics, or team management Use [External reviewer access](/external-reviewer) to invite an external reviewer, grant jurisdictions, and assign promotions. ## What each role can do The Compliance and External Reviewer roles do not grant access to every promotion. Reviewing is also scoped by the markets (jurisdictions) each person has permission for. External reviewers must also be explicitly assigned. | Action | Compliance Admin | Compliance | Marketing Admin | Marketing | Legal | External Uploader | External Reviewer | | - | :-: | :-: | :-: | :-: | :-: | :-: | :-: | | Create promotions | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✕ | | Archive promotions | ✓ | ✓ | ✓ | ✓ | ✕ | ✕ | ✕ | | Delete promotions | ✓ | ✕ | ✓ | ✓ | ✓ | ✕ | ✕ | | Export promotions | ✓ | ✓ | ✓ | ✓ | ✓ | ✕ | ✕ | | Submit promotions | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✕ | | Review promotions\* | ✓ | ✓ | ✕ | ✕ | ✕ | ✕ | ✓ | \*Compliance reviewers need the relevant jurisdiction. External reviewers need the relevant jurisdiction and either a direct assignment or selection as a named candidate when the submitter applies a reviewer preset. | Action | Compliance Admin | Compliance | Marketing Admin | Marketing | Legal | External Uploader | External Reviewer | | - | :-: | :-: | :-: | :-: | :-: | :-: | :-: | | Create claims | ✓ | ✓ | ✓ | ✕ | ✓ | ✓ | ✕ | | Review claims | ✓ | ✓ | ✓ | ✕ | ✕ | ✕ | ✕ | | Archive claims | ✓ | ✕ | ✓ | ✕ | ✕ | ✕ | ✕ | | Action | Compliance Admin | Compliance | Marketing Admin | Marketing | Legal | External Uploader | External Reviewer | | - | :-: | :-: | :-: | :-: | :-: | :-: | :-: | | Manage compliance settings | ✓ | ✕ | ✓ | ✕ | ✕ | ✕ | ✕ | | Create policies | ✓ | ✕ | ✓ | ✕ | ✕ | ✕ | ✕ | | Manage policies | ✓ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | | View rules | ✓ | ✕ | ✓ | ✕ | ✕ | ✕ | ✕ | | Edit, archive, and restore rules | ✓ | ✕ | ✓ | ✕ | ✕ | ✕ | ✕ | | Link policies and handbook references to rules | ✓ | ✕ | ✓ | ✕ | ✕ | ✕ | ✕ | | Respond to escalations | ✕ | ✕ | ✕ | ✕ | ✓ | ✕ | ✕ | | Action | Compliance Admin | Compliance | Marketing Admin | Marketing | Legal | External Uploader | External Reviewer | | - | :-: | :-: | :-: | :-: | :-: | :-: | :-: | | Create disclaimers | ✓ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | | Edit and manage disclaimers | ✓ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | | View disclaimers | ✓ | ✓ | ✓ | ✕ | ✓ | ✕ | ✕ | | Action | Compliance Admin | Compliance | Marketing Admin | Marketing | Legal | External Uploader | External Reviewer | | - | :-: | :-: | :-: | :-: | :-: | :-: | :-: | | Manage organisation profile | ✓ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | | Manage members | ✓ | ✕ | ✓ | ✕ | ✕ | ✕ | ✕ | | Manage team | ✓ | ✕ | ✓ | ✕ | ✕ | ✕ | ✕ | | Connect Slack | ✓ | ✕ | ✓ | ✕ | ✕ | ✕ | ✕ | | View metrics | ✓ | ✕ | ✓ | ✕ | ✕ | ✕ | ✕ | ## Risk acceptance Risk acceptance is a permission, not a role. Compliance Admins and Marketing Admins can turn it on for Marketing and Marketing Admin users under **Settings > Organisation > Users**. Compliance, Compliance Admin, Legal, and external users can't hold it. When an uploader escalates a Rejected or Changes Needed promotion, risk acceptors appear in the escalation list alongside Legal users. The list shows names only, so make sure uploaders know who your risk acceptors are. Admins can see them on the Users page, marked with a **Risk acceptor** badge. Sending a promotion to a risk acceptor moves it to **Reviewing Risk**. The risk acceptor responds with a comment, and the promotion returns to the status it had before. A risk acceptance response doesn't approve the promotion. See [Marketing escalations](/marketing/escalations) for the full flow. ## Choosing the right role Assign **External Uploader** if they submit their own promotions. Assign **External Reviewer** if they approve promotions your internal team submits. See [External reviewer access](/external-reviewer) for the reviewer setup. If they approve or reject promotions and claims day-to-day, assign Compliance. If they also manage your policies and rules, assign Compliance Admin. Remember to add reviewers to the relevant markets so they can see promotions to action. Assign Legal. Reviewers escalate promotions to Legal users. If someone on the marketing side should respond when uploaders escalate a rejected promotion, give them risk acceptance instead. See [Risk acceptance](#risk-acceptance). Assign Marketing for individual contributors who upload promotions. Use Marketing Admin for team leads who also manage members and need broader controls. Roles can be changed at any time. If someone's responsibilities shift, an admin with the right permissions can update their role from the team management area. ## Frequently asked questions Each member is assigned a single role at a time. If someone needs broader access, change their role rather than creating a second account. No. Risk acceptance is a permission added on top of a Marketing or Marketing Admin role. See [Risk acceptance](#risk-acceptance). Only Compliance Admins and Marketing Admins can manage members and update role assignments. Pick the closest match, usually one that errs on the side of less access. You can always upgrade them later if their work requires more permissions. The Compliance role gives access to the review workspace, but the actual list of promotions they see is filtered by the markets (jurisdictions) they have permission for. Ask your site admin to add them to the relevant markets in team management. No. They can create and submit their own work but don't have access to internal settings, metrics, or other team members' data. No. They only see promotions that were explicitly assigned to them. They also need permission for the promotion's jurisdiction. Managing members sits under **Settings > Organisation > Users** (some people call this team members). Most Organisation settings are only visible to admins, so the section may be hidden for you. Compliance Admins and Marketing Admins can manage members; ask one of them for access. ## Related pages Create your account and find your way around Adclear. Submission flow for External Uploaders. Invite and assign outside partners who approve promotions. Day-to-day workflow for reviewers. # Helping Adclear learn Source: https://docs.adclear.ai/how-you-help-adclear-learn How your responses to comments train Adclear's agents, and how to raise issues with the right team. ## Overview Every comment you respond to in Adclear does two things at once. It moves your promotion forward, and it teaches Adclear's agents what compliance looks like in your organisation. Skip a response, leave a one-line reaction, or click through without context, and the agents do not learn. The mechanics of commenting are covered in the /marketing/overview and the /compliance/overview. This guide focuses on why how you respond matters, and how to make sure the right people hear about issues. Throughout this guide we use uploader for the person uploading a promotion, and reviewer for the person assessing it. The two roles interact with comments differently, and that difference matters. ## Before you start You will need the right access to do any of this. The table below shows who can submit, who can review, and where to look for full role detail. | You need to... | Minimum role | Where it is covered | | - | - | - | | Upload a promotion and respond as the uploader | Marketing, Marketing Admin, Compliance, Compliance Admin, Legal, or External Uploader | /marketing/overview | | Review a promotion and respond as the reviewer | Compliance or Compliance Admin | /compliance/overview | | Resolve an escalation | Legal | /how-roles-work | | Tag @Adclear Support on a comment | Any role with access to the promotion | This guide | | Open the Get Help bot to log a question, bug, or feature request | Any logged-in user | This guide | If you are unsure which role you have, check with your workspace admin. Full permission breakdowns are in /how-roles-work. ## Why your comments matter Adclear is not a static rules engine. It is a set of agents that get sharper every time someone tells them whether a comment was right or wrong, and why. The "why" is the part most teams miss, and it is the part that actually trains the agents. Three things happen every time you click a response button: Your response unblocks the next step. The reviewer can decide, the uploader can resubmit, or the asset can be approved. Uploaders see why a comment matters. Reviewers see why a dispute is reasonable. Without context, both sides have to guess. Adclear's agents watch the response, the reasoning, and the outcome, then adjust how they comment on similar content in future. ### The agents are weighted toward reviewer responses This is the most important thing to understand about how Adclear learns. When an uploader and a reviewer disagree on a comment, the reviewer's response carries more weight in how the agents adjust. For regulatory comments, only the reviewer's response trains the agents on what is compliant. An uploader disputing a regulatory comment without a reviewer agreeing will not change how Adclear comments on similar content in future. This is by design. The reviewer holds the foundation of what is compliant and what is not. That has two practical consequences: 1. Uploaders cannot quietly silence a comment. Disputing a regulatory comment without supporting context simply sends it to the reviewer to decide. The reviewer's call is what counts. 2. Reviewers carry the responsibility for shaping the agents. A reviewer who clicks through with no rationale is not just slowing down the next reviewer. They are missing the chance to teach Adclear something it can reuse on every future promotion. For tone-of-voice and non-regulatory comments the picture is more flexible. Patterns from uploader responses can feed into building guidelines over time, but the same principle holds: the more context, the better the learning. ## How each side responds The three response options look similar between uploader and reviewer, but they mean different things, and the buttons are labelled differently for a reason. When you have uploaded a promotion and Adclear has commented on something, you have three options: | Button | What it means | What happens to the comment | | - | - | - | | Agree, Will Action | You agree with the comment and will make the change in the next version | Comment moves to the Actioned tab. You are expected to address it before resubmitting | | Dispute | You disagree with the comment and do not intend to change the promotion | Comment stays visible with a Disputed status. The reviewer will see it and decide | | Reply | You are adding context or asking a question without changing the comment's status | Comment stays open. Useful for clarifying before deciding to action or dispute | "Agree, Will Action" and "Dispute" both require substantive context. A one-line "yes" or "no" is not enough. See [What strong feedback looks like](#what-strong-feedback-looks-like) below. When a submitted promotion comes to you for review, your three options are different: | Button | What it means | What happens to the comment | | - | - | - | | Agree, Please Action | You agree with Adclear and you are telling the uploader to make the change | Comment moves to the Actioned tab. The uploader must address it in the next version | | Relevant, Not Required | The comment is relevant in general, but in this specific context it does not need a change | Promotion can be approved as-is. Adclear learns there is a nuance the agents missed | | Dismiss | The comment is wrong. Adclear has misread, misapplied a rule, or got the context wrong | Comment moves to the Dismissed tab. This is an outright rejection of the agents' call | The difference between Relevant, Not Required and Dismiss matters more than it looks. "Relevant, Not Required" tells the agents "the comment was sensible, but this context is an exception." "Dismiss" tells the agents "you were wrong here." They train the agents in different directions, so pick the right one. ## What strong feedback looks like Before getting into specific examples, it helps to know what a strong response is doing. Whether you are an uploader or a reviewer, the same eight dimensions apply. A response that hits more of these is one that the agents can actually learn from, and that the next person reading the comment can rely on. | Dimension | What a strong response does | Why it helps the agents learn | | - | - | - | | Justified disagreement | Explains why a comment is incorrect or over-applied | Teaches boundary calibration and reduces false positives in future | | Contextual awareness | References audience, timing, channel, or market norms | Helps agents learn situational interpretation | | Regulatory grounding | Anchors feedback to identifiable standards or principles (such as COBS, FCA Handbook) | Improves rule-mapping precision | | Harm reasoning | Explains how (or why not) consumers could be misled or harmed | Strengthens risk modelling | | Proportionality | Distinguishes material issues from immaterial ones | Prevents over-enforcement on minor concerns | | Completeness | Identifies missing required information | Helps agents understand where gaps in a rule exist | | Constructive remediation | Suggests what should change or be added | Enables corrective learning rather than just rejection | | Nuanced judgement | Recognises grey areas or uncertainty | Encourages probabilistic reasoning instead of absolute calls | You do not need to hit every dimension in every comment. The point is to recognise that a substantive response usually covers at least three or four. A response that hits none of them, regardless of which button you clicked, is a missed signal. ### Strong feedback in practice Compare the two columns below. Same comment, two very different signals to the agents. Uploader disputes: "disagree, not needed"Reviewer dismisses: "not required" Neither of these tell anyone, human or agent, why. The agents cannot generalise from them, and the next person to read the comment has to start from scratch. Uploader disputes: "Our latest tone of voice guidelines allow 'easy to utilise' in the context of our mobile app, not in terms of ease of investing. Asset stays as is."Reviewer dismisses: "Dismissed. The phrase refers to in-app features being utilised, not investment products. In line with our tone-of-voice agreement on being clear and not misleading, the statement remains."Reviewer agrees: "Agree, please action" is enough on its own. The Adclear comment already explains the rule, you do not need to repeat it. Brevity is fine here. ## What goes wrong without context These are the failure modes we see most often. Each one has a hidden cost for the team, for the audit trail, and for what Adclear's agents are able to learn. The Adclear comment: "The word 'easy' may trivialise the nature of investing, which carries inherent risk. Consider revising in line with COBS 4.2.1R requirement that communications are fair, clear and not misleading."What the uploader does: Clicks Dispute and writes "not needed."The cost: * The reviewer opens the promotion and sees a disputed comment with no reasoning. They now have to either guess what the uploader meant, risking approving something they should not, or kick it back with a question, adding a full review cycle. * The agents see a dispute with no signal and learn nothing. The next promotion with the same comment will trigger the same back and forth. * The audit trail shows a disputed compliance comment with no documented justification. Better: "Disputed. The word 'easy' here refers to the in-app onboarding flow, not the act of investing. The caption clarifies it is the navigation that is easy, not investment outcomes. Per our tone-of-voice policy section 3.2, we use 'easy' for product usability but never for investment ease or returns. Asset stays as is." The Adclear comment: "The word 'utilise' may not comply with tone-of-voice guidelines requiring simple, accessible language."What the reviewer does: Clicks Dismiss and writes "not applicable."The cost: * The uploader sees a dismissed comment and assumes Adclear is unreliable on this kind of issue. They start to ignore similar future comments themselves rather than addressing them, and the tool's credibility erodes for them. * The agents learn "this kind of comment was wrong" but have no signal about why, so they may swing the other way and stop commenting on similar content even where they should. The reviewer holds the foundational knowledge of what is compliant. If they do not share their reasoning, the agents cannot absorb it. * No defensible record exists of why the dismissal was correct. Better: "Dismissed. The agents have read 'utilise' as a tone-of-voice issue, but the word does not appear in the asset itself. It only appears in the caption, which is internal context for review and is not customer-facing. The tone-of-voice rule does not apply." ## When the comment itself is the problem: Notifying Adclear Sometimes the issue is not whether a comment is right or wrong. It is that Adclear has misread the promotion entirely, missed something it should have caught, or hit a bug in the tool. You have three ways to notify the Adclear team, and each is for a different situation. ### Tag @Adclear Support on a specific comment Use this when Adclear has commented on something incorrectly. For example, the agents are misreading a word, applying a rule that does not fit, or referencing content that is not actually in the asset. Reply to the relevant Adclear AI comment from the right-hand panel. Use the @ symbol to tag `@Adclear Support` and add specific context. For example: "This is misreading the promotion, the word 'utilise' does not actually appear in the asset." The Adclear team is notified against this specific promotion and a ticket is created. ### Add a sticky comment for something Adclear missed Use this when Adclear has missed a feature or element of the promotion that should have been raised. No existing comment exists for you to reply to. This is the sticky-comment tool. It lets you place a marker anywhere on the asset. For example, on a rocket image in an investments ad: "Rockets should not be used here as they trivialise investment risk." Tagging `@Adclear Support` against the new comment notifies the Adclear team. We then review the agents and train them so this gets picked up automatically in future. Where your workspace has the flag button in the comment box, flag the comment instead of tagging support. The flagged comment and its pin reach the Adclear team directly. See [Flagging something Adclear missed](/compliance/commenting#flagging-something-adclear-missed). ### Use the Get Help bot for questions, bugs, and feature requests Use this for anything not specific to a single comment. General questions, suspected bugs in the tool, or feature ideas. The Get Help button is in the top right of any promotion (and also via the chat icon in the bottom left). It opens the Adclear support bot, which categorises your message into one of three flows: For how-do-I and why-is-this questions. Quickest path to an answer. For broken behaviour, errors, or things not working as documented. For ideas and improvements. These feed into the product roadmap. At any point you can ask to speak to a human. Just type "speak to an agent." We monitor every comment that comes through the bot, and the bot exists to help us spot themes and respond consistently, not to keep you at arm's length. ## Quick reference A printable summary of who does what. | When you... | Click | And add... | | - | - | - | | Agree with the comment and will fix it | Agree, Will Action | What you are changing and why | | Disagree and will not change the promotion | Dispute | The specific reason: context, rule, policy | | Need clarification before deciding | Reply | The question you need answered | | Spot Adclear has misread something | (any reply) | Tag @Adclear Support with what it got wrong | | Spot something Adclear missed | Flag button in the comment box, or sticky comment via + icon | Where and what. Tag @Adclear Support if the flag button is not available yet | | Have a general question or bug | Get Help button | Pick the right category in the bot | Resubmit only when every comment has a status applied. Leaving a comment unaddressed means the reviewer has to chase it. | When you... | Click | And add... | | - | - | - | | Agree the comment is right and the uploader must fix it | Agree, Please Action | A short acknowledgement is enough. The Adclear comment already explains the rule | | Comment is reasonable but does not apply in this context | Relevant, Not Required | The specific nuance that makes this an exception | | Comment is wrong | Dismiss | A prescriptive reason: what the agents got wrong, and what rule actually applies | | Spot Adclear has misread something | (any reply) | Tag @Adclear Support with what it got wrong | | Spot something Adclear missed | Flag button in the comment box, or sticky comment via + icon | Where and what. Tag @Adclear Support if the flag button is not available yet | | Need legal or specialist input | Final review action | Use Escalate and select the right person (where enabled) | | Have a general question or bug | Get Help button | Pick the right category in the bot | Respond to every comment before clicking Review. A skipped comment is a missed training signal, and the agents are weighted toward your responses, so what you skip, they do not learn. ## Frequently asked questions For tone-of-voice and non-regulatory comments, yes. Uploader responses contribute, especially when patterns emerge. For regulatory comments, the agents are weighted toward the reviewer's response. An uploader dispute alone will not change how Adclear comments on similar content. The reviewer's agreement or dismissal carries the regulatory training signal. They train the agents in opposite directions. Dismiss says "the comment was wrong." Relevant, Not Required says "the comment was sensible, but this context is an exception, please learn the exception." If you dismiss comments that were actually relevant, the agents will eventually stop commenting on similar content even when they should, because you have told them the comment itself was incorrect. For uploader disputes and reviewer dismissals: enough that someone reading it next week, without you in the room, can understand both the decision and why. Name the context (what the promotion is, what channel, what product), and name the rule or policy that justifies the call. For reviewer agreements: a short acknowledgement is fine, since the Adclear comment already explains the rule. You do not need to repeat the regulatory citation when you are agreeing with it. See the section above for the full set of dimensions. `@Adclear Support` ties your message to a specific promotion and a specific comment. Use it when the issue is about how Adclear commented (or did not comment) on something on that asset. The Get Help bot is for everything else: general questions, suspected bugs across the tool, or feature requests. Both notify the Adclear team. The difference is whether the context is the asset or the tool. The bot and `@Adclear Support` are more efficient for us to triage. When you raise something through either channel, the context, user information, and the specific promotion or comment are pinned directly to the request, so we can pick it up and act without needing to chase down the background. Direct emails strip that context and slow the response down. The reviewer's decision ultimately stands. They hold the keys to your organisation's policies and are the foundational source of what is compliant in your context. Disagreements should usually be resolved through comments and conversation on the promotion itself, not by overriding the decision. Escalation is by exception, not a routine route. It is used when there is genuine grey area that needs legal or specialist input, or where an Uploader user with Risk Accepting permissions needs to formally accept risk on a specific change request. It is not a way to challenge a reviewer's standard call. The Escalate button is also not enabled for every organisation. If your workspace does not show it, escalations are not part of your configured workflow. Speak to your workspace admin or contact Adclear support if you think it should be enabled. ## Related guides Full mechanics of uploading, choosing the right upload type, and submitting promotions for review. Full mechanics of reviewing promotions, making decisions, and handling escalations. Permissions, role definitions, and how to choose the right role for a team member. Every status a promotion can be in and who acts next at each stage. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Welcome to Adclear Source: https://docs.adclear.ai/introduction AI-assisted compliance review for promotional content, built around your policies, your tone of voice, and your team. ## What Adclear is for Adclear helps content uploaders and compliance reviewers produce promotional content faster, with fewer review cycles and a clear audit trail. Promotions are uploaded, automatically assessed against your organisation's policies and the relevant regulatory rules, then reviewed and signed off by your reviewer team, all in one place. The earlier and more consistently your team uses Adclear, the more it learns from your reviewers' decisions and the better its assessments become. ## Where to start Create your account, sign in, and find your way around Adclear. See what each role can do and pick the right one for your team. Upload promotions, manage versions, and track decisions. Review submissions, make decisions, and handle escalations. ## Core concepts These pages are referenced from across the documentation and worth reading early. Single, Carousel, Variations, and Batch, and when to use each. Every status a promotion can be in and who acts next. How your responses to comments train Adclear's agents. ## Beyond the basics Escalations, Evergreens, Claims, Self-Approvals, and more. Post-publication monitoring of websites, Discord, and social media. Definitions for every metric on the Analytics page. See exactly what Adclear checks for, where it comes from, and change where each rule applies. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # After review Source: https://docs.adclear.ai/marketing/after-review What each review decision means and what your next step is. ## Overview Once you've submitted, you can no longer edit the promotion. You'll receive an email notification when a decision is made. ## Decisions and next steps | Decision | Status | Your next step | | - | - | - | | Approved | Approved | No action required. The promotion is cleared for use. | | Conditionally Approved | Conditionally Approved | The promotion appears on your tasks. Read the reviewer's condition, make the requested update, and upload a new version. The new version may be eligible for self-approval. | | Rejected | Rejected | The promotion appears on your tasks with reviewer comments. Review the comments, then upload a new version that addresses them. | | Changes Needed | Changes Needed | The promotion appears on your tasks. Upload a new version if the content needs to change, or [resubmit the current version](#resubmitting-without-a-new-version) if it does not. | If you think a decision is wrong, ask the reviewer. On an individual review they can change their decision. Under [multi-level approval](/multi-level-approval), address the comments and submit a new version. You should not need to contact Adclear support to undo a decision. ## Resubmitting without a new version Resubmitting the current version is for when you disagree with the requested changes: explain why in the comment thread, then send it back so the reviewer can look at it again. If you want the risk accepted rather than the content changed, [escalate for risk acceptance](#if-you-disagree-with-the-decision) instead. While a promotion is in Changes Needed, use **Resubmit** in the promotion viewer to send the current version back to the reviewer's queue as it stands. The reviewer can then approve it. Resubmit is offered only while the promotion is in Changes Needed, and works the same way on individual reviews and under [multi-level approval](/multi-level-approval). ## If you disagree with the decision If you've received a Rejected or Changes Needed decision and you believe the risk should be accepted rather than the content changed, you can escalate the decision for risk acceptance review. See [Escalations](/marketing/escalations) for the full flow. ## What happens next on the dashboard Promotions in Pending Review, In Review, Approved, Escalated, Reviewing Risk, or Risk Accepted are visible on the Promotion Dashboard but don't appear on your tasks unless action is required from you. Conditionally Approved promotions **do** appear on your tasks, alongside Rejected and Changes Needed, because a new version is still owed. They are visible to whoever uploaded the promotion and to anyone collaborating on the campaign, and they drop off once the new version is approved. For a full breakdown of every status and who acts at each stage, see [Promotion Statuses](/promotion-statuses). ## After conditional approval The promotion appears on your tasks, and opening it shows a banner at the top of the sidebar telling you what is still outstanding. The banner carries the action itself, so you no longer need to find **Add new version** in the promotion menu. It follows you through the rest of the process: | Where you are | What the banner says | Button | | - | - | - | | On the conditionally approved version | Add a new version with the requested changes, then self-approve it | Add version | | On the new version, before submitting | V1 was conditionally approved. Submit V2, then approve it to finish | Submit for Review | | On the new version, once submitted | V1 was conditionally approved. Approving V2 completes the process | Review | The wording adapts to what you can actually do. If self-approval is not available to you, or the new version will go through an approval chain, the banner asks you to submit for review instead. The promotion then goes to a reviewer as normal. Submitting and approving are two separate steps, on purpose. The new version has to be submitted before it can be approved, and both are recorded separately in the audit history. The reviewer's condition appears as a comment on the promotion. Use it as the brief for the next version. When you upload that version, Adclear may offer self-approval. Eligibility is checked again using the current workspace rules, promotion details, and AI result. The self-approval option appears on the new version dialog when a workspace rule covers this situation. That can be a rule that lets you self-approve generally, or one that applies only to resubmissions after a conditional approval. You may therefore see the option here even if you never see it on a first submission. When it appears, Adclear switches it on by default and the dialog says the version may be self-approvable. If the option is absent or greyed out, no rule covers you here. The dialog says so, and the version goes to a reviewer as normal. Common reasons: * your workspace has no rule covering conditionally approved resubmissions, and you are not otherwise a self-approver; * a rule covers other people, products, channels or jurisdictions than this promotion's; or * the conditionally approved status is not enabled for your organisation. Your compliance admin can check the Self Approval settings page. Conditional approval does not guarantee that the next version can be self-approved. If eligibility fails, send the version through normal review. ## Related pages Every status a promotion can be in and who acts next. Uploading a new version after Changes Needed. Sending a Rejected or Changes Needed decision for risk acceptance. Responding to reviewer comments and looping in collaborators. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Choosing the right upload type Source: https://docs.adclear.ai/marketing/choosing-file-type How to decide between Single, Carousel, Variations, and Batch for your specific workflow. ## Overview Picking the right upload type before you start saves time and prevents avoidable review delays. The four types behave very differently. Using the wrong one is one of the most common issues we see. For full definitions, decision criteria, and common mistakes per type, see the canonical reference at [Upload Types](/upload-types). This page focuses on the practical choice from an uploader's perspective. Quick rule of thumb: Single = 1 promotion, 1 approval. Carousel = 1 promotion (one or more frames), 1 approval. Variations = multiple promotions (same core message), individual approvals. Batch = multiple unrelated promotions, individual approvals. ## Quick comparison | Upload Type | What it creates | Review behaviour | Marketing example | | - | - | - | - | | Single | 1 promotion from 1 asset | 1 approval decision | A new homepage hero banner | | Carousel | 1 promotion from one or more frames | 1 approval covers all frames, you cannot approve individually | A LinkedIn carousel where slides only make sense in sequence | | Variations | Multiple linked promotions | Each variation reviewed independently | 10 email subject line variants for an A/B test | | Batch | Multiple unlinked standalone promotions | Each item independent | 20 unrelated affiliate banners uploaded at the start of the month | ## How to decide Use Single. One file, one approval. The most common upload type for individual ads, pages, or standalone assets. Use Carousel. Frames belong together (a multi-slide social post, an image set that tells one story) and a single decision should cover all of them. Once it's a carousel, you cannot approve frames individually. Use Variations. Same product, same campaign, different formats, channels, or markets. Each variation gets its own decision, but they're linked so the reviewer can see the relationship between them. This is the right choice for A/B tests, localisations, and multi-channel rollouts of the same content. Use Batch. Different promotions, different products, different campaigns, but you want to upload them all in one go. Each is reviewed and approved independently with no linkage between items. If your assets are variants of the same promotion, Variations is almost always the right choice over Batch. Batch loses the relationship between linked items, which makes it harder for the reviewer to give you consistent decisions across variants. ## When in doubt If you're stuck between Variations and Batch, ask yourself: if a reviewer rejects one of these, would the same reasoning apply to the others? * Yes = Variations (they're linked enough that decisions should be considered together) * No = Batch (they're truly independent) For the full per-type breakdown including common mistakes, see [Upload Types](/upload-types). ## Related pages The four upload types and when to use each. How to make sure Adclear can assess what you upload. Submitting, tracking decisions, and managing versions. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Claims Source: https://docs.adclear.ai/marketing/claims Create, link, and version substantiated marketing statements that can be used across promotions. ## Overview Claims are substantiated marketing statements that can be linked to promotions. They go through their own review workflow, and once approved, they can be reused across multiple promotions without needing fresh substantiation each time. Only Approved claims can be linked to a promotion. ## Linking a claim to a promotion You can link an approved claim to a promotion in two places: * During promotion creation, in the Linked Claims section of the new promotion form * After creation, from the Info tab on the promotion page ## Creating a claim Fill in the claim name, content, jurisdictions, products, substantiation (files or URLs), disclaimers, and next review date. All fields are required. Click Submit for Review from the Submit Claim page. The claim follows the same review workflow as promotions. ## Claim versions Once a claim is approved, click + on the claim header to create a new version. The previous version remains accessible via the version switcher. Comments are version-specific. ## Related pages Link claims to a promotion before submitting. Every status a promotion can be in and who acts next. How reviewers assess promotions and the claims linked to them. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Comments and collaboration Source: https://docs.adclear.ai/marketing/comments-collaboration Leave inline comments on text, images, video, and PDFs, and work with collaborators on a promotion. Adclear supports comments on every asset type, attached directly to the relevant part of the asset (a passage of text, a region of an image, a moment in a video, a page of a PDF). This page covers the mechanics. For how to respond effectively to Adclear's AI comments and why response quality affects review cycle times, see [Helping Adclear learn](/how-you-help-adclear-learn). ## Adding inline comments Pick the asset type you're commenting on. Highlight any portion of the text on the Submit for review page. A `+` button appears next to the highlighted text. Click it to attach a comment to that passage. The text becomes highlighted and clickable in the right-hand panel. Click Locate in the right panel to jump back to any comment. Click `+` to enter comment mode, then click the area of the image you want to annotate. A marker with your initials appears on the image, and the comment shows in the right panel. Tick the timestamp checkbox on the video timer before sending. The timestamp is attached to the comment and a tooltip appears on the video timeline at that moment. Click `+` to enter comment mode, then click on any page to place a marker. Each comment is labelled with its page number and has a Locate button to scroll directly to it. If you start a comment and navigate away before sending it, it's kept as a draft and restored when you return. ## @mentions Tag colleagues in any comment using the `@` symbol followed by their name. They'll be notified and can respond directly in the thread. To reach the Adclear team, for example about how a comment was made by AI, type `@` and choose **Adclear Support**. Your message goes to our support inbox. See [Helping Adclear learn](/how-you-help-adclear-learn) for guidance on when to use it. Comments and reactions from Adclear team members appear under the name **Adclear Support**. ## Collaborators When a collaborator is added to your promotion, they receive an email notification and will receive review decision updates alongside you. ## If comments are not showing * Refresh the page. Comments load separately from the promotion, so a slow or failed load can leave the panel empty. * If a colleague can see a comment that you cannot on the same version, contact support. ## Related pages How comment quality calibrates the AI agents. The full submission workflow. Upload a new version after comments. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Escalations Source: https://docs.adclear.ai/marketing/escalations Escalate a Rejected or Changes Needed decision for risk acceptance review. ## Overview If you've received a Rejected or Changes Needed decision and you believe the risk should be accepted rather than the content changed, you can escalate the decision for risk acceptance review. Risk acceptance is reviewed by an Uploader user with Risk Accepting permissions (typically a senior member of the marketing or commercial team who has been granted the right to accept risk on behalf of the organisation). This option is only available if risk acceptance is enabled in your workspace. If you don't see the option, it isn't part of your configured workflow. Speak to your workspace admin if you think it should be enabled. ## How to escalate Find the promotion in your tasks (it will be in Rejected or Changes Needed status). Open the Info tab on the promotion page. Trigger the escalation from the Info tab. The promotion status changes to Escalated, then Reviewing Risk once the relevant user picks it up. The Uploader user with Risk Accepting permissions reviews the request and responds via comment. Their response is prefixed with "Risk Acceptance:" so it's easy to identify. ## What happens next The full status flow for risk acceptance is: Rejected or Changes Needed → Escalated → Reviewing Risk → Risk Accepted. If the risk is accepted, the promotion moves to Risk Accepted and is cleared for use under risk acceptance, with a full audit trail attached. ## Escalation versus reviewer escalation The escalation flow above is initiated by the uploader to push a decision up to risk acceptance. This is different from escalations a reviewer might raise to legal or specialist input during their own review. That flow is covered in the Compliance User Guide. ## Related pages Every status a promotion can be in, including Reviewing Risk and Risk Accepted. What each decision means and your next step. Who can review and accept risk escalations. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # FAQs Source: https://docs.adclear.ai/marketing/faqs Answers to the questions uploaders ask most often. ## Uploads and file types Single for one standalone asset. Carousel for one or more frames of the same social media post reviewed together as one. Variations for the same promotion in different formats or jurisdictions (each gets its own review decision). Batch for multiple completely unrelated promotions uploaded at once. If unsure between Variations and Batch: if the assets share the same core message, use Variations. If they're entirely different promotions, use Batch. See [Choosing the right upload type](/marketing/choosing-file-type) and [Upload types](/upload-types). Adclear supports a wide range of file types across images, video, documents, and audio. | Category | Formats | | - | - | | Images | JPG, JPEG, PNG, GIF, WEBP, SVG | | Video | MP4, MOV, AVI, WEBM | | Documents | PDF, DOC, DOCX, PPTX | | Audio | MP3, WAV, OGG, M4A, AAC, FLAC | Uploading an unsupported type shows a validation message explaining which formats are accepted. For live, final pages, use a website link. Adclear captures the screenshot automatically. For pages not yet live, or when you need to record a specific version, use a PDF or image. If the page contains video with disclosure information, include that content separately. It won't be captured from a static upload. Almost always an upload quality issue. The most common causes are blurry or compressed images (Adclear can't read the text clearly), missing disclosures (cropped screenshots or incomplete PDF exports), or multiple promotions merged into one file. See the [Upload quality guide](/marketing/upload-quality-guide) before resubmitting. ## Versions and decisions No. Once uploaded, versions can't be deleted. You can archive the entire promotion using the three-dot menu on the Promotions table, but individual versions can't be removed. On an individual review, an authorised reviewer can correct the latest version's decision. Ask them to open the promotion, go to **Info**, and choose a different decision from the status dropdown. In a multi-level approval flow, the Info status dropdown does not let a reviewer change a decision. Upload a new version that addresses the comments, or escalate for risk acceptance review if you believe the risk should be accepted. See [Escalations](/marketing/escalations). Evergreen promotions require periodic re-review. When a reviewer approves one, they must set a next review date. The promotion returns to review when that date arrives. You can view the evergreen toggle and next review date but can't edit the date yourself. Claims that reach their next review date should automatically return to Pending status. If this doesn't happen, contact support. ## Reviewers and assignment Yes. Use the Reviewer field during promotion creation. The reviewer you assign will see the promotion in their tasks. Other reviewers with permission for the same market can also pick it up. Yes. Anyone with reviewer permissions for the relevant market can pick up a promotion, even if it was assigned to a specific colleague. Assigning a reviewer surfaces the promotion in their tasks but doesn't lock it. ## Related pages The full submission workflow. What each decision means and your next step. How your responses calibrate the AI agents. The reviewer-side workflow. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Adclear plugin for Figma Source: https://docs.adclear.ai/marketing/figma-plugin Send Figma frames, carousels, batches, and customer journey flows to Adclear with the official plugin. Use the official Adclear plugin for Figma to select designs in Figma and send them to Adclear. Complete the promotion details and compliance review in Adclear. **Use the official plugin for Figma imports.** We no longer recommend the integrated Figma link import in the Adclear platform. That integration will be removed soon. The official plugin is the recommended way to send Figma designs to Adclear. ## Open the plugin and sign in Open your design file and run **Adclear** from Figma's plugin menu. Find the official plugin in Figma Community. Select **Sign in** to open Adclear authentication in your browser. Return to Figma after signing in. Select your organisation and workspace. The plugin lists the destinations available to your Adclear account; use search if you have several. Select frames or sections in Figma to add them to the plugin. The list shows thumbnails, names, and dimensions. ## Choose a promotion type | Type | What you send | Result in Adclear | | - | - | - | | **Single** | One selected frame | One promotion | | **Carousel** | At least two promotional frames, selected in order | One promotion with ordered carousel items | | **Batch** | At least two promotional frames | A separate promotion for each promotional frame | | **Variations** | Named flows connecting selected frames | Two or more saved flows create separate, linked promotions with independent approval decisions. One saved flow creates one promotion. | Choose **Promotion type** before importing. Single, Carousel, and Batch import from the frame-selection screen. Variations uses **Continue** to open the flow builder. ## Select frames and context Click frames or sections in the Figma canvas to add them to the list. Check the frames you want to send, remove an unwanted item, or use **Select all**, **Deselect all**, and **Clear** for multiple selections. For Carousel, select frames in the order you want to review them. Numbered markers show the order of all selected frames, including Context frames. Only FP frames become carousel items, so their item numbers can differ from the markers. For modes with frame tags, mark designs as **FP** (Finished Product) or **Context**. FP frames are the promotional content. Context frames provide supporting information alongside the imported promotion. For a Single promotion, select exactly one frame. Carousel and Batch require at least two FP frames; context frames do not count towards that minimum. ## Build customer journey flows Use **Variations** to show how a customer moves through several designs, such as an advert, landing page, and follow-up screen. Select the frames you need and click **Continue**. The **Flow Canvas** displays them as cards. Click one frame, then another to connect them. Create the paths you want reviewers to follow. Click **Save Flow** and give it a name. Save additional flows for other paths through the designs. Save any unfinished connections, then click **Import to Adclear**. With two or more saved flows, each flow becomes a separate promotion in a linked group. Each promotion has its own approval decision. One saved flow creates a single promotion. ## Manage the flow canvas Move frame cards around the canvas. Pan and zoom to work with larger journeys, or use **Expand canvas** for more space. Resize the plugin window with its corner handle. Select a flow in **Saved Flows** to highlight its path. Open its action menu and choose **Modify flow** to change connections. Use **Update Flow** to save your edits or **Cancel Edit** to discard them. Use a saved flow's menu to **Rename**, **Clone**, or **Delete** it. Cloning gives you a starting point for another journey. Use a frame's context menu to duplicate or remove a frame card. Set its FP or Context tag in the frame-selection list or on the canvas card. Select a connection to reveal **Delete connection**, then remove it. Save the updated flow when you finish editing. ## Finish the import in Adclear The plugin shows export and upload progress. After a successful import, the promotion page opens in your browser so you can complete the required details. If the page does not open, use **Open promotion page**. You can choose **Return to Figma** to close the plugin or **Import another** to start another import. Sending designs from the plugin prepares the upload in Adclear. Finish creating the promotion and submit it for review in the platform. ## Troubleshooting The plugin lists fonts that it cannot load. Cancel and make those fonts available before importing, or choose **Continue anyway** to use replacements. Check the imported design because text may look different. Select frames or sections in the open Figma file. Check the plugin's frame list and select the items you want to import. Check the requirements for your promotion type. For Variations, save at least one flow and save or clear unfinished connections before importing. Check that you signed in with the correct Adclear account. Ask your workspace admin to confirm your access, then sign in again. # Importing from Figma Source: https://docs.adclear.ai/marketing/importing-from-figma Use the official Adclear plugin for Figma instead of the platform's integrated Figma link import. Send Figma designs to Adclear with the official plugin. You can import a single frame, a carousel, a batch, or customer journey flows. **The integrated Figma import is being retired.** We no longer recommend pasting Figma links into the Adclear platform to import designs. That integration will be removed soon. Use the official Adclear plugin for Figma instead. ## Use the official plugin Run the official Adclear plugin in your Figma file. Sign in with your Adclear account and choose where to send your designs. Choose the frames, promotion type, and any customer journey flows. Import them and finish creating the promotion in Adclear. See [Adclear plugin for Figma](/marketing/figma-plugin) for all promotion types, context frames, flow editing, and troubleshooting. ## Existing platform imports The integrated Figma link importer remains available for now, including when you add a new promotion version. You can still connect Figma, paste a file link, and choose a frame, but use the plugin for future imports. This notice concerns the platform's Figma link importer. The official Adclear plugin is the recommended replacement. # Importing from Frame.io Source: https://docs.adclear.ai/marketing/importing-from-frameio Import videos by Frame.io link or send them directly with the Send to Adclear custom action. ## Overview Bring a video into Adclear by pasting a Frame.io link, or send it directly from Frame.io with **Send to Adclear**. Both methods copy the video into Adclear for review. Connect your own Frame.io account from the promotion upload page, then paste a share or file link. Finish creating and submitting the promotion in Adclear. Use the **Send to Adclear** custom action in Frame.io's asset menu. A workspace admin configures brand presets and invites external users to connect. The custom action is available where enabled for your workspace. If you do not see **Settings → Integrations → Frame.io**, ask your workspace admin or Adclear contact. Sign in to Frame.io a single time per account. Adclear remembers the connection until it expires. Use a Frame.io share link (`f.io/…`) or a file link from Frame.io (`app.frame.io/…`). The video downloads into Adclear in the background while you fill in the promotion details. The imported video becomes the asset on a single promotion, reviewed like any other video. ## Connect your Frame.io account Go to **Promotions**, click **+ Add New**, and select the **Single** upload type. Below the upload zone, select **Frame.io**. Click **Connect Frame.io account**. A window opens to sign in with Adobe (Frame.io uses Adobe sign-in). Approve access. The window closes and the panel shows **Connected as [your-email@example.com](mailto:your-email@example.com)**. You only do this once per account. The connection can expire after a period of inactivity. When it does, the panel shows **Reconnect your Frame.io account**. Click **Reconnect Frame.io** and sign in again. If the panel shows **This Adobe account has no Frame.io access**, reconnecting will not help. Adobe signed you in, but Frame.io does not accept the account behind that sign-in. This usually means you signed in with an Adobe profile that does not own your Frame.io account, or your Frame.io account is still on the older version of Frame.io. Connect again and choose the Adobe profile that owns your Frame.io account, or contact support. If nothing happens when you click Connect, your browser may have blocked the sign-in window. Allow pop-ups for Adclear and try again. ## Import a video In the **Frame.io link** field, paste a share link (`https://f.io/…`) or a file link from Frame.io (`https://app.frame.io/…`). Adclear checks the link, shows a thumbnail of the video, and starts pulling it in. A progress bar shows the download. Large files take longer. You can keep filling in the promotion details while it runs. Once the import completes, finish the promotion fields and click **Create Promotion**, then **Submit for Review** when ready. ## Supported videos | Requirement | Supported | | - | - | | Formats | MP4, MOV | | Maximum size | 2 GB | The link must point to a video your connected Frame.io account can access. Make sure the file is shared with the account you signed in with. ## Set up Send to Adclear A workspace admin sets up the custom action. External users can send from Frame.io without an Adclear account. In Adclear, open **Settings → Integrations → Frame.io** for the workspace that should receive promotions. Under **Brand presets**, enter a name and review deadline. Set whether submissions are financial or paid promotions. You can lock the channel, product, and jurisdiction to preset values. Leave a field unlocked to let the sender choose it for each submission. Create at least one preset. Copy the **Invite link** under **Invite an external user** and share it with the person sending from Frame.io. The sender opens the invite, signs in with the Adobe profile that owns their Frame.io account, and approves access. Adclear creates and registers **Send to Adclear** automatically in their accessible Frame.io workspaces. The invite flow sets up the action without copying webhook URLs or signing secrets. Manual registration is available in the settings page for an existing custom action. ## Send a video from Frame.io Open the video in Frame.io and choose **Send to Adclear** from its asset menu. If several brand presets are available, select the destination brand and continue. A single preset takes you straight to its details. Choose any unlocked channel, product, and jurisdiction fields. Enter a **Promotion title** and an optional caption, then click **Submit**. Adclear imports the asset in the background, creates a draft promotion in the destination workspace, and starts AI evaluation. Continue the review workflow in Adclear. The custom action creates a draft and starts evaluation. It does not approve the promotion or submit it for compliance review automatically. Workspace admins can manage registrations under **Connected users**. Disconnecting a sender revokes their connection; they must authorize again before sending more files. ## While the import runs The video downloads from Frame.io into Adclear in the background, so a large file does not block the page. A thumbnail and a progress bar appear while it works. A playable preview of the video becomes available once the promotion is created. ## Troubleshooting Open a fresh invite from the receiving workspace and authorize the correct Frame.io account. The action is installed in the Frame.io workspaces that account can access. Ask the receiving workspace admin to create at least one brand preset, then trigger **Send to Adclear** again. Ask the workspace admin for a fresh invite link from **Settings → Integrations → Frame.io**. Confirm the link is correct and that the file is shared with the Frame.io account you connected with. If you have access to the file through a different Frame.io account, sign in with that account instead. Frame.io needs to finish processing a file before it can be downloaded. Wait until it is ready in Frame.io, then import again. Only MP4 and MOV files up to 2 GB are supported. Export a supported format from Frame.io, or trim the file below the size limit. If the panel shows **Reconnect your Frame.io account**, your session has expired. Click **Reconnect Frame.io** and sign in again. Frame.io does not accept the account behind your Adobe sign-in, so reconnecting fails the same way every time. This usually means you signed in with an Adobe profile that does not own your Frame.io account, or your Frame.io account is still on the older version of Frame.io. Connect again and choose the Adobe profile that owns your Frame.io account. If you are not sure which profile to use, contact support. ## Related pages Create a promotion, fill in the required fields, and submit it. The four upload types and when to use each. How to make sure Adclear can assess what you upload. Why response quality matters and how it shortens review cycles. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Importing from Google Docs Source: https://docs.adclear.ai/marketing/importing-from-google-docs Import Google Docs as PDFs, choose document tabs, and bring source edits into Adclear as new versions. Paste a Google Docs link to import your document as a PDF promotion. You can choose individual document tabs or combine several tabs for review. Google Docs uses the same connection and availability rules as [Google Drive](/marketing/importing-from-google-drive). Public **anyone with the link** documents need no Google sign-in. Private and shared documents require account connection where it is available. ## Import a document Open **Promotions** and start a new promotion that accepts PDF documents. Select **Google Drive** and paste the Google Docs share link. If your upload interface detects sources automatically, you can paste directly into its main field instead. Click **Import**. If the document has tabs, choose which tabs to import. Adclear converts the selected content to PDF. Complete the promotion details and click **Create Promotion**. Select **Submit for Review** when ready. If account connection is unavailable, do not make a private document public unless your organisation permits it. Download a PDF and upload it instead. ## Choose document tabs For a document with multiple tabs, Adclear shows tab cards with previews. Select the content you want to review. Select one tab and click **Import this tab**. The selected tab becomes one promotion. Select two or more tabs and click **Import as single**. Adclear combines the selected tabs into one PDF promotion. Select two or more tabs and choose the button labelled **Import as** followed by the number of **variants**. Each tab becomes a separate promotion in a linked group, with its own approval decision. Use **Select all** to select every tab. When Adclear lists multiple tabs, the first tab is selected initially. Check the selected tab before importing, even if your share link points to another tab. ## Bring later edits into Adclear Edit the document in Google Docs, then open the imported promotion and use its source pill. Choose **Check Google Docs for updates** and confirm the new version when changes are found. Adclear copies the current content into a new version, carries over the promotion settings, and runs evaluation again. An unchanged source does not create a version. Adclear does not write comments or review changes back to Google Docs. Your imported PDF is a copy of the document at import time. If the source pill shows **Needs your account**, confirm the document using your own Google account. See [Google Drive source updates](/marketing/importing-from-google-drive#updating-a-promotion-from-google-drive) for sync states and access requirements. # Importing from Google Drive Source: https://docs.adclear.ai/marketing/importing-from-google-drive Import Google Drive files by link or file picker, and bring later edits into Adclear as new versions. Import a file from Google Drive without downloading it first. Adclear copies the content into your promotion and keeps the source link. Google imports depend on availability for your workspace. Public **anyone with the link** files can be imported without Google sign-in when Adclear's server API key is configured. Public Google Docs can export without that key. Account connection and the file picker are being rolled out separately, pending Google's review of Drive access. For document tabs and Google Docs links, see [Importing from Google Docs](/marketing/importing-from-google-docs). ## Import a file Open **Promotions** and start a new promotion. Choose a promotion type that accepts your file. Select **Google Drive** and paste the share link. If your upload interface detects sources automatically, you can paste directly into its main field instead. The form with separate content-type options requires **Google Drive**; its general link field does not import Drive files. If you have connected Google and the file picker is available, use **Browse** to choose a file from Drive. Click **Import**. Public files do not need Google sign-in when public-file import is configured. Private files and files shared with you require your connected account. If Google asks you to confirm a file, select it in the Google window. You need access to that file in Google Drive. Wait for the import, complete the promotion details, and click **Create Promotion**. Select **Submit for Review** when ready. If account connection is unavailable, use a public link only if your organisation permits public sharing. Otherwise, download the file and upload it to Adclear. ## Connect your Google account Where account connection is enabled, connect from the Google Drive import panel or **Settings → Integrations → Google**. Approve access and choose the files you want to use. The connection belongs to you. A colleague's connection does not give your Google account access to their files. You can disconnect or reconnect from Settings; previously imported copies remain on their promotions. Adclear reads the files you choose and copies their content into promotions. It does not edit your source files or write review changes back to Google Drive. ## Supported file types | Type | Formats | Maximum size | | - | - | - | | Images | JPG, JPEG, PNG, GIF, WEBP | 30 MB | | Video | MP4, MOV | 2 GB | | Audio | MP3, WAV, M4A, AAC, FLAC | 2 GB | | Documents | PDF, plain text | 30 MB (PDF), 10 MB (text) | | Google Docs, Sheets, Slides | Converted to PDF | Export size is not checked before import | | Google Drawings | Converted to PNG | 30 MB | Microsoft Office files and archives are not supported by the Drive importer. Export to a supported format first. ## Updating a promotion from Google Drive Edit the source in Google Drive, then bring the latest content into Adclear as a new version. Adclear does not replace an existing version. The source pill in the promotion header shows the sync state. **In sync** means the source has not changed; **Update available** means Google has a newer version. Open the pill to view the source, last editor, and last check, or to open the original file. Choose **Check Google Drive for updates**. If changes are found, confirm the import. If the source is unchanged, Adclear does not create a version. Adclear imports the current content, carries over the promotion settings, and runs evaluation again. You are taken to the new version when it is ready. If the pill shows **Needs your account**, use **Confirm file in Google Drive** to confirm the source with your own Google account. The file must be shared with you. Files without a recorded source revision can show a neutral sync state. Adclear asks you to confirm the import because it cannot tell whether the source changed. Adclear imports current content, not an older Google revision. ## Troubleshooting Check the link and your access to the source. If Google connection is unavailable, use an authorised public link or upload a downloaded copy. Public Drive files such as PDFs and images need Adclear's server API key (`GOOGLE_API_KEY`) when you import without a connected account. If that key is missing, even an **anyone with the link** file can be reported as private. Ask your Adclear administrator or support to check the configuration. Public Google Docs exports do not require this key. Confirm the file in the Google picker so Adclear can read it. You may need to confirm it once even if a colleague already imported it. Check the table above. Export unsupported files to PDF, an image, or another supported format before importing. Use the source pill to check for updates and confirm a new version. Changes in Google do not replace promotion versions automatically. # Overview Source: https://docs.adclear.ai/marketing/overview Everything you need to upload, manage, and track your promotional content in Adclear. ## What this guide covers As an uploader, your role is to create and submit promotional content for review. This section follows the full journey, from getting oriented with the Promotion Dashboard, through choosing the right upload type and preparing your files, to submitting, tracking, and managing your promotions. New to Adclear? See [Getting started](/overview) to set up your account before continuing. ## How this section is organised This guide is split into focused pages so you can jump straight to what you need. Your home screen. Filtering, saved views, columns, and exporting. Picking the right upload type and preparing files Adclear can assess properly. Submitting, tracking decisions, managing versions, and collaborating on comments. Creating, linking, and versioning substantiated marketing statements. Escalating a Rejected or Changes Needed decision for risk acceptance review. Answers to the questions uploaders ask most often. Marketing Admins can also see and edit the rules Adclear applies during review. See [Rules](/compliance/rules) in the Compliance Guide. ## Two pages worth reading first These two are referenced repeatedly throughout this guide, and reading them up front will save time later. The four upload types and when to use each. Picking the wrong one is the most common reason promotions get delayed. Why your responses to AI comments matter, and how the way you respond affects review cycle times. ## Related pages How reviewers assess promotions and apply decisions. Permissions and role definitions across uploaders and reviewers. Every status a promotion can be in and who acts next. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Previewing promotions Source: https://docs.adclear.ai/marketing/previewing-promotions Zoom, pan, fit, search, and navigate images, PDFs, and videos in the promotion preview, and place comments from the control bar. Every promotion opens in a preview that shares one control bar across asset types, so zooming, fitting, and commenting work the same way whether you're looking at an image, a PDF, or a video. ## The control bar The control bar floats at the bottom-centre of the preview. It stays out of the way on a narrow window — the lower-priority controls collapse and the rest scroll — so the core zoom controls are always reachable. | Control | What it does | | - | - | | **Zoom out / Zoom in** | Step the zoom down or up. | | **Zoom level** | Shows the current zoom as a percentage. Click it for a menu with **Fit width**, **Fit to page** (PDFs), and preset levels (50%, 100%, 150%, 200%, 400%). The active level is ticked. | | **Fit to width** | Scales the asset so it fills the width of the viewport. | | **Fit to page** | (PDFs) Fits a whole page in view. | | **Reset view** | Returns to the default zoom and recentres. | ## Zooming and panning Beyond the buttons, the preview responds to trackpad and mouse gestures: * **Two-finger scroll** pans around the asset. * **Pinch**, or **hold `Ctrl`/`⌘` while scrolling**, zooms in and out towards the pointer. Images and PDF pages zoom up to 800%. SVGs are vector, so they zoom much further without going blurry. ## Navigating a PDF PDFs add a sidebar (toggle it from the leftmost button on the control bar) with everything specific to multi-page documents: * **Page controls** — type a page number to jump to it, or step through with the up/down buttons. * **Find in document** — search the full text of the PDF. The field shows the current match position and total (e.g. `2/7`); press `Enter` for the next match, `Shift`+`Enter` for the previous, and `Esc` to clear. Matches are highlighted on the page. * **Pages** — a thumbnail of every page; click one to jump to it. * **Outline** — the document's bookmarks, when it has them. ## Commenting from the preview The **Add comment** button lives on the control bar. Click it to enter comment mode, then click the asset to place your marker. You can also **show or hide** existing comments from the bar; the button carries a badge with the comment count. For the full commenting workflow, see [Comments and collaboration](/marketing/comments-collaboration). ## Downloading When downloads are available for a promotion, the **Download** action also sits on the control bar. # Promotion dashboard Source: https://docs.adclear.ai/marketing/promotion-dashboard Your home screen for tracking every promotion you've uploaded, with filtering, saved views, and exporting. ## Overview The Promotion Dashboard is your home screen. Every promotion you've uploaded is listed here, along with its current status, assigned reviewer, and deadline. ## Columns at a glance | Column | What it shows | | - | - | | Name | The title you gave the promotion | | Jurisdiction | The market the promotion applies to | | Status | Where the promotion is in the review workflow | | Reviewer | The reviewer assigned to it | | Deadline | The date you've requested a decision by | | Tags | Labels for grouping or internal notes | | Last Upload | When the promotion was last submitted | You can resize, reorder, sort, and hide columns to suit your workflow. ## Promotion statuses For a full breakdown of every status and what it means, including who acts next at each stage, see [Promotion Statuses](/promotion-statuses). ## Filtering and saved views Click Add Filter and choose your criteria: status, jurisdiction, product, channel, uploader, reviewer, date, or tags. Multiple filters combine with AND logic. Once filters are applied, click Save, name the view, and confirm. It appears as a tab for instant access. Use the more options menu on any view tab to rename, edit filters, or delete it. Click Clear to remove active filters without deleting the view. Saved views are shared across your organisation. When you save a view, everyone in your organisation sees it as a tab on their Promotion Dashboard. Use clear, descriptive names so colleagues can tell at a glance what the view is for. The Uploader and Reviewer filters also let you select a team. Choosing a team shows every promotion uploaded or reviewed by any of that team's current members. See [Teams](/settings#teams) for how teams are created and managed. Every filter list has **Select all** and **Clear** buttons at the bottom. Select all ticks every option currently shown, so you can type to narrow the list first, or select everything and untick the few you want to leave out. The Tags filter also offers **No tag**, which matches promotions that carry no tag at all. Saved views persist after page refresh. A "Last 7 Days" view is available by default. ## Exporting Click Export to download all promotion data as an Excel file. In addition to the standard columns, the export includes two fields not visible in the UI: Status History (a full log of every status change with timestamps) and Number of Versions. The export contains the following columns: * Name * Jurisdiction * Product * Channel * Targeting * Promotion Type * Uploader * Reviewer * Deadline * Current Status * Status History (export only) * Date Created * Date Submitted * Date Approved * Tags * Evergreen * Number of Versions (export only) * Readability Score * Adclear URL ## Related pages Picking the right upload type and preparing files Adclear can assess properly. Submitting, tracking decisions, and managing versions. Every status a promotion can be in and who acts next. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Renaming promotions Source: https://docs.adclear.ai/marketing/renaming-promotions How to rename a promotion from the promotion viewer header. You can rename any promotion directly from its header, as long as it is not archived. ## How to rename Navigate to the promotion you want to rename. In the promotion header, click the pencil icon next to the current name. The name becomes an editable text field. Enter the new name. It must be at least 3 characters. Press **Enter** or click the checkmark to save. Press **Escape** or click the X to cancel without saving. Archived promotions cannot be renamed. The pencil icon does not appear for archived content. ## Validation * The name must be at least 3 characters after trimming whitespace. * If validation fails, an error toast appears explaining the issue. * If the name is unchanged, no save occurs and the field closes automatically. # Submitting for review Source: https://docs.adclear.ai/marketing/submitting-for-review Create a promotion, fill in the required fields, and submit it for review. ## Overview Once you've decided on your upload type and prepared your files, you create the promotion in Adclear, fill in the required details, and submit it for review. Before clicking Submit, read [Helping Adclear learn](/how-you-help-adclear-learn). The way you respond to Adclear's automatic comments before submission directly affects how quickly your promotion gets through review. ## Creating a promotion Go to the Promotions page and click + Add New. The New Promotion page has the four upload types covered in Upload Types. ### Required fields (all types) Every promotion needs: * Promotion name * Product * Jurisdiction * Channel * Deadline ### Optional fields | Field | Purpose | | - | - | | Caption | The text published with the asset. Click Add caption to include one; it is evaluated as part of the promotion | | Additional details | Notes for the reviewer, shown at the top of their Comments tab. Not published with the asset | | Paid promotion | Toggle to indicate paid content | | Evergreen | Toggle for promotions requiring periodic re-review. Adclear can set Evergreen to start on for app uploads. You can turn it off for each promotion. API, Frame.io, and external submissions still start off | | Assigned reviewer | Assign a specific reviewer. Anyone with the right permissions for the relevant market can still pick the promotion up | | Reviewer preset | Choose a multi-level approval preset. If your admin has mapped the jurisdiction to a preset, this is selected automatically and locked | If your organisation has jurisdiction autoapply enabled and your admin has mapped the selected jurisdiction to a reviewer preset, the preset selector is locked and shows a "Required by" label. You cannot change it. See [Jurisdiction autoapply](/multi-level-approval#jurisdiction-autoapply) for more detail. ## Single upload Drag and drop a file, paste a link or text, or choose a source below the upload zone. Supported sources include Google Drive, Google Docs, Figma, and Frame.io where enabled. Add the promotion name, product, jurisdiction, channel, and deadline. Click Create Promotion. Adclear's AI generates compliance suggestions automatically. Click Submit for Review when ready. ### Upload method options Drag and drop or browse to upload a file. Supported file types are listed below. Paste or type promotional copy directly. A minimum of 50 characters is required for AI evaluation. Paste a URL and click Capture Screenshot to load the live page as your asset. The captured screenshot is what the reviewer sees, so it acts as a snapshot of the page at the moment of capture. We no longer recommend the integrated Figma link import in the Adclear platform. It will be removed soon. Use the official Adclear plugin for Figma instead. The plugin sends single frames, carousels, batches, and customer journey flows to Adclear. See [Adclear plugin for Figma](/marketing/figma-plugin) for the full guide. The platform's link importer remains available for now. Paste a Google share link to import a file, or use the file picker where Google account connection is enabled. Google Docs are converted to PDF, with options for selecting document tabs. See [Importing from Google Drive](/marketing/importing-from-google-drive) and [Importing from Google Docs](/marketing/importing-from-google-docs). Connect your Frame.io account and paste a video link (MP4 or MOV, up to 2 GB). You can also send files directly from Frame.io using the **Send to Adclear** custom action where enabled. See [Importing from Frame.io](/marketing/importing-from-frameio). ## AI evaluation progress After you create a promotion, Adclear AI starts checking the content and shows its progress in the promotion viewer. The activity panel may show Evaluating, Syncing, Complete, or Failed while Adclear reads the asset, checks rules, and prepares comments. When evaluation finishes, the panel summarizes the result. It can show comments that need review, no modifications required, or that no rule checks are needed because the asset is not a financial promotion. If the evaluation fails, use Retry to run the check again. If Adclear classifies the asset as not a financial promotion but you still need a compliance review, use Mark as Financial Promotion to continue with review. ### Supported file types | Category | Formats | | - | - | | Images | JPG, JPEG, PNG, GIF, WEBP, SVG | | Video | MP4, MOV, AVI, WEBM | | Documents | PDF, DOC, DOCX, PPTX | | Audio | MP3, WAV, OGG, M4A, AAC, FLAC | ## Batch upload Batch creates multiple standalone promotions at once. Each is reviewed and approved independently. Each file appears as a separate promotion block. Complete the details for one promotion, then click Apply to all to copy shared settings across all blocks. Click Create Promotion. All promotions are created in Draft status. If one file in the batch is invalid, the valid files still upload and a validation message appears under the invalid block only. ## Carousel Creates a single promotion from one or more frames, reviewed and approved as one. Each file becomes a frame in the carousel. Add the promotion name, product, jurisdiction, channel, and deadline. Click Create Promotion, then Submit for Review. One approval decision covers all frames. All frames in a carousel are reviewed as a single unit. You cannot approve frames individually. If you need independent approval per asset, use Variations instead. ## Variations Creates linked but independently reviewable promotions for the same core message in different formats. Each file becomes a separate variation. At least 2 files are required. Set the promotion name, product, channel, deadline, and any evergreen or paid toggles. These apply across all variations. If Evergreen starts on for your organisation, you can turn it off for the whole group. For each variation, set its jurisdiction and optionally add a caption, additional details, reviewer, collaborators, and linked claims. Click Create Promotion. All variations appear as a collapsible group in Draft status, tagged with a Var- prefix. Apply to all on the Variations tab only propagates the jurisdiction field. All other shared settings (name, product, channel, deadline) are set once at the top and apply automatically. ## Submitting From the promotion's Submit for Review page, click Submit for Review. The promotion moves to Pending Review and appears on the relevant reviewer's tasks. If you're submitting a variation group, a modal will ask whether to submit this promotion only or all remaining promotions. Submitting all moves every variation to Pending Review simultaneously. ## Related pages The four upload types and when to use each. Decision tree for picking Single, Carousel, Variations, or Batch. How to make sure Adclear can assess what you upload. What each decision means and your next step. Why response quality matters and how it shortens review cycles. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Supporting the review cycle Source: https://docs.adclear.ai/marketing/supporting-review-cycle Submit your promotion, track the decision, manage versions, and collaborate on comments. ## What this section covers Once you've prepared your upload, the review cycle begins. This section covers everything that happens from the moment you click Submit for Review through to the final decision and any follow-up actions. The four pages below break the cycle into focused stages. Read them in order if it's your first time, or jump straight to the stage you need. The submission flow itself, including what to do before you click Submit. What each review decision means and what your next step is. Uploading new versions and managing version history. How to comment on text, images, video, and PDFs, and how collaboration works. ## A note on response quality How you respond to comments has a direct effect on how quickly your promotion gets through review, and on how well Adclear's agents learn from your team's decisions over time. Before submitting, read [Helping Adclear learn](/how-you-help-adclear-learn). ## Related pages Filtering, saved views, columns, and exporting. Picking the right upload type and preparing files Adclear can assess properly. Every status a promotion can be in and who acts next. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Upload quality guide Source: https://docs.adclear.ai/marketing/upload-quality-guide Make sure Adclear can clearly assess what you upload, and avoid the most common causes of inaccurate flags. ## Why upload quality matters Adclear can only assess what it can clearly see. Poor-quality or incomplete uploads cause the AI to misread text, miss disclosures, or flag issues inaccurately - leading to delays and rework that could have been avoided. This guide is primarily for uploaders preparing files to submit, but it's also referenced by reviewers when assessing whether an upload is fit for review. If you're a reviewer, see the [Compliance User Guide](/compliance/overview) for guidance on what to do when an upload is too low quality to assess fairly. Every issue in this guide has been reported by real users. Taking two minutes to check your file before uploading saves significant back-and-forth with your compliance team. ## Image quality and resolution Compressed or blurry images cause Adclear to misread text, misinterpret brand names, and produce inaccurate flags. Why this happens: Screenshots pasted into Word or PowerPoint, images exported from compressed sources, and low-resolution mobile captures all reduce the text clarity Adclear needs. Upload original files - screenshots taken at full resolution, PDFs exported directly from your design tool, or final creative exports. Zoom in before capturing to confirm text is sharp. Pasting screenshots into Word or PowerPoint then re-exporting. Uploading blurry, compressed, or mobile-captured images. Including unnecessary cover pages, headers, or stock imagery. ## Missing context and information Adclear reviews only what is uploaded. If disclaimers, footnotes, or risk warnings aren't visible in the file, they will be flagged as missing - even if they appear on the live page. Drafts and works-in-progress are fine to submit. What matters is that the upload is complete - meaning all relevant context, disclaimers, and qualifying information are present in what you upload, regardless of whether the asset is in a draft state. Ensure all disclosures, footnotes, and qualifying text are visible in the file. If expandable or tooltip content can't be captured inline, include it as a separate page. Assuming Adclear will infer missing tooltip or pop-up content. Uploading an asset where key disclaimers or risk warnings have been left out of the file entirely. ## Multiple promotions in one file Combining unrelated promotions into a single PDF creates cross-referencing errors - Adclear may attribute risk from one promotion to another. Upload each financial promotion as a separate file. Use Adclear's Batch Upload feature to handle multiple unrelated items efficiently. See [Upload types](/upload-types) for guidance on which type to use. Combining unrelated promotions into one PDF. Manually merging multiple promotions before uploading. Uploading multiple variants without clear identification per file. ## Cropped screens missing context Tightly cropped images can remove the qualifying language, risk warnings, or surrounding content that compliance needs to assess your promotion accurately. Include the full page where context matters. Ensure risk warnings appear alongside claims in the same file. Capture complete sections of webpages - not just banners. Cropping tightly around headline claims only. Removing surrounding qualifying language. Uploading partial screenshots without the full context of the page. ## Website link vs. file upload A common question: is it better to submit a website link or a PDF screenshot? The page is live. Adclear captures a screenshot of the webpage automatically, showing it exactly as it appears to a visitor - including any dynamically loaded content. The page isn't live yet, or you need to record a specific version. Remember that video content won't be captured from a static upload - include disclosure information from videos as a separate page. ## Pre-upload checklist Run through this before every submission. Check that all relevant context, disclaimers, and risk warnings are included in the file. Drafts and works-in-progress are fine - what matters is that nothing required for a fair assessment has been left out. Check that footnotes, qualifying text, and risk warnings are all included in the upload - not hidden in tooltips or pop-ups that won't be captured. Zoom in on any text-heavy areas. If you can't read it clearly at full size, Adclear can't either. If you have multiple unrelated promotions, use the right [upload type](/upload-types) - not a single combined file. Strip out cover pages, internal notes, or stock imagery that isn't part of the promotion being reviewed. ## For reviewers: Signs of a poor upload If you're reviewing a promotion and suspect a flag was caused by a poor upload rather than a genuine compliance issue, request changes and ask the uploader to resubmit a higher-quality or more complete version. * Sharp, high-resolution image or PDF * All disclosures, footnotes, and risk warnings visible in the file * One promotion per file - no merged PDFs * Full page context, not just a cropped banner * Complete version - all required information present, regardless of draft state * Blurry or pixelated text - Adclear may misread content * Missing disclaimers or risk warnings that should be present * Multiple unrelated promotions merged into one file * Tightly cropped image that removes surrounding qualifying language * Key information absent from the file, regardless of whether it's a draft or final version ### Common upload issues and what they cause | Upload issue | What it leads to | | - | - | | Blurry or compressed image | Adclear misreads text, misidentifies brand names, produces inaccurate flags | | Missing disclaimers or risk warnings | Flags raised for content that may be present on the live page but wasn't captured | | Multiple promotions in one file | Risk from one promotion may be attributed to another | | Tightly cropped screenshot | Qualifying language or context removed - promotion appears non-compliant when it isn't | | Required information missing from upload | Flags raised against incomplete content; the upload does not give Adclear enough to assess fairly | You are not required to make a final decision on an upload that is clearly incomplete. Requesting changes for upload quality reasons is a valid review action. ## Related pages Uploading, submitting, and resubmitting promotions end-to-end. How reviewers assess promotions and what they look for. The four upload types and when to use each. # Uploading guidance Source: https://docs.adclear.ai/marketing/uploading-guidance Pick the right upload type and prepare your files so Adclear can assess them properly the first time. ## What this section covers How you upload a promotion has a direct effect on how quickly it gets through review. Two decisions, made before you click submit, drive most of the review delays we see. The first is choosing the right upload type, picking Single, Carousel, Variations, or Batch based on what you're actually uploading and how you need it reviewed. The wrong choice can mean a single approval covering content that needed individual decisions, or four separate review cycles for content that should have been one. The second is upload quality. Adclear can only assess what it can clearly see. Blurry images, cropped screenshots, multiple promotions merged into one file, or a draft with the disclaimers missing all force the reviewer to ask questions or assess content that does not match what will actually go live. The two pages below cover both decisions in detail. Read them before your first submission, and refer back when you're unsure. Decide between Single, Carousel, Variations, and Batch for your specific workflow. Make sure Adclear and your reviewer can assess what you're submitting. ## Related pages The four upload types and when to use each. Filtering, saved views, columns, and exporting. Submitting, tracking decisions, and managing versions. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Versions Source: https://docs.adclear.ai/marketing/versions Upload new versions of a promotion, and understand version history. ## Overview If a promotion needs updating after submission, upload a new version rather than creating a new promotion from scratch. This keeps the full history (original asset, comments, decisions) attached to the promotion. ## Uploading a new version Find the promotion in your dashboard and open it. Upload the updated file and submit. The version indicator updates (for example, V2 with a "Latest" label). Earlier versions remain accessible through the version switcher on the promotion page but cannot be modified. ## When to upload a new version You'll typically upload a new version after receiving: * Rejected: address the reviewer's comments and submit a corrected version * Changes Needed: make the requested amendments and resubmit * A change to the underlying asset that needs review (for example, an updated landing page or a revised copy block) ## Jurisdiction preset changes between versions If your organisation has jurisdiction autoapply enabled and your admin changed which preset is linked to the jurisdiction since the previous version, the new version uses the updated preset. The review chain from the previous version is not carried over. If the linked preset was deleted or deactivated, you pick a preset freely. See [Jurisdiction autoapply](/multi-level-approval#jurisdiction-autoapply) for more detail. ## Limitations You cannot delete a version once uploaded. If you uploaded the wrong file by mistake, you can archive the entire promotion using the three-dot menu on the Promotions table, but the individual version itself stays in the history. ## Related pages The full submission workflow. What each decision means and your next step. Responding to reviewer comments and looping in collaborators. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Connect Adclear to your AI assistant Source: https://docs.adclear.ai/mcp/connect Use Adclear from Claude, ChatGPT or Cursor to find promotions, read feedback and upload new promotions. MCP (Model Context Protocol) is the standard that AI assistants use to connect to other apps. When you connect Adclear, your assistant can find promotions, read feedback from Adclear AI and reviewers, upload promotions and read dashboard metrics. The assistant acts as you. It can see and do only what you can in the Adclear app, in the organisation you choose when you sign in. MCP is in closed beta. To get access, contact your Adclear account manager. ## What you can ask Ask in your own words. The assistant chooses the tools. For example: * "Which of my promotions got new comments this week?" * "Summarise what Adclear AI found on the latest version of my summer savings promotion." * "Upload this PDF as a new promotion and tell me what Adclear AI finds." * "Pre-check this email copy before I upload it." * "How many promotions did we approve last month?" For the full list of actions and the permissions each one needs, see [Tools and permissions](/mcp/tools-and-permissions). ## Before you start You need: * **A client ID.** Your Adclear account manager gives it to you when your organisation joins the beta. Keep it inside your organisation. * **An Adclear account** with access to at least one workspace. * **Network access to `files.adclear.ai`**, to upload files from your computer. Some assistants run code in a sandbox that blocks unknown sites. If uploads fail, ask your IT team to allow `files.adclear.ai`. Without it, you can still upload from a public link. The server URL is: ```text theme={null} https://mcp.adclear.ai/mcp ``` ## Connect your assistant Claude Team and Enterprise plans only. A Claude Owner adds Adclear once. Then each person connects their own Adclear account. Open **Organization settings** > **Connectors**, choose **Add**, then **Custom** > **Web**. Enter `Adclear` as the name and the server URL. For authentication, choose **Use your own OAuth client**. Enter the client ID and leave the client secret empty. Choose **Add**. Open **Customize** > **Connectors**, find **Adclear** and choose **Connect**. Sign in to Adclear, choose your organisation and click **Allow access**. In a chat, open the **+** menu, choose **Connectors** and turn on **Adclear**. ChatGPT Business, Enterprise and Edu workspaces only. A workspace admin adds Adclear once. Then each person signs in with their own Adclear account. Open **Workspace settings** > **Permissions & roles** and turn on **Developer mode**. Open **Workspace settings** > **Apps** and choose **Create**. Enter `Adclear` as the name and the server URL. Under authentication, open **Advanced settings**, choose **User-defined OAuth client** and enter the client ID. Leave the secret empty. Copy the callback URL that ChatGPT shows and send it to your Adclear contact. Save the app when Adclear confirms that it is ready. In a chat, choose **Adclear** from your apps. The first time, sign in to Adclear, choose your organisation and click **Allow access**. Open the command palette, search for **Open MCP settings** and click **Add custom MCP**. Cursor opens `mcp.json`. Add this server, with your client ID: ```json theme={null} { "mcpServers": { "adclear": { "url": "https://mcp.adclear.ai/mcp", "auth": { "CLIENT_ID": "" } } } } ``` Reload Cursor. Sign in to Adclear when Cursor asks. Choose your organisation and click **Allow access**. ## Check that it works Ask your assistant: "Who am I signed in as in Adclear?" The answer shows your name, your organisation and role, and the workspace your requests use. ## Change workspace If your organisation has more than one workspace, ask: "List my Adclear workspaces", then "Switch to the Brand workspace". Adclear keeps your choice for later conversations until you choose a different one. If you lose access to that workspace, requests go to your organisation's default workspace. ## Frequently asked questions In Claude and ChatGPT, an admin must add Adclear first. Ask your Claude Owner or ChatGPT workspace admin. Check that the client ID is the one your Adclear contact gave you, with no extra spaces. In ChatGPT, also check that Adclear confirmed your callback URL. The connection is tied to the organisation you chose at sign-in. Disconnect Adclear in your assistant, connect again and choose the other organisation. Your account has no access to a workspace in this organisation. Ask your Adclear admin to give you access. The assistant gets only the tools your role allows, and it loads the list when it connects. If your role changed, disconnect Adclear and connect again so the assistant loads the new list. Your assistant probably cannot reach `files.adclear.ai`. Ask your IT team to allow it, or give the assistant a public link to the file. Disconnect Adclear in your assistant and connect again. If it still fails, contact Adclear support. Include the time of the error and the correlation ID if the assistant shows one. # Tools and permissions Source: https://docs.adclear.ai/mcp/tools-and-permissions What your AI assistant can do in Adclear through MCP, the permission each action needs, and how to keep control of changes. Your assistant uses tools to work in Adclear. Each tool does one action, such as listing promotions or uploading a file. The assistant chooses the tools from what you ask. MCP is in closed beta. To get access, contact your Adclear account manager. ## Same permissions as the app The assistant acts as you. It can see and do only what you can in the Adclear app, in the organisation you chose at sign-in. Tools that your role cannot use do not appear in the assistant. You sign in on Adclear's own page. Your assistant never sees your password. External reviewers and influencers cannot use MCP tools. ## Tools | What you can do | Tools | Type | You need | | - | - | - | - | | **Find promotions** | `listPromotions`, `searchPromotions`, `listSavedViews`, `getPromotionFilterOptions`, `listOrganizationUsers` | Read | Workspace access | | **Read feedback** | `getPromotionDetails`, `getPromotionComments`, `listPromotionVersions` | Read | Workspace access | | **Search claims and disclaimers** | `searchClaims`, `searchDisclaimers` | Read | Workspace access. Disclaimers also need permission to view disclaimers. | | **Upload promotions** | `createPromotion`, `createUpload`, `completeUpload` | Write | Workspace access | | **Upload a new version** | `createPromotionVersion` | Write | Permission to submit promotions | | **Submit for review** | `submitPromotion` | Write | Permission to submit promotions | | **Pre-check a draft** | `precheckPromotion`, `getPrecheckResult` | Write. Counts towards your plan. | Permission to submit promotions | | **Archive and restore** | `archivePromotion`, `unarchivePromotion` | Write | Permission to archive promotions | | **Delete** | `deletePromotion` | Write. Cannot be undone. | Permission to delete promotions | | **Read dashboards** | `getDashboardMetrics` | Read | Permission to view metrics | | **Check your context** | `getMyContext`, `listWorkspaces`, `selectWorkspace` | Read. `selectWorkspace` changes your workspace. | Workspace access | ### Uploading The assistant can upload a promotion from a public link or from a file on your computer. Uploads from your computer go to `files.adclear.ai`. Adclear AI then reviews the promotion, the same as an upload in the app. The assistant does not send a promotion to reviewers until you ask it to submit. ### Pre-checks A pre-check runs an Adclear AI review of draft copy or a draft file. It does not create a promotion or send anything to reviewers. Each pre-check counts towards your plan's usage. ### Deleting You can delete only an archived promotion. Archive it first. ## Control changes Tools marked **Write** change data in Adclear. Adclear tells your assistant to ask you before it uses one. Most assistants also ask you to approve each write. Keep that approval turned on. Changes to promotions are recorded under your name, the same as changes you make in the app. Pre-checks do not change promotions, so they are not recorded in promotion history. ## Stay safe * **Read each write before you approve it.** Check the promotion, the version and the action. * **Watch for instructions inside content.** A web page, file or comment can contain text that tries to make an assistant do something you did not ask for. Approve only the actions you expect. * **Use one organisation per connection.** To work in a different organisation, connect again and choose it. ## Remove access * **Remove your own access:** disconnect or remove Adclear in your assistant's settings. * **Remove access for everyone in Claude or ChatGPT:** the Claude Owner or ChatGPT workspace admin removes Adclear from the organisation's connectors or apps. * **Remove access for another person:** an Adclear admin removes the person from the organisation or workspace in Adclear. Their assistant then loses the same access. To see what each role can do, read [How roles work](/how-roles-work). # Metrics Source: https://docs.adclear.ai/metrics Plain-English definitions of every metric on the Analytics page, what each one measures, and what it includes and excludes. The Analytics page covers pre-publication financial promotion metrics: submissions, review timings, approvals, and rejection patterns. Post-publication metrics for affiliates and live content are managed separately in the Affiliate Monitoring & Affiliate Hub. ## How filters work Every metric on the Analytics page reflects your active dashboard filters. When you adjust any of the filters below, all metrics update simultaneously. You do not need to apply them per section. | Filter | What it controls | | - | - | | Product | Limits metrics to promotions linked to the selected product | | Ad Type | Limits metrics to promotions of the selected ad format | | Country | Limits metrics to promotions targeting the selected country | | Uploader | Limits metrics to promotions submitted by the selected person or team (current team members) | | Reviewer | Limits metrics to promotions reviewed by the selected person or team (current team members on the legacy reviewer field) | | Promotion | Limits metrics to a specific promotion | | Tags | Limits metrics to promotions with any of the selected tags, or to untagged promotions when **No tag** is selected | | Evergreen | Includes or excludes evergreen promotions | Open **Filters**, choose **Tags**, and select one or more campaign tags. Metrics update to include only promotions that carry at least one of the selected tags. Choose **No tag** as well to keep promotions that carry no tag, so excluding a few tags does not silently drop untagged promotions from your numbers. Tags are assigned on promotions in the Promotion dashboard. Every filter list has **Select all** and **Clear** buttons at the bottom. Select all ticks every option currently shown, so you can type to narrow the list first, or select everything and untick the few you want to leave out. To report on real promotions only, for example, open **Tags**, click **Select all**, then untick your test tags. ## Upload volume The total number of promotions that entered the review pipeline during the selected period. Use this to understand overall demand coming into your team. Promotions still in draft state are not counted. Only those that have been actively submitted for review are included. The total number of individual ad versions submitted during the selected period. Each version is a distinct creative upload within a promotion. This metric reflects the actual volume of content that reviewers handle. The average number of submitted versions per promotion. A low number suggests promotions are typically straightforward; a higher number suggests more complex submissions with multiple creative variations. Displayed rounded to one decimal place. The dashboard always shows a minimum of 1.0 to prevent the metric showing a misleading value in edge cases. The percentage of submitted versions that were marked as early requests. An early request is when a promotion is submitted with a deadline shorter than the SLA your organisation has agreed for review turnaround. For example, if your SLA is 5 working days from submission and an uploader sets a deadline 2 working days out, that promotion is counted as an early request. This metric helps teams understand how much of their incoming workload is time-sensitive or has been prioritised by the submitter. Your organisation's SLA is configured in Settings. ## Key metrics The percentage of reviewed versions where the review was completed within the agreed service-level timeframe. This is the primary indicator of whether your review team is keeping pace with its commitments. SLA compliance is assessed at the date level, not the exact time of day. If no versions have been reviewed in the selected period, this metric displays as 0%. The percentage of promotions that were approved the very first time they were reviewed, without needing any further revisions or re-submissions. A higher number indicates stronger content quality and fewer back-and-forth review cycles. The approval doesn't need to happen within the selected date range. As long as the promotion was created in range, approvals that occur later are still factored in. How long it typically takes from the moment a version is first submitted to the moment it receives its first approval. This gives a clear picture of end-to-end review speed. The dashboard shows both the average and the median, displayed in the most readable unit (minutes, hours, days, or weeks) based on actual values. How long it takes for a reviewer to give any initial response after a version is submitted, even if that response isn't a final decision. This highlights reviewer responsiveness early in the process. The dashboard shows both the average and the median. The average number of times a promotion had to be re-submitted after its initial upload before receiving approval. Zero means the first submission was approved straight away. Higher numbers indicate more back-and-forth and rework. A promotion with only one submission, approved first try, contributes 0 iterations. The first submission is the baseline, not a re-submit. The median is also calculated alongside the average to give a better sense of the spread. ## Most active uploaders & reviewers Shows which uploaders submitted the most work during the selected period. Useful for understanding where submission volume is coming from and spotting any concentration across a small number of submitters. Displays the top 5 uploaders by submission count, in descending order. Use the Versions / Promotions toggle in the card's header to change what is counted. Each card has its own toggle: * Promotions mode - counts campaigns per uploader * Versions mode - counts individual ad versions per uploader Shows which reviewers completed the most review work during the selected period. Useful for understanding how workload is distributed across the review team and whether any reviewers are handling a disproportionate share. Displays the top 5 reviewers by completed review count, in descending order. Use the Versions / Promotions toggle in the card's header to change what is counted. Each card has its own toggle: * Promotions mode - counts campaigns reviewed per reviewer * Versions mode - counts individual versions reviewed per reviewer This metric is based on when the review decision was made, not when the promotion was originally created. A review event in the selected period counts even if the promotion was submitted earlier. ## Promotions breakdown Breaks down all promotions into their current status, showing what share of your submission volume sits at each stage of the workflow. Useful for spotting backlogs or understanding the overall mix of outcomes. For status definitions, see [Promotion Statuses](/promotion-statuses). Promotions with no status recorded appear as "Unknown." Shows how promotion volume is distributed across different products. Helps identify which products are generating the most review traffic and whether any product is driving an outsized share of submissions. Promotions not linked to any product appear under "Unknown." Shows how promotion volume is distributed across different ad formats. Helps teams understand which ad types create the most pipeline load and where review capacity may need to be focused. Promotions not linked to any ad type appear under "Unknown." ## Rejection & change reasons Shows which reasons are selected most often when reviewers reject a promotion. Helps identify recurring compliance or quality failure patterns so teams can address root causes upstream. A single review can record multiple rejection reasons. Each one is counted individually. If the same promotion is reviewed and rejected more than once over time, each rejection adds further rows. This means the total can exceed the number of rejected promotions. Shows which reasons are selected most often when reviewers request changes rather than outright rejecting a promotion. Helps teams identify the most common fix requests and reduce revision cycles proactively. Reasons are grouped by name, not by unique review event. If a reviewer selects multiple reasons in a single review, each reason is counted as a separate row. This means the total can exceed the number of promotions that received a changes-requested outcome. ## Related pages Every status a promotion can be in and who acts next. Post-publication metrics for monitored content. How reviewers assess promotions and apply decisions. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Discord monitoring Source: https://docs.adclear.ai/monitoring/discord-monitoring Connect Discord servers, configure Approved Copy, and review flagged affiliate messages in Adclear. ## Overview Discord monitoring lets Adclear track messages in specific channels within an affiliate's Discord server. Relevant messages are evaluated against your **Approved Copy** library and raised for review when they do not match. New messages are evaluated as they are posted. No manual recheck is needed. Named message templates that pass evaluation automatically when matched. Only messages containing your configured link patterns are evaluated. Configure servers and scope per affiliate in **Monitor Settings**. ## Prerequisites Before configuring Discord monitoring, the Adclear bot must be present in the Discord server you want to monitor. Open **Settings → Discord** in your workspace. Use the bot invite link on that page and accept the invite in the target Discord server. Verify the bot appears in the server's member list before adding the server in Adclear. The affiliate or their server administrator must have permission to add bots to the Discord server. Without this, the bot cannot join. For workspace-level Discord setup steps, see [Settings → Discord](/settings#discord). ## Where to configure Discord Configure default Discord settings at **Settings → Discord**. This is the starting point for bot connection and workspace-level Approved Copy. Open **Affiliates → \[affiliate] → Monitor Settings → Discord** to add servers, channels, monitored usernames, and affiliate link patterns scoped to that affiliate. Most teams configure the bot at workspace level first, then add per-affiliate server details in **Monitor Settings**. ## Add a Discord server Navigate to **Affiliates**, open the affiliate, and click **Monitor Settings**. Scroll to the **Discord** section. Click **Add server** to open the **Add Discord Server** dialog. Paste the server's **Guild ID**. Right-click the server in Discord (with Developer Mode enabled) and select **Copy Server ID**. Adclear loads the server name, channels, and members automatically. Choose which channels Adclear should watch using the multi-select list. Messages in unselected channels are ignored. Choose which Discord members to track from the member list. You can also add custom usernames manually if a member is not listed. Enter one pattern per line. Adclear evaluates messages that contain a matching affiliate link. Protocol and www variants are treated as the same link, so `https://ninjatrader.com` matches `ninjatrader.com`. Click **Add** to save. You should see a confirmation that the server is configured for monitoring. Enable **Developer Mode** in Discord (**User Settings → Advanced → Developer Mode**) to copy server and channel IDs. ## Approved Copy library Approved Copy is a library of pre-approved message templates. When a Discord message matches an entry in your library, Adclear marks it as compliant even if it contains an affiliate link. In **Monitor Settings → Discord**, find the **Approved Copy** group. Click **Add** and enter the exact approved wording. Give each entry a descriptive name so reviewers can identify which template matched. The library is used for all subsequent message evaluations on that affiliate's configured servers. Add your standard launch messages, weekly recap formats, and other templates affiliates reuse. This is the easiest way to reduce false positives. ## How message evaluation works Once configured, Adclear evaluates messages automatically when all of the following are true: * The message is in a configured channel. * The sender is a monitored username. * The message contains an affiliate link pattern you configured. If the message matches an **Approved Copy** entry, it is marked **No Issues Found**. If it does not match, it is raised for review in **Monitoring → Discord**. ## Reviewing flagged messages Navigate to **Monitoring** and select the **Discord** tab. Use **Show: Flagged for Review** to focus on items needing attention. Click a row to open the message detail view. The posted content appears alongside the Approved Copy it was evaluated against. Review the difference between what was posted and what was expected. Use the **Review** actions: **No Issues Found**, **Changes Needed**, **In Review**, or **Escalate**. ## Frequently asked questions A message is evaluated when it is sent by a monitored username in a configured channel and contains an affiliate link pattern. Messages from other users, in other channels, or without matching link patterns are not evaluated. **Settings → Discord** connects the bot and can hold workspace-wide defaults. **Monitor Settings → Discord** on an affiliate scopes servers, channels, usernames, and link patterns to that specific affiliate. Yes. Open the server card in **Monitor Settings → Discord** and edit channels, usernames, or link patterns. The dialog title changes to **Edit Discord Server**. ## Next steps The Monitoring inbox, Affiliates hub, and operating cadence. Bot invite, workspace-level configuration, and Approved Copy. Social media post monitoring with relevancy filtering. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Affiliate monitoring Source: https://docs.adclear.ai/monitoring/overview Overview of post-publication affiliate monitoring in Adclear: the Monitoring inbox, Affiliates hub, and three channel types. ## Overview Adclear's affiliate monitoring tools give compliance teams and affiliate managers a structured way to track post-publication activity across **websites**, **Discord**, and **social media**. Once content is live, Adclear continues to evaluate it, raise compliance issues, and build an audit trail over time. The operational inbox where flagged website versions, Discord messages, and social posts are reviewed. The affiliate-level view with compliance metrics and channel-specific monitor lists. URL rechecks with version history. See the full guide. Real-time message checks against Approved Copy. See the full guide. Instagram, TikTok, YouTube, LinkedIn Personal, and LinkedIn Company post monitoring with relevancy filtering. See the full guide. Affiliate monitoring covers post-publication activity. Pre-publication financial promotion review (and the associated metrics) is covered separately. See [Analytics](/metrics) for pre-publication metrics. ## Intended audience This guide is written for: * Compliance managers responsible for reviewing flagged content and maintaining audit records. * Affiliate managers overseeing affiliate activity, tracking compliance rates, and managing monitor configurations. Users who can create campaigns typically configure website monitors, Discord servers, and social media handles. This aligns with Marketing and affiliate manager roles in most workspaces. Users who can review promotions work through the Monitoring inbox and record review decisions. This aligns with Compliance and Legal roles. The **External Uploader** role cannot access Monitoring. External partners submit promotions through the external submission form but do not see the post-publication inbox. ## Quick start If you are new to affiliate monitoring, follow these steps to get oriented. Navigate to **Monitoring** from the main navigation. You will see channel tabs: **Website**, **Discord**, and **Social Media** (depending on which add-ons are enabled for your workspace). Each tab defaults to **Show: Flagged for Review**. Toggle to **Show: All** when you need the full list. Select a row to open the detail view. Review the evaluation outcome, the content that was checked, and any issues raised. Navigate to **Affiliates**. Locate an affiliate to view their compliance rate, total monitored sites, and channel-specific monitor lists. Open an affiliate and click **Monitor Settings** to configure website URLs, Discord servers, or social media handles for that affiliate. ## The Monitoring inbox Monitoring is where post-publication checks are reviewed. Each channel has its own tab. | Tab | What it lists | | - | - | | **Website** | Website monitors and their latest version status | | **Discord** | Flagged Discord messages | | **Social Media** | Flagged social media posts | On every tab you can filter by status, affiliate, and date. Use **Show: Flagged for Review** to focus on items that need attention. When you open an item, use the **Review** actions to record your assessment: **No Issues Found**, **Changes Needed**, **In Review**, or **Escalate**. ## Affiliates **Affiliates** brings together everything relevant to a specific affiliate: profile details, compliance metrics, and monitored content across channels. When you open an affiliate's profile, three summary indicators appear at the top. | Metric | What it shows | | - | - | | **Total Sites** | The number of website monitors currently active for this affiliate. | | **Compliance Rate** | The proportion of monitored content that has passed evaluation, expressed as a percentage. | | **Avg. Issue Per Site** | The average number of issues recorded across all monitored sites for this affiliate. | These metrics are website-centric today. Discord and social media items appear in the Monitoring inbox and on the affiliate's channel tabs, but are not yet reflected in these headline metrics. Profile details such as the affiliate's owner, contact details, and country live in a details sidebar. Click the info button in the top-right of the affiliate page to open it. The sidebar is collapsed by default. Click **Monitor Settings** on an affiliate profile to configure website URLs, Discord servers, and social media handles for that affiliate. ## Recommended operating cadence * Check **Monitoring** for newly raised items from overnight checks. * Review and action raised Discord messages and social media posts from the previous 24 hours. * Confirm that active monitors are running as expected (no error states). * Review compliance rates for key affiliates in **Affiliates**. * Identify affiliates with a declining compliance rate or rising **Avg. Issue Per Site**. * Audit newly added monitors to confirm they are configured correctly, including Approved Copy and social media relevancy settings. * Clear any backlog of items awaiting review. * Review all active monitors and confirm they are still relevant and correctly configured. * Update Approved Copy and social media keywords or brand assets to reflect current campaigns. * Check whether any affiliates need to be removed from or added to the monitoring programme. * Use website version history on key monitors to identify content drift over time. ## Frequently asked questions **Monitoring** is the operational inbox where you review flagged items day to day. **Affiliates** is the affiliate-level summary: metrics, profile details, and monitor lists grouped by channel. Use it when you need the overall compliance picture for one affiliate. All workspaces with affiliate monitoring enabled see the **Website** tab. **Discord** and **Social Media** tabs require separate add-ons. When social media monitoring is enabled, Adclear supports **Instagram**, **TikTok**, **YouTube**, **LinkedIn Personal**, and **LinkedIn Company**. Speak to your Adclear contact if a tab or platform is missing. Each website is tracked as a single monitor. Every recheck creates a new **version** with a snapshot of the content at that point in time. See [Website monitoring](/monitoring/website-monitoring) for the full workflow. Assign a daily reviewer to work through the Monitoring inbox. Weekly, review affiliate compliance trends in **Affiliates**. Monthly, audit monitor configuration across all channels. ## Next steps Set up URL monitors, review versions, and manage rechecks. Connect servers, configure Approved Copy, and review messages. Configure handles, relevancy rules, and review flagged posts. Every Adclear feature, including monitoring add-ons. Who can configure and review monitoring. Pre-publication promotion metrics. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Social media monitoring Source: https://docs.adclear.ai/monitoring/social-media-monitoring Configure social media handles, set relevancy rules, and review flagged affiliate posts in Adclear. ## Overview Social media monitoring tracks affiliate posts on social media channels for compliance issues after publication. Adclear filters posts for relevancy first, then runs compliance evaluation on posts that match your configured rules. Supported monitoring channels: | Platform | What Adclear monitors | | - | - | | **Instagram** | Posts from configured profile handles; individual post URLs can also be fetched manually | | **TikTok** | Posts from configured profile handles; individual post URLs can also be fetched manually | | **YouTube** | Videos from configured channel handles; individual video URLs can also be fetched manually | | **LinkedIn Personal** | Posts from configured personal profile handles | | **LinkedIn Company** | Posts from configured company page handles | Twitter and Facebook handles can be stored on an affiliate profile for reference, but Adclear does not poll or evaluate posts on those platforms yet. Keywords, affiliate link domains, and brand assets determine which posts enter the compliance pipeline. Turn monitoring on per handle to poll configured social accounts on a schedule. Relevant posts are evaluated against your workspace policies like any other promotion. Flagged posts appear on **Monitoring → Social Media** for reviewer action. ## Prerequisites Navigate to **Affiliates** and create the affiliate record if it does not exist yet. The affiliate must have a country assigned before you can add social handles. Open the affiliate and click **Monitor Settings**. Scroll to the **Social Media** section. If the affiliate country is blank, the **Add** button for handles is disabled. Set the country on the affiliate profile first. ## Configure social media monitoring The **Social Media** section in **Monitor Settings** has four configuration groups. Social account usernames to track. Click **Add** to open **Add Handle**. Select the **Platform** and enter the **Handle** (without the `@` prefix). Click **Add** to save. Toggle monitoring **on** using the switch on the handle row. When enabled, Adclear polls that account automatically. URL or domain patterns that indicate a post is promoting your affiliate programme. Click **Add** to open **Add Affiliate Link** and enter the URL pattern (for example, a tracking domain or landing page path). Keywords that indicate a post is relevant to your campaigns. Click **Add** to open **Add Monitored Content** and enter a keyword or phrase (for example, a campaign name or product term). Images used to detect your brand in post content (logos, product shots, etc.). Click **Add** to open **Add Brand Asset**, upload an image, and optionally add a **Label**. You can add up to five brand assets per affiliate. Configure at least one relevancy signal (affiliate link, keyword, or brand asset) alongside your handles. This reduces noise from unrelated posts on the affiliate's account. ## Enable monitoring on a handle In **Monitor Settings → Social Media → Handles**, click **Add**, select the **Platform** (Instagram, TikTok, YouTube, LinkedIn Personal, or LinkedIn Company), and enter the handle (without the `@` prefix). Adclear checks the profile when you save. Wait for the **Checking profile…** step to complete. Toggle the switch on the handle row to enable monitoring. You should see a **Monitoring enabled** confirmation. To pause monitoring without removing the handle, toggle the switch off. You should see **Monitoring paused**. ## Reviewing flagged posts Navigate to **Monitoring** and select the **Social Media** tab. Use **Show: Flagged for Review** to list posts needing attention. Filter by **Status**, **Platform**, **Affiliate**, or **Created** date. Click a row to open the post detail view. Review the captured content and evaluation outcome. Open the **Info** tab. **Additional Details** shows the platform, poster handle (when known), and a link to the live post on the social network. Use the **Review** actions: **No Issues Found**, **Changes Needed**, **In Review**, or **Escalate**. You can also review an affiliate's posts from **Affiliates → \[affiliate] → Social Media** tab. Social media posts do not have version history or manual recheck like website monitors. Each post is evaluated once when it enters the pipeline. ## Frequently asked questions Adclear polls and evaluates posts on **Instagram**, **TikTok**, **YouTube**, **LinkedIn Personal**, and **LinkedIn Company** when monitoring is enabled for that handle. Twitter and Facebook handles can be saved on the affiliate record but are not monitored yet. The post may have been filtered as irrelevant before compliance evaluation. Check your **Affiliate Links**, **Monitored Content**, and **Brand Assets** configuration. Confirm the handle has monitoring turned on. Website monitors recheck URLs on a schedule and create **versions** over time. Social media monitoring polls configured handles, filters posts for relevancy, and evaluates each relevant post once. There is no version history for social posts. When monitoring is enabled for a handle, Adclear polls that account automatically every six hours for new posts. Adclear staff can also trigger a manual fetch of the latest post or a specific post URL. Social media monitoring is an add-on feature. Speak to your Adclear contact if your workspace should have access. ## Next steps The Monitoring inbox, Affiliates hub, and operating cadence. Real-time message checks against Approved Copy. URL rechecks with version history. Who can configure and review monitoring. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Website monitoring Source: https://docs.adclear.ai/monitoring/website-monitoring Set up website URL monitors, review recheck versions, and manage post-publication compliance for affiliate sites. ## Overview Website monitoring tracks a single URL or domain as one monitor record. Each time Adclear rechecks that site, a new **version** is recorded. You always have a history of what the site looked like at each point in time. Each monitor tracks one website URL linked to an affiliate. Change detection triggers new versions without manual action from your team. Every recheck creates a version you can open and review individually. Open an affiliate's **Website** tab to see only their monitors. ## Setting up a website monitor Navigate to **Monitoring** and select the **Website** tab. Click **New Monitor** to add a single URL, or **Bulk Import** to upload multiple URLs at once. Provide the URL you want to monitor and link the monitor to the relevant affiliate. To monitor several pages on one site, turn on **Extract all URLs?**. Adclear scans the site and lists up to 250 pages for you to review before creating monitors. Add a search term to narrow the results. Confirm and save. The monitor appears in the **Website** tab list. You can also add website URLs from an affiliate's **Monitor Settings** page under the **Website** section. The **Created By** filter on the Website tab lets you select a team. Choosing a team shows every monitor created by any of that team's current members. See [Teams](/settings#teams) for how teams are created and managed. The **Flagged by rule** filter on the Website tab shows only websites whose latest scan was flagged by the rules you select. The same filter is available on an affiliate's detail page. You can search for rules and select more than one. Options are sorted by how many websites each rule flagged, so you can see which rules flag most often. All versions of a rule are grouped under its current name. The filter does not take into account whether an issue was dismissed or agreed. If the same scan is re-evaluated, rules flagged in earlier runs still match. ## Bulk importing website monitors Use bulk import when you need to create several website monitors from a spreadsheet. Download the CSV template from the bulk import dialog, then complete one row per website monitor. Each file can contain up to 250 rows. The **Product** and **Channel** columns accept either a single value or multiple comma-separated values. For example, use `Credit Card, Savings Account` to scope one monitor to both products. Values must match the product and channel names configured in your workspace. ## Reviewing website versions On the **Website** tab, use **Show: Flagged for Review** to list monitors needing attention. Filter by status, affiliate, product, country, or **Flagged by rule** as needed. Click a row to open the monitor detail view. Each recheck appears as a separate version. Select a version to see the content captured during that check and its evaluation outcome. Open the **Comments** tab on the version detail view. For each Adclear evaluation comment, choose **Please Action** if you agree with the finding, or **Dismiss** if you disagree. Resolved comments move to the **Actioned** or **Dismissed** tabs. Work through every comment before recording your overall review decision. For guidance on when to action versus dismiss, see [How you help Adclear learn](/how-you-help-adclear-learn). Use the **Review** actions to record your assessment: **No Issues Found**, **Changes Needed**, **In Review**, or **Escalate**. The follow-up workflow for notifying affiliates or monitor owners after you action or dismiss comments is still being finalised. Record your comment responses and review decision in Adclear today. Your team can define offline follow-up steps in the meantime. ## Managing active monitors From the **Website** tab you can: * **Recheck** a monitor on demand to capture the current page content immediately. * **Archive** monitors that are no longer relevant. * Toggle a monitor **active** or inactive without deleting it. * Edit the monitored URL if the affiliate's landing page has moved. Archiving removes the monitor from active lists but preserves its history. Use this when an affiliate relationship ends rather than deleting records outright. ### Archiving several monitors at once Select monitors with the checkbox at the start of each row, then archive them together. Bulk archive is rolling out gradually. If the Website table shows no checkboxes, speak to your Adclear contact about enabling it. * Click a row's checkbox to select it. Hold `Shift` and click another row's checkbox to select every row between them. * Once a row is selected, hold `⌘` (Mac) or `Ctrl` (Windows) and click a row to add it to the selection or take it out. `Shift`-click a row to extend the range. * The checkbox in the column header selects every monitor on the current page. Click it again to clear them. * Press `Esc`, or click **Clear selection** (×) on the selection bar, to clear the selection. While monitors are selected, a bar at the bottom of the table shows how many. Click **Archive** in the bar, or press `⌘`+`K` (`Ctrl`+`K` on Windows) and choose **Archive** under **Bulk actions**. Confirm in the dialog to archive the selected monitors. Adclear skips any that are already archived. If Adclear can't archive some of them, the notification says how many it archived. The ones that failed stay selected, so you can click **Archive** again to retry only those. Row selection is available to roles that can archive promotions. External uploaders don't see it. See [How roles work](/how-roles-work). ## Status reference The latest version has been evaluated and is waiting for a reviewer decision. A reviewer confirmed the content passes compliance, or the evaluation found no issues requiring action. The evaluation or reviewer identified compliance issues that need to be addressed. A reviewer is actively working on the item. Adclear is capturing or evaluating content. No reviewer action is needed yet. The recheck or evaluation did not complete successfully. Investigate the monitor configuration or contact support if the error persists. ## Next steps The Monitoring inbox, Affiliates hub, and operating cadence. Real-time message checks against Approved Copy. Social media post monitoring with relevancy filtering. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Multi-level approval Source: https://docs.adclear.ai/multi-level-approval Route promotions through multiple reviewers in parallel or sequential flows using reviewer presets. ## Overview Multi-level approval lets you send a promotion through more than one reviewer instead of a single approver. It works well when a submission needs sign-off from several teams. For example, Marketing, Compliance, Admin, or Legal. Reviewers work at the same time. Neither has to wait for the other to finish. Reviewers work one after another in a set order. Each step waits for the previous one. This guide is written for marketers submitting promotions and for admins setting up review flows. If anything here differs from earlier internal notes, this guide takes priority. ## The four things to understand A reviewer preset is a saved review path you set up once and reuse. Presets are created in **Settings**, in the reviewer preset section. Each preset defines: * Which roles take part (Marketing, Compliance, Admin, Legal, and so on) * Whether the flow is parallel or sequential * The order of steps (for sequential flows) Once saved, presets appear when someone submits a promotion. There is also a **default preset**, which is chosen automatically unless the submitter picks a different one. Only admins can create reviewer presets. You cannot change the review roles on a saved preset. To change who reviews for a jurisdiction, create a new preset with the roles you want and set it to auto-apply for that jurisdiction in place of the original. Promotions already in review keep the preset they were submitted with. Only new promotions use the new preset. To change the flow on a live promotion, see [Edit the review flow during and after review](#edit-the-review-flow-during-and-after-review). In a parallel flow, reviewers do not block each other. For example, Marketing and Compliance can both review at the same time. Neither has to wait for the other to finish first. This is useful when you want answers quickly and the teams do not depend on each other's decision. In a sequential flow, reviews happen in order. Step 2 does not start until Step 1 is done. Step 3 does not start until Step 2 is done. The remaining steps follow the same pattern. This is useful when one team's review should happen before the next — for example Marketing first, then Compliance, then Legal. Presets save **roles** (Marketing, Compliance, and Legal) or **teams** and their step order, not fixed names. Teams are an add-on to roles: a preset step can point at a team instead of a role, and applies the same way. See [Teams](/settings#teams) for how teams are created and managed. When applying a preset to a promotion, the person submitting chooses the actual people within each role or team group who should review. That way you are not automatically sending the promotion to everyone in a role or team. Only the people you tick are involved. Users can leave a role or team selection open. If no specific people are ticked, anyone with that role, or anyone currently in that team, and with the correct permissions, can review. External Reviewer steps are different, whether the step is a role or a team. When you apply the preset, you must select one or more named external reviewers because **Anyone** is unavailable for that step. Each selected person also needs permission for the promotion's jurisdiction. See [External reviewer access](/external-reviewer). A team step can also block submission on its own: if nobody in the team has access to the promotion's workspace, Adclear won't let you apply that step until an admin adds an eligible member to the team, or you switch to individual reviewers for that step instead. Adclear stops you applying a preset that is obviously invalid, for example the same person chosen in two roles, but not every combination is caught. Because one person cannot review more than one step, a flow can still end up with a step nobody is eligible to complete (for example, if the only person at step 2 also reviews step 1). If that happens, a Compliance Admin or Marketing Admin can reassign the stage or swap the preset. See [Edit the review flow during and after review](#edit-the-review-flow-during-and-after-review). The same role or team can appear more than once in a single preset. This is useful for sequential flows where a group needs to review at multiple steps. Being in a team does not by itself let you review at a team step. You also need review permission for the promotion. See [Settings](/settings) for review permissions. Jurisdiction autoapply is not available by default. It is enabled per organisation under controlled rollout. Speak to your Adclear contact about whether it is the right fit for your team. Admins can link a jurisdiction (country) to a specific preset so that whenever a promotion targets that jurisdiction, the correct preset is applied automatically. The submitter does not need to pick one manually. These links are configured per workspace inside the preset create or edit dialog. If a jurisdiction is already linked to a different preset, the admin sees a conflict indicator and can choose to reassign it. When a jurisdiction is linked to a preset: * The preset selector is locked at upload and shows a "Required by" label. * The submitter cannot change the preset for that jurisdiction. * Adclear enforces the preset at submission time, even if no preset was applied at draft. See [Jurisdiction autoapply](#jurisdiction-autoapply) below for the full lifecycle. ## When to use each type Use parallel review when: * More than one team can review on their own * One reviewer does not need to finish before another starts **Example:** Marketing and Compliance review at the same time. Use sequential review when: * One review must happen before the next * Later reviewers rely on earlier decisions * You want a clear, fixed order of sign-off **Example:** Marketing → Compliance → Legal. ## Using multi-level approval with self-approval Whether a promotion can skip review is decided by your workspace's self-approval rules (channel, product, jurisdiction, and people), not chosen by the submitter each time. If no rule matches, self-approval is blocked and the standard review workflow applies. See [Self-approval](/self-approval) for how eligibility is checked, and [Configure self-approval rules](/settings/self-approval-rules) for how admins set the rules. ## How admins set up a reviewer preset Go to **Settings > Organisation > Reviewer Presets**. Select **Add new**. Pick **Sequential** or **Parallel**. Add each role or team group that should take part. Use the **Roles** tab for role groups such as Marketing, Compliance, Admin, or Legal. Use the **Teams** tab to add a team as a step instead of a role. If the flow needs an outside partner, add **External Reviewer** from the Roles tab. You will select the specific external partners later, when you apply the preset to a promotion. For sequential flows, put the steps in the right order. Steps can mix roles and teams, for example: 1. Marketing 2. Compliance team 3. Legal Save the preset. It will then be available when promotions are submitted. You can also set which preset is the default. If jurisdiction autoapply is enabled, the preset dialog includes a **Jurisdiction Auto-Apply** panel. Select which jurisdictions (per workspace) should use this preset automatically. If a jurisdiction is already linked to another preset, Adclear shows a conflict badge and asks you to confirm the reassignment. ## How to use a preset when submitting a promotion Create your promotion as usual. In the submission flow, use the reviewer selection dropdown in the bottom-right area of the screen. You can either: * Pick a single individual reviewer (the usual one-reviewer path), or * Pick a reviewer preset (multi-level path) Choose the default preset, or switch to another one if needed. If your admin has linked the promotion's jurisdiction to a specific preset, that preset is selected automatically and the selector is locked. You will see a "Required by" label indicating which jurisdiction triggered it. Open each group inside the preset to see the people available in that role or team. Use the tick boxes to select exactly who should review from each group. For example, if Marketing is in the flow, you might choose one person, two people, or everyone eligible in Marketing. Selecting specific people is **optional**. Leaving the selection open means anyone with that role and the correct permissions can review. When applying a preset, selecting specific people is required for an External Reviewer group. Adclear blocks submission if the step has no named candidate or a selected reviewer lacks the promotion's jurisdiction. Submit the promotion. The approval flow can start at the upload stage or the submission stage, depending on how your team works. You can change the preset on a submitted promotion, but recorded decisions are discarded when you do. See [Edit the review flow during and after review](#edit-the-review-flow-during-and-after-review). ## What happens after submission After submission, the screen is updated to show the review flow more clearly. You should be able to see: * The approval steps in the flow * The current step * Whose turn it is to review (especially in sequential flows) ### Step-ready notifications Reviewers are notified by email and Slack direct message when a step they can review opens. That happens when: * The promotion is submitted or resubmitted, for the first step (or every step in a parallel flow) * The previous step is approved, for the next step * Someone changes the review flow and a new step opens * Someone reassigns an open step, for the person it was reassigned to On a step assigned to a role or team, everyone in that role or team who can review the promotion's jurisdiction is notified. External reviewers are only notified when they are named on the step. The person who made the change is never notified. The person who uploaded the promotion is only notified if they are allowed to review it themselves. See [self-approval](/self-approval). These notifications follow the **Assigned as a reviewer** setting for email and the **Assigned as reviewer** setting for Slack. Turn those off to stop them. See [Notifications](/settings#notifications). ### What reviewers receive when a promotion is submitted Each person gets one notice when a promotion is submitted or resubmitted, based on where they sit in the review flow: | Where you sit | What you receive | Setting that controls it | | - | - | - | | On a step that is open now | "Your review step is ready" | **Assigned as a reviewer** | | On a later step (internal reviewers) | A heads-up that you're on a later step, and that you'll be told when it opens | **New promotion submissions** and **Review countries** | | In the promotion's jurisdiction, but not on the review flow | A notice that the promotion was submitted, with no action needed | **New promotion submissions** and **Review countries** | | On a later step (external reviewers) | Nothing until your step opens | – | The person who submitted the promotion doesn't receive a notice. The Slack channel announcement for new submissions is unchanged. ## Approve, Reject, and Request Changes in a multi-level flow Multi-level approval uses the same three decisions as normal Adclear review. The difference is what they mean when several people are involved. **In a sequential flow:** Your approval completes your step. The promotion moves to the next person in the order. It is not fully approved until the last required step is approved. **In a parallel flow:** Your approval counts toward your part of the flow. The promotion is only fully approved when every required step in that parallel flow has been approved. The promotion did not pass review. The flow stops. The promotion goes back to the marketing team with your comments, as it does today. Specific changes are needed before the promotion can be approved. Like Reject, it stops the flow and sends the promotion back to marketing with your feedback. Clicking **Approve** on an early step does not mean the promotion is cleared for use. Only full approval at the end of the flow means it is approved. ## Edit the review flow during and after review Reviewers go on leave, teams change, and sometimes the wrong preset is applied. Permitted users can change the review flow on a live promotion without resubmitting it. This includes stages that already hold a decision and chains that have finished review. The editing controls appear in two places on the promotion: the review flow in the **sidebar**, and the review section of the **Details** tab. Both show the same stages and behave the same way. ### Who can edit | When | Who can edit | | - | - | | Before any decision is recorded | Anyone who can assign a reviewer to the promotion | | After a decision is recorded, including a completed review | Compliance Admins and Marketing Admins | Comments do not lock the flow. Only a recorded decision does. External reviewers can never reassign a promotion or edit its review flow. See [External reviewer access](/external-reviewer). ### Reassign the reviewer on a stage Open the promotion and find the stage in the sidebar or on the **Details** tab. Select the reassign control on the stage row. Tick up to 100 named reviewers, or choose **Anyone** to open the stage to everyone in that role or team. **Anyone** is unavailable for External Reviewer stages, and for team stages that contain external members. Those stages always need named reviewers. Each named reviewer also needs permission for the promotion's jurisdiction. If the change does not affect any recorded decision, it applies straight away. If it would discard decisions, Adclear opens a confirmation dialog first. After a reassignment, Adclear recalculates whose turn it is. In a sequential flow the earliest undecided stage becomes active again. Editing an assignment on a draft does not submit it or start the review. ### Swap the preset or switch to single review The same permitted users can replace the whole flow instead of one stage, even after decisions have been recorded: * **Swap the preset.** Pick a different preset from the reviewer selection. The old chain is replaced by the new one. * **Switch to single review.** Pick an individual reviewer instead of a preset. The chain is replaced by the usual one-reviewer path. Either change discards every recorded decision on the promotion. The confirmation dialog shows the current flow next to the new one, with a **Discarded** badge on each decision that would be lost. ### What happens to recorded decisions | Change | Decisions discarded | | - | - | | Reassign a stage in a **sequential** flow | The reassigned stage and every later stage. Approvals on earlier stages survive. | | Reassign a stage in a **parallel** flow still in progress | Only the reassigned stage. Other stages keep their decisions. | | Reassign a stage in a **parallel** flow that has finished | Every stage. The whole round restarts. | | Swap the preset or switch to single review | Every recorded decision on the promotion. | Whenever a change would discard decisions, the confirmation dialog names each decision at stake, showing the reviewer and their stage. Select **Cancel** to keep every decision. Nothing is discarded until you confirm. ### When editing is unavailable You can edit the review flow while a promotion is Draft, Pending Review, or In Review, and after review completes with Approved, Conditionally Approved, Rejected, or Changes Needed. You cannot edit it while a promotion is Escalated, Reviewing Risk, or Risk Accepted. See [Promotion statuses](/promotion-statuses). ## Example workflows **Goal:** Get Marketing and Compliance sign-off as quickly as possible. **Setup:** * Review type: Parallel * Reviewers: Marketing and Compliance **What happens:** * Both teams are notified * Both can review straight away * Neither has to wait for the other * The promotion is fully approved once both have approved **Goal:** Reviews happen in a strict order. **Setup:** 1. Marketing 2. Compliance 3. Legal **What happens:** * Marketing reviews first * Compliance cannot review until Marketing has finished * Legal cannot review until Compliance has finished * The promotion is fully approved only after Legal approves If anyone Rejects or Requests Changes at any step, the flow stops and the promotion goes back to marketing. ## When marketing sends a new version After Rejected or Changes Needed, marketing can upload a fixed version with the same preset. Adclear then offers eligible approvals from the previous version. The submitter chooses which approved steps to carry forward. Any unselected or ineligible steps are reviewed again. In a sequential flow, review resumes at the first step not carried forward. Approvals cannot be carried forward when the preset changes or a reviewer required a fresh re-review. In those cases, the new version starts a fresh review. If jurisdiction autoapply is enabled and your admin changed which preset is linked to the jurisdiction between versions, the new version uses the updated preset instead of carrying over the previous one. If the linked preset was deleted or deactivated, the submitter picks a preset freely. ## Jurisdiction autoapply Jurisdiction autoapply is not available by default. It is enabled per organisation under controlled rollout. Speak to your Adclear contact about whether it is the right fit for your team. Jurisdiction autoapply lets admins link a jurisdiction to a preset so the correct review flow is enforced automatically at every stage of a promotion's lifecycle. Once configured, no manual preset selection is needed for linked jurisdictions. Open an existing preset (or create a new one) in **Settings**. The **Jurisdiction Auto-Apply** panel appears at the bottom of the dialog. For each workspace, select the jurisdictions that should use this preset. If a jurisdiction is already linked to a different preset, a conflict badge appears and Adclear asks you to confirm the reassignment. When a preset is deactivated or deleted, Adclear removes its jurisdiction links automatically. When a submitter selects a jurisdiction that is linked to a preset, the preset is applied to the draft automatically. The preset selector is locked and displays a "Required by" label. This applies to single uploads, batch uploads, and carousels. If a promotion reaches submission with no preset applied (for example, because it was created before the preset was configured for that jurisdiction), Adclear applies the correct preset automatically as a fallback. If the submitter explicitly chooses a different preset that conflicts, the submission is rejected. External and integration submissions follow the same logic. If the jurisdiction is linked to a preset, that preset is applied automatically before the submission reaches review. When a new version is created, Adclear checks which preset the jurisdiction is currently linked to. If the link changed since the previous version (for example, the admin reassigned the jurisdiction to a different preset), the new version gets the updated preset. The previous chain is not carried over blindly. If the linked preset was deleted or deactivated, the submitter picks a preset freely. When a jurisdiction is linked to a preset, the preset selector and reviewer field on the promotion viewer show which preset is active. ## Best practices * Use **parallel review** when teams can review on their own and you want faster turnaround. * Use **sequential review** when order matters and later reviewers should build on earlier ones. * Save common flows as presets so people do not rebuild the same review path every time. * Use individual selection within role groups so you only involve the people who need to review. Avoid assigning the whole role. * When applying a preset, always select named candidates for External Reviewer steps and confirm their jurisdiction permissions. * Before making a preset the default, check that it matches how your business actually approves content. ## Admin setup checklist Before rolling this out to your team, confirm: * Reviewer presets are created in **Settings** * The right roles have been assigned to users * Users understand parallel vs sequential review * The right people can be selected within each role group * Submitters know they must select named candidates when applying a preset that contains an External Reviewer step * If jurisdiction autoapply is enabled, jurisdictions are linked to the correct presets per workspace ## Quick summary | | Single reviewer | Multi-level approval | | - | - | - | | Who reviews? | One person | Several people, in a set flow | | How is it set up? | Pick one reviewer | Pick a preset (or use the default) | | Approve means… | Promotion is approved | Your step is done; others may still need to review | | Reject / Request Changes | Sends back to marketing | Stops the whole flow and sends it back to marketing | | Best for… | Simple sign-off | Marketing + Compliance + Legal (or similar) | In short: Multi-level approval routes a promotion through the right people in parallel or in order. It uses the same Approve, Reject, and Request Changes decisions you already know. The promotion is only fully approved when every required step in that flow is complete. ## Related pages The single-approver add-on for permitted users on permitted promotions. Every Adclear feature in one place, including where multi-level approval sits as an add-on. Understand the different roles in Adclear and what each one can do. Invite external reviewers and assign promotions to them. Configure reviewer presets and other organisation settings. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # My Submissions Source: https://docs.adclear.ai/my-submissions How external partners track their submitted promotions, check review status, and create new submissions. ## Who this page is for This page serves two audiences: * Internal admins explaining the post-submission experience to external partners. Read this end to end so you can guide your partners through what they see after submitting. * External submitters who want to track their promotions. Focus on how to find your submissions, filter by status, and respond to review decisions. ## What it is My Submissions is a dedicated page where external partners (agencies, affiliates, influencers) see every promotion they have submitted. It replaces the need to find individual promotions through email links. My Submissions appears as the main navigation item for External Uploaders. ## What the page shows The page displays a table of your submitted promotions with the following columns. | Column | What it shows | | - | - | | ID | The promotion's reference number | | Title | The promotion name | | Status | The current review status (Draft, Pending Review, In Review, Approved, Changes Needed, and others) | | Submitted | The date you submitted the promotion | | Deadline | The review deadline, with visual indicators for overdue or approaching deadlines | ## Filtering and searching You can narrow down the list in two ways: * **Status filter.** Click the Status filter above the table and select a status to show only promotions in that state (for example, only those with Changes Needed). * **Search.** Type in the search bar to find promotions by name. ## Opening a promotion Click any row in the table to open that promotion. You can also click the actions menu on a row and select View details. From the promotion page you can see the reviewer's decision, read comments, and upload a new version if changes have been requested. ### Which comments you can see You see every comment written by a person on the promotion. On the Comments tab, Adclear's AI comments stay hidden from you unless someone from the internal team has replied in that thread, in which case the whole thread becomes visible. AI comments the internal team has asked you to action appear on the Actioned tab, and ones they have dismissed appear on the Dismissed tab. The internal team cannot hide individual comments from you, so they write on the assumption that you can read them. Some organisations choose to hide comments from external uploaders altogether. If yours has, you won't see a Comments tab or any comments, only the promotion and its Info tab. Ask your contact at that organisation if you need their feedback on a submission. ## Creating a new promotion Click the New Promotion button at the top of the page to start a new submission. This takes you to the same upload form described in [Submitting for review](/marketing/submitting-for-review). ## What you can and cannot see External Uploaders see only their own submitted promotions. You cannot see promotions submitted by other people, internal promotions, policies, workspace settings, or team member information. External Reviewer is a separate role for outside partners who approve assigned promotions. See [External reviewer access](/external-reviewer) if your work is to review rather than upload. ## Related pages How external partners submit promotional content for the first time. How affiliates and agencies are invited to view their own compliance status. Permissions and role definitions, including the External Uploader role. What each review decision means and your next step. How your responses to AI comments shape future reviews. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Getting started Source: https://docs.adclear.ai/overview Set up your Adclear account, sign in, and configure your notifications. ## Overview Before you can upload or review promotional content in Adclear, you'll need an account, access to the right workspace, and notifications configured so you don't miss tasks or mentions. This page covers everything you need to get started. It should take less than ten minutes. If your organisation uses single sign-on (SSO), you may be directed to sign in through your company's identity provider instead. Contact your internal Adclear admin if you're unsure which method applies to you. Admins setting this up can follow [Set up SSO with Okta](/sso/okta) or [Set up SSO with Microsoft Entra ID](/sso/azure). Once you're signed in, take a few minutes to read /how-roles-work to understand what your role can do, and /upload-types to learn the core concepts used throughout the platform. ## Account setup If you've been invited to Adclear, you'll receive an email with a link to create your account. Follow the link and complete the steps below. On the sign-up page, enter the email address your invitation was sent to. Choose a strong password that meets the requirements below, then click Continue. A verification code will be sent to your email address. Enter the code when prompted. If it doesn't arrive within a couple of minutes, check your spam folder. Enter your first and last name, then click Complete. You'll be taken to your Adclear home screen, either My Tasks or the Promotion Dashboard, depending on your role. If you see a "No organisation found" message, your admin may need to complete your workspace assignment. Reach out to them directly. When creating or resetting your password, it must: * Be at least 8 characters long * Contain at least one uppercase letter * Contain at least one number * Not appear in a known data breach If your password doesn't meet these requirements, Adclear will tell you exactly what needs to change before you can continue. Go to the Adclear sign-in page and enter your email address, then click Continue. On the password step, click Forgot password?. A reset card will appear - click Send Reset Link. Check your email for a verification code and enter it when prompted. Enter and confirm your new password (the same requirements apply), then click Reset password. You'll be signed in automatically. If you don't receive the reset email within a few minutes, check your spam folder. If it still hasn't arrived, contact your internal Adclear admin. ## Signing in Once your account is set up, signing in is straightforward. Enter your email address and click Continue. Enter your password and click Continue. You'll be taken to your home screen. ### Common sign-in issues | Issue | What you'll see | What to do | | - | - | - | | Wrong password | "Password is incorrect. Try again, or use another method." | Double-check caps lock, or use Forgot password? | | Email not recognised | "Couldn't find your account." | Check you're using the email your invite was sent to | | Invalid email format | Continue stays disabled | Make sure the email address is formatted correctly | ## Set up your notifications Adclear sends notifications by email and Slack to keep you on top of tasks, comments, mentions, and review activity. We strongly recommend configuring both before you start using the platform so nothing slips through. Sent automatically to the email address on your account. No setup needed - manage your preferences in Settings. Available once an admin has connected your organisation's Slack workspace. Channel and DM preferences are managed per user. ### Slack notifications If you're a Compliance Admin or Marketing Admin, you can connect your organisation's Slack workspace so everyone in Adclear receives notifications. Go to Settings in Adclear and click Slack Notifications. Click Add to Slack, then Allow on the Slack authorisation page. You'll be redirected back to Adclear once the app is installed. Select a Slack channel from the Connected Channels dropdown. This is where Adclear will post channel-wide notifications for your organisation. To use a private channel or a channel shared across workspaces, you'll need to invite the Adclear bot to the channel in Slack first. See the /settings for the full walkthrough. Clicking Disconnect from Slack disables both channel and DM notifications for every user in your Adclear organisation. Only disconnect if you're sure no one in your team relies on Slack notifications. Once your admin has connected Slack, you'll automatically receive channel notifications in the channel they selected. You can't switch channel notifications off in Adclear, but you can mute the channel directly in Slack. You can choose whether to receive direct messages (DMs) from Adclear, and which types. Go to Settings in Adclear and click Slack Notifications. Switch Enable Slack DM Notifications on or off. When on, you can choose which types of notifications you receive by DM. Mention notifications - when someone tags you in a comment thread - are only delivered by DM. If you turn DM notifications off, you won't see mentions in Slack at all. For the full Slack notifications walkthrough, including shared channels, private channels, and the complete list of DM notification types, see the /settings. ## What's next? Understand what your role can do and where you fit in. Learn the four ways to upload promotions and when to use each. Full reference for connecting Slack and managing notification preferences. Manage which email notifications you receive from Adclear. ## Getting support Raise requests through the Get Help button or by tagging @Adclear Support on a comment. Both attach your details and the promotion or comment to the request, so the Adclear team can pick it up without asking you for the background. Click Help at the bottom of the navigation sidebar, or Get help in the top right of any promotion, to chat with the Adclear team about a question, bug, or feature request. Reply to a comment on a promotion and tag @Adclear Support when Adclear has misread or missed something on that asset. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Promotion statuses Source: https://docs.adclear.ai/promotion-statuses A reference guide to every status a promotion can have in Adclear, and what each one means. ## Overview Every promotion in Adclear moves through a series of statuses as it progresses from creation through to a final review decision. Understanding what each status means, and who is responsible at each stage, helps both uploaders and reviewers track content efficiently. Some statuses (Escalated, Reviewing Risk, and Risk Accepted) are only available if your workspace has those features enabled. If you don't see them, they may not be active for your organisation. ## Status reference | Status | What it means | Who acts next | | - | - | - | | Draft | The promotion has been created but not yet submitted for review. Only the uploader can see and edit it at this stage. | Uploader, submit when ready | | Pending Review | The promotion has been submitted and is waiting for a reviewer to pick it up. | Reviewer, open and begin review | | In Review | A reviewer has opened the promotion and is actively assessing it. | Reviewer, reach a decision | | Approved | The promotion has passed compliance review and is cleared for use. | No action required | | Conditionally Approved | The promotion is approved for its current use with a recorded condition. The uploader should read the review comment and address the condition in the next version. Where a workspace self-approval rule covers conditionally approved resubmissions, the uploader can approve that next version themselves. | Uploader, prepare the next version | | Rejected | The promotion did not pass review. The reviewer's comments explain why. | Uploader, review comments, then resubmit a new version | | Changes Needed | The reviewer has requested specific amendments before the promotion can be approved. | Uploader, make the requested changes and resubmit | | Escalated | A reviewer has escalated the promotion to a specialist (typically legal or senior compliance) for input before reaching a final decision. (Requires escalations to be enabled in your workspace.) | The escalation recipient, respond via comment | | Reviewing Risk | An uploader has escalated a Rejected or Changes Needed decision to an Uploader user with Risk Accepting permissions, who is deciding whether to accept the risk and proceed. (Requires risk acceptance to be enabled.) | Uploader user with Risk Accepting permissions, respond via comment | | Risk Accepted | An Uploader user with Risk Accepting permissions has accepted the risk on behalf of the organisation. The promotion is cleared for use under risk acceptance, with a full audit trail. | No action required | ## Standard status flow This diagram shows the path a promotion follows in a standard review cycle, including the reviewer-initiated legal escalation route. ```mermaid theme={null} flowchart LR A["Draft"] --> B["Pending Review"] B --> C["In Review"] C --> D["Approved"] C --> H["Conditionally Approved"] C --> E["Rejected"] C --> F["Changes Needed"] E --> B F --> B C -->|"Reviewer escalates to legal"| G["Escalated"] G -->|"Returns for decision"| C ``` When a reviewer escalates to legal, the promotion returns to the reviewer after the specialist has responded. The reviewer then makes the final decision. ## Risk acceptance flow This diagram shows the separate path when an uploader escalates a Rejected or Changes Needed decision for risk acceptance review. ```mermaid theme={null} flowchart LR A["Pending Review"] --> B["In Review"] B --> C["Rejected / Changes Needed"] C -->|"Uploader escalates"| D["Reviewing Risk"] D -->|"Risk accepted"| E["Risk Accepted"] D -->|"Risk declined"| C ``` Risk acceptance is a separate route from legal escalation. Escalated is initiated by a reviewer during review. Reviewing Risk is initiated by an uploader after a rejection or changes needed decision. See [the feature catalog](/feature-catalog) for full detail on both. ## Statuses by role ### What uploaders will see on their tasks Uploaders see a promotion on their tasks when action is required from them: * Rejected, review the reviewer's comments and decide whether to create a new version * Changes Needed, make the requested amendments and resubmit Promotions in Pending Review, In Review, Approved, Conditionally Approved, Escalated, or Reviewing Risk are visible on the Promotion Dashboard but do not appear on the uploader's task list. ### What reviewers will see on their tasks Reviewers see a promotion on their tasks when it is ready for review: * Pending Review, unassigned, or assigned specifically to them * Returned after a legal escalation, Pending Review again, ready for the reviewer to make their decision Promotions assigned to a different named reviewer will not appear in a reviewer's task list. ### What Uploader users with Risk Accepting permissions will see Uploader users with Risk Accepting permissions see a promotion on their tasks when an uploader has escalated it for risk review: * Reviewing Risk, assess the uploader's rationale and decide whether to accept or decline the risk ## Related pages How to upload, submit, and resubmit promotions. How to review promotions and apply decisions. How the upload type affects review behaviour and decisions. How responses to comments train Adclear's agents. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Self-approval Source: https://docs.adclear.ai/self-approval How eligible uploaders approve their own promotions under workspace controls. ## Overview Self-approval lets an eligible uploader approve their own promotion. It is always an active decision. Adclear never approves the promotion automatically. Your workspace decides which content and people are eligible. Adclear checks eligibility again when the uploader approves. ## How eligibility works Your workspace uses one of two models. Ask your admin which is active. Configurable self-approval is managed at the **workspace** level under **Settings > Compliance > Self Approval**. Rules can limit self-approval by: * channel; * product; * jurisdiction; * named users, roles, or everyone; and * AI requirement. A rule must match every attribute configured on it. If several matching rules target the uploader, a named-user rule takes priority over a role rule, then a rule for everyone. Within the selected level, the stricter AI requirement applies. The uploader does not need reviewer permission for the promotion's jurisdiction. Self-approval entitlement and reviewer permission are separate settings. If no rule matches the promotion, Adclear blocks self-approval and the standard review workflow applies. Legacy self-approval is managed at the **organisation** level under **Settings > Review permissions**. The uploader must: * be designated as a self-approver in the organisation's review permissions; and * have reviewer permission for the promotion's market (country). Both conditions must be met. If the uploader does not have reviewer permission for the relevant market, self-approval is blocked even when they are designated as a self-approver. In both models: * the promotion's **Self Approval** setting must be on; * the person approving must be the uploader; and * AI evaluation must finish before approval. ## When self-approval is ineligible Eligibility is determined by the self-approval rules configured for your workspace. These rules define which combinations of channel, product, and jurisdiction are permitted for self-approval, and which users are eligible. If a promotion does not match any active self-approval rule, Adclear displays an ineligibility notice in the promotion sidebar and blocks the self-approval action. The standard review workflow applies instead. If your workspace has no self-approval rules, no promotion is eligible, whatever your role or permissions. See [Configure self-approval rules](/settings/self-approval-rules). Each self-approval rule also sets what is **Required before approval**, controlling how AI evaluation affects self-approval. ### Required before approval Admins choose one requirement for each rule: * **Nothing** — the uploader can self-approve regardless of Adclear AI review comments. * **All Adclear AI comments answered** — the review must finish and every comment on the latest version needs a reply. * **No modifications required** — the review must finish with nothing flagged. Adclear checks the current rule, promotion details, uploader, and AI state when approval is attempted. A visible toggle does not bypass those checks. Self-approval is ineligible when: * the uploader is not designated as a self-approver in the organisation's review permissions; or * the uploader does not have reviewer permission for the promotion's jurisdiction. When ineligible, the promotion must go through the standard reviewer workflow. ## Approve your promotion Create the promotion and submit it for review. If your workspace uses legacy self-approval, turn on **Self Approval** before submitting. Complete any action required by the selected rule, such as responding to AI comments. Check the promotion and the AI findings before making your decision. Select **Approve**. Adclear checks eligibility and records you as both uploader and approver. If the promotion is no longer eligible, Adclear blocks self-approval. Send it through the normal reviewer workflow or ask a workspace admin to check the rule. ## Conditional approval and the next version A reviewer can conditionally approve a promotion and explain what must change. The next version can use self-approval when the conditional workflow permits it. Read the review comment, make the requested changes, and upload the new version. Adclear checks eligibility again before the new version is approved. Two kinds of rule can allow this: * a rule set to **All submissions**, which is the same rule that lets you self-approve ordinary work; or * a rule set to **Conditionally approved resubmissions only**, which allows self-approval *only* here. The second kind means you may be able to self-approve a resubmission after a conditional approval even though you cannot self-approve a first submission. That is deliberate: the reviewer has already described what needs fixing, so a second full review often adds little. It does not change what you can do anywhere else. If your workspace has no rule covering conditionally approved resubmissions, the next version goes through the normal review path with a reviewer assigned. ### You cannot conditionally approve your own work Self-approval lets you approve your own promotion. It does not let you conditionally approve it, and **Conditionally Approve** does not appear on a promotion you uploaded. Conditional approval records a change that someone else expects you to make, so it only makes sense between a reviewer and an uploader. On your own work it would also stop the SLA clock and count as an approval while the content is unfinished. Approve the promotion, or leave it unapproved until it is ready. ## Find self-approved promotions The Promotion Dashboard shows self-approval on an **Approved** status badge instead of in a separate **Self-approved** column. The badge can include: * a person icon when the promotion was self-approved by its uploader; or * a dashed check-circle when the current version was self-approved after the immediately preceding version was conditionally approved. Hover over the badge or focus it with the keyboard to see the approver and, where available, the version number. After a conditional approval, the explanation lists the conditional approval first and the later self-approval second. Use the **Self-approved** filter to find both ordinary self-approvals and self-approvals that follow a conditional approval. A qualifier appears only when: * the promotion is approved; * self-approval was selected; and * the recorded approver is the uploader. Variation-group parent rows do not show an approval qualifier because their variations can have different approval histories. Expand the group to see each variation's qualifier. ## Admin setup Go to **Settings > Compliance > Self Approval** in your workspace to create and manage self-approval rules. See [Configure self-approval rules](/settings/self-approval-rules). Go to **Settings > Review permissions** at the organisation level to designate self-approvers and assign reviewer permissions by market. ## Related pages Understand approved, conditionally approved, and other review outcomes. What uploaders should do after each decision. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Settings Source: https://docs.adclear.ai/settings Configure your account and workspace in Adclear, from personal preferences to compliance workflows and integrations. Adclear's settings are grouped into three areas, based on what each setting affects: Account (you personally), Organisation (everything under your organisation), and Workspace (the workspace you're currently in). The settings sidebar shows the three areas as separate sections, so you always know the scope of the setting you're changing. Account settings follow you everywhere and stay the same across every workspace. Organisation settings apply org-wide, regardless of which workspace you're in. Workspace settings are configured separately for each workspace. Profile, notifications, and security settings tied to you personally. Team members, teams, and other settings that apply across your whole organisation. Compliance rules and integrations for the workspace you're currently in. ## Account These settings apply to you personally, regardless of which organisation or workspace you're in. ### General Update your personal profile so teammates can recognise you across Adclear. Upload a profile photo to replace the default initials. Format: JPEG or PNG. Maximum size: 5 MB. Square images work best. Adclear will crop non-square uploads to fit. Set the first and last name that appears next to your activity. Both your first name and last name should be between 2 and 16 characters. Choose how Adclear looks for you. The Theme selector sits in **Settings > Account > General**, under the Theme heading. Pick Light, Dark, or System, where System follows the light or dark setting on the device you are using. Your choice is saved to your own profile, so it follows you across devices and does not affect anyone else in your organisation. If you do not see the Theme option, ask your Adclear contact to switch it on for your organisation. ### Notifications Control how, and where, Adclear keeps you informed. Receive Adclear alerts directly in Slack. A Compliance Admin or Marketing Admin connects your organisation's Slack workspace once and picks the notification channel. Everyone else only sets their own DM preferences. Click Connect Slack and authorise Adclear to send messages to your Slack workspace. Select which channel should receive workspace-level notifications (announcements that aren't tied to a specific person). Decide which events trigger a direct message to you. Once connected, you can fine-tune your DM preferences: Promotion status changes, and when you're added as a collaborator. New submissions, reviewer assignments (including multi-level approval steps that open for you), escalations, escalation responses, and promotion deadline reminders. Get a DM whenever someone tags you in a comment or note. Heads-up notifications before a review's next due date. Choose which Adclear activity sends you an email. **Assigned as a reviewer** also covers multi-level approval steps that open for you. On a multi-level approval flow, **New promotion submissions** only reaches you if your step isn't open yet, or you're not on the flow. See [Multi-level approval](/multi-level-approval#what-reviewers-receive-when-a-promotion-is-submitted). Email and Slack notifications are configured independently. You can enable both, either, or neither for each event type. ### Security We strongly recommend keeping MFA enabled. It's the single most effective way to prevent unauthorised access to your account. Adclear supports TOTP-based two-factor authentication using apps like 1Password, Authy, or Google Authenticator. Toggle MFA on or off from this page. When enabled, you'll be asked for a 6-digit code from your authenticator app each time you log in. ## Organisation These settings apply across your whole organisation, regardless of which workspace you're in. The section header shows your organisation's name so you always know which one you're configuring. Most Organisation settings are only visible to workspace admins. If a section is missing, ask your admin for access. ### Users Manage who belongs to your organisation, what they can do, and which workspaces they can enter. See every member alongside their role and status (active or pending invite). In multi-workspace organisations, also see the workspaces they can access. Search by name or filter by role and workspace. Send invitations by email. Pending invites appear in the same list until accepted. Assign each member a role and the countries they're permitted to review for. See [How roles work](/how-roles-work) for what each role can do. In multi-workspace organisations, the Workspace Access column shows the workspaces each member can enter as chips. Control which workspaces each member belongs to from here. #### Add an external reviewer External reviewer access lets an outside partner review only the promotions assigned to them. It is an add-on enabled per organisation. Select **Invite team members**, enter their email address, and choose **External Reviewer**. The person must accept the invitation and become an active member before you can set their review permissions. In **Users**, make sure the active member has access to the workspace where they will review. Pending members cannot be added to a workspace. Go to **Settings > Workspace > Compliance > Review Permissions** and find their email address. Set **Reviewable Jurisdictions** to the countries the person may review. Select **All Jurisdictions** if they also need to review promotions without a country. Assign the reviewer directly on a promotion or add the **External Reviewer** role to a reviewer preset. When you apply that preset to a promotion, select the named external reviewers who should take the step. Adclear displays external reviewers by email address. External reviewers cannot access Users or other settings. See [External reviewer access](/external-reviewer) for setup, assignment, and the restricted reviewer experience. An Uploader user with Risk Accepting permissions can formally accept compliance risk on a promotion. They can sign off on a promotion proceeding even when a reviewer has raised a concern. Assign this carefully; it's typically reserved for senior compliance staff or legal. ### Teams Group people in your organisation into teams for reviewer presets and assignment. Teams are available when your organisation has the teams feature enabled. Give the team a name and optional description from **Settings > Organisation > Teams**. Add people manually from your organisation, or use an auto-include rule to add everyone whose email matches a pattern. Turn on auto-include, enter email patterns (for example `@bank.com`), and save. Adclear shows a preview of who joins or leaves before you confirm. Teams can be used as steps in reviewer presets when multi-level approval is enabled for your organisation. When Teams is enabled for your organisation, team membership also appears on the **Users** page. #### Teams on the Users page When Teams is enabled for your organisation, the **Users** page adds a **Teams** column. Each member shows soft chips for their teams. Click a chip to open that team's settings page in a new tab. Use the **Teams** filter to narrow the list to members of a specific team, or choose **No team** to find people who are not in any team yet. Click the **+** button in the Teams column to add someone to a team without leaving the page. Search for a team and select it to add them immediately. #### Filter team members and add them in bulk On a team's page, filter its member list by role, workspace, and how each person joined (added manually, or matched by the auto-include rule). The same filters are available in the **Add members** dialog, so you can narrow the list of eligible people before picking who to add. Open a team from **Settings > Organisation > Teams** and use the **Filter** button above the member table. Filter by role, workspace, or source, or combine several filters at once. Click **Add members**, then use the same **Filter** button inside the dialog to narrow the list of eligible people. With a filter applied, click **Select all** to select every matching person at once instead of picking them one by one. The workspace filter only appears when your organisation has more than one workspace. #### Add members to a workspace When you filter to a single workspace and search by name, the list splits into two groups so you can grant access without leaving the page. Use the Workspace filter to narrow the list to the workspace you want to manage. Type a name. The results split into members already in that workspace, and members in your organisation who don't yet have access to it. In the second group, click Add to grant that member access. They move into the workspace immediately. Pending invites can't be added to a workspace until the invite is accepted. ### API keys Generate the keys your integrations use to call the [Adclear API](/developer/introduction). Open **Settings > Organisation > API keys**. Anyone in your organisation can generate keys and revoke the ones they generated. Compliance Admins and Marketing Admins can also revoke other people's keys. External uploaders and reviewers can't use API keys. API keys isn't available to every organisation yet. If you don't see it under Organisation, ask your Adclear contact. Give the key a name. In multi-workspace organisations, also choose the workspace it works in. You can't change the workspace later. Adclear records everything the key does as the person who generated it. Adclear shows the key once, so copy it before you close the dialog. Keys expire after 30 days by default. You can also choose 90 days, 1 year, or no expiry. You can't change the expiry once you've generated the key. Each key shows as Active, Expired, or Revoked. In its last 7 days, an active key shows how long it has left. Expired and revoked keys stay in the list, greyed out. Before a key expires, generate a new one, update your integration to use it, then revoke the old key. A revoked or expired key stops working immediately. Keys generated here work with both the File API and the Adclear API. See [Key expiry](/developer/authentication#key-expiry) for what your integration sees when a key expires. A key stops working if the person who generated it leaves the organisation or moves to an external role (external uploader or reviewer). Generate integration keys from a long-lived account, and replace them before that person leaves. See [Keys tied to their creator](/developer/authentication#keys-tied-to-their-creator). ### Reviewer Presets Create and manage the review flows that are applied to promotions when they are submitted. Each preset defines which roles take part and, when Teams is enabled for your organisation, can also include teams. Flows can be parallel or sequential. Open **Settings > Organisation > Reviewer Presets**. See [Multi-level approval](/multi-level-approval) for the full guide. If jurisdiction autoapply is enabled for your organisation, the preset dialog also includes a **Jurisdiction Auto-Apply** panel where you map jurisdictions to presets per workspace. See [Jurisdiction autoapply](/multi-level-approval#jurisdiction-autoapply) for details. ## Workspace These settings apply only to the workspace you're currently viewing. If you switch workspaces, you'll see a different set of values here. The Workspace section header doubles as a workspace switcher. If your organisation has more than one workspace, click the header to switch, and the settings below update to that workspace's values. If your organisation has only one workspace, this header isn't shown at all. ### Compliance Configure how reviews are handled in your workspace. Set the number of working days your team has to review a promotion after submission. For example, setting this to 5 means reviewers should complete their review within five working days of submission. The SLA is used to drive deadline reminders. Reviewers and risk acceptors will get nudges as the deadline approaches. Fine-tune who can review what. * See every reviewer and which countries they're permitted to review. Invited reviewers appear here after they accept their invitation and have access to the current workspace. Use **Reviewable Jurisdictions** to choose the countries they may review. Workspaces using legacy review permissions also manage the self-approver setting here. Workspaces using configurable self-approval rules manage eligibility on the separate **Self Approval** page. See [Self-approval](/self-approval). Customise the list of reasons reviewers can choose from when rejecting a promotion. Click Add reason and enter a short, descriptive label. Hover an existing reason and click the pencil icon to rename it. Use the trash icon to remove reasons you no longer use. Default reasons always appear at the top of the list, and "Other" is always pinned to the bottom, regardless of how you order custom reasons. ### External Generate a shareable URL that affiliates and external partners can use to submit promotions directly into your workspace, with no Adclear login needed. The link opens the external submission form, which feeds straight into your workspace's submissions queue. Click the copy button next to the URL to grab the link in one click. Submissions arrive in your workspace with the partner already attributed. ### Affiliates Set workspace-wide defaults that pre-fill when a new affiliate submission comes in. These defaults save reviewers time and keep submission data consistent. * Default Channel - the ad channel the promotion will run on, for example social, display, or email. * Default Product - the product being promoted. * Default Jurisdiction - the country or region the promotion is intended for. * Default Targeting - the target markets for the promotion. The Default Targeting field may not be visible in every workspace. If you don't see it, it isn't currently enabled for your account. Affiliates can still override these defaults on individual submissions. They're starting values, not locks. ### Discord Invite the Adclear bot from **Settings → Workspace → Discord** (`/settings/workspace/discord`). You'll need server admin permissions to add the bot. Configure monitored servers, channels, usernames, affiliate link patterns, and Approved Copy from the affiliate detail page (`/affiliates/:id?view=settings`). For per-affiliate Discord configuration and message review workflows, see [Discord monitoring](/monitoring/discord-monitoring). ## Still need help? Reach the Adclear team if anything in this guide doesn't match what you see. Some settings are only visible to workspace admins. If a section is missing, ask your admin for access. # Configure self-approval rules Source: https://docs.adclear.ai/settings/self-approval-rules Create workspace rules that control who can self-approve which promotions. ## Before you start You need access to workspace compliance settings. Open **Settings**, then go to **Workspace**, **Compliance**, and **Self Approval**. This page applies to workspaces using configurable self-approval rules. Workspaces using legacy review permissions manage self-approvers from the review permissions page. ## Create a rule Select **Add rule** and enter a name that explains its purpose. Apply the rule to every channel or select the channels it covers. Apply the rule to every product or select the products it covers. Apply the rule to every jurisdiction or select the jurisdictions it covers. Target named users, a role, or everyone in the workspace. Select **Nothing**, **All Adclear AI comments answered**, or **No modifications required**. Select **All submissions** or **Conditionally approved resubmissions only**. New rules start at **All submissions**. Review the scope and save the rule. Adclear applies it to future self-approval checks in this workspace. ## Applies to This setting controls *when* a rule grants self-approval. | Setting | When the rule applies | | - | - | | All submissions | Any submission the rule matches | | Conditionally approved resubmissions only | Only the next version of a promotion a reviewer conditionally approved | The second option covers a specific need: after a reviewer conditionally approves a promotion, the uploader is fixing something the reviewer already described, so a second full review often adds little. This setting lets those resubmissions be self-approved without granting self-approval on ordinary work. A rule set to **Conditionally approved resubmissions only** is ignored everywhere else, so it never widens who can self-approve a first submission. To give someone both, create two rules. Two ways to use it: * **One broad rule.** Cover all users and all products, channels and jurisdictions, so any uploader can self-approve a fix after a conditional approval. If no rule grants this yet, the Self Approval page offers to create this rule for you. * **Scoped rules.** Name specific users or a role, and narrow the products, channels or jurisdictions, when only some people or some content should work this way. This setting appears only where the conditionally approved status is available in your organisation. ## How matching rules are selected A rule must match every dimension configured on it. For example, a rule scoped to one product and one jurisdiction applies only when both match. Rules that do not apply to the submission at hand are set aside first. A rule limited to conditionally approved resubmissions is not considered for an ordinary submission. Among the rules that remain: 1. a rule for the named user takes priority; 2. otherwise, a rule for the user's role takes priority; 3. otherwise, a rule for everyone is used. If several rules match at that same level, the stricter AI requirement applies. Adclear does not rank one rule above another because it has a narrower product, channel, or jurisdiction scope. ## AI requirements | Setting | What the uploader must do | | - | - | | Nothing | Approve regardless of Adclear AI review comments | | All Adclear AI comments answered | Reply to every comment on the latest version | | No modifications required | Finish the review with nothing flagged | ## Check a rule After saving: * confirm the intended users or roles are included; * test a promotion that matches every selected dimension; * test one promotion outside the scope; * confirm the expected AI requirement is enforced; and * for a rule limited to conditionally approved resubmissions, confirm it grants self-approval after a conditional approval and not on a first submission. An empty rule set does not grant self-approval. Add at least one matching rule before enabling self-approval on promotions. ## Related pages The uploader workflow and eligibility model. Other workspace and organisation settings. # Set up SSO with Microsoft Entra ID Source: https://docs.adclear.ai/sso/azure Connect Microsoft Entra ID as your organisation's identity provider so your team signs in to Adclear with their existing Microsoft accounts. Single sign-on (SSO) lets your team sign in to Adclear through Microsoft Entra ID (formerly Azure Active Directory), using the accounts and access policies you already manage there. Adclear supports Entra ID through SAML. SSO is an organisation-level setting that applies to everyone on your email domain. Setting it up is a joint effort between your IT team and Adclear support. ## Before you start Make sure you have: * Administrative access to the [Microsoft Azure portal](https://azure.microsoft.com/en-us/get-started/azure-portal) * Permission to create and configure enterprise applications * Permission to assign users to an enterprise application * The email domain, or domains, your team signs in with (for example `@company.com`) You'll also need a set of connection values (an Identifier and a Reply URL) that are unique to your organisation. Contact Adclear support to generate them before you begin. You'll enter them in Entra ID during setup. ## Set up the app in Entra ID Adclear support provides the **Identifier (Entity ID)** and **Reply URL (Assertion Consumer Service URL)** in the steps below. Ask our team for these values for your organisation before you start. In the Azure portal, go to **Enterprise applications** and select **New application**. On the **Browse Microsoft Entra Gallery** page, select **Create your own application**. Give the app a name your team will recognise, such as "Adclear", choose **Integrate any other application you don't find in the gallery (Non-gallery)**, then select **Create**. Open **Assign users and groups**, then select **Add user/group**. Choose the people or groups who should be able to sign in to Adclear, then select **Assign**. For advanced group assignment, see [Microsoft's documentation](https://learn.microsoft.com/en-us/entra/identity/enterprise-apps/assign-user-or-group-access-portal?pivots=portal). Under **Manage**, select **Single sign-on**, then choose **SAML**. In the **Basic SAML Configuration** section, select **Edit** and enter the values Adclear support gave you: * **Identifier (Entity ID)**: the value provided by Adclear * **Reply URL (Assertion Consumer Service URL)**: the value provided by Adclear Select **Save** and close the panel. In the **Attributes & Claims** section, select **Edit** and confirm the email claim is present. Entra ID usually configures these by default, but it's worth checking to avoid sign-in errors. | Claim | Value | | - | - | | `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress` | `user.mail` | | `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname` | `user.givenname` | | `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname` | `user.surname` | The email claim is required. Name claims are optional. If your organisation uses custom attribute names, update the **Value** column with your own attribute paths. In the **SAML Certificates** section, copy the **App Federation Metadata URL**. You'll send this to Adclear support in the next section. ## What Adclear needs from you To finish the connection, send Adclear support: 1. The **App Federation Metadata URL** you copied from the SAML Certificates section 2. The **email domain, or domains**, this SSO applies to (for example `@company.com`). Tell us whether to include subdomains such as `@team.company.com`. ## What happens next Once you've sent those details, Adclear support: 1. Configures the SSO connection on our side 2. Tests it to confirm sign-in works end to end 3. Confirms with you when it's live Your team can then sign in to Adclear with their Microsoft credentials. If existing users have email addresses on the SSO domain, they'll need to sign in through Entra ID once SSO is enabled. If that applies to your team, we recommend switching it on during off-peak hours. ## Troubleshooting Check that each person is assigned to the enterprise application in Entra ID. Confirm the attribute mappings, especially the email address claim. Confirm the Identifier and Reply URL from Adclear were entered exactly as provided. For anything else, contact Adclear support with details of the error you're seeing. ## Related pages Use Okta as your identity provider instead. Understand what each role can do once your team signs in. # Set up SSO with Okta Source: https://docs.adclear.ai/sso/okta Connect Okta as your organisation's identity provider so your team signs in to Adclear with their existing Okta accounts. Single sign-on (SSO) lets your team sign in to Adclear through Okta, using the accounts and access policies you already manage there. Adclear supports Okta through SAML 2.0. SSO is an organisation-level setting that applies to everyone on your email domain. Setting it up is a joint effort between your Okta administrator and Adclear support. ## Before you start Make sure you have: * Administrative access to your Okta Admin Console * Permission to create and configure app integrations in Okta * The email domain, or domains, your team signs in with (for example `@company.com`) You'll also need a set of connection values (a sign-on URL and an audience URI) that are unique to your organisation. Contact Adclear support to generate them before you begin. You'll enter them in Okta during setup. ## Set up the app in Okta Adclear support provides the **Single sign-on URL** and **Audience URI (SP Entity ID)** in the steps below. Ask our team for these values for your organisation before you start. In the Okta Admin Console, go to **Applications** and select **Create App Integration**. Choose **SAML 2.0** as the sign-in method, then select **Next**. Give the app a name your team will recognise, such as "Adclear" or "Adclear Compliance Platform", then select **Next**. On the **Configure SAML** screen, enter the values Adclear support gave you: * **Single sign-on URL**: the value provided by Adclear * **Audience URI (SP Entity ID)**: the value provided by Adclear Enable **Use this for Recipient URL and Destination URL**. Under **Attribute Statements**, add the following user attributes so Adclear receives each person's name and email: | Name | Value | | - | - | | `mail` | `user.email` | | `firstName` | `user.firstName` | | `lastName` | `user.lastName` | If your organisation stores these fields in custom Okta profile attributes, replace the Okta expressions in the **Value** column with your own attribute paths. Review the configuration and select **Save**. Okta creates the application and opens its settings. Open the **Sign On** tab and select **View IdP metadata**. Copy the metadata URL. You'll send this to Adclear support in the next section. On the **Assignments** tab, assign the users or groups who should be able to sign in to Adclear. Add any access policies your organisation requires. ## What Adclear needs from you To finish the connection, send Adclear support: 1. The **IdP metadata URL** you copied from the Sign On tab 2. The **email domain, or domains**, this SSO applies to (for example `@company.com`). Tell us whether to include subdomains such as `@team.company.com`. ## What happens next Once you've sent those details, Adclear support: 1. Configures the SSO connection on our side 2. Tests it to confirm sign-in works end to end 3. Confirms with you when it's live Your team can then sign in to Adclear with their Okta credentials. ## Related pages Understand what each role can do once your team signs in. Manage members, workspaces, and other organisation settings. # System status alerts Source: https://docs.adclear.ai/system-status-alerts What the banner at the top of Adclear means when there's an active incident or scheduled maintenance. ## Overview If Adclear is experiencing a service disruption or has scheduled maintenance in progress, you may see an alert banner at the top of the app. It tells you what's affected and links to the [Adclear status page](https://status.adclear.ai) for details and updates. This alert only appears while an incident or maintenance window is active. If everything is running normally, you won't see it. ## What the banner tells you The banner shows: * What's affected (for example, AI reviews, email notifications, or the app generally) * Whether the issue is degraded performance or a full outage * The current status of the fix (investigating, identified, monitoring, or resolved) * A link to view the incident on the status page ## Dismissing the banner You can dismiss the banner by clicking the close icon. Once dismissed, it won't reappear for that incident, even if the status page posts a new update. Check the [Adclear status page](https://status.adclear.ai) directly if you want to follow an incident's progress after closing the banner. ## Where to check for updates The [Adclear status page](https://status.adclear.ai) is the source of truth for incident and maintenance updates, including issues that may not surface as an in-app banner. # Upload types Source: https://docs.adclear.ai/upload-types The four ways to upload promotions in Adclear, when to use each, and how each one behaves under review. ## Overview Every promotion in Adclear is created using one of four upload types. Picking the right type at the start saves time and prevents avoidable review delays. Using the wrong one is one of the most common issues we see. This page is the canonical reference for upload types. Both the [Marketing Guide](/marketing/overview) and the [Compliance Guide](/compliance/overview) refer back to it. **Quick rule of thumb:** * **Single** = 1 promotion, 1 approval * **Carousel** = 1 promotion (one or more frames), 1 approval * **Variations** = multiple promotions (same core message), individual approvals * **Batch** = multiple unrelated promotions, individual approvals One asset submitted as one promotion. One approval decision covers the whole thing. One or more frames grouped into a single promotion. Reviewed and approved as one unit. Multiple linked promotions - same core message, different formats or markets. Each reviewed independently. Multiple unrelated standalone promotions created in one go. Each reviewed and approved independently. ## Type comparison | Upload Type | What it creates | Review behaviour | Use when | | - | - | - | - | | Single | 1 promotion from 1 asset | 1 approval decision | You're uploading a single product page or a one-off display ad | | Carousel | 1 promotion from one or more frames | 1 approval covers all frames, you cannot approve individually | You have an Instagram or LinkedIn carousel where every frame is part of the same story | | Variations | Multiple linked promotions | Each variation reviewed independently - approve one, some, all, or none | You have 10 emails you want to A/B test, or one banner localised for 5 markets | | Batch | Multiple unlinked standalone promotions | Each item independent, no linkage | You have 20 unrelated affiliate banners to upload at the start of a promotion month | ## How decisions apply by type This table is most relevant if you are a reviewer. It shows how a single review decision is scoped depending on how the promotion was uploaded. | Upload Type | What it contains | How decisions apply | | - | - | - | | Single | 1 asset (image, video, PDF, text, website, or Figma frame) | 1 approval covers the whole promotion | | Carousel | One or more frames as 1 promotion | 1 approval covers all frames - you cannot approve frames individually | | Variations | Multiple linked promotions (same core message, different formats or jurisdictions) | Each variation reviewed independently - approve one, some, all, or none | | Batch | Multiple standalone, unlinked promotions | Each item reviewed independently with no linkage | ## Next steps How to create each upload type step by step. How to review each upload type and apply decisions. How to make sure Adclear can assess what you upload. Every status a promotion can have and who acts next. ## Still need help? Contact support at [support@adclear.ai](mailto:support@adclear.ai). # Batch Source: https://docs.adclear.ai/upload-types/batch Multiple unrelated standalone promotions uploaded in one go, each reviewed independently. ## What it is Bulk upload of multiple standalone, unrelated promotions created in one go. Each is reviewed and approved independently with no linkage between items. ## When to use it * At the start of a promotion month, you upload 20 affiliate banners covering different products and offers * You have multiple unrelated items to upload at once and want to save time ## Common mistake Using Batch when [Variations](/upload-types/variations) was the right choice. If your assets are variants of the same promotion, Variations gives reviewers better context and tracking. ## Marketing example At the start of a promotion month, you upload 20 affiliate banners covering different products and offers in one go, all unrelated to each other. ## How decisions apply | What it contains | How decisions apply | | - | - | | Multiple standalone, unlinked promotions | Each item reviewed independently with no linkage | # Carousel Source: https://docs.adclear.ai/upload-types/carousel One or more frames grouped into a single promotion, reviewed and approved as one unit. ## What it is One or more assets grouped into a single promotion. All frames are reviewed and approved as one unit. ## When to use it * You have an Instagram or LinkedIn carousel where every frame is part of the same story * The frames only make sense read in sequence ## Common mistake Using Carousel instead of [Variations](/upload-types/variations) or [Batch](/upload-types/batch) when you actually need the ability to approve frames individually. Once it's a carousel, a single decision covers everything. ## Important behaviour All frames in a carousel are reviewed as a single unit. If you need to update one frame, you must re-upload the full set of frames as a new version. You cannot approve frames individually. If you need independent approval per asset, use [Variations](/upload-types/variations) instead. ## Marketing example A five-slide LinkedIn carousel announcing a new product feature, where the slides only make sense read in sequence. ## How decisions apply | What it contains | How decisions apply | | - | - | | One or more frames as 1 promotion | 1 approval covers all frames - you cannot approve frames individually | # Single Source: https://docs.adclear.ai/upload-types/single One asset submitted as one promotion, with one approval decision. ## What it is One individual asset - image, video, PDF, text, website link, or Figma frame - submitted as one promotion. One approval decision covers the whole thing. ## When to use it * You're uploading a single product page or a one-off display ad * The asset stands alone and doesn't need to be grouped with others ## Common mistake Splitting one webpage into multiple Singles. This removes the context the reviewer team needs to see the full page together. If your content is a multi-frame sequence, use [Carousel](/upload-types/carousel) instead. ## Marketing example A new homepage hero banner that goes live on its own. ## How decisions apply | What it contains | How decisions apply | | - | - | | 1 asset (image, video, PDF, text, website, or Figma frame) | 1 approval covers the whole promotion | # Variations Source: https://docs.adclear.ai/upload-types/variations Multiple linked promotions with the same core message, each reviewed independently. ## What it is Linked but independently reviewable promotions. For example, the same ad sized for different channels, or localised for different jurisdictions. Each variation gets its own approval decision, but they're linked so the reviewer can see the context. ## When to use it * You have 10 emails you want to A/B test * One banner localised for 5 markets * Same core message adapted for different formats or audiences ## Common mistake Using Variations as a general grouping tool for completely different pages - such as a hub page and a separate product page. Variations are for the same promotion in different forms. If you just want to group unrelated items, use a tag instead. ## Feedback matters Apply comments and status decisions to each variation individually so Adclear can learn from each one accurately. See [Helping Adclear Learn](/how-you-help-adclear-learn) for more on why per-variation feedback matters. ## Marketing example You've written 10 subject line variants for the same email send and you want to A/B test them. Each variant gets its own approval, but they're linked so the reviewer can see the context. ## How decisions apply | What it contains | How decisions apply | | - | - | | Multiple linked promotions (same core message, different formats or jurisdictions) | Each variation reviewed independently - approve one, some, all, or none |