API Reference
Complete reference for integrating with our testimonial management API. Build powerful testimonial workflows with simple HTTP requests.
API Endpoints Overview
Quick navigation to all available endpoints
Testimonials
Forms
Widgets
Getting Started
Authentication and base configuration
Base URL
https://ufjhlsryemazcfitzewn.supabase.co/functions/v1/api-proxy
Authentication
Include your API key in the x-api-key header for all requests:
x-api-key: YOUR_API_KEY
Response Format
All API responses follow this consistent structure:
{
"success": true,
"data": {
// Response data here
},
"error": null
}
Testimonials
Manage customer testimonials and reviews
/testimonials
List testimonials
Retrieve all testimonials for your workspace with optional filtering and pagination
Essential Query ParametersMost developers only need these
Parameter | Type | Required | Description |
---|---|---|---|
page | integer | Optional | Page number for pagination (default: 1) |
limit | integer | Optional | Number of items per page (default: 50, max: 100) |
status | string | Optional | Filter by status: pending, approved, rejected |
Example Request
curl -X GET \
-H "x-api-key: YOUR_API_KEY" "https://ufjhlsryemazcfitzewn.supabase.co/functions/v1/api-proxy/testimonials?status=approved&limit=10"
Example Response
{
"success": true,
"data": {
"testimonials": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"title": "Amazing product!",
"content": "This product has completely transformed our workflow. Highly recommended!",
"rating": 5,
"author_firstname": "John",
"author_lastname": "Doe",
"author_photo_url": "https://example.com/photo.jpg",
"job_title": "CEO",
"company": "Acme Corp",
"company_logo_url": "https://example.com/logo.jpg",
"company_website_url": "https://acme.com",
"social_links": {
"linkedin": "https://linkedin.com/in/johndoe",
"twitter": "https://twitter.com/johndoe"
},
"testimonial_images": ["https://example.com/image1.jpg"],
"testimonial_video": "https://example.com/video.mp4",
"testimonial_audio": null,
"tags": ["customer", "enterprise"],
"status": "approved",
"source": "direct_from_customers",
"featured": true,
"embed_approved": true,
"submitted_at": "2024-01-15T10:30:00Z",
"approved_at": "2024-01-15T11:00:00Z",
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T11:00:00Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 25,
"pages": 3
}
}
}
/testimonials/:id
Get testimonial by ID
Retrieve a specific testimonial by its ID
Example Request
curl -X GET \
-H "x-api-key: YOUR_API_KEY" https://ufjhlsryemazcfitzewn.supabase.co/functions/v1/api-proxy/testimonials/123e4567-e89b-12d3-a456-426614174000
Example Response
{
"success": true,
"data": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"title": "Amazing product!",
"content": "This product has completely transformed our workflow.",
"rating": 5,
"author_firstname": "John",
"author_lastname": "Doe",
"job_title": "CEO",
"company": "Acme Corp",
"status": "approved",
"source": "direct_from_customers",
"created_at": "2024-01-15T10:30:00Z"
}
}
/testimonials
Create testimonial
Add a new testimonial to your collection. Tags that don't exist will be automatically created in your workspace.
Essential Request Body ParametersRequired & commonly used
Parameter | Type | Required | Description |
---|---|---|---|
title | string | Optional | Testimonial title or headline |
content | string | Optional | Main testimonial content |
author_firstname | string | Required | Author's first name |
Example Request
curl -X POST \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" -d '{
"title": "Game-changing solution",
"content": "This platform has revolutionized how we collect and manage testimonials.",
"rating": 5,
"author_firstname": "Jane",
"author_lastname": "Smith",
"job_title": "Marketing Director",
"company": "TechCorp",
"company_website_url": "https://techcorp.com",
"social_links": {
"linkedin": "https://linkedin.com/in/janesmith"
},
"tags": ["marketing", "enterprise", "new-tag"],
"source": "direct_from_customers",
"featured": true,
"embed_approved": true
}' \
https://ufjhlsryemazcfitzewn.supabase.co/functions/v1/api-proxy/testimonials
Example Response
{
"success": true,
"data": {
"id": "456e7890-e89b-12d3-a456-426614174001",
"title": "Game-changing solution",
"content": "This platform has revolutionized how we collect and manage testimonials.",
"rating": 5,
"author_firstname": "Jane",
"author_lastname": "Smith",
"job_title": "Marketing Director",
"company": "TechCorp",
"tags": ["marketing", "enterprise", "new-tag"],
"status": "pending",
"featured": true,
"embed_approved": true,
"created_at": "2024-01-15T12:00:00Z"
}
}
/testimonials/:id
Update testimonial
Modify an existing testimonial. Only author firstname is required. Only provided fields will be updated. New tags will be automatically created.
Essential Request Body ParametersRequired & commonly used
Parameter | Type | Required | Description |
---|---|---|---|
title | string | Optional | Testimonial title or headline |
content | string | Optional | Main testimonial content |
author_firstname | string | Required | Author's first name |
Example Request
curl -X PATCH \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" -d '{
"content": "This platform has completely revolutionized how we collect and manage testimonials.",
"author_firstname": "Jane",
"status": "approved",
"featured": true,
"embed_approved": true,
"tags": ["customer", "featured", "enterprise"]
}' }' \
https://ufjhlsryemazcfitzewn.supabase.co/functions/v1/api-proxy/testimonials/123e4567-e89b-12d3-a456-426614174000
Example Response
{
"success": true,
"data": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"content": "This platform has completely revolutionized how we collect and manage testimonials.",
"author_firstname": "Jane",
"status": "approved",
"featured": true,
"embed_approved": true,
"tags": ["customer", "featured", "enterprise"],
"approved_at": "2024-01-15T13:00:00Z",
"updated_at": "2024-01-15T13:00:00Z"
}
}
/testimonials/:id
Delete testimonial
Permanently remove a testimonial from your workspace
Example Request
curl -X DELETE \
-H "x-api-key: YOUR_API_KEY" https://ufjhlsryemazcfitzewn.supabase.co/functions/v1/api-proxy/testimonials/123e4567-e89b-12d3-a456-426614174000
Example Response
{
"success": true,
"data": {
"message": "Testimonial deleted successfully"
}
}
Forms
Create and manage testimonial collection forms
/forms
List forms
Get all testimonial forms for your workspace
Essential Query ParametersMost developers only need these
Parameter | Type | Required | Description |
---|---|---|---|
page | integer | Optional | Page number for pagination |
limit | integer | Optional | Number of items per page |
Example Request
curl -X GET \
-H "x-api-key: YOUR_API_KEY" https://ufjhlsryemazcfitzewn.supabase.co/functions/v1/api-proxy/forms
Example Response
{
"success": true,
"data": {
"forms": [
{
"id": "789e0123-e89b-12d3-a456-426614174002",
"title": "Customer Feedback Form",
"description": "Share your experience with our product",
"published": true,
"submissions": 25,
"blocks": [
{
"id": "block_1",
"type": "testimonial",
"title": "Share Your Experience"
}
],
"settings": {
"theme": "light",
"show_progress_bar": true,
"background_color": "#ffffff"
},
"created_at": "2024-01-10T09:00:00Z",
"updated_at": "2024-01-15T14:00:00Z"
}
]
}
}
/forms/:id
Get form by ID
Retrieve a specific form configuration
Example Request
curl -X GET \
-H "x-api-key: YOUR_API_KEY" https://ufjhlsryemazcfitzewn.supabase.co/functions/v1/api-proxy/forms/789e0123-e89b-12d3-a456-426614174002
/forms
Create form
Create a new testimonial collection form with customizable blocks and settings
Essential Request Body ParametersRequired & commonly used
Parameter | Type | Required | Description |
---|---|---|---|
title | string | Required | Form title |
blocks | array | Required | Array of form blocks (see Form Block Types section for detailed configuration) |
Example Request
curl -X POST \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" -d '{
"title": "Customer Experience Survey",
"description": "Help us improve by sharing your experience",
"blocks": [
{
"id": "block_1",
"type": "testimonial",
"title": "Share Your Experience",
"rating": {
"enabled": true,
"question": "Rate your experience",
"scale": 5,
"required": true
},
"testimonial_text": {
"enabled": true,
"question": "Tell us about your experience",
"placeholder": "Your feedback helps us improve...",
"required": true
},
"testimonial_video": {
"enabled": true,
"question": "Record a video testimonial (optional)",
"max_duration": 90,
"allow_upload": true,
"required": false
}
},
{
"id": "block_2",
"type": "profile_info",
"title": "About You",
"first_name": {
"label": "First Name",
"placeholder": "Enter your first name",
"required": true,
"visible": true
},
"last_name": {
"label": "Last Name",
"placeholder": "Enter your last name",
"required": true,
"visible": true
},
"job_title": {
"label": "Job Title",
"placeholder": "Your role",
"required": true,
"visible": true
},
"photo": {
"label": "Profile Photo",
"placeholder": "Upload your photo",
"required": false,
"visible": true
}
},
{
"id": "block_3",
"type": "company_info",
"title": "Company Information",
"company_name": {
"label": "Company",
"placeholder": "Your company name",
"required": true,
"visible": true
},
"company_logo": {
"label": "Company Logo",
"placeholder": "Upload company logo",
"required": false,
"visible": true
},
"website_url": {
"label": "Website",
"placeholder": "https://yourcompany.com",
"required": false,
"visible": true
}
}
],
"settings": {
"theme": "light",
"show_progress_bar": true,
"navigation_arrows": true,
"background_color": "#ffffff",
"text_color": "#333333",
"buttons_color": "#2563eb",
"button_text_color": "#ffffff"
},
"thank_you_block": {
"type": "thank_you",
"title": "Thank You!",
"message": "Your testimonial has been submitted successfully.",
"button_text": "Visit Our Website",
"redirect_url": "https://yourcompany.com"
},
"published": false
}' \
https://ufjhlsryemazcfitzewn.supabase.co/functions/v1/api-proxy/forms
/forms/:id
Update form
Update an existing form configuration
Essential Request Body ParametersRequired & commonly used
Parameter | Type | Required | Description |
---|---|---|---|
title | string | Optional | Form title |
Example Request
curl -X PATCH \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" -d '{
"published": true,
"title": "Updated Product Review Form"
}' \
https://ufjhlsryemazcfitzewn.supabase.co/functions/v1/api-proxy/forms/789e0123-e89b-12d3-a456-426614174002
/forms/:id
Delete form
Permanently delete a form and all its responses
Example Request
curl -X DELETE \
-H "x-api-key: YOUR_API_KEY" https://ufjhlsryemazcfitzewn.supabase.co/functions/v1/api-proxy/forms/789e0123-e89b-12d3-a456-426614174002
Widgets
Manage testimonial display widgets
/widgets
List widgets
Get all widgets for your workspace
Example Request
curl -X GET \
-H "x-api-key: YOUR_API_KEY" https://ufjhlsryemazcfitzewn.supabase.co/functions/v1/api-proxy/widgets
Example Response
{
"success": true,
"data": {
"widgets": [
{
"id": "abc12345-e89b-12d3-a456-426614174003",
"name": "Homepage Reviews",
"widget_type": "wall",
"layout_type": "grid",
"design_theme": "showcase",
"published": true,
"public_url": "xyz789",
"embed_code": "<iframe src='https://kudowall.com/w/xyz789'></iframe>",
"display_settings": {
"showRating": true,
"showAuthorName": true,
"showCompany": true
},
"layout_settings": {
"columns": 3,
"gap": 16
},
"brand_settings": {
"background_color": "#ffffff",
"accent_color": "#000000"
},
"view_count": 1250,
"click_count": 89,
"created_at": "2024-01-12T15:30:00Z"
}
]
}
}
/widgets/:id
Get widget by ID
Retrieve a specific widget configuration
Example Request
curl -X GET \
-H "x-api-key: YOUR_API_KEY" https://ufjhlsryemazcfitzewn.supabase.co/functions/v1/api-proxy/widgets/abc12345-e89b-12d3-a456-426614174003
/widgets
Create widget
Create a new testimonial display widget
Essential Request Body ParametersRequired & commonly used
Parameter | Type | Required | Description |
---|---|---|---|
name | string | Required | Widget name |
Example Request
curl -X POST \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" -d '{
"name": "Website Testimonials",
"widget_type": "wall",
"layout_type": "grid",
"display_settings": {
"showRating": true,
"showAuthorName": true,
"showCompany": true,
"showJobTitle": true
},
"layout_settings": {
"columns": 3,
"gap": 16
},
"brand_settings": {
"background_color": "#ffffff",
"accent_color": "#2563eb"
},
"auto_include_new": true
}' \
https://ufjhlsryemazcfitzewn.supabase.co/functions/v1/api-proxy/widgets
/widgets/:id
Update widget
Update widget configuration and settings
Essential Request Body ParametersRequired & commonly used
Parameter | Type | Required | Description |
---|---|---|---|
name | string | Optional | Widget name |
Example Request
curl -X PATCH \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" -d '{
"published": true,
"layout_settings": {
"columns": 4
}
}' \
https://ufjhlsryemazcfitzewn.supabase.co/functions/v1/api-proxy/widgets/abc12345-e89b-12d3-a456-426614174003
/widgets/:id
Delete widget
Permanently delete a widget
Example Request
curl -X DELETE \
-H "x-api-key: YOUR_API_KEY" https://ufjhlsryemazcfitzewn.supabase.co/functions/v1/api-proxy/widgets/abc12345-e89b-12d3-a456-426614174003
Tags
Organize testimonials with tags
Tag Management Behavior
Automatic Tag Creation
When creating or updating testimonials, any tags that don't exist in your workspace will be automatically created. This means you don't need to pre-create tags before using them.
// When you create a testimonial with new tags:
{
"content": "Great service!",
"tags": ["existing-tag", "brand-new-tag", "another-new-tag"]
}
// The API will:
// 1. Use "existing-tag" if it already exists
// 2. Create "brand-new-tag" in your workspace
// 3. Create "another-new-tag" in your workspace
// 4. Associate all tags with the testimonial
Workspace Isolation
Tags are scoped to your workspace. Each workspace maintains its own set of tags, so tag names only need to be unique within your workspace, not globally.
Tag Usage Statistics
The testimonial_count
field shows how many testimonials are currently using each tag. This count updates automatically when testimonials are tagged or untagged.
Object Structures Reference
Detailed breakdown of complex object types used in the API endpoints above
Social Links Object
Structure for storing social media profile links in testimonials:
{
"linkedin": "https://linkedin.com/in/username",
"twitter": "https://twitter.com/username",
"facebook": "https://facebook.com/username",
"instagram": "https://instagram.com/username",
"youtube": "https://youtube.com/@username",
"tiktok": "https://tiktok.com/@username"
}
Widget Settings Objects
Display Settings
{
"showRating": true,
"showAuthorName": true,
"showAuthorPhoto": true,
"showCompany": true,
"showJobTitle": false,
"showDate": false,
"showSource": false,
"truncateText": true,
"maxTextLength": 200
}
Layout Settings
{
"columns": 3,
"gap": 16,
"cardStyle": "default",
"borderRadius": 8,
"shadowLevel": 1,
"spacing": "comfortable"
}
Brand Settings
{
"background_color": "#ffffff",
"accent_color": "#2563eb",
"text_color": "#1f2937",
"border_color": "#e5e7eb",
"font_family": "Inter",
"custom_css": ""
}
Embed Settings
{
"auto_refresh": true,
"refresh_interval": 300,
"filter_tags": ["featured"],
"filter_rating": 4,
"max_testimonials": 50,
"sort_by": "created_at",
"sort_order": "desc"
}
Form Settings Object
Configuration options for form behavior and appearance:
{
"theme": "light",
"show_progress_bar": true,
"navigation_arrows": true,
"allow_navigation_back": true,
"background_color": "#ffffff",
"text_color": "#333333",
"buttons_color": "#2563eb",
"button_text_color": "#ffffff",
"custom_css": "",
"auto_save": true,
"require_consent": false,
"consent_text": "I agree to the terms and conditions"
}
Form Block Types Reference
Complete guide to configuring form blocks used in the Forms endpoints above
Overview
Forms are built using blocks. Each block represents a section of the form and can be configured with specific parameters to collect different types of information.
Testimonial Block
The main block for collecting testimonial content, ratings, and media.
Parameter | Type | Required | Description |
---|---|---|---|
type | string | Required | Must be 'testimonial' |
id | string | Required | Unique identifier for the block |
title | string | Optional | Block title displayed to users |
rating.enabled | boolean | Optional | Enable star rating input |
rating.question | string | Optional | Question text for rating |
rating.scale | number | Optional | Rating scale (1-10, default: 5) |
rating.required | boolean | Optional | Make rating required |
testimonial_text.enabled | boolean | Optional | Enable text testimonial input |
testimonial_text.question | string | Optional | Question text for testimonial |
testimonial_text.placeholder | string | Optional | Placeholder text |
testimonial_text.required | boolean | Optional | Make testimonial text required |
testimonial_text.max_length | number | Optional | Maximum character limit |
testimonial_video.enabled | boolean | Optional | Enable video testimonial upload |
testimonial_video.question | string | Optional | Question text for video |
testimonial_video.max_duration | number | Optional | Max video duration in seconds |
testimonial_video.allow_upload | boolean | Optional | Allow video file uploads |
testimonial_video.required | boolean | Optional | Make video required |
Profile Info Block
Collects personal information from the testimonial author.
Parameter | Type | Required | Description |
---|---|---|---|
type | string | Required | Must be 'profile_info' |
id | string | Required | Unique identifier for the block |
title | string | Optional | Block title displayed to users |
first_name.label | string | Optional | Label for first name field |
first_name.placeholder | string | Optional | Placeholder text |
first_name.required | boolean | Optional | Make first name required |
first_name.visible | boolean | Optional | Show/hide field |
last_name.label | string | Optional | Label for last name field |
last_name.placeholder | string | Optional | Placeholder text |
last_name.required | boolean | Optional | Make last name required |
last_name.visible | boolean | Optional | Show/hide field |
job_title.label | string | Optional | Label for job title field |
job_title.placeholder | string | Optional | Placeholder text |
job_title.required | boolean | Optional | Make job title required |
job_title.visible | boolean | Optional | Show/hide field |
photo.label | string | Optional | Label for photo upload |
photo.placeholder | string | Optional | Placeholder text |
photo.required | boolean | Optional | Make photo required |
photo.visible | boolean | Optional | Show/hide field |
Company Info Block
Collects company-related information from the testimonial author.
Parameter | Type | Required | Description |
---|---|---|---|
type | string | Required | Must be 'company_info' |
id | string | Required | Unique identifier for the block |
title | string | Optional | Block title displayed to users |
company_name.label | string | Optional | Label for company name field |
company_name.placeholder | string | Optional | Placeholder text |
company_name.required | boolean | Optional | Make company name required |
company_name.visible | boolean | Optional | Show/hide field |
company_logo.label | string | Optional | Label for logo upload |
company_logo.placeholder | string | Optional | Placeholder text |
company_logo.required | boolean | Optional | Make logo required |
company_logo.visible | boolean | Optional | Show/hide field |
website_url.label | string | Optional | Label for website field |
website_url.placeholder | string | Optional | Placeholder text |
website_url.required | boolean | Optional | Make website required |
website_url.visible | boolean | Optional | Show/hide field |
Social Links Block
Collects social media profile links from the testimonial author.
Parameter | Type | Required | Description |
---|---|---|---|
type | string | Required | Must be 'social_links' |
id | string | Required | Unique identifier for the block |
title | string | Optional | Block title displayed to users |
linkedin.label | string | Optional | Label for LinkedIn field |
linkedin.placeholder | string | Optional | Placeholder text |
linkedin.required | boolean | Optional | Make LinkedIn required |
linkedin.visible | boolean | Optional | Show/hide field |
twitter.label | string | Optional | Label for Twitter/X field |
twitter.placeholder | string | Optional | Placeholder text |
twitter.required | boolean | Optional | Make Twitter required |
twitter.visible | boolean | Optional | Show/hide field |
facebook.label | string | Optional | Label for Facebook field |
facebook.placeholder | string | Optional | Placeholder text |
facebook.required | boolean | Optional | Make Facebook required |
facebook.visible | boolean | Optional | Show/hide field |
instagram.label | string | Optional | Label for Instagram field |
instagram.placeholder | string | Optional | Placeholder text |
instagram.required | boolean | Optional | Make Instagram required |
instagram.visible | boolean | Optional | Show/hide field |
youtube.label | string | Optional | Label for YouTube field |
youtube.placeholder | string | Optional | Placeholder text |
youtube.required | boolean | Optional | Make YouTube required |
youtube.visible | boolean | Optional | Show/hide field |
tiktok.label | string | Optional | Label for TikTok field |
tiktok.placeholder | string | Optional | Placeholder text |
tiktok.required | boolean | Optional | Make TikTok required |
tiktok.visible | boolean | Optional | Show/hide field |
Additional Block Types
The following block types are available for creating more complex forms:
Statement Block
Display informational text or instructions to users.
type: "statement"
Multiple Choice Block
Allow users to select one option from multiple choices.
type: "multiple_choice"
Multi Select Block
Allow users to select multiple options from a list.
type: "multi_select"
Number Block
Collect numeric input from users.
type: "number"
Phone Number Block
Collect formatted phone numbers with country codes.
type: "phone_number"
Date Block
Allow users to select dates using a date picker.
type: "date"
File Upload Block
Enable file uploads with customizable file type restrictions.
type: "file_upload"
Error Handling
Understanding API error responses and status codes
Error Response Format
When an error occurs, the API returns a consistent error format with appropriate HTTP status codes:
{
"success": false,
"data": null,
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid request parameters",
"details": {
"field": "rating",
"issue": "Must be between 1 and 5"
}
}
}
HTTP Status Codes
Status Code | Description |
---|---|
200 | OK - Request successful |
201 | Created - Resource created successfully |
400 | Bad Request - Invalid request parameters |
401 | Unauthorized - Invalid or missing API key |
403 | Forbidden - Insufficient permissions |
404 | Not Found - Resource doesn't exist |
429 | Too Many Requests - Rate limit exceeded |
500 | Internal Server Error - Server-side issue |
Rate Limiting
API requests are rate limited to ensure fair usage. Default limits are:
- • 1000 requests per hour per API key
- • Rate limit headers are included in all responses
- • Upgrade your plan for higher rate limits