Platform Management API
Manage authentication, users, billing and platform-wide settings
MCP Tokens
Create
/services/platforms/v1/mcp-tokens/create
Auth
Create a USER-LEVEL, MCP-ONLY API token for the external MCP server (POST /api/mcp/wemasy). Two deliberate properties: - project_id stays NULL -> NOT locked to one project, so the agent can target ANY of the user's projects per call (multi-project). A project-scoped token would be hard-locked by AddProjectToRequestMiddleware and cannot switch. - abilities = ['mcp'] -> rejected on the rest of the API by AddProjectToRequestMiddleware (mcp ability but not '*'), so a leaked MCP token is useless outside the MCP endpoint. Least privilege. Gated by the per-user `mcp_enabled` flag (User::canUseMcp). The plaintext token is returned ONCE.
List
/services/platforms/v1/mcp-tokens/list
Auth
List the current user's MCP tokens (user-level, `mcp` ability). NOT gated by canUseMcp so a user can still see + revoke existing tokens after the flag is turned off. Project-scoped tokens and full-access (`*`) tokens are excluded.
Revoke
/services/platforms/v1/mcp-tokens/revoke
Auth
Revoke one of the current user's MCP tokens. Scoped to the user + verified to be an MCP token (user-level + `mcp` ability) so it can't touch other tokens.
API Tokens
Create API Token
/services/platforms/v1/api-tokens/create
Auth
List API Tokens
/services/platforms/v1/api-tokens/list
Auth
Revoke API Token
/services/platforms/v1/api-tokens/revoke
Auth
Active Sessions
List Sessions This includes browser sessions, API tokens, etc
/services/platforms/v1/active-sessions/list
Auth
Revoke Session
/services/platforms/v1/active-sessions/revoke
Auth
Revoke All Sessions This will log out the user from all devices and revoke all API tokens
/services/platforms/v1/active-sessions/revoke-all
Auth
Audit Logs
List Audit Logs
/services/platforms/v1/audit-logs/list
Auth
Authentication
Login
/v1/login
Public
Authenticate Login
/v1/authenticate
Public
Create Account
/v1/create-account
Public
Verify Email OTP
/v1/verify-email-otp
Public
Rate limit: 5 attempts per email address and 10 attempts per IP address per 30 minutes.
Resend Email OTP
/v1/resend-email-otp
Public
Rate limit: 5 requests per 30 minutes.
Send Verification Email
/v1/send-verification-email
Public
Rate limit: 5 requests per 30 minutes.
Confirm Email
/v1/confirm-email
Public
Forgot Password
/v1/forgot-password
Public
Reset Password
/v1/reset-password
Public
Setup Password (admin-invited account first login)
/v1/setup-password
Public
Email me a login link
/v1/login-link/request
Public
Always answers "if the address exists, a link is on its way", whether the account exists or not.
Send me a new link
/v1/login-link/renew
Public
From the page of an expired or used link: a new link to the account of that link (never another address). Same answer as `request`.
Open a login link
/v1/login-link/open
Public
New email code
/v1/login-link/resend-code
Public
Verify the security step and log in
/v1/login-link/verify
Public
Get Policy
/v1/get-policy
Public
Logout
/v1/logout
Auth
Send Verification Email
/services/platforms/v1/send-verification-email
Auth
Rate limit: 5 requests per 30 minutes.
Authentication (Two Factor)
Create Security Email Code
/services/platforms/v1/user/get-security-email-code
Auth
Validate Two Factor Auth
/services/platforms/v1/user/security-two-factor-validate-auth
Auth
Security Verification
/services/platforms/v1/user/security-verification
Auth
Verify Two Factor Code
/services/platforms/v1/user/verify-two-factor-code
Auth
Update Security Authenticator
/services/platforms/v1/user/security-authenticator-update
Auth
Generate Recovery Codes
/services/platforms/v1/user/regenerate-new-recovery-codes
Auth
Save Recovery Codes
/services/platforms/v1/user/save-new-recovery-codes
Auth
Billing
Get Billing Summary
/services/platforms/v1/billing/summary
Auth
Get billing summary for projects owned by the authenticated user Returns aggregated data and only expired/near-expired/failed subscriptions
Calculate Checkout Tax
/services/platforms/v1/checkout/calculate-tax
Auth
Calculate VAT for the current checkout state. Validates ONLY the inputs the tax calculation actually consumes (country, contact_type, vat_number, subtotal) plus the VIES VAT check when a company supplies a number. Other contact fields (name, address, phone, etc.) are intentionally NOT validated here — they don't influence the tax rate, and validating them mid-edit blocks the tax line from rendering while the user is still filling the form. Full field validation runs at the final `/domain-upgrade/checkout` POST.
List Invoices
/services/platforms/v1/invoices/all
Auth
CheckoutVerify
Send the code to the account email
/services/platforms/v1/user/checkout-verify/send
Auth
Check the code; on success the account email is verified
/services/platforms/v1/user/checkout-verify/confirm
Auth
Community
Community Usage
/services/platforms/v1/community/usage
Auth
Posts this month, published listings and members, each with the plan's limit (and extra packs).
Visitor Accounts Status
/services/platforms/v1/community/accounts/status
Auth
Whether visitors of this project's site can sign up and log in.
Community Members
/services/platforms/v1/community/members/all
Auth
The site's visitor accounts with their community roles, and the role requests that wait.
Approve A Role Request
/services/platforms/v1/community/members/approve
Auth
Reject A Role Request
/services/platforms/v1/community/members/reject
Auth
Give A Community Role
/services/platforms/v1/community/members/grant
Auth
The owner makes a verified visitor account a moderator, business or organisation.
Take A Community Role Away
/services/platforms/v1/community/members/revoke
Auth
Turn On Visitor Accounts
/services/platforms/v1/community/accounts/enable
Auth
Visitors of the site can sign up (with email verification first) and log in: the account pages are added, nothing of the shop. No mail goes out from this.
Designer "Edit with AI" version history for one text field: list the drafts and applied texts
/services/platforms/v1/designer/paragraph/versions/list
Auth
/services/platforms/v1/designer/paragraph/versions/save
Auth
Designer Inline paragraph rewrite for the designer toolbar. Draft-then-apply; streams as server-sent events (status → thinking → text → done).
/services/platforms/v1/designer/paragraph/rewrite
Auth
Feedback
Store Feedback Delegates to the unified support ticket system using the "feedback" channel
/services/platforms/v1/feedback/store
Auth
Rate limit: 20 requests per user per 5 minutes.
List Feedbacks Backward-compatible endpoint — queries support_tickets filtered by the "feedback" channel and maps the response to match the original PlatformFeedback shape
/services/platforms/v1/feedback/list
Auth
Feedback pop-up settings Whether the reward line is on (the promotion switch) and whether this account already got a reward
/services/platforms/v1/feedback/wall/config
Auth
Send feedback One answer of the one-screen pop-up: the owner's own words. The ticket uses the logged-in account. Rate limit: 5 per user per hour
/services/platforms/v1/feedback/wall/store
Auth
Geo
List Countries
/services/platforms/v1/geo/countries
Public
List States
/services/platforms/v1/geo/countries/{iso2}/states
Public
GrowthEventStore
/services/platforms/v1/events
Auth
MCP OAuth
Check an authorization request for the consent screen
/services/platforms/v1/mcp-oauth/prepare
Auth
Returns what the owner is asked to approve: the app name, where it will be sent back to, the owner's projects with the scopes each allows, and a signed consent token that binds the later approval to exactly these checked parameters.
Approve: one project, one scope
/services/platforms/v1/mcp-oauth/approve
Auth
Returns the redirect_to URL (the registered redirect URI plus a one-time code).
Deny: sends the client back with error=access_denied
/services/platforms/v1/mcp-oauth/deny
Auth
The AI apps this account has connected (OAuth), for the settings screen
/services/platforms/v1/mcp-oauth/grants
Auth
/services/platforms/v1/mcp-oauth/grant-revoke
Auth
NicheFix
/services/platforms/v1/onboarding/niche-fix/state
Auth
/services/platforms/v1/onboarding/niche-fix/apply
Auth
/services/platforms/v1/onboarding/niche-fix/keep
Auth
Notifications
List Notifications
/services/platforms/v1/notifications/all
Auth
Get Notification
/services/platforms/v1/notifications/get
Auth
Mark Notifications as Read
/services/platforms/v1/notifications/mark-as-read
Auth
Mark Notification as Unread
/services/platforms/v1/notifications/mark-as-unread
Auth
Archive Notifications
/services/platforms/v1/notifications/archive
Auth
Delete Notifications
/services/platforms/v1/notifications/delete
Auth
List Archived Notifications
/services/platforms/v1/notifications/archived
Auth
Unarchive Notifications
/services/platforms/v1/notifications/unarchive
Auth
Onboarding Inline-AI "Generate with AI" for onboarding content steps (simple flow). Credits-gated via the existing AI ledger; SSE stream mirrors the outbox / ticket inline streams (status → thinking → text → done). The full AI session is NOT reachable here — this endpoint only fills a step's fields.
/services/platforms/v1/onboarding/content/generate
Auth
OnboardingPreviewCopy
/services/platforms/v1/onboarding/preview-copy
Auth
OutboxPreferencesGet
/services/platforms/v1/outbox/preferences
Auth
/services/platforms/v1/outbox/preferences/get
Auth
OutboxPreferencesUpdate
/services/platforms/v1/outbox/preferences
Auth
/services/platforms/v1/outbox/preferences
Auth
Partners Become a WEMASY partner (brain company/products/partners.md section 7
Apply as a partner (or see the existing application)
/services/platforms/v1/partners/apply
Auth
The signed-in account's own partner record, or null
/services/platforms/v1/partners/me
Auth
The partner dashboard (a first page in slice 1; clients and earnings follow)
/services/platforms/v1/partners/dashboard
Auth
Platforms
Platform info
/services/platforms/v1/platforms/info
Public
ProjectModules
/services/platforms/v1/project-modules/get
Auth
/services/platforms/v1/project-modules/save
Auth
The QR codes for the tables (print sheet). Only with the QR menu module on
/services/platforms/v1/project-modules/qr-codes
Auth
Projects
Validate Invitation
/v1/validate-invitation
Public
Join Invitation
/v1/join-invitation
Public
Check Project Tool Access
/services/platforms/v1/project-tools-access
Public
Get all projects
/services/platforms/v1/projects/all
Auth
Search projects (project switcher)
/services/platforms/v1/projects/search
Auth
Small, fast list for the project switcher (Cmd/Ctrl+K): the projects the signed-in user may open, filtered by title, domain or id. Same access rule as projects/all, but at most `limit` rows and only the fields the switcher shows, so it stays fast for an account with thousands of projects. Without a query it returns `recent_ids` first (the projects this browser opened last), then the most recently changed ones.
Update User Permission
/services/platforms/v1/user/project/update-user-permission
Auth
Invite User to Project
/services/platforms/v1/user/project/invite
Auth
Resend Project Invitation
/services/platforms/v1/user/project/invite/resend
Auth
Delete Project Invitation
/services/platforms/v1/user/project/invite/delete
Auth
Get Project Users
/services/platforms/v1/user/project/get-users
Auth
Remove Project User
/services/platforms/v1/user/project/remove-project-user
Auth
Permissions
/services/platforms/v1/user/project/permissions
Auth
Get mail server settings
/services/platforms/v1/user/project/mail-settings/get
Auth
The password is never returned, only whether one is stored.
Send a test email through an SMTP server
/services/platforms/v1/user/project/mail-settings/test
Auth
Sends a short test email to `test_to` through the given settings. Leave `password` empty to use the stored password (only for the same host and username). On success these exact settings can be saved for 30 minutes.
Save mail server settings
/services/platforms/v1/user/project/mail-settings/save
Auth
`mode=wemasy` goes back to WEMASY's mail server and removes the stored settings. `mode=custom` saves the project's own server; it must have passed a test with exactly these settings, unless only `use_forms` or `use_newsletter` changed.
MCP status of the project
/services/platforms/v1/user/project/mcp/status
Auth
Whether MCP is on, whether this account may switch it on (owner on a paid plan for write), the project's MCP tokens and the limits every call has.
Switch MCP on or off for the project
/services/platforms/v1/user/project/mcp/update
Auth
On needs the project owner (any plan). Off stops every token of the project at once and revokes them.
Create an MCP token for the project
/services/platforms/v1/user/project/mcp/token-create
Auth
Returns the token once. `scope` read: only tools that read; write: every tool, changes still ask for a confirm round.
Revoke an MCP token of the project
/services/platforms/v1/user/project/mcp/token-revoke
Auth
Get the email style
/services/platforms/v1/user/project/email-style/get
Auth
`saved`: whether the project's mails use it. `values`: what the form edits (the site's logo and colour as a start when nothing is saved).
Save the email style
/services/platforms/v1/user/project/email-style/save
Auth
From now on every mail of the project uses it. Empty fields fall back: the brand colour to the site's, the button to the brand colour.
Remove the email style: the project's mails get the standard look again
/services/platforms/v1/user/project/email-style/reset
Auth
Preview a style
/services/platforms/v1/user/project/email-style/preview
Auth
A sample mail (as a booking confirmation looks) and a sample newsletter with these values, not saved. HTML documents for an iframe.
Send a test mail
/services/platforms/v1/user/project/email-style/test
Auth
A sample mail in the saved style to the signed-in owner, through the same frame as the project's other mails.
Get Project
/services/platforms/v1/projects/get
Auth
Create a new project
/services/platforms/v1/projects/create
Auth
Builds the Stripe session on the SPA handoff page for the project that create already made (after the billing contact is filled in)
/services/platforms/v1/projects/paid-checkout
Auth
Update Project
/services/platforms/v1/projects/update
Auth
Remember Last Visited Project
/services/platforms/v1/projects/update-selected
Auth
Persists the user's last visited project so fresh logins and legacy un-prefixed URLs resolve to a sensible default. NOT the source of truth for the active project — the URL path is.
Transfer Project Ownership
/services/platforms/v1/projects/transfer
Auth
Update Theme Status
/services/platforms/v1/projects/update-theme-status
Auth
Update Website Availability Status
/services/platforms/v1/projects/update-website-status
Auth
POST /api/services/platforms/v1/projects/update-website-status Sets a project's public availability to live / maintenance / offline. Stored in projects_meta (`website_disabled`, `maintenance_mode`); the generator reads these on the next deploy to serve a blank page (offline) or a maintenance page instead of the real site. The states are mutually exclusive, and it's fully reversible — set back to `live` and re-deploy to restore the normal site. This only persists the flag; the SPA triggers a redeploy afterwards so the change goes live.
/services/platforms/v1/project-usage/get
Auth
Stripe checkout for one usage add-on (task 0045 part 3). Called when the owner clicks confirm in the add-on popup; nothing is charged before that and nothing counts before the payment confirms (webhook)
/services/platforms/v1/project-usage/addon/checkout
Auth
/services/platforms/v1/project-mail-held/get
Auth
"Send later": queued, sent by mail:release-held while today's room allows
/services/platforms/v1/project-mail-held/release
Auth
/services/platforms/v1/project-mail-held/delete
Auth
Ask for a higher daily limit: the number and why; WEMASY reviews the request
/services/platforms/v1/project-mail-held/request-increase
Auth
Projects Every outside account of the project (Google
List the project's connections
/services/platforms/v1/user/project/connections/list
Auth
`summary.attention`: accounts that need the owner (expiring, expired, failing, or a page or location still to choose). `tools`: where the owner can connect more accounts.
Projects The outside websites where this project's tracking snippet may run
Get the outside websites of the project
/services/platforms/v1/user/project/snippet-domains/get
Auth
Save the outside websites of the project
/services/platforms/v1/user/project/snippet-domains/save
Auth
Projects The project's business profile: the company's facts for the website
Get the business profile
/services/platforms/v1/user/project/business-profile/get
Auth
`saved`: whether the project has the file. Until then `profile` is a first version from the facts the project had (`from_existing` says where each came from; `hints` holds what could not be filled in).
Save the business profile
/services/platforms/v1/user/project/business-profile/save
Auth
Writes business/profile.json (one commit, none when nothing changed). The website shows it after the next publish; the AI uses it at once.
Preview what changes where
/services/platforms/v1/user/project/business-profile/preview
Auth
For the profile in the form (not saved): the facts that change on the website, its JSON-LD organization node, what each connected Google Business Profile location has now and what a push would do per field, and the AI's view of the facts. `problems`: what is not valid yet.
Send the profile to Google Business Profile
/services/platforms/v1/user/project/business-profile/push
Auth
The saved profile to one connected location: `fields` (name, phone, description, hours, special_hours), default every field that differs. Never an empty value.
Send the logo and cover photo to Google Business Profile
/services/platforms/v1/user/project/business-profile/photos/push
Auth
The saved profile's media.logo and media.cover (https pictures) to one connected location through Google's media API: `kinds` (logo, cover), default every one that differs. A picture is checked first (JPG or PNG, 10 KB to 5 MB, a minimum size) and the location's media is read back to confirm it arrived. Never an empty picture; an unchanged one is skipped.
Send the description and banner to the YouTube channel
/services/platforms/v1/user/project/business-profile/youtube/push
Auth
The saved profile's description (at most 1000 characters) and cover picture (the banner: JPG or PNG, 16:9, at least 2048x1152, at most 6 MB) to one connected channel: `fields` (description, banner), default each that differs; a description changed on YouTube is not overwritten unless asked for. Editing a channel needs the youtube.force-ssl permission: an account that has not given it answers 409 `scope_missing` (reconnect). The channel is read back to confirm (`verified`).
Send the about text, description and cover to the Facebook Page
/services/platforms/v1/user/project/business-profile/facebook/push
Auth
The saved profile's short text (About, at most 255 characters), long text (Description) and cover picture (JPG or PNG, at least 400x150) to one connected Page: `fields` (about, description, cover), default each that differs; a text changed on Facebook is not overwritten unless asked for. Editing a Page needs pages_manage_metadata (Meta App Review): a Page that has not given it answers 409 `scope_missing` (reconnect). The Page is read back to confirm (`verified`). The Page's profile picture cannot be changed through the API.
SignupHandoff
/v1/signup-handoff/redeem
Public
The setup page found no token and could not get one (31 Oct, users 4206 and 4268: the signup page reported goto_setup and nothing followed), or the visitor left / hid the tab / waited more than 8 s before the setup page started (user 4370; sent by the signup page with navigator.sendBeacon). Public, because without a token nothing else can speak. With a code the journey of the user it was issued to gets signup.setup_bounced (the code is left alone: a redeem that never reached us is still valid). Without a code there is nobody to name, so it is a log line and a daily counter
/v1/signup-handoff/report
Public
/services/platforms/v1/signup-handoff/issue
Auth
Smart Filters
Save Smart Filter
/services/platforms/v1/smart-filter/save
Auth
Get Smart Filter
/services/platforms/v1/smart-filter/get
Auth
Delete Smart Filter
/services/platforms/v1/smart-filter/delete
Auth
Subscriptions
List Subscriptions
/services/platforms/v1/subscriptions/all
Auth
Verify Subscription
/services/platforms/v1/subscriptions/verify
Auth
POST /api/services/platforms/v1/subscriptions/verify
Cancel Subscription
/services/platforms/v1/subscriptions/cancel
Auth
Upgrade Trial
/services/platforms/v1/subscriptions/upgrade-trial
Auth
Used when: - User on active trial wants to pay early - Trial expired and user wants to reactivate with payment
Resume Subscription
/services/platforms/v1/subscriptions/resume-cancelled
Auth
Subscribe to Tool
/services/platforms/v1/subscriptions/subscribe-tool
Auth
Subscribe to a new tool for existing project. Supports BOTH trial and paid flows: - trial=true: Create trial subscription immediately (if eligible) - trial=false: Create paid subscription with Stripe checkout
/services/platforms/v1/subscriptions/checkout-gateways
Auth
Request a refund
/services/platforms/v1/subscriptions/refund/request
Auth
Rate limit: 5 requests per user per 10 minutes — prevents accidental double-submits from impatient button-clickers and rules out abuse loops.
List my refund requests
/services/platforms/v1/subscriptions/refund/list
Auth
Cancel my refund request
/services/platforms/v1/subscriptions/refund/cancel
Auth
Domain Upgrade Checkout
/services/platforms/v1/domain-upgrade/checkout
Auth
Support
List Support Channels
/services/platforms/v1/support/channels
Auth
Create Support Ticket
/services/platforms/v1/support/tickets/store
Auth
Rate limit: 10 requests per user per 5 minutes.
List Support Tickets
/services/platforms/v1/support/tickets/list
Auth
List My Support Tickets
/services/platforms/v1/support/tickets/my-list
Auth
Get Support Ticket Detail
/services/platforms/v1/support/tickets/detail
Auth
Reply to Support Ticket
/services/platforms/v1/support/tickets/reply
Auth
Download a ticket attachment (the ticket's owner or WEMASY support)
/services/platforms/v1/support/tickets/attachments/download
Auth
Update Support Ticket
/services/platforms/v1/support/tickets/update
Auth
ThemePreviewRedirect
/v1/themes/preview/{slug}/{layout}
Public
User
Get User
/services/platforms/v1/user/get
Auth
Accept Policy
/services/platforms/v1/user/policy-acceptance
Auth
Update User Details
/services/platforms/v1/user/update-details
Auth
Send Update Email Token
/services/platforms/v1/user/update-email-sendtoken
Auth
Rate limit: 5 attempts per email address and 5 attempts per IP address per 60 minutes.
Verify Update Email
/services/platforms/v1/user/update-email-via-token
Auth
Update Password
/services/platforms/v1/user/update-password
Auth
Update Language
/services/platforms/v1/user/update-language
Auth
Update Timezone
/services/platforms/v1/user/update-timezone
Auth
Update Editor Settings
/services/platforms/v1/user/update-editor-settings
Auth
Update Editor Mode
/services/platforms/v1/user/update-editor-mode
Auth
Saves the user's editor mode preference to user metadata
Update Sidebar Layout Mode
/services/platforms/v1/user/update-sidebar-layout-mode
Auth
Saves the user's sidebar layout mode preference to user metadata
Update Designer Workspace Mode
/services/platforms/v1/user/update-designer-workspace-mode
Auth
Saves whether the sitebuilder shell shows Manual designer tools or the inline AI workspace. Same user-meta pattern as sidebar_layout_mode / editor_mode so refresh and new tabs restore the last choice.
Dismiss Widget Teaser
/services/platforms/v1/user/dismiss-widget-teaser
Auth
WhatsApp follow-up consent: read
/services/platforms/v1/user/whatsapp-optin/get
Auth
Whether the signed-in user agreed to get their website link and tips on WhatsApp, on which number, and which consent text version they saw.
WhatsApp follow-up consent: give or withdraw
/services/platforms/v1/user/whatsapp-optin
Auth
`opt_in: true` needs the user's own WhatsApp number (country code first). `opt_in: false` withdraws. Every change is kept as a consent record.
Hide or show a product hero
/services/platforms/v1/user/update-hero-dismissed
Auth
Remembers, per user and on every device, which product pages show their hero small (title and buttons only). Same user-meta pattern as sidebar_layout_mode; user/get returns the list as `dismissed_heroes`.
UserDeviceTokenRegister
Register a mobile push device token for the authenticated user
/services/platforms/v1/user/device-token
Auth
Prefer auto-registration via PushDeviceTokenMiddleware (cookie or X-Wemasy-Device-* headers). This endpoint is the explicit fallback used by the native shells after APNs/FCM token is available.
VerifyEmailRequest
/services/platforms/v1/user/verify-email/request
Auth
Workspaces
List Workspaces
/services/platforms/v1/workspaces/all
Auth
Returns all workspaces the authenticated user owns within the current platform, with a project count per workspace.
Create Workspace
/services/platforms/v1/workspaces/create
Auth
Update Workspace
/services/platforms/v1/workspaces/update
Auth
Delete Workspace
/services/platforms/v1/workspaces/delete
Auth
Soft-deletes the workspace and unassigns all its projects (sets projects.workspace_id = NULL). Projects are NEVER deleted.
Assign Projects to Workspace
/services/platforms/v1/workspaces/assign-projects
Auth
Bulk-move projects into a workspace, or unassign them by passing workspace_id = null.
Enqueue Workspace Publish
/services/platforms/v1/workspaces/publish-queue/enqueue
Auth
Add projects to the durable workspace publish queue. Processing continues on the server (max 2 concurrent per workspace) even if the browser closes.
Workspace Publish Queue Status
/services/platforms/v1/workspaces/publish-queue/status
Auth
Returns durable queue rows for a workspace (pending / running / recent terminal). Safe to poll after refresh — the queue is not browser-local.
Cancel Workspace Publish Queue Item
/services/platforms/v1/workspaces/publish-queue/cancel
Auth
Removes a pending site from the queue, or cancels an in-flight deploy that this queue started.