The short version
- Read your reviews and send review requests from your own code, Zapier or your AI assistant.
- Hear about new reviews the second they come in, with signed webhooks.
- Connect GoHighLevel, HubSpot, Jobber, Housecall Pro, Pipedrive, Salesforce or Zoho with no code at all.
Quick start
Make a key in videoreview under Settings, Developers, API keys. Send it as a bearer token. Everything is JSON.
curl https://dash.videoreview.co/api/v1/reviews \
-H "Authorization: Bearer vrk_your_key" The base address is https://dash.videoreview.co/api/v1.
Keys
A key works as the person who made it, and only while they still have access and the account is on Pro or Agency. Remove it under Settings, Developers and it stops at once.
Agencies can make a key for one business or for every business. When a key opens more than one, pass business (the business's link name, like acme-roofing) with each call. GET /me lists them.
| Call | What it does |
|---|---|
GET /me | Who the key belongs to, and its businesses with their record links and Google rating. |
Reviews
| Call | What it does |
|---|---|
GET /reviews | Newest first. Filters: kind (video, text), status (new, wall, hidden, held), starred, since (a date). limit up to 100; next page with before=the next value. |
GET /reviews/{id} | One review in full. |
PATCH /reviews/{id} | Change status (wall puts it on your wall), starred (shows first) or shared (its public link). |
A review has the person's name, email, rating, what they said (the transcript, for videos), the best quote, a summary, where it came from, and links. video_url and poster_url are signed links that work for 7 days without a key, so Zapier can copy the video to Drive, YouTube or social.
{
"id": "k3x9q2m7a1b4c8d0",
"business": "acme-roofing",
"kind": "video",
"status": "wall",
"name": "Sam Rivera",
"email": "[email protected]",
"rating": 5,
"text": "They showed up on time and the roof looks perfect.",
"quote": "The roof looks perfect.",
"seconds": 34,
"source": "email",
"video_url": "https://dash.videoreview.co/api/dl/k3x9…/video?e=…&s=…",
"share_url": null,
"created_at": "2026-11-08T17:00:00.000Z"
}
Review requests
Requests go out from the business's own email account (connected under Settings, Sending), never from ours. Anyone who already reviewed, was asked in the last 30 days, or unsubscribed is skipped. Up to 200 a day per business, 50 per call.
| Call | What it does |
|---|---|
POST /requests | Send one (email, name) or many (people: a list of { name, email }). Optional subject and message; [First name] is filled in. Leave them out to use the business's saved words. |
GET /requests | Newest first, with status: sent, opened, clicked, reviewed or failed. status=waiting for no review yet. |
GET /requests/{id} | One request. |
POST /requests/{id}/remind | One reminder (or a retry, for one that failed). |
If the business has an automation for Zapier and the API (Requests, Automations), requests without your own subject and message follow it: they wait, send and remind on its schedule, and come back as scheduled with each one's send_at.
curl -X POST https://dash.videoreview.co/api/v1/requests \
-H "Authorization: Bearer vrk_your_key" \
-H "Content-Type: application/json" \
-d '{ "name": "Sam Rivera", "email": "[email protected]" }'
Stats and links
| Call | What it does |
|---|---|
GET /stats | Pass days to choose how far back (default 30). Returns reviews, video and written, average rating, and the share of requests sent, opened and reviewed. |
GET /record-link | The link customers open to record, plus versions for a QR code and your website. |
Webhooks
Add an address under Settings, Developers, Webhooks (or POST /webhooks with url and events). We POST JSON to it when:
review.received: a new video or written review is ready (videos after their transcript and cleanup).request.sent: a review request went out.request.opened: a customer opened their request for the first time.
{ "id": "evt_123", "type": "review.received", "created": "…", "business": { "id": "…", "name": "Acme Roofing", "slug": "acme-roofing" }, "data": { …the review… } } Every body is signed. Check VideoReview-Signature: t=<seconds>,v1=<hex>: the HMAC-SHA256 of <t>.<body> with your webhook's secret.
const [t, v1] = header.split(',').map((p) => p.split('=')[1])
const ok = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex') === v1 Answer with any 2xx. Failures retry for a day (1 minute, 5, 30, then hours apart). After 50 failures in a row the webhook turns off; Send a test turns it back on.
AI assistants (MCP)
Connect Claude, ChatGPT, Cursor or any MCP client to https://dash.videoreview.co/mcp. Claude and ChatGPT sign you in and ask which businesses it may use; other clients can use an API key.
- Claude: Settings, Connectors, Add custom connector, paste the address.
- ChatGPT: Settings, Apps and Connectors, Create, paste the address.
It can list and read reviews, put them on your wall, show stats and your record link, and send review requests. Before any email goes out it shows you exactly who gets what and waits for your yes. It can never touch your plan, logins or settings.
Zapier
Connect videoreview in Zapier with an API key. Triggers: New Review and Review Request Opened. Action: Send Review Request. Search: Find Review. That covers ServiceTitan, monday.com, Airtable, Google Sheets, Slack and 7,000 more apps.
CRMs
No code needed: connect your CRM under Settings, Integrations, then set up an automation under Requests, Automations. Pick what sends a request (a won deal, a stage, a finished job, a paid invoice), how long to wait, and the reminders. When the review comes in, it's added to that customer's record.
| CRM | Sends a request when | The review comes back as |
|---|---|---|
| An opportunity is marked Won, or reaches a stage | A note and the tag videoreview on the contact | |
| A deal reaches a stage | A note on the contact and the deal | |
| A job is closed, or an invoice is paid | A note on the client | |
| A job is complete | A note on the job | |
| A deal is marked Won, or reaches a stage | A note on the person and deal | |
| An opportunity is Closed Won, or reaches a stage | A completed task on the contact and opportunity | |
| A deal reaches a stage (like Closed Won) | A note on the contact | |
| A project is booked or paid, through Zapier | Your own Zap decides |
Only deals and jobs from after you turn it on count, so nobody from before gets an email.
Coming soon
ServiceTitan
JobNimbus
AccuLynx
Workiz
ServiceM8
Keap
ActiveCampaign
monday.com
Close
Follow Up Boss
Square
Vagaro
Boulevard
Clio
Aircall
RingCentral
GoTo Connect
Zoom Phone
Nextiva
Using one of these today? Connect it through Zapier until it's built in.
Errors and limits
Errors come back as { "error": { "status": 400, "message": "…" } } with a message you can show a person.
| Status | Means |
|---|---|
| 400 | Something in the call is missing or wrong; the message says what. |
| 401 | Missing, unknown or removed key. |
| 403 | The account isn't on Pro or Agency. |
| 404 | No such review, request or call. |
| 409 | Not possible right now, like no email connected yet. |
| 422 | The business's mail server said no, or the day's limit is reached. |
| 429 | More than 120 calls a minute on one key. |