Back to API Overview

Sites API

Create and manage site projects, pages, and components.

146 endpoints

Endpoints

POST
/api/v1/appBuilder/listProjects

List all app builder projects. Returns array with id, name, description, linkedBaseId, page count, component count.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listProjects \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{}'
POST
/api/v1/appBuilder/getProject

Get a project with its pages, components, linkedBase, and triggers

Parameters

idstringrequired

Project ID from listProjects

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getProject \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/appBuilder/getAccessOverview

Aggregated access-control snapshot for the central Access Control page.

Parameters

projectIdstringrequired

Project ID from listProjects

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getAccessOverview \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/createProject

Create a new app builder project

Parameters

namestringrequired

Project name

descriptionstring

Optional project description

colorstring

Hex color code (default: #3B82F6)

brandKitany

Brand kit (colors/typography/tokens) to seed the project design system

projectTypestring

Project type: web or mobile app

bundleIdentifierstring

Mobile app bundle identifier (e.g. com.example.myapp)

appDisplayNamestring

Mobile app display name for App Store / Play Store

isDevSiteboolean

Partner dev site: visitor-locked test site that does not consume plan quota (partners only)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/createProject \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "example",
  "description": "example",
  "color": "example"
}'
POST
/api/v1/appBuilder/updateProject

Update project settings including branding, dependencies, marketplace, and mobile config

Parameters

idstringrequired

Project ID from listProjects

namestring

New project name

descriptionstring

New description

colorstring

New hex color code

logostring

URL or path to logo image (recommended: 200x50px PNG or SVG)

faviconstring

URL or path to favicon image (recommended: 32x32px PNG or ICO)

showSerenitesBrandingboolean

Show "Powered by Serenities AI" branding on published app

dependenciesobject

NPM packages to bundle. Example: {"framer-motion": "^10.0.0", "chart.js": "^4.4.0"}. Packages are installed via Bun and bundled by Vite for production. Tailwind CSS is included by default.

aiKnowledgestring

AI project knowledge - persistent instructions for AI including project goals, coding style, and constraints

brandKitobject

Brand kit - design tokens and identity (colors, typography, logo, voice, style) the AI applies when generating UI

marketplaceEnabledboolean

Enable marketplace listing for this app

marketplaceThumbnailstring

Thumbnail image URL or path for marketplace listing (recommended: 400x300px)

marketplaceCoverstring

Cover/banner image URL or path for marketplace detail page (recommended: 1200x400px)

marketplaceDescriptionstring

Extended description for marketplace listing

appDisplayNamestring

Mobile app display name for App Store / Play Store

bundleIdentifierstring

Mobile app bundle identifier (e.g. com.example.myapp)

appVersionstring

Mobile app version (e.g. 1.0.0)

buildNumberinteger

Mobile app build number

appIconstring

URL to app icon image (1024x1024 PNG)

splashScreenstring

URL to splash screen image (1284x2778 PNG)

orientationstring

Mobile app orientation lock

mobilePermissionsarray

Mobile permissions: camera, location, notifications, media-library, contacts, biometrics, file-system

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateProject \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "name": "example",
  "description": "example"
}'
POST
/api/v1/appBuilder/setPageActive

Activate or deactivate a page. Slot rule: exactly ONE active page per URL path — activating a page automatically deactivates any sibling page holding the same path (e.g. switching which "/" home page variant is live). Params: projectId, pageId, active (boolean).

Parameters

projectIdstringrequired

Project ID from listProjects

pageIdstringrequired
activebooleanrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/setPageActive \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "pageId": "example",
  "active": true
}'
POST
/api/v1/appBuilder/updateProjectAuth

Update project authentication settings

Parameters

idstringrequired

Project ID

authEnabledboolean

Enable authentication for this app

authAllowSignupboolean

Allow new users to sign up

authRequireEmailboolean

Require email verification

authAllowSocialboolean

Allow social login (Google, GitHub)

authPathsobject

Custom auth paths object. Keys: login, signup, forgotPassword, resetPassword, verifyEmail, afterLogin, afterLogout, accessDenied, or any custom paths. Values: the URL path (e.g., "/signin", "/register")

authCustomFieldsarray

Custom signup form fields. MERGED by field name into the existing list (upsert): pass only the fields you want to add or change — omitted fields are preserved, not dropped. Pass null to clear ALL fields. To delete specific fields, use removeCustomFields.

removeCustomFieldsarray

Field names to remove from authCustomFields. Does not delete values already stored on user profiles, only stops the field being declared.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateProjectAuth \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "authEnabled": true,
  "authAllowSignup": true
}'
POST
/api/v1/appBuilder/bundleDeps

Bundle npm dependencies for a project. Call this after adding/changing dependencies to ensure they are bundled and ready for preview.

Parameters

idstringrequired

Project ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/bundleDeps \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/appBuilder/updateSubdomain

Update the published subdomain for an app

Parameters

idstringrequired

Project ID

subdomainstringrequired

New subdomain (without .serenitiesai.app)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateSubdomain \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "subdomain": "example"
}'
POST
/api/v1/appBuilder/listEnvVars

List environment variables for a project

Parameters

projectIdstringrequired

Project ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listEnvVars \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/createEnvVar

Create a new environment variable

Parameters

projectIdstringrequired

Project ID

namestringrequired

Variable name (e.g., OPENAI_API_KEY)

valuestringrequired

Variable value

descriptionstring

Optional description

isSecretboolean

If true, value is masked in UI

installScopeIdstring

Scope this variable to an installed plugin (listingId) — the plugin sees it, nothing else does.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/createEnvVar \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "name": "example",
  "value": "example"
}'
POST
/api/v1/appBuilder/updateEnvVar

Update an environment variable

Parameters

idstringrequired

Environment variable ID

valuestring

New value (only if changing)

descriptionstring

New description

isSecretboolean

Update secret flag

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateEnvVar \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "value": "example",
  "description": "example"
}'
POST
/api/v1/appBuilder/deleteEnvVar

Delete an environment variable

Parameters

idstringrequired

Environment variable ID to delete

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/deleteEnvVar \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/appBuilder/updateCustomDomain

Update custom domain settings

Parameters

idstringrequired

Project ID

customDomainstring

Custom domain (e.g., myapp.com)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateCustomDomain \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "customDomain": "example"
}'
POST
/api/v1/appBuilder/getAppUsers

Get users who signed up to this published app

Parameters

projectIdstringrequired

Project ID

limitnumber
offsetnumber

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getAppUsers \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "limit": 0,
  "offset": 0
}'
POST
/api/v1/appBuilder/deleteAppUser

