curl --request POST \
--url https://api.mixpeek.com/v1/apps \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"meta": {
"title": "Product Search"
},
"slug": "my-product-search"
}
'import requests
url = "https://api.mixpeek.com/v1/apps"
payload = {
"meta": { "title": "Product Search" },
"slug": "my-product-search"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({meta: {title: 'Product Search'}, slug: 'my-product-search'})
};
fetch('https://api.mixpeek.com/v1/apps', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.mixpeek.com/v1/apps",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'meta' => [
'title' => 'Product Search'
],
'slug' => 'my-product-search'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.mixpeek.com/v1/apps"
payload := strings.NewReader("{\n \"meta\": {\n \"title\": \"Product Search\"\n },\n \"slug\": \"my-product-search\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.mixpeek.com/v1/apps")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"meta\": {\n \"title\": \"Product Search\"\n },\n \"slug\": \"my-product-search\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixpeek.com/v1/apps")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"meta\": {\n \"title\": \"Product Search\"\n },\n \"slug\": \"my-product-search\"\n}"
response = http.request(request)
puts response.read_body{
"app_id": "<string>",
"slug": "<string>",
"url": "<string>",
"meta": {
"title": "My Product Search",
"description": "Search across 10k+ product images",
"logo_url": "https://cdn.example.com/logo.png",
"favicon_url": "https://cdn.example.com/favicon.ico",
"indexable": false
},
"is_active": true,
"version": 123,
"custom_domains": [
{
"domain": "<string>",
"status": "pending",
"verification_token": "<string>",
"cname_target": "<string>",
"tls_cert_id": "<string>",
"tls_expires_at": "2023-11-07T05:31:56Z",
"verified_at": "2023-11-07T05:31:56Z",
"is_primary": false
}
],
"auth_config": {
"mode": "public",
"clerk_org_id": "<string>",
"clerk_allowed_providers": [
"<string>"
],
"password_hash": "<string>",
"saml_idp_metadata_url": "<string>",
"saml_sp_entity_id": "<string>",
"saml_acs_url": "<string>",
"oidc_issuer": "<string>",
"oidc_client_id": "<string>",
"oidc_client_secret_name": "<string>",
"oidc_scopes": [
"<string>"
],
"jwt_jwks_url": "<string>",
"jwt_audience": "<string>",
"jwt_issuer": "<string>",
"api_keys": [
{}
]
},
"build_config": {
"entry": "src/layout.jsx",
"framework": "react",
"tailwind": true,
"env_vars": {},
"secrets": {},
"asset_prefix": "<string>",
"api_allow": [
{
"pattern": "<string>",
"methods": [
"<string>"
]
}
]
},
"environments": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"template": "<string>",
"sections": [
{
"type": "<string>",
"section_id": "<string>",
"props": {},
"order": 123
}
],
"custom_html": "<string>",
"hero": {
"headline": "<string>",
"subheadline": "<string>",
"background_type": "solid",
"background_url": "<string>",
"background_color": "<string>",
"text_color": "#FFFFFF",
"logo_url": "<string>",
"height": "420px",
"cta_label": "<string>",
"cta_url": "<string>"
},
"theme": {
"primary_color": "#007AFF",
"secondary_color": "#FF6B6B",
"font_family": "Inter, sans-serif",
"background_color": "#FFFFFF",
"text_color": "#374151",
"heading_font_family": "Georgia, serif",
"surface_color": "#F9FAFB",
"muted_color": "#6B7280",
"border_color": "#E5E7EB",
"border_radius": "8px",
"card_style": "elevated",
"card_hover_effect": "lift"
},
"seo": {
"author": "Mixpeek",
"favicon_url": "https://example.com/favicon.ico",
"keywords": [
"fitness",
"yoga",
"workout",
"exercise videos"
],
"locale": "en_US",
"logo_url": "https://example.com/logo.png",
"meta_description": "Search and discover fitness videos using AI-powered semantic search.",
"meta_title": "Fitness Video Search | Mixpeek",
"og_image_alt": "Fitness video search interface",
"og_image_url": "https://mixpeek-public-pages.s3.amazonaws.com/og.png",
"og_type": "website",
"robots": "index, follow",
"site_name": "Mixpeek",
"structured_data": {
"additional_properties": {
"applicationCategory": "Search"
},
"type": "WebApplication"
},
"twitter_card": "summary_large_image",
"twitter_site": "@mixpeek"
},
"stats": [
{
"label": "<string>",
"value": "<string>"
}
],
"featured_gallery": {
"enabled": true,
"title": "Featured",
"retriever_id": "<string>",
"public_name": "<string>",
"default_inputs": {},
"layout": {
"mode": "grid",
"columns": 3,
"gap": "8px",
"full_width": false
},
"field_config": {}
},
"tabs": [
{
"tab_id": "<string>",
"label": "<string>",
"display_config": {
"components": {
"result_card": {
"card_click_action": "viewDetails",
"field_order": [
"title",
"description",
"price"
],
"layout": "vertical",
"show_find_similar": true,
"show_thumbnail": true
},
"result_layout": "grid",
"show_hero": true,
"show_results_header": true,
"show_search": true
},
"custom_cta": {
"label": "Search Tips",
"markdown_content": "# Search Tips\n\n- Use quotes for exact phrases\n- Try descriptive terms"
},
"description": "Search through our product catalog",
"exposed_fields": [
"title",
"description",
"price",
"image_url"
],
"external_links": [
{
"name": "GitHub Repository",
"url": "https://github.com/mixpeek/product-search"
},
{
"name": "Blog Post",
"url": "https://blog.mixpeek.com/building-product-search"
}
],
"field_config": {
"price": {
"format": "number",
"format_options": {
"decimals": 2,
"label": "Price",
"prefix": "$"
}
},
"title": {
"format": "text",
"format_options": {
"label": "Product Name",
"truncate_chars": 60
}
}
},
"field_mappings": {
"thumbnail": "image_url",
"title": "title"
},
"inputs": [
{
"field_name": "query",
"field_schema": {
"description": "Search query",
"examples": [
"wireless headphones",
"laptop"
],
"type": "string"
},
"input_type": "text",
"label": "Search Products",
"order": 0,
"placeholder": "What are you looking for?",
"required": true
}
],
"layout": {
"columns": 3,
"gap": "16px",
"mode": "grid"
},
"logo_url": "https://example.com/logo.png",
"markdowns": [
{
"content": "# AI-Powered Product Search\n\nOur search uses **machine learning** to understand your queries and find the most relevant products.\n\n## Features\n\n- **Semantic Search**: Understands meaning, not just keywords\n- **Visual Search**: Upload images to find similar products\n- **Smart Filters**: Automatically suggests relevant filters",
"title": "How it Works"
},
{
"content": "## Tips for Better Results\n\n1. Use descriptive terms (e.g., \"wireless noise-canceling headphones\")\n2. Try different keywords if you don't find what you're looking for\n3. Use filters to narrow down results\n\n*Happy searching!*",
"title": "Search Guide"
}
],
"template_type": "media-search",
"theme": {
"border_radius": "12px",
"card_style": "elevated",
"font_family": "Inter, sans-serif",
"primary_color": "#007AFF"
},
"title": "Product Search"
},
"retriever_id": "<string>",
"public_name": "<string>",
"description": "<string>"
}
],
"password_protected": true,
"warnings": [
"<string>"
],
"has_unpublished_changes": false,
"monitoring_config": {
"enabled": true,
"error_boundary_enabled": true,
"sentry_enabled": true,
"posthog_enabled": true,
"custom_error_message": "<string>",
"auto_fix_enabled": true
},
"repo_url": "<string>",
"repo_branch": "<string>",
"github_installation_id": 123,
"versions": [
{
"version": 123,
"s3_version_id": "<string>",
"asset_prefix": "<string>",
"asset_manifest": {},
"asset_manifest_url": "<string>",
"deployed_by": "<string>",
"deployed_at": "2023-11-07T05:31:56Z",
"environment": "production",
"build_duration_ms": 123,
"message": "<string>",
"source_files": {},
"git_commit_sha": "<string>",
"git_commit_message": "<string>",
"git_author": "<string>"
}
]
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}Create an App
Create a new App.
Apps are full-stack web applications deployed as zip bundles to
{slug}.mxp.co. After creation, deploy your built frontend via the
deploy pipeline:
POST /v1/apps/{app_id}/deploy/upload-url— get a presigned S3 PUT URL- Upload your built
dist/zip to that URL POST /v1/apps/{app_id}/deploy— trigger the build
Only slug and meta are required. Set auth_config.mode to
control end-user authentication (public, clerk, password,
api_key, jwt, sso_oidc, sso_saml).
Slugs are globally unique across all organizations.
Deprecated fields: template, sections, custom_html,
hero, theme, seo, stats, featured_gallery, tabs,
password_secret_name are accepted for backward compatibility but
should not be used for new apps.
Tier limits: Free = 1 app, Pro = 10, Enterprise = unlimited
(TierLimits._max_apps). Exceeding your tier’s limit returns a 400 with
the limit + current count in error.details.
curl --request POST \
--url https://api.mixpeek.com/v1/apps \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"meta": {
"title": "Product Search"
},
"slug": "my-product-search"
}
'import requests
url = "https://api.mixpeek.com/v1/apps"
payload = {
"meta": { "title": "Product Search" },
"slug": "my-product-search"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({meta: {title: 'Product Search'}, slug: 'my-product-search'})
};
fetch('https://api.mixpeek.com/v1/apps', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.mixpeek.com/v1/apps",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'meta' => [
'title' => 'Product Search'
],
'slug' => 'my-product-search'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.mixpeek.com/v1/apps"
payload := strings.NewReader("{\n \"meta\": {\n \"title\": \"Product Search\"\n },\n \"slug\": \"my-product-search\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.mixpeek.com/v1/apps")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"meta\": {\n \"title\": \"Product Search\"\n },\n \"slug\": \"my-product-search\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixpeek.com/v1/apps")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"meta\": {\n \"title\": \"Product Search\"\n },\n \"slug\": \"my-product-search\"\n}"
response = http.request(request)
puts response.read_body{
"app_id": "<string>",
"slug": "<string>",
"url": "<string>",
"meta": {
"title": "My Product Search",
"description": "Search across 10k+ product images",
"logo_url": "https://cdn.example.com/logo.png",
"favicon_url": "https://cdn.example.com/favicon.ico",
"indexable": false
},
"is_active": true,
"version": 123,
"custom_domains": [
{
"domain": "<string>",
"status": "pending",
"verification_token": "<string>",
"cname_target": "<string>",
"tls_cert_id": "<string>",
"tls_expires_at": "2023-11-07T05:31:56Z",
"verified_at": "2023-11-07T05:31:56Z",
"is_primary": false
}
],
"auth_config": {
"mode": "public",
"clerk_org_id": "<string>",
"clerk_allowed_providers": [
"<string>"
],
"password_hash": "<string>",
"saml_idp_metadata_url": "<string>",
"saml_sp_entity_id": "<string>",
"saml_acs_url": "<string>",
"oidc_issuer": "<string>",
"oidc_client_id": "<string>",
"oidc_client_secret_name": "<string>",
"oidc_scopes": [
"<string>"
],
"jwt_jwks_url": "<string>",
"jwt_audience": "<string>",
"jwt_issuer": "<string>",
"api_keys": [
{}
]
},
"build_config": {
"entry": "src/layout.jsx",
"framework": "react",
"tailwind": true,
"env_vars": {},
"secrets": {},
"asset_prefix": "<string>",
"api_allow": [
{
"pattern": "<string>",
"methods": [
"<string>"
]
}
]
},
"environments": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"template": "<string>",
"sections": [
{
"type": "<string>",
"section_id": "<string>",
"props": {},
"order": 123
}
],
"custom_html": "<string>",
"hero": {
"headline": "<string>",
"subheadline": "<string>",
"background_type": "solid",
"background_url": "<string>",
"background_color": "<string>",
"text_color": "#FFFFFF",
"logo_url": "<string>",
"height": "420px",
"cta_label": "<string>",
"cta_url": "<string>"
},
"theme": {
"primary_color": "#007AFF",
"secondary_color": "#FF6B6B",
"font_family": "Inter, sans-serif",
"background_color": "#FFFFFF",
"text_color": "#374151",
"heading_font_family": "Georgia, serif",
"surface_color": "#F9FAFB",
"muted_color": "#6B7280",
"border_color": "#E5E7EB",
"border_radius": "8px",
"card_style": "elevated",
"card_hover_effect": "lift"
},
"seo": {
"author": "Mixpeek",
"favicon_url": "https://example.com/favicon.ico",
"keywords": [
"fitness",
"yoga",
"workout",
"exercise videos"
],
"locale": "en_US",
"logo_url": "https://example.com/logo.png",
"meta_description": "Search and discover fitness videos using AI-powered semantic search.",
"meta_title": "Fitness Video Search | Mixpeek",
"og_image_alt": "Fitness video search interface",
"og_image_url": "https://mixpeek-public-pages.s3.amazonaws.com/og.png",
"og_type": "website",
"robots": "index, follow",
"site_name": "Mixpeek",
"structured_data": {
"additional_properties": {
"applicationCategory": "Search"
},
"type": "WebApplication"
},
"twitter_card": "summary_large_image",
"twitter_site": "@mixpeek"
},
"stats": [
{
"label": "<string>",
"value": "<string>"
}
],
"featured_gallery": {
"enabled": true,
"title": "Featured",
"retriever_id": "<string>",
"public_name": "<string>",
"default_inputs": {},
"layout": {
"mode": "grid",
"columns": 3,
"gap": "8px",
"full_width": false
},
"field_config": {}
},
"tabs": [
{
"tab_id": "<string>",
"label": "<string>",
"display_config": {
"components": {
"result_card": {
"card_click_action": "viewDetails",
"field_order": [
"title",
"description",
"price"
],
"layout": "vertical",
"show_find_similar": true,
"show_thumbnail": true
},
"result_layout": "grid",
"show_hero": true,
"show_results_header": true,
"show_search": true
},
"custom_cta": {
"label": "Search Tips",
"markdown_content": "# Search Tips\n\n- Use quotes for exact phrases\n- Try descriptive terms"
},
"description": "Search through our product catalog",
"exposed_fields": [
"title",
"description",
"price",
"image_url"
],
"external_links": [
{
"name": "GitHub Repository",
"url": "https://github.com/mixpeek/product-search"
},
{
"name": "Blog Post",
"url": "https://blog.mixpeek.com/building-product-search"
}
],
"field_config": {
"price": {
"format": "number",
"format_options": {
"decimals": 2,
"label": "Price",
"prefix": "$"
}
},
"title": {
"format": "text",
"format_options": {
"label": "Product Name",
"truncate_chars": 60
}
}
},
"field_mappings": {
"thumbnail": "image_url",
"title": "title"
},
"inputs": [
{
"field_name": "query",
"field_schema": {
"description": "Search query",
"examples": [
"wireless headphones",
"laptop"
],
"type": "string"
},
"input_type": "text",
"label": "Search Products",
"order": 0,
"placeholder": "What are you looking for?",
"required": true
}
],
"layout": {
"columns": 3,
"gap": "16px",
"mode": "grid"
},
"logo_url": "https://example.com/logo.png",
"markdowns": [
{
"content": "# AI-Powered Product Search\n\nOur search uses **machine learning** to understand your queries and find the most relevant products.\n\n## Features\n\n- **Semantic Search**: Understands meaning, not just keywords\n- **Visual Search**: Upload images to find similar products\n- **Smart Filters**: Automatically suggests relevant filters",
"title": "How it Works"
},
{
"content": "## Tips for Better Results\n\n1. Use descriptive terms (e.g., \"wireless noise-canceling headphones\")\n2. Try different keywords if you don't find what you're looking for\n3. Use filters to narrow down results\n\n*Happy searching!*",
"title": "Search Guide"
}
],
"template_type": "media-search",
"theme": {
"border_radius": "12px",
"card_style": "elevated",
"font_family": "Inter, sans-serif",
"primary_color": "#007AFF"
},
"title": "Product Search"
},
"retriever_id": "<string>",
"public_name": "<string>",
"description": "<string>"
}
],
"password_protected": true,
"warnings": [
"<string>"
],
"has_unpublished_changes": false,
"monitoring_config": {
"enabled": true,
"error_boundary_enabled": true,
"sentry_enabled": true,
"posthog_enabled": true,
"custom_error_message": "<string>",
"auto_fix_enabled": true
},
"repo_url": "<string>",
"repo_branch": "<string>",
"github_installation_id": 123,
"versions": [
{
"version": 123,
"s3_version_id": "<string>",
"asset_prefix": "<string>",
"asset_manifest": {},
"asset_manifest_url": "<string>",
"deployed_by": "<string>",
"deployed_at": "2023-11-07T05:31:56Z",
"environment": "production",
"build_duration_ms": 123,
"message": "<string>",
"source_files": {},
"git_commit_sha": "<string>",
"git_commit_message": "<string>",
"git_author": "<string>"
}
]
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}Authorizations
Mixpeek API key, sent as Authorization: Bearer mxp_sk_.... Create one in Studio under Settings → API Keys, or with an admin key via POST /v1/organizations/users/{user_email}/api-keys. A missing header returns 403; an invalid or revoked key returns 401.
Body
Request to create a new App.
Only slug and meta are required. After creation, deploy a zip
bundle via POST /v1/apps/{app_id}/deploy.
Legacy page-builder fields (template, sections, custom_html,
hero, theme, seo, stats, featured_gallery, tabs,
password_secret_name) are accepted for backward compatibility but
deprecated. New apps should not use them.
URL-safe slug (globally unique, lowercase + hyphens). Becomes your URL: {slug}.mxp.co
3 - 60^[a-z0-9][a-z0-9-]*[a-z0-9]$"my-product-search"
"brand-dashboard"
App metadata (title, logo, favicon)
Show child attributes
Show child attributes
End-user authentication. Set mode='clerk' for managed auth.
Show child attributes
Show child attributes
JSX build configuration for an App.
Phase 1: schema only. Phase 3: used by the build pipeline Celery task.
Show child attributes
Show child attributes
Opt-in monitoring configuration for a Canvas app.
All monitoring is off by default except error_boundary_enabled, which
is a client-side UX safety net (shows fallback UI instead of blank page)
and sends no data externally.
When sentry_enabled or posthog_enabled are turned on, monitoring
data is sent to Mixpeek-internal Sentry/PostHog — never to the
customer's own observability stack. PII is stripped via beforeSend /
mask_all_text, and session replay is always off.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Hero section configuration for a page.
Show child attributes
Show child attributes
Theme configuration for public retriever UI.
Defines colors, fonts, and visual styling for the public search interface.
Show child attributes
Show child attributes
SEO configuration for public retriever discoverability.
Auto-generated during publishing with sensible defaults inferred from the retriever's display_config. All fields can be overridden manually.
This configuration controls how the public retriever appears in:
- Search engine results (Google, Bing, etc.)
- Social media shares (Twitter, Facebook, LinkedIn)
- Link previews in messaging apps
Show child attributes
Show child attributes
{
"author": "Mixpeek",
"favicon_url": "https://example.com/favicon.ico",
"keywords": [
"fitness",
"yoga",
"workout",
"exercise videos"
],
"locale": "en_US",
"logo_url": "https://example.com/logo.png",
"meta_description": "Search and discover fitness videos using AI-powered semantic search.",
"meta_title": "Fitness Video Search | Mixpeek",
"og_image_alt": "Fitness video search interface",
"og_image_url": "https://mixpeek-public-pages.s3.amazonaws.com/og.png",
"og_type": "website",
"robots": "index, follow",
"site_name": "Mixpeek",
"structured_data": {
"additional_properties": { "applicationCategory": "Search" },
"type": "WebApplication"
},
"twitter_card": "summary_large_image",
"twitter_site": "@mixpeek"
}
Show child attributes
Show child attributes
Configuration for the featured gallery section.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Response
The created App configuration
Response model for an App.
Deploy-based apps use versions, environments, build_config,
and auth_config. Legacy page-builder fields (template,
sections, custom_html, hero, theme, seo, stats,
featured_gallery, tabs, password_protected) are included
for backward compatibility but deprecated.
Canonical published URL (https://{slug}.mxp.co)
Page-level metadata (REQUIRED when creating a page).
This object is separate from the optional seo field.
meta controls the visible page chrome (browser tab title, logo, favicon),
while seo controls search-engine tags (og:title, og:description, etc.).
Show child attributes
Show child attributes
Show child attributes
Show child attributes
End-user authentication configuration for an App.
Supported modes:
public: No authentication required (default)clerk: Managed auth via Clerk Organizations — handles Google, GitHub, email/password signup/login. Each canvas app maps to a Clerk Organization. Users are synced to canvas_users via Clerk webhooks.password: Simple password gate — visitors must enter a password to access the app. The password is hashed (bcrypt) before storage.api_key,jwt,sso_oidc,sso_saml: Advanced modes retained for future use.
Show child attributes
Show child attributes
JSX build configuration for an App.
Phase 1: schema only. Phase 3: used by the build pipeline Celery task.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Hero section configuration for a page.
Show child attributes
Show child attributes
Theme configuration for public retriever UI.
Defines colors, fonts, and visual styling for the public search interface.
Show child attributes
Show child attributes
SEO configuration for public retriever discoverability.
Auto-generated during publishing with sensible defaults inferred from the retriever's display_config. All fields can be overridden manually.
This configuration controls how the public retriever appears in:
- Search engine results (Google, Bing, etc.)
- Social media shares (Twitter, Facebook, LinkedIn)
- Link previews in messaging apps
Show child attributes
Show child attributes
{
"author": "Mixpeek",
"favicon_url": "https://example.com/favicon.ico",
"keywords": [
"fitness",
"yoga",
"workout",
"exercise videos"
],
"locale": "en_US",
"logo_url": "https://example.com/logo.png",
"meta_description": "Search and discover fitness videos using AI-powered semantic search.",
"meta_title": "Fitness Video Search | Mixpeek",
"og_image_alt": "Fitness video search interface",
"og_image_url": "https://mixpeek-public-pages.s3.amazonaws.com/og.png",
"og_type": "website",
"robots": "index, follow",
"site_name": "Mixpeek",
"structured_data": {
"additional_properties": { "applicationCategory": "Search" },
"type": "WebApplication"
},
"twitter_card": "summary_large_image",
"twitter_site": "@mixpeek"
}
Show child attributes
Show child attributes
Configuration for the featured gallery section.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Non-fatal advisories about the request that was just applied. Currently used to spell out the effect of a takedown write, e.g. 'is_active: false' makes the canvas runtime refuse the app's URL with a 404 within its serving-cache window, and the note says how to verify that. Additive and safe to ignore.
Opt-in monitoring configuration for a Canvas app.
All monitoring is off by default except error_boundary_enabled, which
is a client-side UX safety net (shows fallback UI instead of blank page)
and sends no data externally.
When sentry_enabled or posthog_enabled are turned on, monitoring
data is sent to Mixpeek-internal Sentry/PostHog — never to the
customer's own observability stack. PII is stripped via beforeSend /
mask_all_text, and session replay is always off.
Show child attributes
Show child attributes
Deploy version history with timestamps and environment info
Show child attributes
Show child attributes
Was this page helpful?

