Install
openclaw skills install reveal-feedbackInteract with Reveal feedback infrastructure to manage products, create review tasks, read AI-analyzed user feedback, get sentiment insights, view submissions, manage notifications, register webhooks, and generate marketing content (scripts, images, videos). Use when the user asks about product feedback, user reviews, testing tasks, sentiment analysis, top issues, review submissions, marketing videos, marketing images, video scripts, or anything related to their Reveal account.
openclaw skills install reveal-feedbackReveal is a universal feedback platform where human reviewers screen-record themselves using products and provide AI-analyzed feedback. This skill connects to the Reveal REST API to manage the full feedback lifecycle — from collecting reviews to generating marketing content from that feedback.
All API calls require the REVEAL_API_KEY environment variable. The key is a vendor API key generated from the Reveal dashboard under Settings → API Keys.
Every request uses this header:
Authorization: Bearer $REVEAL_API_KEY
Base URL: https://www.testreveal.ai/api/v1
(Override with REVEAL_BASE_URL env var if set.)
Fetch products, active review tasks, and unread notifications to give the user a quick status update.
Steps:
/products to list vendor products/review-tasks?status=active to list active tasks/notifications?unread=true&limit=5 to get unread notificationsFetch AI-aggregated insights: top issues, top positives, sentiment distribution, and suggestions.
Steps:
/products to find the product ID matching the user's request/insights/{productId} to get aggregated insightsFetch quantitative metrics for a product.
Steps:
/products/{productId}/analyticsGet individual review submissions with transcripts, AI analysis, sentiment, and issue counts.
Steps:
/review-tasks?status=active&limit=5 to find the relevant task (or use a task ID if provided)/review-tasks/{taskId}/submissions to get all submissionsCreate a new user-testing task so reviewers can test a product.
Steps:
/products to find the product matching the user's description/review-tasks with body:{
"title": "extracted title",
"productId": "matched product ID",
"requiredReviewers": 5,
"instructions": {
"objective": "what the reviewer should accomplish",
"steps": "step-by-step instructions",
"feedback": "what feedback to focus on"
}
}
Close, pause, or modify an existing review task.
Steps:
/review-tasks/{taskId} with fields to update (status, title, description, requiredReviewers)Show all products registered on the vendor's Reveal account.
Steps:
/products?limit=50Check for new activity on Reveal.
Steps:
/notifications?unread=true&limit=20/notifications with {"markAllRead": true}Set up real-time event notifications.
Steps:
/webhooks with body:{
"url": "https://user-provided-url",
"events": ["review.submitted", "review.analyzed", "task.completed", "video.generated"]
}
Steps:
/webhooksTurn raw user feedback into polished, persuasive marketing statements.
Steps:
/marketing/summarize-highlights with body:{
"highlights": ["feedback string 1", "feedback string 2", "..."]
}
summary — an array of marketing-ready highlight stringsGenerate a 30-second video script from product feedback or the product description.
Steps:
/products to find the product ID/insights/{productId} to extract positive highlights/marketing/generate-script with body:{
"productId": "the product ID",
"positiveHighlights": ["highlight 1", "highlight 2"],
"scriptType": "problem-solution"
}
positiveHighlights is optional; if omitted the product description is usedscriptType options: problem-solution, empathetic, aspirational, story-drivenscript — a formatted script with [Scene X: Title] headers, Visual and Narration per sceneCreate a marketing image for a product with AI.
Steps:
/products to find the product ID/marketing/generate-image with body:{
"productId": "the product ID",
"prompt": "Modern dashboard showcasing the key analytics features",
"styleName": "Modern Gradient",
"tagline": "Insights that drive growth"
}
prompt is required — the creative direction for the imagestyleName and tagline are optionalimageUrl — a public URL to the generated imageParse a script into structured scenes and apply edits — change narration/visuals, add new scenes, or remove scenes.
Steps:
/marketing/edit-script with body:{
"script": "the current script text",
"operations": [
{ "action": "edit", "sceneNumber": 3, "narration": "Updated narration text" },
{ "action": "add", "position": 4, "title": "New CTA", "visual": "Happy customer using phone", "narration": "Try it free today!" },
{ "action": "remove", "sceneNumber": 6 }
]
}
operations is optional — omit it to just parse the script into structured scenesaction: "edit" — update title, visual, or narration of an existing scene (only include fields to change)action: "add" — insert a new scene at position (or append if omitted)action: "remove" — delete a scene by number (scenes renumber automatically)script string and a scenes array with structured scene objectsFind stock images and videos from the Pictory library to use in specific video scenes.
Steps:
/marketing/media-search?keyword=business+meeting&page=1
keyword is required — the search termcategory and page are optionalresults — array of { url, type, thumbnail }url values in the customMediaUrls field of generate-video to assign media to specific scenesCreate a full marketing video from a script. This is a multi-step async workflow.
Steps:
/marketing/generate-video with body:{
"productId": "the product ID",
"script": "the full script with [Scene X: Title] headers",
"voiceOver": { "speaker": "Jackson", "speed": 100 },
"musicVolume": 0.4,
"customMediaUrls": {
"1": "https://stock-media-url-for-scene-1",
"3": "https://stock-media-url-for-scene-3"
}
}
customMediaUrls is optional — map scene numbers to stock media URLs from media-search{ "data": { "jobId": "...", "accessToken": "...", "productId": "..." } }/marketing/render-video/{jobId} with body:{
"accessToken": "the accessToken from step 4",
"webhook": "https://optional-callback-url"
}
/marketing/video-status?jobId={jobId}
Response: { "data": { "status": "in-progress" | "completed" | "failed", "videoUrl": "..." } }
status is completedvideoUrl contains the final video URLAll API responses follow this structure:
{ "data": { ... } }{ "error": { "code": "ERROR_CODE", "message": "description" } }video-status rather than assuming immediate completionaccessToken from generate-video — it's needed for render-video