Delete a user from this published app

Parameters

projectIdstringrequired

Project ID

userIdstringrequired

App user ID to delete

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/deleteAppUser \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "userId": "example"
}'
POST
/api/v1/appBuilder/getEntitlements

List an app user's entitlements with live status — what paid access they hold right now

Parameters

projectIdstringrequired

Project ID

appUserIdstringrequired

App user ID (from getAppUsers)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getEntitlements \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "appUserId": "example"
}'
POST
/api/v1/appBuilder/grantEntitlement

Grant (or re-activate) paid access to an app user — e.g. a free month, a comp, or after an offline payment

Parameters

projectIdstringrequired

Project ID

appUserIdstringrequired

App user ID

keystringrequired

Entitlement key, e.g. "member"

expiresAtstring

ISO date when access ends; omit for lifetime

graceUntilstring

ISO date grace period ends (access continues past expiry until then)

sourceobject

Audit context, e.g. { reason: "support comp" }

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/grantEntitlement \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "appUserId": "example",
  "key": "example"
}'
POST
/api/v1/appBuilder/extendEntitlement

Extend an existing entitlement's expiry (renewal)

Parameters

projectIdstringrequired

Project ID

appUserIdstringrequired

App user ID

keystringrequired

Entitlement key

expiresAtstringrequired

New ISO expiry date (required — use grantEntitlement for lifetime)

graceUntilstring

ISO date grace period ends

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/extendEntitlement \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "appUserId": "example",
  "key": "example"
}'
POST
/api/v1/appBuilder/suspendEntitlement

Suspend an entitlement (e.g. missed installment) — access ends when any grace runs out

Parameters

projectIdstringrequired

Project ID

appUserIdstringrequired

App user ID

keystringrequired

Entitlement key

graceUntilstring

ISO date until which access continues despite suspension (grace)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/suspendEntitlement \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "appUserId": "example",
  "key": "example"
}'
POST
/api/v1/appBuilder/revokeEntitlement

Revoke an entitlement immediately (refund/abuse) — access ends now, audit trail kept

Parameters

projectIdstringrequired

Project ID

appUserIdstringrequired

App user ID

keystringrequired

Entitlement key

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/revokeEntitlement \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "appUserId": "example",
  "key": "example"
}'
POST
/api/v1/appBuilder/updateManualPayments

Configure the manual/cash payment method — members pay outside the platform, the owner verifies and approves

Parameters

projectIdstringrequired

Project ID

enabledboolean

Turn the manual/cash payment method on or off

instructionsstring

Shown to members at checkout: bank details, wallet handle, where to pay

qrUrlstring

Legacy single QR image URL (kept as a one-method fallback). Prefer methods.

methodsarray

Labelled QR/wallet methods shown to members. Supersedes qrUrl. Pass [] or null to clear.

notifyEmailboolean

Email the owner on submit and the member on approve/reject

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateManualPayments \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "enabled": true,
  "instructions": "example"
}'
POST
/api/v1/appBuilder/listManualPayments

The manual-payment approval queue: members' offline payments awaiting the owner's verification

Parameters

projectIdstringrequired

Project ID

statusstring

Filter — default "pending" (the approval queue)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listManualPayments \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "status": "example"
}'
POST
/api/v1/appBuilder/approveManualPayment

Approve a member's manual payment — marks it succeeded and grants the offer's entitlement per its access terms

Parameters

projectIdstringrequired

Project ID

paymentIdstringrequired

Manual payment id (from listManualPayments)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/approveManualPayment \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "paymentId": "example"
}'
POST
/api/v1/appBuilder/rejectManualPayment

Reject a member's manual payment claim (not received / wrong amount). No entitlement is granted

Parameters

projectIdstringrequired

Project ID

paymentIdstringrequired

Manual payment id

reasonstring

Optional reason kept on the record

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/rejectManualPayment \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "paymentId": "example",
  "reason": "example"
}'
POST
/api/v1/appBuilder/createAppUser

Manually create a user for this published app

Parameters

projectIdstringrequired

Project ID

emailstringrequired

User email

namestring

User name

passwordstringrequired

User password (min 8 chars)

rolestring

Legacy user/admin enum (kept for backward compat during the role-migration).

roleIdsarray

New-format role assignments. Each ID must be an AppBuilderRole for this project. Granted atomically with user creation.

sendWelcomeEmailboolean

Send welcome email with credentials

customFieldsobject

Custom field values keyed by field ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/createAppUser \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "email": "example",
  "name": "example"
}'
POST
/api/v1/appBuilder/resetAppUserPassword

Reset password for an app user

Parameters

projectIdstringrequired

Project ID

userIdstringrequired

App user ID

newPasswordstringrequired

New password (min 8 chars)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/resetAppUserPassword \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "userId": "example",
  "newPassword": "example"
}'
POST
/api/v1/appBuilder/updateAppUserRole

LEGACY: set the platform-level user/admin classification. For has_role rules in access control, use assignRoleToAppUser / unassignRoleFromAppUser with roleIds from listProjectRoles.

Parameters

projectIdstringrequired

Project ID

userIdstringrequired

App user ID

rolestringrequired

LEGACY platform-level classification (user|admin). Retained for backward compat during the role-migration window. For access-control roles, use assignRoleToAppUser with a roleId from listProjectRoles.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateAppUserRole \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "userId": "example",
  "role": "example"
}'
POST
/api/v1/appBuilder/updateAppUser

Update an app user record (name, email, role, banned status, custom fields)

Parameters

projectIdstringrequired

Project ID

userIdstringrequired

App user ID

namestring

User name

emailstring

User email

rolestring

User role

isBannedboolean

Ban/unban user

customFieldsobject

Custom field values matching authCustomFields

profileDataobject

Alias of customFields — custom field values matching authCustomFields, merged into existing profileData

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateAppUser \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "userId": "example",
  "name": "example"
}'
POST
/api/v1/appBuilder/listProjectRoles

List all role definitions for a project. Auto-seeds reserved + legacy roles.

Parameters

projectIdstringrequired

Project ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listProjectRoles \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/createProjectRole

Create a new role on a project.

Parameters

projectIdstringrequired

Project ID

namestringrequired

Role name

colorstring

Hex color for UI badges

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/createProjectRole \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "name": "example",
  "color": "example"
}'
POST
/api/v1/appBuilder/updateProjectRole

Update a role on a project. The reserved app-super-admin role cannot be renamed.

Parameters

roleIdstringrequired

Role ID from listProjectRoles

namestring

New role name

colorstring

