Admin API
/admin/publicbootstrap, contact, verification, and onboarding routes/admin/apiusers, mailboxes, aliases, messages, profiles, branding, and invites/admin/dataresources, operations, jobs, groups, env vars, compute, and IaC
API
Use this page to integrate every site-facing /admin/* and /data/* route exposed
on a Hydrix site domain. All paths below are the public site-domain paths, not internal or stage-prefixed
service routes.
/admin/public bootstrap, contact, verification, and onboarding routes/admin/api users, mailboxes, aliases, messages, profiles, branding, and invites/admin/data resources, operations, jobs, groups, env vars, compute, and IaCGET /data/auth/config runtime auth discoveryGET /data/public/auth/config public alias for auth discoveryGET /data/auth/methods current visitor sign-in methodsPOST /data/auth/providers/google/link/start explicit Google-link flow startPOST /data/auth/password/add add password sign-in to a Google-only accountPOST /data/public/{operation} public runtime operationsPOST /data/{operation} authenticated runtime operations/admin/api/* and /admin/data/* use the site admin user pool/data/{operation} uses the site data-system access token| Route Family | Token | Who Uses It |
|---|---|---|
/admin/public/* |
No token | Anonymous bootstrap and public workflow routes. |
/admin/api/profile |
Admin user pool JWT | Any signed-in site user for their own profile. |
/admin/api/mailboxes/* and /admin/api/messages/* |
Admin user pool JWT | Admins can access any mailbox. Regular users are limited to owned mailboxes. |
/admin/api/* other routes |
Admin user pool JWT | Admin or super-admin site-management actions. |
/admin/api/auth-email-branding/admin/api/super-admin-invites/resend
|
Admin user pool JWT | Super-admin only. |
/admin/data/* |
Admin user pool JWT | Admin or super-admin data-control actions. |
/data/auth/config/data/public/auth/config
|
No token | Site application auth discovery. |
/data/auth/methods |
Data-system access token | Current visitor sign-in method discovery. |
/data/auth/providers/google/link/start/data/auth/password/add
|
Data-system access token | Visitor sign-in method management for explicit Google link and add-password flows. |
/data/public/{operation} |
No token | Public site runtime operations. |
/data/{operation} |
Data-system access token | Authenticated visitor or site-application runtime operations. |
limit and nextToken.GET /admin/api/users returns at most 50 users per call; continue with nextToken to fetch the rest.payload.{ ok, data?, error? }.GET /data/auth/config and GET /data/auth/methods are the supported GET routes./admin/data/* routes can return retryable provisioning states while runtime initializes./admin/public RoutesThese routes are intentionally anonymous. They bootstrap the admin app, accept public contact-form submissions, verify forwarding targets, and complete onboarding flows from emailed invite links.
| Method | Path | Purpose | Access |
|---|---|---|---|
| GET |
/admin/public/config
Payload and response
|
Loads admin SPA bootstrap config: site identity, base path, and Cognito Hosted UI or custom-login settings. | No token. |
| POST |
/admin/public/contact
Payload and response
|
Sends the site contact form to configured contact recipients with the submitter as Reply-To. |
No token. WAF rate-limited. |
| GET |
/admin/public/forwarding/verify
Payload and response
|
Confirms an external forwarding target from the verification link delivered to that external inbox. | No token. Query-string token required. |
| GET |
/admin/public/onboarding/super-admin
Payload and response
|
Renders the Hydrix-hosted password setup page for a super-admin invite token. | No token. Query-string token required. |
| POST |
/admin/public/onboarding/super-admin
Payload and response
|
Sets the password and redeems a super-admin onboarding token. | No token. Token and password are submitted in the form body. |
| GET |
/admin/public/onboarding/user
Payload and response
|
Renders the Hydrix-hosted password setup page for a regular user invite token. | No token. Query-string token required. |
| POST |
/admin/public/onboarding/user
Payload and response
|
Sets the password and redeems a regular user onboarding token. | No token. Token and password are submitted in the form body. |
GET /admin/public/config
Bootstrap config
No request body.
{
"siteId": "site_123",
"siteDomain": "example.com",
"region": "us-east-1",
"api": {
"basePath": "/admin/api"
},
"auth": {
"clientId": "1exampleclientid",
"domain": "https://example.auth.us-east-1.amazoncognito.com",
"scope": ["openid", "email", "profile"],
"redirectUri": "https://example.com/admin/callback",
"logoutUri": "https://example.com/admin/logout"
}
}
POST /admin/public/contact
Contact form submit
{
"name": "Ada Lovelace",
"email": "ada@example.org",
"phone": "555-0100",
"subject": "New project inquiry",
"message": "We would like to talk about a new site build.",
"metadata": {
"company": "Example Co",
"budget": "10k-25k"
}
}
{
"messageId": "ses-message-id"
}
GET /admin/public/forwarding/verify
Forwarding verification
{
"mailbox": "support@example.com",
"target": "person@gmail.com",
"token": "forwarding-token"
}
{
"mailbox": "support@example.com",
"target": "person@gmail.com",
"status": "VERIFIED"
}
GET /admin/public/onboarding/super-admin
Super-admin onboarding page
{
"token": "super-admin-onboarding-token"
}
Returns a Hydrix-hosted HTML password setup page, not JSON.
POST /admin/public/onboarding/super-admin
Redeem super-admin invite
{
"token": "super-admin-onboarding-token",
"password": "StrongPassword!123",
"confirmPassword": "StrongPassword!123"
}
Returns a Hydrix-hosted HTML success page or validation-error page, not JSON.
GET /admin/public/onboarding/user
User onboarding page
{
"token": "user-onboarding-token"
}
Returns a Hydrix-hosted HTML password setup page, not JSON.
POST /admin/public/onboarding/user
Redeem user invite
{
"token": "user-onboarding-token",
"password": "StrongPassword!123",
"confirmPassword": "StrongPassword!123"
}
Returns a Hydrix-hosted HTML success page or validation-error page, not JSON.
Hydrix data auth now supports explicit visitor sign-in method management without exposing admin-only APIs. Google link completion happens inside Cognito's pre-sign-up flow for a dedicated link client, while the frontend keeps PKCE state and exchanges the callback code with Cognito directly.
| Method | Path | Purpose |
|---|---|---|
| GET | /data/auth/methods |
Returns whether the current account already has password and Google sign-in enabled. |
| POST | /data/auth/providers/google/link/start |
Returns the Cognito Hosted UI Google authorize URL for explicit account linking. |
| POST | /data/auth/password/add |
Adds local password sign-in to the currently authenticated Google-only account. |
/admin/api RoutesThese routes power the admin experience for users, mailboxes, aliases, messages, and site settings. They all use the site admin user pool, and mailbox-sensitive routes enforce owner rules for regular users.
| Method | Path | Purpose | Access |
|---|---|---|---|
| POST |
/admin/api/users
Payload and response
|
Creates a site user, assigns the requested role, and sends the Hydrix onboarding email. | Admin or super-admin. |
| GET |
/admin/api/users
Payload and response
|
Lists site users with role and profile summary data. | Admin or super-admin. |
| GET |
/admin/api/users/{userId}/profile
Payload and response
|
Reads a specific user profile, including primary email, optional external email, and settings. | Admin or super-admin. |
| PUT |
/admin/api/users/{userId}/profile
Payload and response
|
Updates a specific user profile, including active email behavior and per-user settings. | Admin or super-admin. |
| DELETE |
/admin/api/users/{userId}
Payload and response
|
Deletes a user and applies mailbox-ownership safety rules before removal. | Admin or super-admin. |
| GET |
/admin/api/profile
Payload and response
|
Loads the signed-in user’s own profile and client settings. | Any signed-in site user. |
| PUT |
/admin/api/profile
Payload and response
|
Updates the signed-in user’s own profile and client settings. | Any signed-in site user. |
POST /admin/api/usersCreate a site user{
"email": "alice@example.com",
"role": "admin",
"externalEmail": "alice.personal@example.org"
}{
"userId": "user_123",
"email": "alice@example.com",
"role": "admin",
"externalEmail": "alice.personal@example.org",
"inviteSent": true,
"inviteRecipient": "alice@example.com"
}GET /admin/api/usersList users{
"limit": 50,
"nextToken": "opaque-token"
}{
"items": [
{
"userId": "user_123",
"email": "alice@example.com",
"role": "admin",
"externalEmail": "alice.personal@example.org"
}
],
"nextToken": "opaque-token"
}Repeat the request with nextToken until it is null or omitted.
The route returns at most 50 users per response.GET /admin/api/users/{userId}/profileRead a user profile{
"userId": "user_123"
}{
"userSub": "sub_123",
"primaryEmail": "alice@example.com",
"activeEmail": "alice@example.com",
"externalEmail": "alice.personal@example.org",
"settings": {
"signature": "Sent from Hydrix"
},
"createdAt": "2026-03-20T15:00:00.000Z",
"updatedAt": "2026-03-20T15:00:00.000Z"
}PUT /admin/api/users/{userId}/profileUpdate a user profile{
"primaryEmail": "alice@example.com",
"externalEmail": "alice.personal@example.org",
"settings": {
"signature": "Sent from Hydrix"
}
}{
"userSub": "sub_123",
"primaryEmail": "alice@example.com",
"activeEmail": "alice@example.com",
"externalEmail": "alice.personal@example.org",
"settings": {
"signature": "Sent from Hydrix"
},
"updatedAt": "2026-03-20T15:30:00.000Z"
}DELETE /admin/api/users/{userId}Remove a user{
"userId": "user_123"
}Returns 204 No Content on success. It can also return 409 MailboxOwnershipConflict if mailbox ownership cannot be reassigned safely.
GET /admin/api/profileRead your own profileNo request body.
{
"userSub": "sub_123",
"primaryEmail": "alice@example.com",
"activeEmail": "alice@example.com",
"externalEmail": "alice.personal@example.org",
"settings": {
"theme": "system"
}
}PUT /admin/api/profileUpdate your own profile{
"primaryEmail": "alice@example.com",
"activeEmail": "alice@example.com",
"externalEmail": "alice.personal@example.org",
"settings": {
"theme": "system"
}
}{
"userSub": "sub_123",
"primaryEmail": "alice@example.com",
"activeEmail": "alice@example.com",
"externalEmail": "alice.personal@example.org",
"settings": {
"theme": "system"
},
"updatedAt": "2026-03-20T15:30:00.000Z"
}| Method | Path | Purpose | Access |
|---|---|---|---|
| POST |
/admin/api/mailboxes
Payload and response
|
Creates a mailbox and assigns the initial owners. | Admin or super-admin. |
| GET |
/admin/api/mailboxes
Payload and response
|
Lists mailboxes visible to the caller. | Admins see all. Users see owned mailboxes. |
| PATCH |
/admin/api/mailboxes/{address}
Payload and response
|
Replaces the owner list for one mailbox. | Admin or super-admin. |
| DELETE |
/admin/api/mailboxes/{address}
Payload and response
|
Disables a mailbox without deleting historical mail. | Admin or super-admin. |
| POST |
/admin/api/mailboxes/{address}/purge
Payload and response
|
Permanently removes a mailbox and cascades mailbox-specific cleanup. | Super-admin only. |
| POST |
/admin/api/mailboxes/{address}/restore
Payload and response
|
Re-enables a disabled mailbox and restores owner assignments. | Admin or super-admin. |
| GET |
/admin/api/mailboxes/{address}/settings
Payload and response
|
Reads trash auto-purge and retention settings for one mailbox. | Admins see any mailbox. Users are limited to owned mailboxes. |
| PUT |
/admin/api/mailboxes/{address}/settings
Payload and response
|
Updates mailbox trash auto-purge and retention behavior. | Super-admin only. |
| POST |
/admin/api/mailboxes/{address}/owners
Payload and response
|
Adds owners to an existing mailbox. | Admin or super-admin. |
| DELETE |
/admin/api/mailboxes/{address}/owners
Payload and response
|
Removes owners from an existing mailbox while enforcing minimum-owner rules. | Admin or super-admin. |
| GET |
/admin/api/mailboxes/{address}/forwarding
Payload and response
|
Returns forwarding state, keep-copy behavior, and verified targets for a mailbox. | Admins see any mailbox. Users are limited to owned mailboxes. |
| PUT |
/admin/api/mailboxes/{address}/forwarding
Payload and response
|
Enables or disables forwarding and controls whether the mailbox keeps a local copy. | Admins can update any mailbox. Users are limited to owned mailboxes. |
| GET |
/admin/api/mailboxes/{address}/forwarding-targets
Payload and response
|
Lists the external forwarding targets attached to a mailbox. | Admins see any mailbox. Users are limited to owned mailboxes. |
| POST |
/admin/api/mailboxes/{address}/forwarding-targets
Payload and response
|
Adds external forwarding targets and sends verification emails. | Admins can update any mailbox. Users are limited to owned mailboxes. |
| DELETE |
/admin/api/mailboxes/{address}/forwarding-targets
Payload and response
|
Removes forwarding targets from a mailbox. | Admins can update any mailbox. Users are limited to owned mailboxes. |
| PUT |
/admin/api/aliases/{aliasAddress}
Payload and response
|
Creates or updates an alias and its target mailbox list. | Admin or super-admin. |
| DELETE |
/admin/api/aliases/{aliasAddress}
Payload and response
|
Deletes an alias. | Admin or super-admin. |
| GET |
/admin/api/aliases
Payload and response
|
Lists aliases for the current site. | Admin or super-admin. |
POST /admin/api/mailboxesCreate mailbox{
"address": "support@example.com",
"owners": ["user_123", "user_456"]
}{
"address": "support@example.com",
"status": "ACTIVE",
"owners": ["user_123", "user_456"]
}GET /admin/api/mailboxesList mailboxes{
"limit": 25,
"nextToken": "opaque-token"
}{
"items": [
{
"address": "support@example.com",
"status": "ACTIVE",
"owners": ["user_123", "user_456"]
}
],
"nextToken": "opaque-token"
}PATCH /admin/api/mailboxes/{address}Replace mailbox owners{
"owners": ["user_123", "user_789"]
}{
"address": "support@example.com",
"status": "ACTIVE",
"owners": ["user_123", "user_789"]
}DELETE /admin/api/mailboxes/{address}Disable mailbox{
"address": "support@example.com"
}Returns 204 No Content on success.
POST /admin/api/mailboxes/{address}/purgePermanently purge mailbox{
"confirm": true
}Returns 204 No Content on success.
POST /admin/api/mailboxes/{address}/restoreRestore mailbox{
"owners": ["user_123", "user_456"]
}{
"address": "support@example.com",
"status": "ACTIVE",
"owners": ["user_123", "user_456"]
}GET /admin/api/mailboxes/{address}/settingsRead mailbox settings{
"address": "support@example.com"
}{
"mailbox": "support@example.com",
"trashAutoPurge": true,
"trashRetentionDays": 30
}PUT /admin/api/mailboxes/{address}/settingsUpdate mailbox settings{
"trashAutoPurge": true,
"trashRetentionDays": 30
}{
"mailbox": "support@example.com",
"trashAutoPurge": true,
"trashRetentionDays": 30
}POST /admin/api/mailboxes/{address}/ownersAdd owners{
"owners": ["user_789"]
}{
"address": "support@example.com",
"status": "ACTIVE",
"owners": ["user_123", "user_456", "user_789"]
}DELETE /admin/api/mailboxes/{address}/ownersRemove owners{
"owners": ["user_456"]
}{
"address": "support@example.com",
"status": "ACTIVE",
"owners": ["user_123"]
}GET /admin/api/mailboxes/{address}/forwardingRead forwarding state{
"address": "support@example.com"
}{
"mailbox": "support@example.com",
"enabled": true,
"keepCopy": true,
"targets": [
{
"target": "person@gmail.com",
"status": "VERIFIED"
}
]
}PUT /admin/api/mailboxes/{address}/forwardingUpdate forwarding state{
"enabled": true,
"keepCopy": true
}{
"mailbox": "support@example.com",
"enabled": true,
"keepCopy": true,
"targets": []
}GET /admin/api/mailboxes/{address}/forwarding-targetsList forwarding targets{
"address": "support@example.com"
}{
"mailbox": "support@example.com",
"items": [
{
"target": "person@gmail.com",
"status": "VERIFIED",
"createdAt": "2026-03-20T15:00:00.000Z"
}
]
}POST /admin/api/mailboxes/{address}/forwarding-targetsAdd forwarding targets{
"targets": ["person@gmail.com"]
}{
"mailbox": "support@example.com",
"items": [
{
"target": "person@gmail.com",
"status": "PENDING",
"verificationSent": true
}
]
}DELETE /admin/api/mailboxes/{address}/forwarding-targetsRemove forwarding targets{
"targets": ["person@gmail.com"]
}Returns 204 No Content on success.
PUT /admin/api/aliases/{aliasAddress}Create or update alias{
"targets": ["support@example.com", "sales@example.com"]
}{
"address": "hello@example.com",
"targets": ["support@example.com", "sales@example.com"]
}DELETE /admin/api/aliases/{aliasAddress}Delete alias{
"aliasAddress": "hello@example.com"
}Returns 204 No Content on success.
GET /admin/api/aliasesList aliasesNo request body.
{
"items": [
{
"address": "hello@example.com",
"targets": ["support@example.com", "sales@example.com"]
}
]
}| Method | Path | Purpose | Access |
|---|---|---|---|
| GET |
/admin/api/messages
Payload and response
|
Lists messages by mailbox, folder, and optional time window, with pagination support. | Admins see any mailbox. Users are limited to owned mailboxes. |
| GET |
/admin/api/messages/{messageId}
Payload and response
|
Reads message metadata and returns signed URLs for attachments and raw message content. | Admins see any mailbox. Users are limited to owned mailboxes. |
| DELETE |
/admin/api/messages/{messageId}
Payload and response
|
Soft-deletes a message by moving it to Trash, or marks it deleted when already in Trash. | Admins see any mailbox. Users are limited to owned mailboxes. |
| POST |
/admin/api/messages/attachments
Payload and response
|
Stages an outbound attachment upload and returns an attachment token for send or reply requests. | Mailbox access rules apply. |
| POST |
/admin/api/messages/send
Payload and response
|
Sends a new outbound message through the shared SMTP gateway from a site mailbox. | Mailbox access rules apply. |
| POST |
/admin/api/messages/{messageId}/reply
Payload and response
|
Loads reply context for the parent message and sends the reply through the shared SMTP gateway. | Mailbox access rules apply. |
| POST |
/admin/api/messages/{messageId}/restore
Payload and response
|
Restores a message from Trash back to its original folder, or to Inbox when needed. | Mailbox access rules apply. |
| POST |
/admin/api/messages/{messageId}/archive
Payload and response
|
Moves a message into Archive. | Mailbox access rules apply. |
| POST |
/admin/api/messages/{messageId}/seen
Payload and response
|
Marks a message seen or unseen for mailbox client state. | Mailbox access rules apply. |
| POST |
/admin/api/messages/{messageId}/purge
Payload and response
|
Hard-deletes one message and its stored objects immediately. | Super-admin only. |
| POST |
/admin/api/messages/purge
Payload and response
|
Hard-deletes a selected list of message IDs in one request. | Super-admin only. |
| POST |
/admin/api/messages/purge-deleted
Payload and response
|
Hard-deletes deleted messages that match the supplied site-scoped filters. | Super-admin only. |
| POST |
/admin/api/messages/purge-all
Payload and response
|
Hard-deletes all deleted messages for the current site. | Super-admin only. |
GET /admin/api/messagesList messages{
"mailbox": "support@example.com",
"folder": "INBOX",
"limit": 25,
"nextToken": "opaque-token",
"includeDeleted": false
}{
"items": [
{
"id": "msg_123",
"mailbox": "support@example.com",
"folder": "INBOX",
"subject": "Question about pricing",
"hasAttachments": false,
"seen": false
}
],
"nextToken": "opaque-token"
}GET /admin/api/messages/{messageId}Read message detail{
"messageId": "msg_123"
}{
"id": "msg_123",
"mailbox": "support@example.com",
"folder": "INBOX",
"from": "customer@example.org",
"to": ["support@example.com"],
"subject": "Question about pricing",
"attachments": [],
"rawUrl": "https://signed-url",
"seen": false
}DELETE /admin/api/messages/{messageId}Soft-delete message{
"messageId": "msg_123"
}Returns 204 No Content on success.
POST /admin/api/messages/attachmentsStage attachment upload{
"mailbox": "support@example.com",
"filename": "invoice.pdf",
"contentType": "application/pdf",
"size": 102400
}{
"attachmentRef": "<opaque-token>",
"mailbox": "support@example.com",
"filename": "invoice.pdf",
"contentType": "application/pdf",
"size": 102400,
"upload": {
"method": "PUT",
"url": "https://signed-upload",
"headers": {
"Content-Type": "application/pdf"
},
"expiresAt": "2025-11-12T04:45:00Z"
}
}Use this staged upload flow for browser and admin UI clients. Server-side callers should use Hydrix.sendEmail(...) or direct SMTP submission with inline attachments[] or base64 raw. Limits: 10 attachments max, 10 MiB per file, 15 MiB total decoded attachment bytes, and a 25 MiB shared-gateway raw message cap. The upload target is a presigned S3 PUT; expect a normal S3 success status, typically HTTP 200, with no JSON body. Uploads are CORS-ready from the admin origin. attachmentRef values are reusable until expiry while the staged object still exists, but successful send/reply deletes the staged upload.
POST /admin/api/messages/sendSend new message{
"mailbox": "support@example.com",
"to": ["customer@example.org"],
"subject": "Reaching out",
"body": "Hello from Hydrix.",
"attachmentRefs": ["<opaque-token>"]
}{
"id": "msg_456",
"threadId": "thread_123"
}The response confirms gateway acceptance. Sent items usually appear on the next message or thread fetch immediately, but clients should still use optimistic UI and tolerate brief eventual consistency before a refresh reflects the new message.
POST /admin/api/messages/{messageId}/replyReply to message{
"body": "Thanks for reaching out.",
"subject": "Re: Question about pricing",
"attachmentRefs": ["<opaque-token>"]
}{
"id": "msg_789",
"threadId": "thread_123"
}The response confirms gateway acceptance. Reply messages usually appear on the next message or thread fetch immediately, but clients should still use optimistic UI and tolerate brief eventual consistency before a refresh reflects the new reply.
POST /admin/api/messages/{messageId}/restoreRestore message{
"messageId": "msg_123"
}{
"id": "msg_123",
"deleted": false
}POST /admin/api/messages/{messageId}/archiveArchive message{
"messageId": "msg_123"
}Returns 204 No Content on success.
POST /admin/api/messages/{messageId}/seenMark seen or unseen{
"seen": true
}{
"id": "msg_123",
"seen": true
}POST /admin/api/messages/{messageId}/purgePurge one message{
"messageId": "msg_123"
}Returns 204 No Content on success.
POST /admin/api/messages/purgeBulk purge selected messages{
"messageIds": ["msg_123", "msg_456"],
"force": true
}{
"purged": ["msg_123", "msg_456"],
"failed": []
}POST /admin/api/messages/purge-deletedPurge deleted by filter{
"confirm": true,
"dryRun": false,
"filters": {
"mailbox": "support@example.com"
}
}{
"matchedCount": 12,
"deletedCount": 12,
"failedCount": 0,
"dryRun": false
}POST /admin/api/messages/purge-allPurge all deleted messages{
"confirm": true,
"dryRun": false
}{
"matchedCount": 42,
"deletedCount": 42,
"failedCount": 0,
"dryRun": false
}| Method | Path | Purpose | Access |
|---|---|---|---|
| GET |
/admin/api/contact-recipients
Payload and response
|
Lists the site-local recipients that receive /admin/public/contact submissions. |
Admin or super-admin. |
| POST |
/admin/api/contact-recipients
Payload and response
|
Adds site-local contact-form recipients. | Admin or super-admin. |
| DELETE |
/admin/api/contact-recipients
Payload and response
|
Removes contact-form recipients. | Admin or super-admin. |
| GET |
/admin/api/auth-email-branding
Payload and response
|
Reads site-specific Cognito auth-email branding for the admin and data-system pools. | Super-admin only. |
| PUT |
/admin/api/auth-email-branding
Payload and response
|
Creates, updates, or clears auth-email branding for the admin and data-system pools. | Super-admin only. |
| POST |
/admin/api/super-admin-invites/resend
Payload and response
|
Reissues pending super-admin invites and rotates their onboarding tokens. | Super-admin only. |
GET /admin/api/contact-recipientsList contact recipientsNo request body.
{
"items": [
{
"email": "contact@example.com",
"createdAt": "2026-03-20T15:00:00.000Z",
"updatedAt": "2026-03-20T15:00:00.000Z"
}
]
}POST /admin/api/contact-recipientsAdd contact recipients{
"recipients": ["contact@example.com", "sales@example.com"]
}{
"items": [
{
"email": "contact@example.com"
},
{
"email": "sales@example.com"
}
]
}DELETE /admin/api/contact-recipientsRemove contact recipients{
"recipients": ["sales@example.com"]
}Returns 204 No Content on success.
GET /admin/api/auth-email-brandingRead auth email brandingNo request body.
{
"siteId": "site_123",
"authEmailBranding": {
"adminVerificationEmail": {
"subject": "Your admin code",
"htmlBody": "<p>Your code is <strong>{{code}}</strong>.</p>"
}
},
"messageTypes": ["adminVerificationEmail", "dataVerificationEmail"]
}PUT /admin/api/auth-email-brandingSave auth email branding{
"adminVerificationEmail": {
"subject": "Your admin code",
"htmlBody": "<p>Your code is <strong>{{code}}</strong>.</p>"
},
"dataVerificationEmail": null
}{
"siteId": "site_123",
"authEmailBranding": {
"adminVerificationEmail": {
"subject": "Your admin code",
"htmlBody": "<p>Your code is <strong>{{code}}</strong>.</p>"
}
}
}POST /admin/api/super-admin-invites/resendResend super-admin invites{
"superAdminEmails": ["owner@example.com"]
}{
"matchedCount": 1,
"resentCount": 1,
"status": "sent"
}/admin/data RoutesThese routes manage the site data runtime. They are always authenticated with the site admin pool and are intended for admins or super-admins. Resource and runtime provisioning can be asynchronous, so callers should treat provisioning and retryable availability states as part of the normal contract.
| Method | Path | Purpose | Access |
|---|---|---|---|
| POST |
/admin/data/resources
Payload and response
|
Creates a data resource such as a DynamoDB table, S3 bucket, or Lambda-backed runtime helper. | Admin or super-admin. |
| GET |
/admin/data/resources
Payload and response
|
Lists current resources and operation bindings. This route can return provisioning status while runtime boots. | Admin or super-admin. |
| PATCH |
/admin/data/resources/{resourceId}
Payload and response
|
Updates one resource’s metadata or runtime configuration. | Admin or super-admin. |
| DELETE |
/admin/data/resources/{resourceId}
Payload and response
|
Deletes one resource from the site data runtime. | Admin or super-admin. |
| POST |
/admin/data/resources/{resourceId}/data/ddb/{action}
Payload and response
|
Runs a direct DynamoDB helper against a bound resource. Supported actions are get, query, scan, put, update, and delete. |
Admin or super-admin. |
| POST |
/admin/data/resources/{resourceId}/data/s3/{action}
Payload and response
|
Runs a direct S3 helper against a bound resource. Supported actions are list-objects, get-object, put-object, delete-object, presign-get-object, and presign-put-object. |
Admin or super-admin. |
| POST |
/admin/data/operations
Payload and response
|
Creates or updates a site data operation binding, either to a Lambda resource or to a built-in preset. | Admin or super-admin. |
| DELETE |
/admin/data/operations/{operation}
Payload and response
|
Deletes one site data operation binding. | Admin or super-admin. |
| POST |
/admin/data/operations/{operation}
Payload and response
|
Invalidates cached responses for one data operation. | Admin or super-admin. |
| POST |
/admin/data/reconcile
Payload and response
|
Repairs data runtime first, then queues reconcile once runtime is ready to realign runtime and control state. | Admin or super-admin. |
POST /admin/data/resourcesCreate resource{
"type": "ddbTable",
"name": "profiles",
"config": {
"partitionKey": {
"name": "pk",
"type": "S"
}
}
}{
"resourceId": "res_profiles",
"type": "ddbTable",
"name": "profiles",
"permissionsSync": {
"status": "queued"
}
}GET /admin/data/resourcesList resources and bindingsNo request body.
{
"resources": [
{
"resourceId": "res_profiles",
"type": "ddbTable",
"name": "profiles"
}
],
"operations": []
}PATCH /admin/data/resources/{resourceId}Update resource metadata{
"name": "profiles-v2",
"config": {
"ttlAttribute": "expiresAt"
}
}{
"resourceId": "res_profiles",
"type": "ddbTable",
"name": "profiles-v2"
}DELETE /admin/data/resources/{resourceId}Delete resource{
"resourceId": "res_profiles"
}{
"ok": true
}POST /admin/data/resources/{resourceId}/data/ddb/{action}Direct DynamoDB helper{
"key": {
"pk": "user#123"
}
}{
"item": {
"pk": "user#123",
"name": "Ada"
}
}POST /admin/data/resources/{resourceId}/data/s3/{action}Direct S3 helper{
"prefix": "uploads/",
"maxKeys": 25
}{
"items": [
{
"key": "uploads/example.txt"
}
]
}POST /admin/data/operationsCreate or update operation binding{
"operation": "getProfile",
"lambdaResourceId": "res_profiles_handler",
"auth": {
"mode": "authenticated"
},
"cache": {
"ttlSeconds": 60
}
}{
"operation": "getProfile",
"resourceId": "res_profiles_handler",
"permissionsSync": {
"status": "queued"
}
}DELETE /admin/data/operations/{operation}Delete operation binding{
"operation": "getProfile"
}{
"ok": true
}POST /admin/data/operations/{operation}Invalidate cached operation output{
"operation": "getProfile"
}{
"ok": true,
"invalidatedCount": 3
}POST /admin/data/reconcileRepair data systemNo request body.
{
"status": "queued",
"permissionsSync": {
"status": "queued"
}
}| Method | Path | Purpose | Access |
|---|---|---|---|
| GET |
/admin/data/jobs
Payload and response
|
Lists configured backend jobs for the site data runtime. | Admin or super-admin. |
| PUT |
/admin/data/jobs/{jobId}
Payload and response
|
Creates or updates a backend job, including schedule, payload, and auth context. | Admin or super-admin. |
| POST |
/admin/data/jobs/{jobId}
Payload and response
|
Runs one configured backend job immediately. | Admin or super-admin. |
| DELETE |
/admin/data/jobs/{jobId}
Payload and response
|
Deletes one backend job and any attached schedule. | Admin or super-admin. |
| GET |
/admin/data/groups
Payload and response
|
Lists data-system Cognito groups used to protect authenticated data operations. | Admin or super-admin. |
| POST |
/admin/data/groups
Payload and response
|
Creates a data-system Cognito group. | Admin or super-admin. |
| DELETE |
/admin/data/groups/{groupName}
Payload and response
|
Deletes a data-system Cognito group. | Admin or super-admin. |
| POST |
/admin/data/groups/{groupName}/users
Payload and response
|
Adds a data-system user to one group. | Admin or super-admin. |
| DELETE |
/admin/data/groups/{groupName}/users
Payload and response
|
Removes a data-system user from one group. | Admin or super-admin. |
| GET |
/admin/data/env-vars
Payload and response
|
Lists site env vars. Secret values remain write-only and are never returned. | Admin or super-admin. |
| PUT |
/admin/data/env-vars
Payload and response
|
Creates or updates site env vars in secure storage. | Admin or super-admin. |
| DELETE |
/admin/data/env-vars
Payload and response
|
Deletes all current site env vars. | Admin or super-admin. |
| POST |
/admin/data/compute/execute
Payload and response
|
Runs ad hoc CommonJS code inside the tenant-isolated compute runner. | Admin or super-admin. |
GET /admin/data/jobsList jobsNo request body.
{
"items": [
{
"jobId": "nightly-sync",
"operation": "syncProfiles"
}
]
}PUT /admin/data/jobs/{jobId}Create or update job{
"operation": "syncProfiles",
"payload": {
"full": true
},
"schedule": {
"cron": "0 2 * * *"
}
}{
"jobId": "nightly-sync",
"operation": "syncProfiles",
"schedule": {
"cron": "0 2 * * *"
}
}POST /admin/data/jobs/{jobId}Run job now{
"trigger": "manual"
}{
"ok": true,
"data": {
"jobId": "nightly-sync",
"status": "started"
}
}DELETE /admin/data/jobs/{jobId}Delete job{
"jobId": "nightly-sync"
}{
"ok": true
}GET /admin/data/groupsList data groupsNo request body.
{
"items": [
{
"groupName": "members",
"description": "Authenticated members"
}
]
}POST /admin/data/groupsCreate data group{
"groupName": "members",
"description": "Authenticated members"
}{
"groupName": "members",
"description": "Authenticated members"
}DELETE /admin/data/groups/{groupName}Delete data group{
"groupName": "members"
}{
"ok": true
}POST /admin/data/groups/{groupName}/usersAdd user to group{
"username": "visitor@example.com"
}{
"groupName": "members",
"username": "visitor@example.com",
"ok": true
}DELETE /admin/data/groups/{groupName}/usersRemove user from group{
"username": "visitor@example.com"
}{
"groupName": "members",
"username": "visitor@example.com",
"ok": true
}GET /admin/data/env-varsList env varsNo request body.
{
"items": [
{
"name": "API_BASE_URL",
"secret": false,
"value": "https://api.example.com"
}
]
}PUT /admin/data/env-varsSave env vars{
"storageBackend": "ssmSecureString",
"variables": {
"API_BASE_URL": {
"value": "https://api.example.com"
},
"API_SECRET": {
"value": "secret-value",
"secret": true
}
}
}{
"items": [
{
"name": "API_BASE_URL",
"secret": false
},
{
"name": "API_SECRET",
"secret": true
}
]
}DELETE /admin/data/env-varsDelete env varsNo request body.
{
"ok": true
}POST /admin/data/compute/executeRun compute snippet{
"code": "module.exports = async ({ payload }) => ({ echoed: payload });",
"payload": {
"hello": "world"
},
"timeoutSeconds": 10
}{
"ok": true,
"data": {
"echoed": {
"hello": "world"
}
}
}| Method | Path | Purpose | Access |
|---|---|---|---|
| POST |
/admin/data/iac/jobs
Payload and response
|
Submits an asynchronous IaC apply or replace job for resources, operations, jobs, groups, and env vars. | Admin or super-admin. |
| GET |
/admin/data/iac/jobs
Payload and response
|
Lists async IaC jobs for the current site. | Admin or super-admin. |
| GET |
/admin/data/iac/jobs/{jobId}
Payload and response
|
Reads the status, summary, and permissions-sync state for one IaC job. | Admin or super-admin. |
| GET |
/admin/data/iac/definitions
Payload and response
|
Lists saved IaC definition profiles for the current site organization. | Admin or super-admin. |
| GET |
/admin/data/iac/definitions/{profileName}
Payload and response
|
Reads one saved IaC definition profile. | Admin or super-admin. |
| PUT |
/admin/data/iac/definitions/{profileName}
Payload and response
|
Creates or updates one saved IaC definition profile. | Admin or super-admin. |
| DELETE |
/admin/data/iac/definitions/{profileName}
Payload and response
|
Deletes one saved IaC definition profile. | Admin or super-admin. |
POST /admin/data/iac/jobsSubmit IaC job{
"mode": "apply",
"definitionProfileName": "baseline",
"persistDefinition": false,
"definition": {
"resources": [
{
"type": "ddbTable",
"name": "profiles"
}
]
}
}{
"jobId": "iac_job_123",
"status": "queued",
"definitionSource": "inline",
"definitionPersisted": false
}GET /admin/data/iac/jobsList IaC jobsNo request body.
{
"items": [
{
"jobId": "iac_job_123",
"status": "running",
"definitionSource": "profile"
}
]
}GET /admin/data/iac/jobs/{jobId}Read IaC job{
"jobId": "iac_job_123"
}{
"jobId": "iac_job_123",
"status": "succeeded",
"definitionSource": "profile",
"permissionsSync": {
"status": "queued"
}
}GET /admin/data/iac/definitionsList saved definitionsNo request body.
{
"items": [
{
"profileName": "baseline",
"updatedAt": "2026-03-20T15:00:00.000Z"
}
]
}GET /admin/data/iac/definitions/{profileName}Read saved definition{
"profileName": "baseline"
}{
"profileName": "baseline",
"definition": {
"resources": [
{
"type": "ddbTable",
"name": "profiles"
}
]
}
}PUT /admin/data/iac/definitions/{profileName}Save definition{
"definition": {
"resources": [
{
"type": "ddbTable",
"name": "profiles"
}
]
},
"overwriteDefinition": true
}{
"profileName": "baseline",
"definition": {
"resources": [
{
"type": "ddbTable",
"name": "profiles"
}
]
}
}DELETE /admin/data/iac/definitions/{profileName}Delete definition{
"profileName": "baseline"
}{
"ok": true
}/data Routes
The site Data API has only four site-facing route shapes. The concrete operation name after
/data/ is site-defined and comes from the operation bindings you create under
/admin/data/operations.
| Method | Path | Purpose | Access |
|---|---|---|---|
| GET |
/data/auth/config
Payload and response
|
Returns data-system auth discovery: user pool, client ID, issuer, region, and optional Hosted UI or localhost-dev settings. | No token. |
| GET |
/data/public/auth/config
Payload and response
|
Public alias for the same auth-discovery response as /data/auth/config. |
No token. |
| POST |
/data/public/{operation}
Payload and response
|
Calls a public site data operation with no visitor authentication. | No token. |
| POST |
/data/{operation}
Payload and response
|
Calls an authenticated site data operation with a data-system access token. | Data-system access token. |
GET /data/auth/configVisitor auth discoveryNo request body.
{
"ok": true,
"data": {
"enabled": true,
"userPoolId": "us-east-1_example",
"userPoolClientId": "123exampleclient",
"issuer": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_example",
"region": "us-east-1",
"domain": "https://hydrix-data-example.auth.us-east-1.amazoncognito.com",
"providers": {
"google": {
"enabled": true,
"identityProvider": "Google",
"responseType": "code",
"scopes": ["openid", "email", "profile", "aws.cognito.signin.user.admin"]
}
}
}
}GET /data/public/auth/configPublic auth discovery aliasNo request body.
{
"ok": true,
"data": {
"enabled": true,
"userPoolId": "us-east-1_example",
"userPoolClientId": "123exampleclient",
"issuer": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_example",
"region": "us-east-1"
}
}POST /data/public/{operation}Public data operation{
"payload": {
"pk": "user#123"
}
}{
"ok": true,
"data": {
"pk": "user#123",
"name": "Ada"
}
}POST /data/{operation}Authenticated data operation{
"payload": {
"pk": "user#123"
}
}{
"ok": true,
"data": {
"pk": "user#123",
"name": "Ada"
}
}payload field.{ "ok": true, "data": ... } on success{ "ok": false, "error": { "code": "...", "message": "..." } } on failuretoken_use must be access.iss, client_id, and exp must match the discovered site config.providers.google.scopes exactly as returned, including aws.cognito.signin.user.admin.