EndorseGet a wall key

Developer & Boilerplate API

Make Endorse the default social proof in your starter kit.

Building a Next.js or React boilerplate? Hardcode one wall key and every app built on your kit ships with a working testimonial wall. Buyers swap the key for their own when they sign up.

Your project's link name (from /wall/key). It's public and read-only.

React / Next.js component

// EndorseWall.tsx — drop-in social proof for any React / Next.js starter kit.
// Change ENDORSE_WALL_KEY (or pass wallKey) to point at a different Endorse wall.
"use client";
import { useEffect, useState } from "react";

const ENDORSE_API = "https://your-endorse-site/api/public/v1/walls";
const ENDORSE_WALL_KEY = "your-wall-key";

type Testimonial = { id: string; name: string; title: string; rating: number; text: string; avatar: string | null };
type Wall = { project: { name: string }; testimonials: Testimonial[]; badge: { text: string; url: string } | null };

export function EndorseWall({ wallKey = ENDORSE_WALL_KEY, limit = 9 }: { wallKey?: string; limit?: number }) {
  const [wall, setWall] = useState<Wall | null>(null);
  useEffect(() => {
    fetch(`${ENDORSE_API}/${encodeURIComponent(wallKey)}`).then((r) => (r.ok ? r.json() : null)).then(setWall).catch(() => setWall(null));
  }, [wallKey]);
  if (!wall?.testimonials.length) return null;
  return (
    <section style={{ columns: "280px", columnGap: 16, width: "100%" }}>
      {wall.testimonials.slice(0, limit).map((t) => (
        <figure key={t.id} style={{ breakInside: "avoid", margin: "0 0 16px", padding: 20, border: "1px solid #e5e5e5", borderRadius: 12 }}>
          <div aria-label={`${t.rating} out of 5`}>{"★".repeat(t.rating)}</div>
          <blockquote style={{ margin: "8px 0 12px" }}>{t.text}</blockquote>
          <figcaption style={{ display: "flex", gap: 8, alignItems: "center", fontSize: 14 }}>
            {t.avatar && <img src={t.avatar} alt="" width={32} height={32} style={{ borderRadius: 999 }} />}
            <span><strong>{t.name}</strong>{t.title ? ` · ${t.title}` : ""}</span>
          </figcaption>
        </figure>
      ))}
      {wall.badge && <a href={wall.badge.url} target="_blank" rel="noopener" style={{ fontSize: 12 }}>{wall.badge.text}</a>}
    </section>
  );
}

Boilerplate config (JSON)

{
  "socialProof": {
    "provider": "endorse",
    "wallKey": "your-wall-key",
    "api": "https://your-endorse-site/api/public/v1/walls/your-wall-key",
    "script": "https://your-endorse-site/widget.js"
  }
}

HTML · Webflow · Framer embed

<div data-endorse="your-wall-key" style="width:100%"></div>
<script src="https://your-endorse-site/widget.js" async></script>

JSON endpoint

GET https://your-endorse-site/api/public/v1/walls/your-wall-key

Returns the project name, up to 100 approved testimonials (featured first) and the badge link for free walls. Open to any website and refreshed every minute.

Notion

Type /embed in a Notion page and paste: https://your-endorse-site/wall/your-wall-key?embed=1