New hex color (null clears)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateProjectRole \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "roleId": "example",
  "name": "example",
  "color": "example"
}'
POST
/api/v1/appBuilder/deleteProjectRole

Delete a role and all its assignments. The reserved app-super-admin role cannot be deleted.

Parameters

roleIdstringrequired

Role ID to delete

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/deleteProjectRole \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "roleId": "example"
}'
POST
/api/v1/appBuilder/listAccessPolicies

List reusable access policies for a project.

Parameters

projectIdstringrequired

Project ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listAccessPolicies \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/createAccessPolicy

Create a reusable access policy. Reference it from a resource rule via { policy: <id> }.

Parameters

projectIdstringrequired

Project ID

namestringrequired

Unique policy name

descriptionstring
colorstring
conditionanyrequired

The access Condition this policy represents (leaf, group, or legacy array).

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/createAccessPolicy \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "name": "example",
  "description": "example"
}'
POST
/api/v1/appBuilder/updateAccessPolicy

Update a reusable access policy. Editing the condition updates every resource that references it.

Parameters

policyIdstringrequired
namestring
descriptionstring
colorstring
conditionany

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateAccessPolicy \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "policyId": "example",
  "name": "example",
  "description": "example"
}'
POST
/api/v1/appBuilder/deleteAccessPolicy

Delete a reusable access policy. Resources still referencing it will DENY (fail-closed) until updated.

Parameters

policyIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/deleteAccessPolicy \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "policyId": "example"
}'
POST
/api/v1/appBuilder/assignRoleToAppUser

Grant a role to an app user. Idempotent.

Parameters

userIdstringrequired

App user ID

roleIdstringrequired

Role ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/assignRoleToAppUser \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "userId": "example",
  "roleId": "example"
}'
POST
/api/v1/appBuilder/unassignRoleFromAppUser

Remove a role from an app user. Idempotent.

Parameters

userIdstringrequired

App user ID

roleIdstringrequired

Role ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/unassignRoleFromAppUser \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "userId": "example",
  "roleId": "example"
}'
POST
/api/v1/appBuilder/getAppUserRoles

Get all roles assigned to an app user.

Parameters

userIdstringrequired

App user ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getAppUserRoles \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "userId": "example"
}'
POST
/api/v1/appBuilder/migrateProjectToRoleSystem

Idempotent one-shot migration of legacy role data into the new AppBuilderRole model.

Parameters

projectIdstringrequired

Project to migrate

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/migrateProjectToRoleSystem \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/deleteProject

Delete a project, its linked Base, and all pages/components

Parameters

idstringrequired

Project ID to delete

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/deleteProject \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/appBuilder/createPage

Create a new page in a project. Set SEO title + description here for any public page so it ships indexable from day one — no follow-up updatePage call needed.

Parameters

projectIdstringrequired

Project ID from listProjects

namestringrequired

Page name (e.g., "About", "Contact")

pathstringrequired

URL path (e.g., "/about", "/contact")

titlestring

SEO page title — 50-60 characters. Keyword-led, action-oriented. Example: "Pricing – Plans for Teams of Any Size". Leave empty for protected/auth pages and /404.

descriptionstring

SEO meta description — 150-160 characters. Action-oriented, includes value prop + key features. Example: "Compare Free, Pro, and Enterprise plans. Start free, upgrade for unlimited tasks, or pick Enterprise for SSO and SLA support."

isHomePageboolean

Set as the project home page (path "/"). Only one page can be home; setting this unsets any existing home.

isProtectedboolean

Require authentication to access. Use for dashboards, settings, user-only content. Skip SEO meta on protected pages.

contentstring

Page content (React component code). Pages without content are skipped by publish — set it here or via updatePage before publishing.

commitMessagestring

Git commit message describing what was created and why. Always provide a meaningful message.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/createPage \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "name": "example",
  "path": "example"
}'
POST
/api/v1/appBuilder/createComponent

Create a new component in a project

Parameters

projectIdstringrequired

Project ID from listProjects

namestringrequired

Component name

descriptionstring

Optional component description

typestring

Component type: "custom", "layout", "ui", or "data"

contentstring

Component code (React/TSX). Set it here or via updateComponent — pages importing an empty component fail to build.

isGlobalboolean

Whether component is globally accessible

commitMessagestring

Git commit message describing what was created and why. Always provide a meaningful message.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/createComponent \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "name": "example",
  "description": "example"
}'
POST
/api/v1/appBuilder/listPages

List all pages in a project

Parameters

projectIdstringrequired

Project ID from listProjects

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listPages \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/getPage

Get page details including content

Parameters

idstringrequired

Page ID from listPages

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getPage \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/appBuilder/readPage

Read page content with line numbers. Use offset/limit to read specific sections of large files.

Parameters

idstringrequired

Page ID from listPages

offsetnumber

Line number to start from (1-indexed). If not specified, starts from line 1.

limitnumber

Number of lines to read. If not specified, reads entire file.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/readPage \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "offset": 0,
  "limit": 0
}'
POST
/api/v1/appBuilder/readComponent

Read component content with line numbers. Use offset/limit for large files.

Parameters

idstringrequired

Component ID from listComponents

offsetnumber

Line number to start from (1-indexed)

limitnumber

Number of lines to read

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/readComponent \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "offset": 0,
  "limit": 0
}'
POST
/api/v1/appBuilder/getPageAccessRules

Get the access rules JSON for a single page.

Parameters

pageIdstringrequired

Page ID from listPages

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getPageAccessRules \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "pageId": "example"
}'
POST
/api/v1/appBuilder/setPageAccessRules

Set access rules on a page and sync legacy isProtected/requiredRole for Worker compatibility.

Parameters

pageIdstringrequired

Page ID from listPages

accessRulesobjectrequired

Pages have a single read/view operation. `read` is a Condition: a rule, a legacy flat array (OR), or an { all | any | not } group with operators. `function` rules are NOT allowed (the edge guard cannot run them).

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/setPageAccessRules \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "pageId": "example",
  "accessRules": {}
}'
POST
/api/v1/appBuilder/getBackendFunctionAccessRules

Get the access rules JSON for a single backend function.

Parameters

functionIdstringrequired

Backend function ID from listBackendFunctions

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getBackendFunctionAccessRules \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "functionId": "example"
}'
POST
/api/v1/appBuilder/setBackendFunctionAccessRules

Set access rules on a backend function.

Parameters

functionIdstringrequired

Backend function ID from listBackendFunctions

accessRulesobjectrequired

Backend functions have a single execute operation. `execute` is a Condition: a rule, a legacy flat array (OR), or an { all | any | not } group with operators and the custom `function` rule.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/setBackendFunctionAccessRules \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "functionId": "example",
  "accessRules": {}
}'
POST
/api/v1/appBuilder/getEmailAccessRules

