Yes. VideoTestimonials has a REST API for reading and writing your spaces and testimonials, plus webhooks that tell your systems when something changes. Use it to send testimonials from your own forms or CRM, pull approved testimonials into a custom page, or approve testimonials from another tool. The full endpoint reference is at /docs/api.
Base URL and authentication
All endpoints live under:
https://app.videotestimonials.video/api/v1
Every request needs an API key in the Authorization header:
Authorization: Bearer sk_live_your_key
Create keys in Dashboard โ Settings โ API Keys. Each key has one or more scopes: Read, Write and Delete. A request without the scope it needs is rejected with a 403 error. The full key is shown only once, when you create it. See API keys for creating, disabling and rotating keys.
Endpoints
| Method | Path | Scope | What it does |
|---|---|---|---|
| GET | /spaces | Read | List your spaces |
| POST | /spaces | Write | Create a space |
| GET | /spaces/:id | Read | Get one space |
| PATCH | /spaces/:id | Write | Update a space's name, description, logo, color or questions |
| DELETE | /spaces/:id | Delete | Delete a space |
| GET | /testimonials | Read | List testimonials, with filters |
| POST | /testimonials | Write | Create a testimonial |
| GET | /testimonials/:id | Read | Get one testimonial |
| PATCH | /testimonials/:id | Write | Update status, text, rating, company or role |
| DELETE | /testimonials/:id | Delete | Delete a testimonial |
| POST | /testimonials/batch/update | Write | Set the status of up to 100 testimonials |
| POST | /testimonials/batch/delete | Delete | Delete up to 100 testimonials |
Listing testimonials
GET /testimonials accepts these query parameters, all optional:
space_id,status(pending,approvedorrejected),type(textorvideo) andrating(1 to 5)search, which matches the testimonial textdate_fromanddate_to, as ISO date-timeslimit(1 to 100, default 50) andoffsetsort_by(created_at,updated_at,ratingorshares) andsort_order(ascordesc)
The response has a data array and a pagination object with total, limit, offset and has_more.
curl "https://app.videotestimonials.video/api/v1/testimonials?status=approved&limit=10" \
-H "Authorization: Bearer sk_live_your_key"
Creating a testimonial
POST /testimonials takes JSON. Required fields are space_id, type (text or video), submitter_name and submitter_email. Optional fields are submitter_company, submitter_role, submitter_avatar_url, text_content, video_url, video_thumbnail_url, rating (1 to 5) and status, which defaults to pending.
curl -X POST "https://app.videotestimonials.video/api/v1/testimonials" \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{"space_id":"YOUR_SPACE_ID","type":"text","submitter_name":"Jane Doe","submitter_email":"jane@example.com","text_content":"Setup took ten minutes.","rating":5}'
Video testimonials created with a video_url are transcribed automatically when the link points straight to a video file.
Limits and errors
- Rate limit: 1,000 requests per hour per account. Responses carry
X-RateLimit-Limit,X-RateLimit-RemainingandX-RateLimit-Resetheaders, and a429response means you've hit the limit. - Errors come back as JSON with an
errorobject containing acode(for exampleUNAUTHORIZED,INVALID_API_KEY,INSUFFICIENT_SCOPEorRATE_LIMIT_EXCEEDED) and amessage.
Webhooks
To react to changes instead of polling, open Dashboard โ Automations, add the URL that should receive events, and choose the events to send:
testimonial.created, when someone submits a testimonialtestimonial.approvedtestimonial.rejectedtestimonial.deleted
Each delivery is a JSON POST with the event name, a timestamp and the testimonial's data. You can pause a webhook and view its delivery logs on the same page.
Plans
The pricing page lists API & Webhooks on the Pro plan ($49/month or $490/year), which also includes 10 spaces, 3 team seats, 2,000 emails a month and AI features. Paid plans start with a 7-day free trial.