Reveal Feedback Infrastructure
Reveal 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.
Authentication
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.)
Capabilities
1. Check dashboard overview
Fetch products, active review tasks, and unread notifications to give the user a quick status update.
Steps:
- GET
/products to list vendor products
- GET
/review-tasks?status=active to list active tasks
- GET
/notifications?unread=true&limit=5 to get unread notifications
- Summarize: product count, active tasks with submission progress, and recent notifications
2. Get feedback insights for a product
Fetch AI-aggregated insights: top issues, top positives, sentiment distribution, and suggestions.
Steps:
- GET
/products to find the product ID matching the user's request
- GET
/insights/{productId} to get aggregated insights
- Present: sentiment breakdown, top issues ranked by frequency, top positives, unique issue count
3. Get product analytics
Fetch quantitative metrics for a product.
Steps:
- GET
/products/{productId}/analytics
- Present: total submissions, analyzed count, average completion rate, sentiment distribution, top issues, top positives
4. View review submissions
Get individual review submissions with transcripts, AI analysis, sentiment, and issue counts.
Steps:
- GET
/review-tasks?status=active&limit=5 to find the relevant task (or use a task ID if provided)
- GET
/review-tasks/{taskId}/submissions to get all submissions
- For each submission, present: status, sentiment, issue count, positive count, transcript preview
5. Create a review task
Create a new user-testing task so reviewers can test a product.
Steps:
- GET
/products to find the product matching the user's description
- Extract from the user's message: title, objective, steps, feedback focus, reviewer count
- POST
/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"
}
}
- Confirm creation with task ID and details
6. Update a review task
Close, pause, or modify an existing review task.
Steps:
- PATCH
/review-tasks/{taskId} with fields to update (status, title, description, requiredReviewers)
- Confirm the update
7. List products
Show all products registered on the vendor's Reveal account.
Steps:
- GET
/products?limit=50
- Present each product: name, category, platform support (web/mobile), website
8. Get notifications
Check for new activity on Reveal.
Steps:
- GET
/notifications?unread=true&limit=20
- Present notification messages with timestamps
- If user says to mark as read: PATCH
/notifications with {"markAllRead": true}
9. Register a webhook
Set up real-time event notifications.
Steps:
- POST
/webhooks with body:
{
"url": "https://user-provided-url",
"events": ["review.submitted", "review.analyzed", "task.completed", "video.generated"]
}
- Return the webhook ID and signing secret. Instruct user to store the secret securely.
10. List webhooks
Steps:
- GET
/webhooks
- Present each webhook: URL, subscribed events, active status
11. Summarize feedback into marketing highlights
Turn raw user feedback into polished, persuasive marketing statements.
Steps:
- Collect the positive feedback strings (from insights or submissions)
- POST
/marketing/summarize-highlights with body:
{
"highlights": ["feedback string 1", "feedback string 2", "..."]
}
- Response contains
summary — an array of marketing-ready highlight strings
12. Generate a marketing video script
Generate a 30-second video script from product feedback or the product description.
Steps:
- GET
/products to find the product ID
- Optionally GET
/insights/{productId} to extract positive highlights
- POST
/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 used
scriptType options: problem-solution, empathetic, aspirational, story-driven
- Response contains
script — a formatted script with [Scene X: Title] headers, Visual and Narration per scene
13. Generate a marketing image
Create a marketing image for a product with AI.
Steps:
- GET
/products to find the product ID
- POST
/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 image
styleName and tagline are optional
- Response contains
imageUrl — a public URL to the generated image
14. Edit and refine a script
Parse a script into structured scenes and apply edits — change narration/visuals, add new scenes, or remove scenes.
Steps:
- POST
/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 scenes
action: "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)
- Response contains both the updated
script string and a scenes array with structured scene objects
15. Search stock media for video scenes
Find stock images and videos from the Pictory library to use in specific video scenes.
Steps:
- GET
/marketing/media-search?keyword=business+meeting&page=1
keyword is required — the search term
category and page are optional
- Response contains
results — array of { url, type, thumbnail }
- Use the
url values in the customMediaUrls field of generate-video to assign media to specific scenes
16. Generate a marketing video (full pipeline)
Create a full marketing video from a script. This is a multi-step async workflow.
Steps:
- Generate a script first (capability 12) or have the user provide one
- Optionally refine the script (capability 14) — edit scenes, add/remove as needed
- Optionally search for stock media (capability 15) to use in specific scenes
- POST
/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
- Scenes without a custom URL will get auto-matched stock media based on the visual description
Response:
{ "data": { "jobId": "...", "accessToken": "...", "productId": "..." } }
- Wait ~30 seconds, then trigger rendering:
PUT
/marketing/render-video/{jobId} with body:
{
"accessToken": "the accessToken from step 4",
"webhook": "https://optional-callback-url"
}
- Poll for completion:
GET
/marketing/video-status?jobId={jobId}
Response: { "data": { "status": "in-progress" | "completed" | "failed", "videoUrl": "..." } }
- Keep polling every 15-30 seconds until
status is completed
- When complete,
videoUrl contains the final video URL
Response format
All API responses follow this structure:
- Success:
{ "data": { ... } }
- Error:
{ "error": { "code": "ERROR_CODE", "message": "description" } }
Guardrails
- Never expose or log the API key in responses to the user
- If an API call fails with 401, tell the user their API key may be invalid or expired
- If a product is not found, suggest listing products first
- When creating review tasks, always confirm the details with the user before sending the POST
- Do not fabricate feedback data — only report what the API returns
- Marketing endpoints require a vendor API key — reviewer keys will get a 403
- Video generation is async — always poll
video-status rather than assuming immediate completion
- When generating videos, save the
accessToken from generate-video — it's needed for render-video