Get who may send email from the published app (client-side email.send). Email is DENY-BY-DEFAULT for non-owners.

Parameters

projectIdstringrequired

Project ID from listProjects

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getEmailAccessRules \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/setEmailAccessRules

Set who may send email from the published app via the client-side email API. Server-side ctx.email.send() in backend functions is NOT affected (it runs as the project). Enforced at /api/email/send.

Parameters

projectIdstringrequired

Project ID from listProjects

accessRulesobjectrequired

{ send: Condition } — same rule shapes as other resources (authenticated/has_role/user_property/policy refs or {all|any|not} groups). Empty/missing send = only the owner may send. NOTE: sending spends the owner's email quota under the owner's sender identity — open it narrowly (e.g. a staff role), not { type: "public" }.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/setEmailAccessRules \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "accessRules": {}
}'
POST
/api/v1/appBuilder/verifyBuild

Fast whole-project verification: per-file syntax/export/undefined-JSX checks, unresolved component imports, npm imports missing from project dependencies, and non-PascalCase component names (breaks publish). Call AFTER finishing edits and fix every reported error BEFORE telling the user the work is done. Warnings are advisory. Static check — publish still runs the full bundler.

Parameters

projectIdstringrequired

Project ID from listProjects

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/verifyBuild \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/updatePage

Update page properties and content

Parameters

idstringrequired

Page ID from listPages

namestring

New page name

pathstring

New URL path

contentstring

Page content (React component code or JSON)

layoutstring

Layout template name

isHomePageboolean

Set as home page

sortOrdernumber

Sort order for navigation

titlestring

Page title for SEO

descriptionstring

Page description for SEO

isDraftboolean

Draft mode - page exists in builder but is not included when publishing

isProtectedboolean

Require authentication to access

requiredRolestring

Required role to access (null = any authenticated user)

redirectIfUnauthstring

Redirect path for unauthenticated users

commitMessagestring

Git commit message describing what changed and why. Always provide a meaningful message.

baseContentHashstring

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updatePage \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "name": "example",
  "path": "example"
}'
POST
/api/v1/appBuilder/editPage

Edit page content by replacing specific text. Exact-match only — a near-miss fails and the error shows the file's actual nearby text to copy. If oldString is not unique, provide more surrounding context or use replaceAll=true.

Parameters

idstringrequired

Page ID from listPages

oldStringstringrequired

Exact text to find — matched byte-for-byte (whitespace/indentation included), NO fuzzy matching. Copy from readPage output WITHOUT the line-number prefixes, and do not add escaping the file does not contain (no \" or \n unless literally in the file). Must be unique in the file unless using replaceAll.

newStringstringrequired

The replacement text (must be different from oldString)

replaceAllboolean

Replace all occurrences. If false (default), oldString must be unique in the file.

commitMessagestring

Git commit message describing what changed and why. Always provide a meaningful message.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/editPage \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "oldString": "example",
  "newString": "example"
}'
POST
/api/v1/appBuilder/searchPage

Search page content for specific text/patterns. Returns matching lines with context. More efficient than getPage for finding specific code.

Parameters

idstringrequired

Page ID from listPages

patternstringrequired

Text or regex pattern to search for

contextLinesnumber

Number of lines to show before and after each match (default: 3)

maxMatchesnumber

Maximum number of matches to return (default: 5)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/searchPage \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "pattern": "example",
  "contextLines": 0
}'
POST
/api/v1/appBuilder/deletePage

Delete a page from the project

Parameters

idstringrequired

Page ID to delete

commitMessagestring

Git commit message explaining why the page was deleted. Always provide a meaningful message.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/deletePage \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "commitMessage": "example"
}'
POST
/api/v1/appBuilder/createEmailTemplate

Create a new email template in a project

Parameters

projectIdstringrequired

Project ID from listProjects

namestringrequired

Template display name (e.g., "Welcome Email")

slugstringrequired

Template slug used in email.send({ template: "slug" })

subjectstring

Default email subject line

descriptionstring

Template description

contentstring

Initial HTML content for the template

variablesarray

Template variables

commitMessagestring

Git commit message

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/createEmailTemplate \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "name": "example",
  "slug": "example"
}'
POST
/api/v1/appBuilder/listEmailTemplates

List all email templates in a project

Parameters

projectIdstringrequired

Project ID from listProjects

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listEmailTemplates \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/getEmailTemplate

Get an email template with full content

Parameters

idstringrequired

Email template ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getEmailTemplate \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/appBuilder/readEmailTemplate

Get email template content with line numbers for AI editing

Parameters

idstringrequired

Email template ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/readEmailTemplate \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/appBuilder/updateEmailTemplate

Update an email template

Parameters

idstringrequired

Email template ID

namestring

Template display name

slugstring

Template slug

subjectstring

Default subject line

descriptionstring

Template description

contentstring

Full HTML email template content

variablesarray

Template variables with source metadata

commitMessagestring

Git commit message

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateEmailTemplate \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "name": "example",
  "slug": "example"
}'
POST
/api/v1/appBuilder/editEmailTemplate

Replace specific text in an email template (string replacement)

Parameters

idstringrequired

Email template ID

oldStringstringrequired

Exact string to find in the template content

newStringstringrequired

Replacement string

replaceAllboolean

Replace all occurrences

commitMessagestring

Git commit message

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/editEmailTemplate \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "oldString": "example",
  "newString": "example"
}'
POST
/api/v1/appBuilder/searchEmailTemplate

Search for text in an email template

Parameters

idstringrequired

Email template ID

patternstringrequired

Search pattern (plain text or regex)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/searchEmailTemplate \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "pattern": "example"
}'
POST
/api/v1/appBuilder/deleteEmailTemplate

Delete an email template

Parameters

idstringrequired

Email template ID

commitMessagestring

Git commit message

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/deleteEmailTemplate \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "commitMessage": "example"
}'
POST
/api/v1/appBuilder/getEmailUsage

Get email usage stats for the current month — both marketing/transactional and auth quotas

Parameters

projectIdstringrequired

Project ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getEmailUsage \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/listComponents

List all components in a project

Parameters

projectIdstringrequired

Project ID from listProjects

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listComponents \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/getComponent

Get component details including content

Parameters

idstringrequired

Component ID from listComponents

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getComponent \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/appBuilder/updateComponent

Update component properties and code

Parameters

idstringrequired

Component ID from listComponents

namestring

New component name

descriptionstring

Component description

contentstring

Component code (React/TSX)

