Skip to content

Testimonials

Collect testimonials from your customers and display approved ones on your site. Submissions start as pending and can be approved or rejected in the dashboard.

Terminal window
curl -X POST https://api.sassmaker.com/v1/testimonials \
-H "Content-Type: application/json" \
-H "X-Project-Key: pk_your_api_key" \
-d '{
"author_name": "Jane Doe",
"author_email": "jane@example.com",
"content": "Foundry saved us weeks of development time.",
"rating": 5
}'

pendingapproved / rejected

New submissions are always pending. Approve or reject from the dashboard or API.

Every project gets a public testimonial submission page at:

https://app.sassmaker.com/t/[project-slug]

Share this in email campaigns, onboarding flows, or support follow-ups.

POST /v1/testimonials

Auth: API Key

Terminal window
curl -X POST https://api.sassmaker.com/v1/testimonials \
-H "Content-Type: application/json" \
-H "X-Project-Key: pk_your_api_key" \
-d '{
"author_name": "Jane Doe",
"author_email": "jane@example.com",
"content": "Foundry saved us weeks of development time.",
"rating": 5,
"author_title": "CTO at Acme",
"tweet_url": "https://twitter.com/jane/status/123"
}'
FieldTypeRequiredDescription
author_namestringYesName of the person
author_emailstringYesEmail address
contentstringYesTestimonial text
ratingnumberYesRating from 1 to 5
author_titlestringNoJob title or role
author_avatar_urlstringNoAvatar image URL
image_urlstringNoAttached image URL
tweet_urlstringNoLink to original tweet

Response (201):

{
"id": "abc-123",
"status": "pending",
"created_at": "2025-01-01T00:00:00Z"
}

Errors:

StatusMessageCause
400"author_name is required"Missing required field
400"Invalid email"Malformed email address
400"rating must be between 1 and 5"Invalid rating
POST /v1/testimonials/by-project/:slug

Auth: None (public)

Same body as above. Use this for public forms where no API key is available.

Errors:

StatusMessageCause
404"Project not found"Invalid slug
GET /v1/testimonials/by-project/:slug

Auth: None (public)

Returns project name and slug for rendering the submission form.

GET /v1/testimonials?limit=50&sort=newest

Auth: API Key

Terminal window
curl "https://api.sassmaker.com/v1/testimonials?sort=rating&limit=10" \
-H "X-Project-Key: pk_your_api_key"
ParamTypeDefaultDescription
limitnumber50Max testimonials to return
sortstringnewestnewest or rating

Response (200):

{
"data": [
{
"id": "abc-123",
"author_name": "Jane Doe",
"author_title": "CTO at Acme",
"content": "Foundry saved us weeks...",
"rating": 5,
"status": "approved",
"created_at": "2025-01-01T00:00:00Z"
}
]
}

Only returns approved testimonials. Use this to display on your site.

GET /v1/testimonials/all?project_id=PROJECT_ID&page=1

Auth: Session Token

Returns all testimonials (pending, approved, rejected) with stats.

Response (200):

{
"data": [...],
"total": 25,
"page": 1,
"limit": 50,
"stats": {
"total": 25,
"pending": 3,
"approved": 20,
"avg_rating": 4.6
}
}
PATCH /v1/testimonials/:id?project_id=PROJECT_ID

Auth: Session Token

Terminal window
curl -X PATCH "https://api.sassmaker.com/v1/testimonials/abc-123?project_id=proj_456" \
-H "Authorization: Bearer SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "status": "approved" }'

Valid statuses: pending, approved, rejected.

Errors:

StatusMessageCause
400"Invalid status"Not a valid status value
403"Forbidden"Not the project owner
404"Not found"Testimonial doesn’t exist
DELETE /v1/testimonials/:id?project_id=PROJECT_ID

Auth: Session Token

Response (200): { "ok": true }

import { SaaSMakerClient } from '@saas-maker/sdk';
const client = new SaaSMakerClient({ apiKey: 'pk_your_api_key' });
// Submit a testimonial
await client.testimonials.submit({
author_name: 'Jane Doe',
author_email: 'jane@example.com',
content: 'Amazing product!',
rating: 5,
});
// List approved testimonials
const { data } = await client.testimonials.list({ sort: 'rating' });