API Documentation

Everything you need to collect testimonials, manage them, and embed social proof on any website. Set up in under 2 minutes.

Quick Start — Embed in 30 Seconds

Add a testimonial widget to any website with a single script tag. No build step, no dependencies, no configuration.

HTML — paste in your site
<div id="testimonialflow-widget"></div>
<script
  src="https://testimonialflow-kappa.vercel.app/api/widget/YOUR_PROJECT_SLUG"
  async
></script>

Replace YOUR_PROJECT_SLUG with your project slug from the dashboard.

Collecting Testimonials

Share a collection link with your customers. They fill out a simple form with their name, role, testimonial text, and star rating.

Collection URL format
https://testimonialflow-kappa.vercel.app/collect/YOUR_PROJECT_SLUG

Each submission is saved and appears in your dashboard for review. Approve the ones you want to display publicly.

Tip: Include this link in your post-purchase emails, thank-you pages, or customer success follow-ups for the highest response rates. Need help crafting the ask? Try our email generator tool.

Embedding the Widget

The widget renders approved testimonials as a responsive card grid. It works on any website — static HTML, WordPress, Shopify, Webflow, Squarespace, or any framework.

How it works

  1. The script fetches approved testimonials from our API
  2. Renders star ratings, text, and attribution in styled cards
  3. Responsive grid: 1 column on mobile, 2 on tablet, 3 on desktop
  4. 60-second cache for fast repeat loads

WordPress / HTML

<!-- Add to any page, post, or widget area -->
<div id="testimonialflow-widget"></div>
<script src="https://testimonialflow-kappa.vercel.app/api/widget/YOUR_SLUG" async></script>

Webflow / Squarespace

Paste the same snippet into a Custom Code / Embed block.

REST API Reference

All endpoints return JSON. No API key required for public endpoints. CORS is enabled for all origins.

Public Endpoints

GET/api/testimonials?slug=YOUR_SLUG

Fetch all approved testimonials for a project.

Response
[
  {
    "id": "abc123",
    "name": "Sarah Chen",
    "role": "Founder, PixelCraft",
    "text": "TestimonialFlow boosted our conversions by 23%.",
    "rating": 5,
    "approved": 1,
    "created_at": "2026-04-01T10:00:00Z"
  }
]
POST/api/testimonials

Submit a new testimonial.

Request body
{
  "slug": "YOUR_SLUG",
  "name": "Customer Name",
  "role": "CEO, Acme Inc",
  "text": "This product changed everything for us.",
  "rating": 5
}
GET/api/widget/YOUR_SLUG

Returns a JavaScript snippet that renders a testimonial widget. Used via <script> tag.

Authenticated Endpoints

These require authentication via the dashboard session cookie.

POST/api/projects

Create a new project. Returns the project with its unique slug.

Request body
{
  "name": "My SaaS Product"
}
PATCH/api/testimonials/[id]

Approve or reject a testimonial.

Request body
{ "approved": 1 }   // or { "approved": 0 }
DELETE/api/testimonials/[id]

Permanently delete a testimonial.

Wall of Love

Every project gets a public Wall of Love page — a beautiful, shareable testimonial showcase with SEO metadata and aggregate ratings.

URL format
https://testimonialflow-kappa.vercel.app/wall/YOUR_SLUG

Share it on social media, include it in proposals, or link to it from your website. Each Wall of Love page includes JSON-LD structured data for rich search results.

See it in action: Live demo Wall of Love

React / Next.js Integration

Fetch testimonials from the API and render them with your own components for full styling control.

React component
async function Testimonials({ slug }: { slug: string }) {
  const res = await fetch(
    "https://testimonialflow-kappa.vercel.app/api/testimonials?slug=" + slug
  );
  const testimonials = await res.json();

  return (
    <div className="grid grid-cols-1 md:grid-cols-3 gap-4">
      {testimonials.map((t) => (
        <div key={t.id} className="border rounded-lg p-4">
          <div className="flex gap-0.5 mb-2">
            {Array.from({ length: t.rating }).map((_, i) => (
              <span key={i}>⭐</span>
            ))}
          </div>
          <p className="text-gray-700">{t.text}</p>
          <p className="mt-2 font-semibold">{t.name}</p>
          <p className="text-sm text-gray-500">{t.role}</p>
        </div>
      ))}
    </div>
  );
}

Pricing

Free

$0/mo

  • Up to 10 testimonials
  • 1 project
  • Embed widget
  • Wall of Love page
  • Collection link

Pro

$9/mo

  • Unlimited testimonials
  • Unlimited projects
  • Everything in Free
  • Priority support
  • Remove "Powered by" branding

Ready to collect testimonials?

Sign up free. No credit card required. Set up in 2 minutes.

Get Started Free