typestring

Component type

isGlobalboolean

Whether globally accessible

commitMessagestring

Git commit message describing what changed and why. Always provide a meaningful message.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateComponent \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "name": "example",
  "description": "example"
}'
POST
/api/v1/appBuilder/editComponent

Edit component content by replacing specific text. Exact-match only — a near-miss fails and the error shows the file's actual nearby text to copy. If oldString is not unique, provide more context or use replaceAll=true.

Parameters

idstringrequired

Component ID from listComponents

oldStringstringrequired

Exact text to find — matched byte-for-byte (whitespace/indentation included), NO fuzzy matching. Copy from readComponent output WITHOUT the line-number prefixes, and do not add escaping the file does not contain (no \" or \n unless literally in the file). Must be unique unless using replaceAll.

newStringstringrequired

The replacement text (must be different from oldString)

replaceAllboolean

Replace all occurrences. If false (default), oldString must be unique.

commitMessagestring

Git commit message describing what changed and why. Always provide a meaningful message.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/editComponent \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "oldString": "example",
  "newString": "example"
}'
POST
/api/v1/appBuilder/searchComponent

Search component content for specific text/patterns. Returns matching lines with context.

Parameters

idstringrequired

Component ID from listComponents

patternstringrequired

Text or regex pattern to search for

contextLinesnumber

Lines to show before/after match

maxMatchesnumber

Maximum matches to return

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/searchComponent \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "pattern": "example",
  "contextLines": 0
}'
POST
/api/v1/appBuilder/deleteComponent

Delete a component from the project

Parameters

idstringrequired

Component ID to delete

commitMessagestring

Git commit message explaining why the component was deleted. Always provide a meaningful message.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/deleteComponent \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "commitMessage": "example"
}'
POST
/api/v1/appBuilder/listSnapshots

List built-in version-history checkpoints for a project (paginated)

Parameters

projectIdstringrequired
limitinteger
cursorstring

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listSnapshots \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "limit": {},
  "cursor": "example"
}'
POST
/api/v1/appBuilder/getSnapshotContent

Resolve a checkpoint's page/component content for preview

Parameters

projectIdstringrequired
snapshotIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getSnapshotContent \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "snapshotId": "example"
}'
POST
/api/v1/appBuilder/restoreSnapshot

Restore the project to a previous version. Reversible — captures the current state first.

Parameters

projectIdstringrequired
snapshotIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/restoreSnapshot \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "snapshotId": "example"
}'
POST
/api/v1/appBuilder/revertSnapshotChange

Undo only the change a version/message made, keeping later changes (skips files later edited).

Parameters

projectIdstringrequired
snapshotIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/revertSnapshotChange \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "snapshotId": "example"
}'
POST
/api/v1/appBuilder/listOffers

List ALL offers (active + inactive) with full terms.

Parameters

projectIdstringrequired

Project ID from listProjects

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listOffers \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/createOffer

Create a PRODUCT (a sellable thing: membership tier, course, pass, download). Buying it grants its entitlement; gate pages/tables/channels with has_entitlement rules. Tiers = multiple products with different entitlementKeys.

Parameters

projectIdstringrequired

Project ID from listProjects

keystringrequired

Stable id used by pages: payments.checkout(key). Lowercase, e.g. "pro"

namestringrequired

Display name, e.g. "Pro Membership"

descriptionstring
amountintegerrequired

Price in MINOR units (1900 = $19.00). 0 = free (trial offers)

currencystring

ISO code, default usd

paymentTermany

How it is paid. Default one_time. recurring {every:1,interval:"month"} = monthly; {every:3,interval:"month"} = quarterly; trialDays = free trial before the first charge (card checkout)

accessTermany

How long access lasts. Default lifetime. while_subscribed pairs with recurring payment

entitlementKeystring

Entitlement granted on payment (default = the product key). Gate content with { type: "has_entitlement", key }

imageUrlstring

Product image URL shown on pricing/product cards

featuresarray

Selling-point bullets, e.g. ["All courses", "Weekly live calls", "Private lounge"]

isActiveboolean

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/createOffer \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "key": "example",
  "name": "example"
}'
POST
/api/v1/appBuilder/updateOffer

Update an offer. Term changes affect FUTURE purchases only — existing members keep what they bought (grandfathering).

Parameters

projectIdstringrequired
keystringrequired

Offer key from listOffers

namestring
descriptionstring
amountinteger
currencystring
paymentTermany
accessTermany
entitlementKeystring
imageUrlstring
featuresarray
isActiveboolean

false = stop selling (existing entitlements unaffected)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateOffer \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "key": "example",
  "name": "example"
}'
POST
/api/v1/appBuilder/deleteOffer

Delete an offer permanently. Prefer updateOffer isActive:false — deletion breaks pages referencing the key. Existing entitlements are never touched.

Parameters

projectIdstringrequired
keystringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/deleteOffer \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "key": "example"
}'
POST
/api/v1/appBuilder/listCoupons

List discount coupons with redemption counts

Parameters

projectIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listCoupons \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/createCoupon

Create a discount coupon. Multiple coupons can be active at once. Redemptions count only on PAID checkouts. The redeemed code lands in the entitlement source — usable for affiliate attribution.

Parameters

projectIdstringrequired
codestringrequired

The code members type (stored UPPERCASE), e.g. LAUNCH20

percentOffinteger

Percent discount 1-100 (use EITHER this or amountOff)

amountOffinteger

Fixed discount in MINOR units (500 = $5 off)

offerKeysarray

Restrict to these offer keys (omit = all offers)

maxRedemptionsinteger

Total successful uses allowed (omit = unlimited)

expiresAtstring

ISO date after which the code stops working

isActiveboolean

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/createCoupon \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "code": "example",
  "percentOff": {}
}'
POST
/api/v1/appBuilder/updateCoupon

Update a coupon (isActive:false kills it instantly; past redemptions unaffected).

Parameters

projectIdstringrequired
codestringrequired

Coupon code from listCoupons

percentOffinteger
amountOffinteger
offerKeysarray
maxRedemptionsinteger
expiresAtstring
isActiveboolean

false = disable the code immediately

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateCoupon \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "code": "example",
  "percentOff": {}
}'
POST
/api/v1/appBuilder/deleteCoupon

Delete a coupon permanently.

Parameters

projectIdstringrequired
codestringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/deleteCoupon \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "code": "example"
}'
POST
/api/v1/appBuilder/listCampaigns

List email campaigns with status + send stats

Parameters

projectIdstringrequired

Project ID from listProjects

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listCampaigns \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/createCampaign

