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-proxyAuthentication
Include your API key in the x-api-key header for all requests:
x-api-key: YOUR_API_KEYResponse Format
All API responses follow this consistent structure:
{
"success": true,
"data": {
// Response data here
},
"error": null
}Testimonials
Manage customer testimonials and reviews
/testimonialsList 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/:idGet 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-426614174000Example 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"
}
}/testimonialsCreate 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/testimonialsExample 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/:idUpdate 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-426614174000Example 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/:idDelete 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-426614174000Example Response
{
"success": true,
"data": {
"message": "Testimonial deleted successfully"
}
}Forms
Create and manage testimonial collection forms
/formsList 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/formsExample 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/:idGet 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/formsCreate 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/:idUpdate 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/:idDelete 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-426614174002Widgets
Manage testimonial display widgets
/widgetsList 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/widgetsExample 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/:idGet 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/widgetsCreate 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/:idUpdate 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/:idDelete 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-426614174003Tags
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 testimonialWorkspace 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