Create a DRAFT email campaign. The audience is dynamic: an access-rule condition evaluated against live member data at send time.

Parameters

projectIdstringrequired

Project ID from listProjects

namestringrequired

Internal name, e.g. "July newsletter"

subjectstringrequired
htmlstringrequired

Email body HTML (an unsubscribe footer is added automatically)

textstring
audienceRulesany

Access Control condition selecting recipients — SAME schema as page/table rules. Examples: [{"type":"has_entitlement","key":"pro"}] = paying Pro members; [{"type":"has_role","roleId":"..."}]; omit = ALL members.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/createCampaign \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "name": "example",
  "subject": "example"
}'
POST
/api/v1/appBuilder/updateCampaign

Update a DRAFT campaign (sent/sending campaigns are immutable).

Parameters

projectIdstringrequired
idstringrequired

Campaign ID from listCampaigns

namestring
subjectstring
htmlstring
textstring
audienceRulesany

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateCampaign \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "id": "example",
  "name": "example"
}'
POST
/api/v1/appBuilder/deleteCampaign

Delete a campaign (any status; stops future batches).

Parameters

projectIdstringrequired
idstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/deleteCampaign \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "id": "example"
}'
POST
/api/v1/appBuilder/previewCampaignAudience

Resolve the campaign audience NOW: recipient count, sample, suppressed count, and quota headroom. Always preview before sendCampaign.

Parameters

projectIdstringrequired
idstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/previewCampaignAudience \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "id": "example"
}'
POST
/api/v1/appBuilder/sendCampaign

Send a draft campaign to its resolved audience. Draws from the combined marketing+transactional monthly quota; signup/password emails are a separate bucket and unaffected.

Parameters

projectIdstringrequired
idstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/sendCampaign \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "id": "example"
}'
POST
/api/v1/appBuilder/listSuppressions

List unsubscribed/suppressed email addresses (marketing only)

Parameters

projectIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listSuppressions \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/removeSuppression

Remove an address from the suppression list (only when the person explicitly re-opted-in).

Parameters

projectIdstringrequired
emailstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/removeSuppression \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "email": "example"
}'
POST
/api/v1/appBuilder/getChannelAccessRules

List realtime channel access rules (pattern -> rules). Channels with no matching pattern allow any signed-in member.

Parameters

projectIdstringrequired

Project ID from listProjects

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getChannelAccessRules \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/setChannelAccessRules

Set access rules for a realtime channel pattern (upserts by pattern). Same rule engine as every other resource.

Parameters

projectIdstringrequired

Project ID from listProjects

patternstringrequired

Channel pattern: exact ("announcements"), wildcard ("chat:*"), or dynamic with {self} = subscriber id ("support:{self}", "user:{self}:*")

accessRulesobjectrequired

Channels have a single `subscribe` operation. Same Condition schema as pages/tables/files: rules, flat arrays (OR), { all | any | not } groups. Example: { subscribe: [{ type: "has_entitlement", key: "pro" }] }

descriptionstring
sortOrderinteger

First matching pattern wins (ascending)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/setChannelAccessRules \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "pattern": "example",
  "accessRules": {}
}'
POST
/api/v1/appBuilder/deleteChannelAccessRules

Remove access rules for a channel pattern.

Parameters

projectIdstringrequired

Project ID from listProjects

patternstringrequired

Channel pattern to remove rules for (channel reverts to the any-member default)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/deleteChannelAccessRules \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "pattern": "example"
}'
POST
/api/v1/appBuilder/setRealtimeGuestAccess

Enable/disable anonymous guest realtime sessions (support-widget chat for non-logged-in visitors).

Parameters

projectIdstringrequired

Project ID from listProjects

enabledbooleanrequired

Allow anonymous visitors to open guest realtime sessions (scoped to their own guest:{id}:* channels)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/setRealtimeGuestAccess \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "enabled": true
}'
POST
/api/v1/appBuilder/listSchedules

List scheduled backend-function runs (crons) for a project

Parameters

projectIdstringrequired

Project ID from listProjects

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listSchedules \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/createSchedule

Schedule a backend function to run on a cron — drip, digests, reminders, sweeps

Parameters

projectIdstringrequired

Project ID from listProjects

functionNamestringrequired

Backend function to run (name from listBackendFunctions)

cronExpressionstringrequired

Cron expression, e.g. "0 9 * * 1" = Mondays 9am

timezonestring

IANA timezone (default UTC)

namestring

Display name, e.g. "Weekly digest"

paramsobject

Extra params passed to the function

isActiveboolean

Start enabled (default true)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/createSchedule \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "functionName": "example",
  "cronExpression": "example"
}'
POST
/api/v1/appBuilder/updateSchedule

Update a schedule (fields omitted stay unchanged); isActive toggles it

Parameters

projectIdstringrequired

Project ID from listProjects

idstringrequired

Schedule ID from listSchedules

functionNamestring
cronExpressionstring
timezonestring
namestring
paramsobject
isActiveboolean

Enable/disable the schedule

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateSchedule \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "id": "example",
  "functionName": "example"
}'
POST
/api/v1/appBuilder/deleteSchedule

Delete a schedule permanently (stop recurring runs)

Parameters

projectIdstringrequired

Project ID from listProjects

idstringrequired

Schedule ID from listSchedules

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/deleteSchedule \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "id": "example"
}'
POST
/api/v1/appBuilder/listTriggers

List all triggers (event-flow mappings) in a project

Parameters

projectIdstringrequired

Project ID from listProjects

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listTriggers \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/createTrigger

Create a trigger to execute a flow when an event occurs

Parameters

projectIdstringrequired

Project ID from listProjects

eventstringrequired

Event type

flowIdstringrequired

Flow ID to execute when event fires

targetPageIdstring

Page ID for page-specific events

targetElementIdstring

Element ID for element-specific events (button clicks, form submits)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/createTrigger \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "event": "example",
  "flowId": "example"
}'
POST
/api/v1/appBuilder/updateTrigger

Update trigger settings

Parameters

idstringrequired

Trigger ID from listTriggers

flowIdstring

New Flow ID

isActiveboolean

Enable/disable trigger

orderIndexnumber

Execution order

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateTrigger \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "flowId": "example",
  "isActive": true
}'
POST
/api/v1/appBuilder/deleteTrigger

Delete a trigger

Parameters

idstringrequired

Trigger ID to delete

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/deleteTrigger \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/appBuilder/publish

Publish an app to production. Builds all pages and deploys for serving.

Parameters

idstringrequired

Project ID to publish

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/publish \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/appBuilder/unpublish

Unpublish an app (marks as unpublished but keeps deployed files)

Parameters

idstringrequired

Project ID to unpublish

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/unpublish \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/appBuilder/getCustomDomainStatus

Get custom domain verification status and DNS instructions

Parameters

idstringrequired

Project ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getCustomDomainStatus \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/appBuilder/verifyCustomDomain

Verify custom domain ownership via DNS TXT record lookup

Parameters

idstringrequired

Project ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/verifyCustomDomain \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/appBuilder/getCodeGuide

Get docs for a SPECIFIC App Builder topic. Pass the topic you need (payments, auth, email, sdk, …). The SDK basics are already in your system prompt, so call this only when you need depth on a specific area — and pass a topic, not "all" (which returns just an index).

Parameters

topicstring

Pick the SPECIFIC topic you need (e.g. "payments", "auth", "email", "sdk", "styling"). "all" returns only a short index of topics, NOT full docs — request a specific topic for details. Topics: "sdk", "globals", "hooks", "navigation", "libraries", "styling", "components", "examples", "errors", "mcp", "access", "auth", "payments", "saas", "functions", "email".

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getCodeGuide \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "topic": "example"
}'
POST
/api/v1/appBuilder/removeCustomDomain

Remove custom domain from a project

Parameters

idstringrequired

Project ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/removeCustomDomain \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/appBuilder/getStripeConnection

Get Stripe connection status for a project

Parameters

projectIdstringrequired

Project ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getStripeConnection \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/updateStripeConnection

Save Stripe API key and/or webhook secret for test or live mode

Parameters

projectIdstringrequired

Project ID

modestringrequired

Which mode to update

secretKeystring

Stripe Secret Key (sk_test_xxx or sk_live_xxx)

webhookSecretstring

Stripe Webhook Secret (whsec_xxx)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateStripeConnection \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "mode": "example",
  "secretKey": "example"
}'
POST
/api/v1/appBuilder/toggleStripeMode

Switch between test and live Stripe mode

Parameters

projectIdstringrequired

Project ID

modestringrequired

Mode to switch to

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/toggleStripeMode \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "mode": "example"
}'
POST
/api/v1/appBuilder/syncStripeProducts

Sync products and prices from Stripe account

Parameters

projectIdstringrequired

Project ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/syncStripeProducts \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/listStripeProducts

List synced Stripe products

Parameters

projectIdstringrequired

Project ID

modestring

Filter by mode (default: current mode)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listStripeProducts \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "mode": "example"
}'
POST
/api/v1/appBuilder/disconnectStripe

Remove Stripe connection for test or live mode

Parameters

projectIdstringrequired

Project ID

modestringrequired

Which mode to disconnect

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/disconnectStripe \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "mode": "example"
}'
POST
/api/v1/appBuilder/createStripeProduct

Create a new product with price in Stripe

Parameters

projectIdstringrequired

Project ID

namestringrequired

Product name

descriptionstring

Product description

amountintegerrequired

Price amount in cents (e.g., 999 = $9.99)

currencystring

Currency code (default: usd)

intervalstring

Billing interval for subscriptions

intervalCountinteger

Number of intervals between billings

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/createStripeProduct \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "name": "example",
  "description": "example"
}'
POST
/api/v1/appBuilder/getGitConnection

Get Git connection status. Param "projectId". Returns: connected, repoOwner, repoName, branch, lastCommitSha, AI permission flags.

Parameters

projectIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getGitConnection \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/connectGitHub

Connect a GitHub repository. Params: projectId (required), repoOwner (GitHub username or org), repoName (repo name), OR createNew (true) with newRepoName to create a new repo.

Parameters

projectIdstringrequired
repoOwnerstring
repoNamestring
createNewboolean
newRepoNamestring

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/connectGitHub \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "repoOwner": "example",
  "repoName": "example"
}'
POST
/api/v1/appBuilder/disconnectGitHub

Disconnect GitHub from project. Param "projectId". Clears all Git settings and token.

Parameters

projectIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/disconnectGitHub \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/updateGitPermissions

Update AI Git permissions. Params: projectId (required), plus any of: - allowAiCommit: boolean - Allow AI to commit changes - allowAiPull: boolean - Allow AI to pull from remote - allowAiPush: boolean - Allow AI to push to remote - allowAiCreateBranch: boolean - Allow AI to create branches/repos

Parameters

projectIdstringrequired
allowAiCommitboolean
allowAiPullboolean
allowAiPushboolean
allowAiCreateBranchboolean

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateGitPermissions \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "allowAiCommit": true,
  "allowAiPull": true
}'
POST
/api/v1/appBuilder/listGitHubRepos

List user GitHub repos for selection. Param "projectId". Returns array of {fullName, name, owner, private, defaultBranch}.

Parameters

projectIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listGitHubRepos \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/gitPull

Pull latest changes from GitHub remote

Parameters

projectIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/gitPull \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/gitPush

Push commits to GitHub remote

Parameters

projectIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/gitPush \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/gitCommit

Create a new commit with current source files

Parameters

projectIdstringrequired
messagestringrequired

Commit message

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/gitCommit \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "message": "example"
}'
POST
/api/v1/appBuilder/gitCreateBranch

Create a new branch from current HEAD

Parameters

projectIdstringrequired
namestringrequired

New branch name

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/gitCreateBranch \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "name": "example"
}'
POST
/api/v1/appBuilder/gitSwitchBranch

Switch to an existing branch

Parameters

projectIdstringrequired
namestringrequired

Branch name to switch to

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/gitSwitchBranch \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "name": "example"
}'
POST
/api/v1/appBuilder/gitMerge

Merge one branch into another

Parameters

projectIdstringrequired
fromstringrequired

Source branch to merge from

tostringrequired

Target branch to merge into

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/gitMerge \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "from": "example",
  "to": "example"
}'
POST
/api/v1/appBuilder/gitListCommits

Get commit history

Parameters

projectIdstringrequired
limitnumber

Maximum number of commits to return

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/gitListCommits \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "limit": 0
}'
POST
/api/v1/appBuilder/gitRollback

Restore project to a previous commit

Parameters

projectIdstringrequired
shastringrequired

Commit SHA to rollback to

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/gitRollback \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "sha": "example"
}'
POST
/api/v1/appBuilder/gitStatus

Get current Git status

Parameters

projectIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/gitStatus \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/gitCreateRepo

Create a new GitHub repository

Parameters

projectIdstringrequired
namestringrequired

Repository name

isPrivateboolean

Whether the repo should be private

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/gitCreateRepo \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "name": "example",
  "isPrivate": true
}'
POST
/api/v1/appBuilder/gitListBranches

List all branches in the repository

Parameters

projectIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/gitListBranches \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/serverProxy

Make an HTTP request through server-side proxy with env var placeholder resolution.

Parameters

projectIdstringrequired
urlstringrequired
methodstring
headersobject
bodyany
timeoutnumber

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/serverProxy \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "url": "example",
  "method": "example"
}'
POST
/api/v1/appBuilder/setServerProxyAccessRules

Set access rules for server proxy on a project. Controls who can use serverFetch in published apps. No rules = deny (only app owner). Set execute rules to allow app users.

Parameters

projectIdstringrequired
accessRulesobjectrequired

Access rules with a single execute operation. `execute` is a Condition: a rule, a legacy flat array (OR), or an { all | any | not } group with operators and the custom `function` rule.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/setServerProxyAccessRules \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "accessRules": {}
}'
POST
/api/v1/appBuilder/getServerProxyAccessRules

Get the current server proxy access rules for a project.

Parameters

projectIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getServerProxyAccessRules \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/listBackendFunctions

List all backend functions for a project — includes BOTH code functions AND data functions (kind: "data" vs "code" in each row). Params: projectId (required). Returns array with id, name, kind, description, code, definition, accessRules, timeout, isActive.

Parameters

projectIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/listBackendFunctions \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example"
}'
POST
/api/v1/appBuilder/getBackendFunction

Get a single backend function. Params: projectId (required), functionId (required). Returns full function with code.

Parameters

projectIdstringrequired
functionIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/getBackendFunction \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "functionId": "example"
}'
POST
/api/v1/appBuilder/createDataFunction

Create a DATA function: a named declarative data operation — no code, no sandbox, entity-call speed. Callable from pages (as the member) AND headlessly by automations/agents (as system). Prefer these over backend functions for plain create/read/update/delete.

Parameters

projectIdstringrequired
namestringrequired

Function name pages/automations call, e.g. "addContact"

descriptionstring
definitionobjectrequired

One owner-locked declarative operation on one table. Callers can only fill the declared placeholders — they cannot change the table, operation, or widen filters.

runAsstring

member (default) = caller's own row permissions. service = elevated (the declarative ctx.service) — use for public forms writing protected tables; combine with tight execute rules.

accessRulesobject

Who may call it. REQUIRED in practice — no rules = nobody can execute (secure by default). Public contact form: { execute: [{ type: "public" }] } with runAs "service".

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/createDataFunction \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "name": "example",
  "description": "example"
}'
POST
/api/v1/appBuilder/updateDataFunction

Update a data function (definition is re-validated; kind cannot change here — recreate to convert).

Parameters

projectIdstringrequired
functionIdstringrequired

Function id from listBackendFunctions

descriptionstring
definitionobject

One owner-locked declarative operation on one table. Callers can only fill the declared placeholders — they cannot change the table, operation, or widen filters.

runAsstring
accessRulesobject

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateDataFunction \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "functionId": "example",
  "description": "example"
}'
POST
/api/v1/appBuilder/createBackendFunction

Create a server-side backend function (sandboxed JS with the ctx API) for secrets, elevated data access, external APIs, or heavy logic. For plain create/read/update/delete of table rows prefer createDataFunction. Read getCodeGuide topic "functions" first for the ctx API, patterns, and a worked example.

Parameters

projectIdstringrequired

Project ID from listProjects

namestringrequired

Function name pages call via functions.invoke("name", params)

descriptionstring

What the function does (shown in the Config panel)

codestring

Sandboxed JS: export default async function(params, ctx) { ... }. ctx gives tables/service.tables/fetch/files/email/env/user — call getCodeGuide topic "functions" for the full ctx API and examples BEFORE writing code.

accessRulesobject

Who may call it from the published app: { execute: [...] }. No rules = nobody can execute (secure by default).

timeoutnumber

Execution timeout in ms (default 10000, max 300000 = 5 min). Extend ONLY for slow work like LLM calls or big imports — long agentic jobs should be turn-based, not one long execution.

maxRetriesinteger

Retries when run by an automation on failure. 0 = run once (default). Set > 0 ONLY if this function is idempotent (safe to re-run).

toolSpecobject

Structured MCP-tool schema authored WITH the code (one artifact): { inputSchema, outputSchema?, returns?, sideEffects? } as JSON Schema. A function with a schema is marked as an MCP tool (its interface is shown + AI-readable); omit it for a plain internal helper.

exposedboolean

true = a public METHOD of this site (catalog-listed, connectable). false (default) = internal helper.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/createBackendFunction \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "name": "example",
  "description": "example"
}'
POST
/api/v1/appBuilder/updateBackendFunction

Update a backend function. Only provided fields are updated. Params: projectId (required), functionId (required), name, description, code, accessRules, timeout (1000-300000), isActive (boolean), maxRetries (0 = run once (default); > 0 only if idempotent — used when an automation runs it), toolSpec (structured MCP-tool schema { inputSchema, outputSchema?, returns?, sideEffects? } — update it TOGETHER with the code so they stay in sync; pass null to remove the schema).

Parameters

projectIdstringrequired
functionIdstringrequired
namestring
descriptionstring
codestring
accessRulesobject
timeoutnumber
maxRetriesinteger

Retries when run by an automation on failure. 0 = run once. Set > 0 only if idempotent.

isActiveboolean
toolSpecobject

Structured MCP-tool schema { inputSchema, outputSchema?, returns?, sideEffects? } authored WITH the code. Pass null to remove the schema (function becomes a plain internal helper).

exposedboolean

Expose/hide as a public method of this site.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/updateBackendFunction \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "functionId": "example",
  "name": "example"
}'
POST
/api/v1/appBuilder/deleteBackendFunction

Delete a backend function OR data function permanently (both live in the same registry — check kind from listBackendFunctions). Params: projectId (required), functionId (required).

Parameters

projectIdstringrequired
functionIdstringrequired

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/deleteBackendFunction \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "functionId": "example"
}'
POST
/api/v1/appBuilder/invokeBackendFunction

Execute/invoke a backend function and return the result. Use this to test functions after creating them. Params: - projectId: Project ID (required) - functionName: The function name (required, NOT the function ID) - params: Optional object of key-value parameters to pass to the function Returns: { success: true, data: <function return value>, executionTime: <ms> } or throws error with the function's error message. Example: invokeBackendFunction({ projectId: "abc", functionName: "getTaskStats", params: {} })

Parameters

projectIdstringrequired
functionNamestringrequired
paramsobject

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/appBuilder/invokeBackendFunction \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "projectId": "example",
  "functionName": "example",
  "params": {}
}'
Sites API - Serenities