# Caraer API Documentation

This documentation provides an overview of the Caraer API, including authentication methods, endpoint details, data models, and integration guidelines for building on the Caraer platform.

Version: 2.0

## Servers

Production
```
https://v2.api.caraer.com
```

## Security

### bearerAuth

Type: http
Scheme: bearer
Bearer Format: Opaque

## Download OpenAPI description

[Caraer API Documentation](https://developer.caraer.com/_bundle/apis/index.yaml)

## App Bar Iframe Sessions

Short-lived iframe session tokens for installed app bars

### Create an iframe session token

 - [POST /api/v2/app-bars/{appBarUuid}/iframe-session](https://developer.caraer.com/apis/app-bar-iframe-sessions/createiframesession.md): Issues a short-lived opaque token for an iframe-based app bar. The token can be validated by the embedded app to confirm user, company, view, and filter context.

### Validate an iframe session token

 - [POST /api/v2/app-bars/iframe-session/validate](https://developer.caraer.com/apis/app-bar-iframe-sessions/validateiframesession.md): Public endpoint for embedded apps to validate a caraer_iframe_token and receive safe context.

## App Bars

Runtime app bar actions for installed apps

### Trigger an action-based app bar

 - [POST /api/v2/app-bars/{appBarUuid}/trigger](https://developer.caraer.com/apis/app-bars/triggerappbar.md): Fires the app bar webhook with optional settings values and record/view context.

### List installed app bars for a location

 - [GET /api/v2/app-bars](https://developer.caraer.com/apis/app-bars/listappbars.md): Returns all app bars from installed apps for the authenticated user's company at the given location.

## App installation runtime

Per-installation state, secrets, jobs, and connections for sync apps

### Get installation state map

 - [GET /api/v2/apps/{appUuid}/installation/state](https://developer.caraer.com/apis/app-installation-runtime/getstate.md)

### Replace/merge installation state (shallow merge)

 - [PUT /api/v2/apps/{appUuid}/installation/state](https://developer.caraer.com/apis/app-installation-runtime/putstate.md)

### Get a single state key

 - [GET /api/v2/apps/{appUuid}/installation/state/{key}](https://developer.caraer.com/apis/app-installation-runtime/getstatekey.md)

### Put a single state key

 - [PUT /api/v2/apps/{appUuid}/installation/state/{key}](https://developer.caraer.com/apis/app-installation-runtime/putstatekey.md)

### Delete a state key

 - [DELETE /api/v2/apps/{appUuid}/installation/state/{key}](https://developer.caraer.com/apis/app-installation-runtime/deletestatekey.md)

### Merge COMPANY-scoped installation settings from the app runtime

 - [PUT /api/v2/apps/{appUuid}/installation/settings](https://developer.caraer.com/apis/app-installation-runtime/mergecompanysettings.md)

### Save USER-scoped installation settings for the current user

 - [PUT /api/v2/apps/{appUuid}/installation/settings/user](https://developer.caraer.com/apis/app-installation-runtime/saveusersettings.md)

### Set an encrypted secret

 - [PUT /api/v2/apps/{appUuid}/installation/secrets/{name}](https://developer.caraer.com/apis/app-installation-runtime/putsecret.md)

### Delete an encrypted secret

 - [DELETE /api/v2/apps/{appUuid}/installation/secrets/{name}](https://developer.caraer.com/apis/app-installation-runtime/deletesecret.md)

### Trigger an ACTION setting without saving settings

 - [POST /api/v2/apps/{appUuid}/installation/settings/{fieldName}/trigger](https://developer.caraer.com/apis/app-installation-runtime/triggersettingaction.md)

### Start external OAuth authorize (returns provider authorize URL)

 - [POST /api/v2/apps/{appUuid}/installation/oauth/{provider}/start](https://developer.caraer.com/apis/app-installation-runtime/startoauth.md)

### Enqueue an async serverless function job

 - [POST /api/v2/apps/{appUuid}/installation/jobs](https://developer.caraer.com/apis/app-installation-runtime/enqueuejob.md)

### List secret names (no values)

 - [GET /api/v2/apps/{appUuid}/installation/secrets](https://developer.caraer.com/apis/app-installation-runtime/listsecrets.md)

### Get async job status

 - [GET /api/v2/apps/{appUuid}/installation/jobs/{jobId}](https://developer.caraer.com/apis/app-installation-runtime/getjob.md)

### List external OAuth connection status

 - [GET /api/v2/apps/{appUuid}/installation/connections](https://developer.caraer.com/apis/app-installation-runtime/listconnections.md)

### Revoke external OAuth connection tokens by connection id or provider name

 - [DELETE /api/v2/apps/{appUuid}/installation/connections/{providerOrConnectionId}](https://developer.caraer.com/apis/app-installation-runtime/revokeconnection.md)

## Applications

Apps are third-party integrations and extensions that extend Caraer functionality. They can provide additional features, connect to external services, include Webhooks for event handling, and offer custom UI components through AppBars. Apps enable the platform ecosystem where companies can integrate with their existing tools and workflows. Apps can be public (available to all companies) or private (company-specific), have pricing models, descriptions, and settings schemas. Apps can include Webhooks with rate limiting and secret-based authentication. The App system enables extensibility and integration capabilities, allowing the platform to connect with external systems and provide additional functionality beyond the core platform features.

### Get a webhook for an app

 - [GET /api/v2/apps/{appUuid}/webhooks/{webhookUuid}](https://developer.caraer.com/apis/applications/getappwebhook.md): Fetches a single webhook that belongs to the specified app.

### Update a webhook for an app

 - [PUT /api/v2/apps/{appUuid}/webhooks/{webhookUuid}](https://developer.caraer.com/apis/applications/updateappwebhookforapp.md): Updates an existing webhook that belongs to the specified app and the authenticated user's selected company.

### Delete a webhook for an app

 - [DELETE /api/v2/apps/{appUuid}/webhooks/{webhookUuid}](https://developer.caraer.com/apis/applications/deleteappwebhook.md): Deletes a webhook that belongs to the specified app and the authenticated user's selected company.

### Get a public app (creator view)

 - [GET /api/v2/apps/public/{uuid}](https://developer.caraer.com/apis/applications/getpublicapp.md): Gets the full app for the creator, including appPublish, appBars, details, and pricing. Returns AppCreatorDTO with everything under App.

### Update a public app (creator edit)

 - [PUT /api/v2/apps/public/{uuid}](https://developer.caraer.com/apis/applications/updatepublicapp.md): Updates a public app with the full creator payload (label, description, details, pricing, settingsSchema, appBars). Send the entire AppCreatorDTO as returned by GET. Returns the updated app as AppCreatorDTO.

### Uninstall an application

 - [POST /api/v2/apps/{uuid}/uninstall](https://developer.caraer.com/apis/applications/uninstallapp.md): Removes the installed application specified by its UUID using the provided settings. The request body should contain an AppRequest with the uninstallation settings. Returns the updated application details as a ShowResponse wrapping an AppDTO.

### Load dynamic options for a setting select field

 - [POST /api/v2/apps/{uuid}/settings-schema/options](https://developer.caraer.com/apis/applications/loadsettingoptions.md): Invokes the app serverless function configured on the field's optionsSource and returns options for SINGLE_SELECT / MULTI_SELECT fields. Uses the draft settingsSchema from the installer UI so credentials entered in other fields are available to the loader.

### Rotate application configurations

 - [POST /api/v2/apps/{uuid}/rotate](https://developer.caraer.com/apis/applications/rotateapp.md): Rotates the configuration or settings for the specified application by UUID. On success, returns the updated application details as a ShowResponse wrapping an AppDTO.

### Migrate an app from platform V1 to V2

 - [POST /api/v2/apps/{uuid}/migrate-v2](https://developer.caraer.com/apis/applications/migratetov2.md): Opt-in in-place migration to the shared container runtime. Validates a single runtime, sets platformVersion=2, schedules an async rebuild, and keeps invoking via legacy gcpReference until runtimeStatus is READY.

### Install an application

 - [POST /api/v2/apps/{uuid}/install](https://developer.caraer.com/apis/applications/installapp.md): Installs the application specified by its UUID with optional initial configuration settings. Returns the updated application details as a ShowResponse wrapping an AppDTO.

### Create a webhook for an app (app-scoped path)

 - [POST /api/v2/apps/{appUuid}/webhooks](https://developer.caraer.com/apis/applications/createappwebhookforapp.md): Creates a new webhook for the specified app using normal bearer authentication. The app must be installed for the authenticated user's selected company. This endpoint is an app-scoped equivalent of the generic webhook creation endpoint.

### Test an unsaved webhook for an app

 - [POST /api/v2/apps/{appUuid}/webhooks/test](https://developer.caraer.com/apis/applications/testappwebhookunsaved.md): Generates a test webhook payload from webhook configuration supplied in the request body without persisting the webhook. When recordUuid is omitted, auto-resolves the latest matching record, prefers records that submitted the topic form and that have as many includeRelations as possible, and uses the event from the webhook topic. If no record exists, a simulated record is used and context.testNote (also X-Webhook-Test-Note) explains that plus any missing includeRelations.

### Test a webhook for an app (auto-resolve)

 - [POST /api/v2/apps/{appUuid}/webhooks/test/{webhookUuid}](https://developer.caraer.com/apis/applications/testappwebhookauto.md): Generates a test webhook payload using the latest matching record for the topic object. Form-submission topics prefer a record that submitted that form; includeRelations prefer a record that has as many of those related objects as possible. If no record exists, a simulated record is used. Missing includeRelations and simulated samples are explained in context.testNote and the X-Webhook-Test-Note header. Uses the event type from the webhook topic (updated when the topic action is all).

### Test a webhook for an app

 - [POST /api/v2/apps/{appUuid}/webhooks/test/{webhookUuid}/{recordUuid}/{eventType}](https://developer.caraer.com/apis/applications/testappwebhook.md): Generates a test webhook payload for a specific record and event type. Uses the same payload generation logic as live webhook delivery.

### Retrieve a paginated list of webhooks for an app

 - [POST /api/v2/apps/{appUuid}/webhooks/index](https://developer.caraer.com/apis/applications/getappwebhooks.md): Fetches a paginated and optionally filtered list of webhooks associated with the specified app and the authenticated user's selected company.

### Create a public app

 - [POST /api/v2/apps/public](https://developer.caraer.com/apis/applications/createpublicapp.md): Creates a new public app with the provided label and optional description. Public apps are automatically published for the creating user's company. Returns the created app details as a CreateResponse wrapping an AppDTO.

### Submit a public app for review

 - [POST /api/v2/apps/public/{uuid}/submit](https://developer.caraer.com/apis/applications/submitpublicapp.md): Submits a public app specified by its UUID for review. Returns the submitted app details as a ShowResponse wrapping an AppDTO.

### Review a public app

 - [POST /api/v2/apps/public/{uuid}/review](https://developer.caraer.com/apis/applications/reviewpublicapp.md): Sets review outcome (approve/reject/changes requested), feedback, and optional reviewer notes. Returns the updated app details as a ShowResponse wrapping an AppDTO.

### Create a private app

 - [POST /api/v2/apps/private](https://developer.caraer.com/apis/applications/createprivateapp.md): Creates a new private app with the provided label and optional description. Private apps are automatically installed for the creating user's company. Returns the created app details as a CreateResponse wrapping an AppDTO.

### Retrieve apps created by the logged-in user's selected company

 - [POST /api/v2/apps/my/index](https://developer.caraer.com/apis/applications/getmycreatedapps.md): Fetches a paginated and optionally filtered list of apps where the selected company is the creator. Returns a PaginationResponse containing AppDTO objects.

### Retrieve a paginated list of applications

 - [POST /api/v2/apps/index](https://developer.caraer.com/apis/applications/getapps.md): Fetches a paginated and optionally filtered list of applications. The list is sorted alphabetically by category and name. On success, returns a PaginationResponse containing AppSummaryDTO objects.

### Retrieve application details by UUID

 - [GET /api/v2/apps/{uuid}](https://developer.caraer.com/apis/applications/getapp.md): Fetches details about an application specified by its UUID. Returns the application details as a ShowResponse wrapping an AppDetailDTO.

### Get webhook property topic options

 - [GET /api/v2/apps/{appUuid}/webhooks/property-topics](https://developer.caraer.com/apis/applications/getwebhookpropertytopics.md): Returns property names on an object that can be used in 4-part property_changed webhook topics.

### Get available webhook formats

 - [GET /api/v2/apps/{appUuid}/webhooks/formats](https://developer.caraer.com/apis/applications/getwebhookformats.md): Returns all supported webhook payload formats with their details.

### Get available webhook record events

 - [GET /api/v2/apps/{appUuid}/webhooks/events](https://developer.caraer.com/apis/applications/getwebhookevents.md): Returns all supported record webhook events with their details.

### Get app runtime logs

 - [GET /api/v2/apps/{appUuid}/runtime/logs](https://developer.caraer.com/apis/applications/getruntimelogs.md): Queries Cloud Logging for the shared V2 app container (app-{uuid}) without filtering to a single function.

### Stream app runtime logs (SSE)

 - [GET /api/v2/apps/{appUuid}/runtime/logs/stream](https://developer.caraer.com/apis/applications/streamruntimelogs.md): Server-Sent Events stream of Cloud Logging entries for the shared V2 app container. Polls every ~2.5s and stops after 5 minutes or client disconnect.

### Get current user's company information

 - [GET /api/v2/apps/{appUuid}/me](https://developer.caraer.com/apis/applications/getcompanyinformation.md): Retrieves the company information of the authenticated user. The response includes public details of the user's selected company.

### List predefined marketplace app categories

 - [GET /api/v2/apps/categories](https://developer.caraer.com/apis/applications/listappcategories.md): Returns the allowed category keys and labels for public app marketplace listings.

## Automations

Endpoints for Caraer Automations and Latenode integration.

### Get Latenode JWT token for current user

 - [GET /api/v2/automations/token](https://developer.caraer.com/apis/automations/gettoken.md): Generates a short-lived Latenode JWT token for the authenticated user, to be used with the Latenode embedded SDK.

## Billing

Billing enforcement status and setup email for the selected company.

### Send billing setup email

 - [POST /api/v2/billing/setup-email](https://developer.caraer.com/apis/billing/sendsetupemail.md): Triggers Jortt to email the linked customer a direct-debit authorization payment link.

### Get billing enforcement status

 - [GET /api/v2/billing/status](https://developer.caraer.com/apis/billing/getstatus.md): Returns whether the selected company should see no UI, a billing banner, or a non-dismissible lockout, based on Caraer BV CRM billing fields.

## Calendars

Native event calendars owned by users

### List calendars visible to the current company

 - [GET /api/v2/calendars](https://developer.caraer.com/apis/calendars/list_3.md)

### Create a calendar owned by the current user

 - [POST /api/v2/calendars](https://developer.caraer.com/apis/calendars/create_4.md)

### Ensure calendar schema, default calendar, and event backfill

 - [POST /api/v2/calendars/bootstrap](https://developer.caraer.com/apis/calendars/bootstrap.md)

### List teams that can be linked to a calendar

 - [GET /api/v2/calendars/teams](https://developer.caraer.com/apis/calendars/listteams.md)

## CMS modules

CMS v2 modules published by an app

### List an app's CMS modules

 - [GET /api/v2/apps/{appUuid}/cms-modules](https://developer.caraer.com/apis/cms-modules/list.md): Includes retired modules, so a developer can see what a push removed.

### Replace an app's CMS module catalog

 - [PUT /api/v2/apps/{appUuid}/cms-modules](https://developer.caraer.com/apis/cms-modules/upsert.md): Registers the modules shipped by a published package version. Modules missing from the payload are retired rather than deleted, because pages may still reference them.

### Publish an app's CMS module package

 - [POST /api/v2/apps/{appUuid}/cms-modules/package](https://developer.caraer.com/apis/cms-modules/publishpackage.md): Accepts a staged npm tarball (base64) and module manifests. Publishes to the platform registry with the host token, then replaces the catalog.

## CMS v2 environments

Company environments for the CMS builder

### Update routing, auth or htmlLang. Keys are immutable.

 - [PUT /api/v2/cms/environments/{key}](https://developer.caraer.com/apis/cms-v2-environments/update_1.md)

### Delete an environment except main

 - [DELETE /api/v2/cms/environments/{key}](https://developer.caraer.com/apis/cms-v2-environments/delete_1.md)

### List company environments

 - [GET /api/v2/cms/environments](https://developer.caraer.com/apis/cms-v2-environments/list_2.md)

### Create an environment

 - [POST /api/v2/cms/environments](https://developer.caraer.com/apis/cms-v2-environments/create_3.md)

### Link two records as translations

 - [POST /api/v2/cms/environments/translations/{fromUuid}/link/{toUuid}](https://developer.caraer.com/apis/cms-v2-environments/link.md)

### Unlink a translation edge

 - [DELETE /api/v2/cms/environments/translations/{fromUuid}/link/{toUuid}](https://developer.caraer.com/apis/cms-v2-environments/unlink.md)

### Translation group for a record

 - [GET /api/v2/cms/environments/translations/{recordUuid}](https://developer.caraer.com/apis/cms-v2-environments/group.md)

## CMS v2 pages

Module-based page editing

### Load a page for the builder

 - [GET /api/v2/webpages/v2/pages/{recordUuid}](https://developer.caraer.com/apis/cms-v2-pages/get.md)

### Replace a page draft

 - [PUT /api/v2/webpages/v2/pages/{recordUuid}](https://developer.caraer.com/apis/cms-v2-pages/save.md)

### Take one locale offline

 - [PUT /api/v2/webpages/v2/pages/{recordUuid}/unpublish](https://developer.caraer.com/apis/cms-v2-pages/unpublish.md)

### Publish one locale, or all of them

 - [PUT /api/v2/webpages/v2/pages/{recordUuid}/publish](https://developer.caraer.com/apis/cms-v2-pages/publish.md): Copies the draft over the published document. Publishing is per locale so a translated page can ship without republishing the others.

### Update slug, title, excerpt, SEO and page scripts

 - [PUT /api/v2/webpages/v2/pages/{recordUuid}/meta](https://developer.caraer.com/apis/cms-v2-pages/savemeta.md)

### Preview field values on the forked module

 - [PUT /api/v2/webpages/v2/pages/{recordUuid}/ai/module-fork/sessions/{sessionId}/fields](https://developer.caraer.com/apis/cms-v2-pages/updatemoduleforkfields.md): Writes test values into the playground session without changing the live page.

### CMS v2 object template document

 - [GET /api/v2/webpages/v2/pages/templates/{objectUuid}](https://developer.caraer.com/apis/cms-v2-pages/gettemplate.md)

### Replace a CMS v2 object template

 - [PUT /api/v2/webpages/v2/pages/templates/{objectUuid}](https://developer.caraer.com/apis/cms-v2-pages/savetemplate.md)

### Apply patches to a page draft

 - [POST /api/v2/webpages/v2/pages/{recordUuid}/patch](https://developer.caraer.com/apis/cms-v2-pages/patch.md): Rejected with 409 when expectedRevision does not match, so a stale client cannot overwrite another editor's work.

### Restore a draft snapshot

 - [POST /api/v2/webpages/v2/pages/{recordUuid}/history/{index}/restore](https://developer.caraer.com/apis/cms-v2-pages/restorehistory.md)

### Create a translated sibling page for an environment

 - [POST /api/v2/webpages/v2/pages/{recordUuid}/environments/{key}/translate](https://developer.caraer.com/apis/cms-v2-pages/createtranslation.md)

### Host this page on another environment

 - [POST /api/v2/webpages/v2/pages/{recordUuid}/environments/{key}/host](https://developer.caraer.com/apis/cms-v2-pages/hostonenvironment.md)

### Rewrite a page or a module from a prompt

 - [POST /api/v2/webpages/v2/pages/{recordUuid}/ai/rewrite](https://developer.caraer.com/apis/cms-v2-pages/airewrite.md): Returns patches the editor applies through the same revision channel as a manual edit, so the change is undoable. Page scope may add, remove and reorder modules. A module's code lives in a shared npm package, so the AI rewrites field values and composition, never the component itself.

### Start a Modify-this-module playground session

 - [POST /api/v2/webpages/v2/pages/{recordUuid}/ai/module-fork/sessions](https://developer.caraer.com/apis/cms-v2-pages/startmodulefork.md): CMS v2 companies and pages only. Copies the installed module's published source into a playground session. Live code edits stay off the company site until save publishes a platform v2 private-app package and a rebuild compiles it.

### Publish the forked module into a private app

 - [POST /api/v2/webpages/v2/pages/{recordUuid}/ai/module-fork/sessions/{sessionId}/save](https://developer.caraer.com/apis/cms-v2-pages/savemodulefork.md): Merges the new module into the whole npm package so sibling modules are not retired, then swaps this placement with set_module.

### Rewrite forked module source from a prompt

 - [POST /api/v2/webpages/v2/pages/{recordUuid}/ai/module-fork/sessions/{sessionId}/prompt](https://developer.caraer.com/apis/cms-v2-pages/promptmodulefork.md)

### Create or reuse the custom 404 page

 - [POST /api/v2/webpages/v2/pages/not-found](https://developer.caraer.com/apis/cms-v2-pages/ensurenotfound.md): Finds the page at /404 on the root Webpage object, or creates an empty draft there, and stores it as the company custom 404 page.

### Signed preview URL for the builder iframe

 - [GET /api/v2/webpages/v2/pages/{recordUuid}/preview-link](https://developer.caraer.com/apis/cms-v2-pages/previewlink.md): The iframe renders the draft document, which the public API will not serve. The signature covers the page and an expiry so a leaked link cannot be retargeted or replayed.

### Draft snapshots for one locale

 - [GET /api/v2/webpages/v2/pages/{recordUuid}/history](https://developer.caraer.com/apis/cms-v2-pages/history.md)

### Environment coverage for the builder dropdown

 - [GET /api/v2/webpages/v2/pages/{recordUuid}/environments](https://developer.caraer.com/apis/cms-v2-pages/environmentcoverage.md)

### Modules available to this company

 - [GET /api/v2/webpages/v2/pages/library/modules](https://developer.caraer.com/apis/cms-v2-pages/library.md): Backs the builder's library picker. Only modules from installed apps, and never retired ones, because a new page must be able to render them.

### Remove an environment from this page only

 - [DELETE /api/v2/webpages/v2/pages/{recordUuid}/environments/{key}](https://developer.caraer.com/apis/cms-v2-pages/unselectenvironment.md)

### Discard a Modify-this-module playground session

 - [DELETE /api/v2/webpages/v2/pages/{recordUuid}/ai/module-fork/sessions/{sessionId}](https://developer.caraer.com/apis/cms-v2-pages/discardmodulefork.md)

## CMS v2 public

Content for the Astro website runtime

### Public records visible in an environment

 - [POST /api/v2/webpages/v2/public/records](https://developer.caraer.com/apis/cms-v2-public/records.md)

### Unlock a password-protected CMS v2 page

 - [POST /api/v2/webpages/v2/public/page/{uuid}/unlock](https://developer.caraer.com/apis/cms-v2-public/unlock.md)

### Company settings, branding and locales

 - [GET /api/v2/webpages/v2/public/settings](https://developer.caraer.com/apis/cms-v2-public/settings.md)

### Published paths per environment, for sitemaps and cache warming

 - [GET /api/v2/webpages/v2/public/paths](https://developer.caraer.com/apis/cms-v2-public/paths.md)

### A published page by URL path

 - [GET /api/v2/webpages/v2/public/page](https://developer.caraer.com/apis/cms-v2-public/pagebypath.md)

### A page by record uuid

 - [GET /api/v2/webpages/v2/public/page/{uuid}](https://developer.caraer.com/apis/cms-v2-public/pagebyuuid.md): Used by the builder preview, which addresses a page by uuid because a draft may not have a slug yet.

### Protection info for a path, without the page document

 - [GET /api/v2/webpages/v2/public/page/gate](https://developer.caraer.com/apis/cms-v2-public/pagegate.md)

### Navigation menus for the header and footer

 - [GET /api/v2/webpages/v2/public/menus](https://developer.caraer.com/apis/cms-v2-public/menus.md)

### Redirect to a company file for the website runtime

 - [GET /api/v2/webpages/v2/public/asset](https://developer.caraer.com/apis/cms-v2-public/asset.md)

### Installed app settings with SECRET fields removed

 - [GET /api/v2/webpages/v2/public/apps/{appName}/settings](https://developer.caraer.com/apis/cms-v2-public/appsettings.md)

### Installed apps and modules for a company's website build

 - [GET /api/v2/webpages/v2/build/manifest](https://developer.caraer.com/apis/cms-v2-public/buildmanifest.md)

## CMS v2 transfer

Attach a caraer-web sidecar, then cut over or roll back

### Restore the live hostname to the stored v1 project

 - [POST /api/v2/company/{companyUuid}/cms-transfer/rollback](https://developer.caraer.com/apis/cms-v2-transfer/rollback.md)

### Switch the live site to CMS v2: schema, caraer-web repo, and hostname

 - [POST /api/v2/company/{companyUuid}/cms-transfer/cutover](https://developer.caraer.com/apis/cms-v2-transfer/cutover.md)

### Attach a manually created caraer-web project

 - [POST /api/v2/company/{companyUuid}/cms-transfer/attach](https://developer.caraer.com/apis/cms-v2-transfer/attach.md)

### Transfer status for one company

 - [GET /api/v2/company/{companyUuid}/cms-transfer](https://developer.caraer.com/apis/cms-v2-transfer/status.md)

## Company

Companies represent multi-tenant organizations in Caraer. Each company has its own isolated database, users, objects, Records, and data. Companies enable SaaS multi-tenancy where each organization's data is completely isolated from others. Companies have settings (branding, configuration), subdomains for custom URLs, and can be customized with their own Objects, Properties, Forms, and Webpages. Users belong to one or more companies and can switch between them. Companies maintain their own access control, scopes, and permissions. The Company system enables the platform to serve multiple organizations while maintaining strict data isolation and allowing each company to customize the platform to their needs.

### Get company by UUID

 - [GET /api/v2/company/{uuid}](https://developer.caraer.com/apis/company/getcompanybyuuid.md): Returns a company by its UUID. Requires TOOLS_COMPANY_SETTINGS_READ scope.

### Update company

 - [PUT /api/v2/company/{uuid}](https://developer.caraer.com/apis/company/updatecompany.md): Updates a company by UUID. Request body should contain the company fields to update.

### Get website settings

 - [GET /api/v2/company/website-settings](https://developer.caraer.com/apis/company/getwebsitesettings.md): Returns the website settings for the company currently selected by the logged-in user.

### Update website settings

 - [PUT /api/v2/company/website-settings](https://developer.caraer.com/apis/company/updatewebsitesettings.md): Updates the website settings for the company currently selected by the logged-in user.

### Get suite dashboard

 - [GET /api/v2/company/suite-dashboards/{suiteName}](https://developer.caraer.com/apis/company/getsuitedashboard.md): Returns the home analytics dashboard for a suite. Empty dashboard when none is saved.

### Update suite dashboard

 - [PUT /api/v2/company/suite-dashboards/{suiteName}](https://developer.caraer.com/apis/company/updatesuitedashboard.md): Creates or replaces the home analytics dashboard for a suite.

### Get digital identity

 - [GET /api/v2/company/digital-identity](https://developer.caraer.com/apis/company/getdigitalidentity.md): Returns the digital identity (branding) for the company currently selected by the logged-in user.

### Update digital identity

 - [PUT /api/v2/company/digital-identity](https://developer.caraer.com/apis/company/updatedigitalidentity.md): Updates the digital identity (branding) for the company currently selected by the logged-in user.

### Resume webhook dispatch

 - [POST /api/v2/company/{companyUuid}/webhooks/resume](https://developer.caraer.com/apis/company/resumewebhookdispatch.md): Clears the per-company webhook circuit breaker so outbound deliveries resume immediately.

### Upload a font file

 - [POST /api/v2/company/uploadFont](https://developer.caraer.com/apis/company/uploadfont.md): Uploads a font file to S3 storage and returns the public URL.

### Get current company

 - [GET /api/v2/company/](https://developer.caraer.com/apis/company/getcompany.md): Returns the company currently selected by the logged-in user. Requires TOOLS_COMPANY_SETTINGS_READ scope.

### Create a new company

 - [POST /api/v2/company/](https://developer.caraer.com/apis/company/createcompany.md): Creates a new company based on the provided request data.

### List suite dashboards

 - [GET /api/v2/company/suite-dashboards](https://developer.caraer.com/apis/company/getsuitedashboards.md): Returns all home analytics dashboards keyed by suite name for the selected company.

## Developer Projects

Developer CLI projects, builds, and deploys for creator-owned apps.

### Create or fetch a developer project

 - [POST /api/v2/developer-projects](https://developer.caraer.com/apis/developer-projects/create_2.md): Creates a developer project linked to the given app, or returns the existing one if already linked. Creator company only.

### List project builds

 - [GET /api/v2/developer-projects/{projectUuid}/builds](https://developer.caraer.com/apis/developer-projects/listbuilds.md)

### Upload a project build

 - [POST /api/v2/developer-projects/{projectUuid}/builds](https://developer.caraer.com/apis/developer-projects/createbuild.md): Decodes a base64-encoded project archive, parses its manifest, uploads it to Cloud Storage, and records an immutable build.

### Deploy a project build

 - [POST /api/v2/developer-projects/{projectUuid}/builds/{buildUuid}/deploy](https://developer.caraer.com/apis/developer-projects/deploy.md): Reconciles the build's manifest (app details, serverless functions, webhooks, schedules, inbound routes, external OAuth providers) against the linked app. Set prune=true to soft-delete remote resources absent from the archive.

### Get a developer project

 - [GET /api/v2/developer-projects/{uuid}](https://developer.caraer.com/apis/developer-projects/show_3.md)

### List project deploys

 - [GET /api/v2/developer-projects/{projectUuid}/deploys](https://developer.caraer.com/apis/developer-projects/listdeploys.md)

### Get a project build

 - [GET /api/v2/developer-projects/{projectUuid}/builds/{buildUuid}](https://developer.caraer.com/apis/developer-projects/getbuild.md)

## Developer Sandboxes

Cloned company databases for safe developer testing.

### List developer sandboxes

 - [GET /api/v2/developer-sandboxes](https://developer.caraer.com/apis/developer-sandboxes/list_1.md): Lists sandboxes owned by the caller's selected company.

### Create a developer sandbox

 - [POST /api/v2/developer-sandboxes](https://developer.caraer.com/apis/developer-sandboxes/create_1.md): Clones the selected company's Neo4j database (no new Company node). Activate with X-Caraer-Sandbox-Uuid; company identity stays the owner.

### Get a developer sandbox

 - [GET /api/v2/developer-sandboxes/{uuid}](https://developer.caraer.com/apis/developer-sandboxes/show_2.md)

## Feeds

Feeds expose Records as XML or JSON for job boards and external integrations.

### List feeds

 - [POST /api/v2/feeds/index](https://developer.caraer.com/apis/feeds/index_1.md)

## File Management

File endpoints manage file uploads and downloads using S3-compatible storage. Files are used for attachments, images, documents, and media in Records and Webpages. Files support property format constraints (when used with file-type Properties) and access control through scopes. The file system provides pre-signed URLs for secure, time-limited access to files, supports bulk uploads, and can list files associated with specific Records. Files are stored with unique keys and can be deleted when no longer needed. The file system enables rich content management, allowing Records and Webpages to include images, documents, and other media assets.

### Download file

 - [GET /api/v2/files/](https://developer.caraer.com/apis/file-management/downloadfile.md): Generates a pre-signed URL to download a file stored in S3-compatible storage. The URL expiry time and download behavior can be specified using the query parameters.

### Upload files

 - [POST /api/v2/files/](https://developer.caraer.com/apis/file-management/uploadfile_2.md): Uploads multiple files to an S3-compatible storage and returns their unique keys. The request must contain one or more files in multipart/form-data format.

### Delete file

 - [DELETE /api/v2/files/](https://developer.caraer.com/apis/file-management/deletefile.md): Deletes a file from the S3-compatible storage identified by its unique key.

### List files

 - [GET /api/v2/files/list](https://developer.caraer.com/apis/file-management/listfiles.md): Lists all files stored in the system or, if a record UUID is provided, lists the files related to that record.

### List company files with metadata for the media library

 - [GET /api/v2/files/library](https://developer.caraer.com/apis/file-management/listlibrary.md)

## Filter

SavedFilters are reusable filter configurations that users can save and share. They encapsulate complex filter criteria for Records, enabling quick access to filtered data views without re-entering filter conditions. SavedFilters improve UX by allowing users to bookmark common queries (e.g., "Active Candidates", "Open Vacancies", "My Applications") and share them with team members. Filters can be soft-deleted and restored, and they support the same filter capabilities as Views but are stored separately for quick access. SavedFilters enable consistent data access patterns across teams and reduce the time needed to access frequently-used filtered views.

### Fetch a specific saved filter

 - [GET /api/v2/filters/{filterUuid}](https://developer.caraer.com/apis/filter/getfilter.md): Retrieves details of a saved filter by its UUID.

### Update an existing saved filter

 - [PUT /api/v2/filters/{filterUuid}](https://developer.caraer.com/apis/filter/updatefilter.md): Updates an existing saved filter identified by its UUID.

### Delete a saved filter

 - [DELETE /api/v2/filters/{filterUuid}](https://developer.caraer.com/apis/filter/deletefilter.md): Soft deletes a saved filter identified by its UUID.

### Create a new saved filter

 - [POST /api/v2/filters](https://developer.caraer.com/apis/filter/createfilter.md): Creates a new saved filter with the provided configuration.

### Fetch paginated saved filters

 - [POST /api/v2/filters/index/{objectUuid}](https://developer.caraer.com/apis/filter/getfilters.md): Fetches a paginated list of saved filters. The request body should contain pagination details such as limit, page, filters, and sort.

## Forms

Forms are dynamic data collection interfaces associated with CaraerObjects. They use a grid-based layout system with FormItems (GridItems) arranged in rows and columns that can render various field types based on Property definitions. Forms support multi-step wizards, lead scoring configurations, styling options (standard, underline, plain), and form submissions that create Records. Forms enable public-facing data collection (e.g., job applications, contact forms, candidate registrations) and can be embedded in Webpages. Forms validate input against Property validation rules and can include nested forms (inner forms) for complex data structures. Form submissions trigger FormSubmissionEvents and can create Relations between Records. Forms are essential for converting external user input into structured Records in the platform.

### Get form by UUID

 - [GET /api/v2/forms/{formUuid}](https://developer.caraer.com/apis/forms/getform.md): Retrieves a specific form by its UUID. Returns the details of the form in a FormDTO object wrapped in a ShowResponse.

### Update an existing form

 - [PUT /api/v2/forms/{formUuid}](https://developer.caraer.com/apis/forms/updateform.md): Updates an existing form identified by its UUID with the provided data. The request body should include the updated fields in a FormDTO. Returns the updated form wrapped in an UpdateResponse. Validation: Form fields are validated according to the Form validation rules. Required fields and format constraints are enforced.

### Delete a form

 - [DELETE /api/v2/forms/{formUuid}](https://developer.caraer.com/apis/forms/deleteform.md): Deletes a form identified by its UUID. On success, returns the deleted form's data wrapped in a DeleteResponse.

### Get forms by object UUID

 - [POST /api/v2/forms/{objectUuid}/index](https://developer.caraer.com/apis/forms/getformsbyobject.md): Retrieves a paginated list of forms associated with a specific object UUID. The endpoint uses a custom Cypher query to match forms linked to the object.

### Restore a deleted form

 - [POST /api/v2/forms/{formUuid}/restore](https://developer.caraer.com/apis/forms/restoreform.md): Restores a previously deleted form identified by its UUID. Returns the restored form wrapped in a RestoreResponse.

### Property options (public)

 - [POST /api/v2/forms/public/{companyUuid}/{propertyUuid}/options](https://developer.caraer.com/apis/forms/getoptions.md): When X-CARAER-TOKEN or X-Caraer-Company-Uuid is sent, that value selects the tenant company and overrides the companyUuid path segment.

### Submit a file

 - [POST /api/v2/forms/public/{companyUuid}/{formUuid}/upload](https://developer.caraer.com/apis/forms/uploadfiles.md): Submits a file with the provided data. Returns a SuccessResponse upon successful submission. When X-CARAER-TOKEN or X-Caraer-Company-Uuid is sent, that value selects the tenant company and overrides the companyUuid path segment.

### Submit a form

 - [POST /api/v2/forms/public/{companyUuid}/{formUuid}/submit](https://developer.caraer.com/apis/forms/submit.md): Submits a form with the provided data. Returns a SuccessResponse upon successful submission. When X-CARAER-TOKEN or X-Caraer-Company-Uuid is sent, that value selects the tenant company and overrides the companyUuid path segment.

### Get all forms for a company

 - [POST /api/v2/forms/public/{companyUuid}/index](https://developer.caraer.com/apis/forms/getformspublic.md): When X-CARAER-TOKEN or X-Caraer-Company-Uuid is sent, that value selects the tenant company and overrides the companyUuid path segment.

### AI form step (public)

 - [POST /api/v2/forms/public/{companyUuid}/ai/step/{stepTitle}/{prompt}](https://developer.caraer.com/apis/forms/chatstep.md): When X-CARAER-TOKEN or X-Caraer-Company-Uuid is sent, that value selects the tenant company and overrides the companyUuid path segment.

### AI form field (public)

 - [POST /api/v2/forms/public/{companyUuid}/ai/field/{fieldUuid}/{prompt}](https://developer.caraer.com/apis/forms/chatfield.md): When X-CARAER-TOKEN or X-Caraer-Company-Uuid is sent, that value selects the tenant company and overrides the companyUuid path segment.

### Get paginated list of forms

 - [POST /api/v2/forms/index](https://developer.caraer.com/apis/forms/getforms.md): Retrieves a paginated list of forms based on the provided filters, sorting, and search query. This endpoint returns a list of FormDTO objects wrapped in a PaginationResponse containing the current page, limit, total count, and the forms data.

### Create a new form

 - [POST /api/v2/forms/](https://developer.caraer.com/apis/forms/createform.md): Creates a new form with the provided data. The request body should contain a valid FormDTO object. On success, returns the created form as a FormDTO wrapped in a CreateResponse. Validation: Form fields are validated according to the Form validation rules. Required fields and format constraints are enforced.

### Get form by UUID

 - [GET /api/v2/forms/public/{companyUuid}/{formUuid}](https://developer.caraer.com/apis/forms/getformpublic.md): Retrieves a specific form by its UUID. When X-CARAER-TOKEN or X-Caraer-Company-Uuid is sent, that value selects the tenant company and overrides the companyUuid path segment.

### List objects that have forms

 - [GET /api/v2/forms/objects](https://developer.caraer.com/apis/forms/getobjectswithforms.md): Returns distinct custom objects that have at least one non-deleted form, ordered by object index.

## Module

API endpoints for managing modules

### Fetch a specific module

 - [GET /api/v2/modules/{moduleId}](https://developer.caraer.com/apis/module/getmodule.md): Retrieves details of a module by its UUID.

### Update an existing module

 - [PUT /api/v2/modules/{moduleId}](https://developer.caraer.com/apis/module/updatemodule.md): Updates the details of an existing module.

### Delete a module

 - [DELETE /api/v2/modules/{moduleId}](https://developer.caraer.com/apis/module/deletemodule.md): Deletes a module by its UUID.

### Fetch a personal module

 - [GET /api/v2/modules/personal/{moduleId}](https://developer.caraer.com/apis/module/getpersonalmodule.md): Retrieves a personal module by UUID for the logged-in user.

### Update a personal module

 - [PUT /api/v2/modules/personal/{moduleId}](https://developer.caraer.com/apis/module/updatepersonalmodule.md): Updates a personal module for the logged-in user.

### Delete a personal module

 - [DELETE /api/v2/modules/personal/{moduleId}](https://developer.caraer.com/apis/module/deletepersonalmodule.md): Deletes a personal module for the logged-in user.

### Fetch paginated personal modules

 - [POST /api/v2/modules/personal/index](https://developer.caraer.com/apis/module/getpersonalmodules.md): Retrieves personal modules for the logged-in user.

### Create a personal module

 - [POST /api/v2/modules/personal/](https://developer.caraer.com/apis/module/createpersonalmodule.md): Creates a module in the user's personal library.

### Fetch paginated modules

 - [POST /api/v2/modules/index](https://developer.caraer.com/apis/module/getmodules.md): Retrieves a paginated list of modules.

### Create a new module

 - [POST /api/v2/modules/](https://developer.caraer.com/apis/module/createmodule.md): Creates a new module.

## Notifications

In-app notification inbox for users and installed apps

### List in-app notifications for the logged-in user

 - [GET /api/v2/notifications](https://developer.caraer.com/apis/notifications/listnotifications.md): Returns notifications for the selected company plus user-general notifications that have no company. Other companies are never included.

### Send a notification (app token)

 - [POST /api/v2/notifications](https://developer.caraer.com/apis/notifications/sendnotification.md): Installed apps call this endpoint after async work completes. Authenticate with the installation token (Authorization: Bearer or X-CARAER-TOKEN). Every notification is scoped to the app's company. Omit targetUserUuid to notify every user in that company, or set it to aim the notification at one member.

### Mark a notification as read

 - [PATCH /api/v2/notifications/{notificationId}/read](https://developer.caraer.com/apis/notifications/markasread.md)

### Mark all notifications as read

 - [PATCH /api/v2/notifications/read-all](https://developer.caraer.com/apis/notifications/markallasread.md)

### Mint a Firebase custom token so the app can listen to its inbox

 - [GET /api/v2/notifications/firebase-token](https://developer.caraer.com/apis/notifications/firebasetoken.md)

### Dismiss a notification

 - [DELETE /api/v2/notifications/{notificationId}](https://developer.caraer.com/apis/notifications/dismissnotification.md)

## Objects

CaraerObjects are schema definitions for dynamic domain entities (e.g., "Candidate", "Vacancy", "Company"). They define the structure and behavior of Records through Properties (field definitions), Relations (connections to other objects), Views (display configurations), and Traits (behavioral features like Flow, Table, Webpage, User). Objects enable a flexible, schema-on-read data model where entities can be customized per company without code changes. Each Object has a name (lowercase identifier), label (display name), plural form, description, icon, and can be organized into groups. Objects can have traits that add specific behaviors: Flow enables kanban-style workflows, Table provides tabular data views, Webpage allows Records to have public-facing pages, and User enables authentication and user profiles. Objects are the foundation of the platform's dynamic data modeling system.

### Get object by UUID

 - [GET /api/v2/objects/{uuid}](https://developer.caraer.com/apis/objects/getobject.md): Fetches a single object by its UUID. Optional parameters determine whether to include views, properties, and relations in the response.

### Update object by UUID

 - [PUT /api/v2/objects/{uuid}](https://developer.caraer.com/apis/objects/updateobject.md): Updates an existing object identified by its UUID with new details. Optional parameters determine if views, properties, and relations should be included in the response. Validation rules: label (required, must be a string, maximum 32 characters), plural (required, must be a string, maximum 32 characters), name (required, must be a string, must be lowercase, must be unique, must match name pattern (lowercase letters, numbers, underscores), cannot be changed after creation), description (optional, maximum 255 characters), groups (required, must be an array of string, no duplicate values allowed).

### Delete object by UUID

 - [DELETE /api/v2/objects/{uuid}](https://developer.caraer.com/apis/objects/deleteobject.md): Deletes a specific object identified by its UUID.

### Configure lifecycle property tracking

 - [PUT /api/v2/objects/{objectUuid}/lifecycle-properties](https://developer.caraer.com/apis/objects/updatelifecycleproperties.md): Sets which properties on this object should generate lifecycle history records when their values change.

### Update object indices

 - [PUT /api/v2/objects/updateIndices](https://developer.caraer.com/apis/objects/updateindices_3.md): Updates indices of objects based on the provided mapping. The request body should contain a mapping of object UUIDs to index values. Optional request parameters determine if views, properties, and relations should be included in the response.

### Sync extended objects for existing records

 - [POST /api/v2/objects/{uuid}/syncExtendedObjects](https://developer.caraer.com/apis/objects/syncextendedobjects.md): Synchronizes existing records for an object after extended configuration changes. The object path variable accepts UUID or object name. Leftover nodes with a unique object label and no primary_object are stamped first. Records that reference the object as primary object, extended object, or label are re-extended.

### Get specific preview by name

 - [GET /api/v2/objects/{uuid}/previews/{name}](https://developer.caraer.com/apis/objects/getpreview.md): Fetches a preview for an object by the object's UUID and the preview name. Returns the preview data wrapped in a ShowResponse.

### Save object preview

 - [POST /api/v2/objects/{uuid}/previews/{name}](https://developer.caraer.com/apis/objects/savepreview.md): Creates or updates a preview for a specific object. The preview type is determined by the 'name' path variable. Depending on the preview type (e.g., 'detail', 'flow', 'pill', or 'page'), the request body will be mapped to the corresponding PreviewDTO and converted to the appropriate Preview model.

### Grant object record access

 - [POST /api/v2/objects/{objectUuid}/access-grant](https://developer.caraer.com/apis/objects/grantobjectaccess.md): Accepts a request to grant record-level scopes on the object to selected users, teams, and installed apps. Validation runs synchronously; grants are applied asynchronously. Returns 202 Accepted on success.

### Get all previews over all objects

 - [POST /api/v2/objects/previews](https://developer.caraer.com/apis/objects/getpreviews.md): Fetches all previews over all objects. Returns a PaginationResponse containing a list of preview DTOs.

### Fetch paginated objects

 - [POST /api/v2/objects/index](https://developer.caraer.com/apis/objects/getobjects.md): Fetches a paginated list of objects, optionally including views, properties, and/or relations. The request body should contain pagination details such as limit, page, filters, sort, and query.

### Create new object

 - [POST /api/v2/objects/](https://developer.caraer.com/apis/objects/createobject.md): Creates a new Caraer object using the provided details. Optional request parameters specify whether to include views, properties, and relations in the response. Validation rules: label (required, must be a string, maximum 32 characters), plural (required, must be a string, maximum 32 characters), name (required, must be a string, must be lowercase, must be unique, must match name pattern (lowercase letters, numbers, underscores)), description (optional, maximum 255 characters), groups (required, must be an array of string, no duplicate values allowed).

### Get all previews of an object

 - [GET /api/v2/objects/{uuid}/previews](https://developer.caraer.com/apis/objects/getpreviews_1.md): Fetches all previews associated with a specific object. Returns a PaginationResponse containing a list of preview DTOs.

### List access grant candidates

 - [GET /api/v2/objects/access-grant/candidates](https://developer.caraer.com/apis/objects/getaccessgrantcandidates.md): Returns all company users, teams, and installed apps that can receive record access on an object.

### Permanently delete archived object

 - [DELETE /api/v2/objects/{uuid}/permanent](https://developer.caraer.com/apis/objects/permanentlydeletearchivedobject.md): Hard-deletes a soft-deleted object. Only objects with deletedAt set can be removed.

## Property

Properties define the schema and field definitions for CaraerObjects. A Property specifies the data type (string, number, date, boolean, etc.), format (text, email, select, multi-select, linked, file, etc.), validation rules (required, unique, character limits, etc.), and display options (label, description, icon, groups). Properties determine what data Records can store, how it's validated, how it's displayed in forms and views, and how it can be searched. Each Property belongs to a CaraerObject and defines one field in that object's schema. Properties support various formats including linked properties (relationships to other Records), file uploads, rich text, and custom option lists. Properties are immutable once created to maintain data integrity, and they can be organized into groups for better UX. The Property system enables dynamic, schema-on-read data modeling where object structures can be customized per company without code changes.

### Fetch a specific property

 - [GET /api/v2/objects/{objectUuid}/properties/{propertyUuid}](https://developer.caraer.com/apis/property/getproperty.md): Retrieves details of a property by its UUID and associates it with its parent object. Returns a ShowResponse containing a PropertyDTO object with complete property details.

### Update an existing property

 - [PUT /api/v2/objects/{objectUuid}/properties/{propertyUuid}](https://developer.caraer.com/apis/property/updateproperty.md): Updates the details of an existing property for a specific object. The property details are provided via SavePropertyDTO, and the property is identified by its UUID. Returns an UpdateResponse containing the updated property as a PropertyDTO. Validation rules: name (required, must be unique, must be lowercase, must match name pattern (lowercase letters, numbers, underscores), cannot be changed after creation), label (required), description (maximum 255 characters), type (required, must be one of valid PropertyTypes, cannot be changed after creation), format (required, must be one of valid PropertyFormats, cannot be changed after creation), rules (required, must be an array of string).

### Delete a property

 - [DELETE /api/v2/objects/{objectUuid}/properties/{propertyUuid}](https://developer.caraer.com/apis/property/deleteproperty.md): Deletes a property from the specified object, identified by the property UUID. Returns a DeleteResponse containing the deleted property's details.

### Pin a property

 - [PUT /api/v2/objects/{objectUuid}/properties/{propertyUuid}/pin](https://developer.caraer.com/apis/property/pinproperty.md): Pins the specified property for the logged-in user. Pinned properties appear at the top of record create and update forms.

### Unpin a property

 - [DELETE /api/v2/objects/{objectUuid}/properties/{propertyUuid}/pin](https://developer.caraer.com/apis/property/unpinproperty.md): Removes the pin for the specified property for the logged-in user.

### Update property indices

 - [PUT /api/v2/objects/{objectUuid}/properties/updateIndices](https://developer.caraer.com/apis/property/updateindices_2.md): Updates the indices for properties of a specific object. The request body should contain a mapping between property UUIDs and their new index values. Returns a SuccessResponse containing a list of updated PropertyDTO objects.

### Restore a soft-deleted property

 - [POST /api/v2/objects/{objectUuid}/properties/{propertyUuid}/restore](https://developer.caraer.com/apis/property/restoreproperty.md): Restores a previously deleted property by propertyUuid for the specified objectUuid. Returns a RestoreResponse containing the restored property details.

### Fetch paginated properties

 - [POST /api/v2/objects/{objectUuid}/properties/index](https://developer.caraer.com/apis/property/getproperties.md): Retrieves a paginated list of properties for a given object. Depending on the object UUID format, a Cypher query is constructed to filter properties belonging to that object. Returns a PaginationResponse containing PropertyDTO objects.

### Copy properties to object

 - [POST /api/v2/objects/{objectUuid}/properties/copy](https://developer.caraer.com/apis/property/copypropertiestoobject.md): Attaches existing properties from other objects to the target object in a single request. Archived links on the target object are restored. Properties already active on the target are rejected.

### Create a new property

 - [POST /api/v2/objects/{objectUuid}/properties/](https://developer.caraer.com/apis/property/createproperty.md): Creates a new property for a specific object using the provided property details. The SavePropertyDTO must include necessary details, and the object association is determined by the objectUuid path variable. Returns a CreateResponse containing the newly created property as a PropertyDTO. Validation rules: name (required, must be unique, must be lowercase, must match name pattern (lowercase letters, numbers, underscores)), label (required), description (maximum 255 characters), type (required, must be one of valid PropertyTypes, cannot be changed after creation), format (required, must be one of valid PropertyFormats, cannot be changed after creation), rules (required, must be an array of string).

### Retrieve allowed calculation types for a property

 - [GET /api/v2/objects/{objectUuid}/properties/{propertyUuid}/calculation-types](https://developer.caraer.com/apis/property/getpropertycalculationtypes.md): Returns calculation functions supported for the property's type.

### Retrieve property formats

 - [GET /api/v2/objects/{objectUuid}/properties/formats](https://developer.caraer.com/apis/property/getformats.md): Fetches a sorted list of available property formats. The formats are retrieved from the PropertyFormats enum and converted to PropertyFormat instances.

### Retrieve allowed calculation types per property type

 - [GET /api/v2/objects/{objectUuid}/properties/calculation-types](https://developer.caraer.com/apis/property/getcalculationtypes.md): Returns the calculation functions available for each property type (for example min/max on numbers).

### Permanently remove archived property

 - [DELETE /api/v2/objects/{objectUuid}/properties/{propertyUuid}/permanent](https://developer.caraer.com/apis/property/permanentlydeletearchivedproperty.md): Deletes the soft-deleted HAS_PROPERTY link to this object. If the property is not linked to any other object, the property node is hard-deleted.

## Records

Records are actual data instances belonging to a CaraerObject. They contain property values that conform to the object's schema defined by Properties. Records support dynamic relationships via Relations, enabling graph-like data modeling where Records can reference and navigate to related Records. Records can be filtered, sorted, paginated, and displayed in various views (table, flow, page, preview). They support extending (association with multiple objects), soft deletion with restore capability, and property parsing for formatted display. Records are the core data entities that users create, update, and manage. Each Record has a UUID, belongs to a primary Object, can have extended objects (making it visible in multiple object contexts), and maintains createdAt/updatedAt timestamps. Records enable the platform's dynamic, content-driven data management.

### Get record details

 - [GET /api/v2/records/{uuid}](https://developer.caraer.com/apis/records/show.md): Retrieves detailed information about a record by its UUID. Returns a ShowResponse containing the record details. Prefer GET /{objectName}/{uuid} when the object context is known.

### Update a record by UUID

 - [PUT /api/v2/records/{uuid}](https://developer.caraer.com/apis/records/updatebyuuid.md): Updates a record identified by UUID. Optional object query param resolves the object context (same as GET /{uuid}?object=...). When omitted, the record's current/primary object is used. Prefer PUT /{objectName}/{uuid} when the object context is known.

### Delete a record

 - [DELETE /api/v2/records/{uuid}](https://developer.caraer.com/apis/records/delete.md): Deletes a record specified by its UUID.

### Get record details by object

 - [GET /api/v2/records/{objectName}/{uuid}](https://developer.caraer.com/apis/records/showbyobject.md): Retrieves a record by object name and UUID. Same response as GET /{uuid}?object={objectName}.

### Update a record

 - [PUT /api/v2/records/{objectName}/{uuid}](https://developer.caraer.com/apis/records/update.md): Updates a record's details identified by its UUID. The record data is provided as a RecordDTO. Returns an UpdateResponse with the updated record. Validation: Record properties are validated according to the property rules defined for the object. Each property may have validation rules such as required, type constraints, character limits, uniqueness, etc.

### Bulk create or update records

 - [PUT /api/v2/records/{objectName}/bulk](https://developer.caraer.com/apis/records/bulkedit.md): Creates or updates multiple records in one request. Returns HTTP 201 when every item succeeds (no per-record errors). Returns HTTP 200 when one or more items fail validation; successful items are still persisted and listed in data.records, with failures in errors.

### Restore a deleted record

 - [POST /api/v2/records/{uuid}/restore](https://developer.caraer.com/apis/records/restore.md): Restores a soft-deleted record identified by its UUID. Returns a SuccessResponse confirming that the record has been restored.

### Extend a record

 - [POST /api/v2/records/{uuid}/extend](https://developer.caraer.com/apis/records/extend.md): Extends a record identified by its UUID to one or more objects. You can use this to move a record or add it to another object so it'll be visible in the new object.Returns a SuccessResponse confirming that the record has been extended.

### Create a new record

 - [POST /api/v2/records/{objectName}](https://developer.caraer.com/apis/records/create.md): Creates a new record for the specified object using the provided RecordDTO data. Returns a CreateResponse with the newly created record. Validation: Record properties are validated according to the property rules defined for the object. Each property may have validation rules such as required, type constraints, character limits, uniqueness, etc.

### Create or update a record

 - [POST /api/v2/records/{objectName}/createOrUpdate](https://developer.caraer.com/apis/records/createorupdate.md): Creates a new record or updates an existing one. Match order: body/path uuid already in the graph, then unique property values. If a matching record exists, it is updated; otherwise, a new record is created. Returns a CreateResponse or UpdateResponse with the record details. Validation: Record properties are validated according to the property rules defined for the object. Each property may have validation rules such as required, type constraints, character limits, uniqueness, etc.

### Bulk delete records

 - [POST /api/v2/records/{objectName}/bulk-delete](https://developer.caraer.com/apis/records/bulkdelete.md): Archives, anonymizes, or permanently deletes multiple records in one request. Returns HTTP 200 when every item succeeds. Returns HTTP 200 with per-record errors when one or more items fail; successful items are still applied and listed in data.uuids.

### Search records

 - [POST /api/v2/records/search](https://developer.caraer.com/apis/records/search.md): Performs a search for records based on the specified criteria in the request body. Returns a PaginationResponse containing matching records.

### Search records across objects

 - [POST /api/v2/records/search/cross-object](https://developer.caraer.com/apis/records/searchcrossobject.md): Searches records across multiple object types in one request. Use fromObjectUuid + relationName to limit to relation target objects (e.g. event attendees), or objectUuids for an explicit list, or omit both to search all company objects (capped). Returns preview-shaped results suitable for relation pickers.

### Create a relation between records

 - [POST /api/v2/records/relations/{fromUuid}/{relationName}/{toUuid}](https://developer.caraer.com/apis/records/createrelation.md): Creates a relation between two records identified by their UUIDs using the provided relation name.

### Delete a relation between records

 - [DELETE /api/v2/records/relations/{fromUuid}/{relationName}/{toUuid}](https://developer.caraer.com/apis/records/deleterelation.md): Deletes a relation between two records identified by their UUIDs and the relation name.

### Update relation edge properties

 - [PATCH /api/v2/records/relations/{fromUuid}/{relationName}/{toUuid}](https://developer.caraer.com/apis/records/updaterelationedge.md): Patches values stored on an existing relation edge. Only keys present in edgeProperties are written; a null value clears a key.

### Advanced graph-aware record query

 - [POST /api/v2/records/query](https://developer.caraer.com/apis/records/query.md): Executes a two-pass GraphRAG query using natural language or a declarative plan. Returns records with scores and graph evidence.

### Fetch paginated records

 - [POST /api/v2/records/index](https://developer.caraer.com/apis/records/index.md): Retrieves a paginated list of records. If a preview type is specified in the request, returns records formatted for preview; otherwise, returns full record details.

### Fetch records for table view

 - [POST /api/v2/records/index/table](https://developer.caraer.com/apis/records/indextable.md): Retrieves records formatted for table display. Returns a PaginationResponse containing records formatted for table view.

### Fetch records for page view

 - [POST /api/v2/records/index/page](https://developer.caraer.com/apis/records/indexpage.md): Retrieves a paginated list of webpages for page view. The search query is temporarily removed from the pagination request and passed separately. Returns a PaginationResponse containing WebpageDTO objects.

### Fetch records for flow view

 - [POST /api/v2/records/index/flow](https://developer.caraer.com/apis/records/indexflow.md): Retrieves a list of records formatted for flow view based on a specific property. If the property is not provided in the request, defaults to the 'status' property of the main object. Returns a SuccessResponse containing the flow records.

### Suggest analytics widgets with AI

 - [POST /api/v2/records/analytics/suggest-widgets](https://developer.caraer.com/apis/records/suggestanalyticswidgets.md): Uses structured OpenAI output plus schema validation to propose dashboard charts for an object. Returns an empty list when AI is unavailable.

### Aggregate records for analytics charts

 - [POST /api/v2/records/aggregate](https://developer.caraer.com/apis/records/aggregate.md): Groups Neo4j records by property or time bucket and returns series points with optional drilldown filters.

### Batch aggregate records for analytics dashboards

 - [POST /api/v2/records/aggregate/batch](https://developer.caraer.com/apis/records/aggregatebatch.md): Runs multiple aggregation requests for dashboard widgets.

### Get record preview

 - [GET /api/v2/records/{uuid}/previews/{name}](https://developer.caraer.com/apis/records/preview.md): Retrieves a preview for a record specified by its UUID and preview name. Returns a ShowResponse containing the preview data.

## Relations

Relations define typed connections between CaraerObjects, enabling graph-like data modeling. A Relation specifies how Records of one Object can connect to Records of another Object (e.g., "Candidate applies to Vacancy", "Company has Employees"). Relations create directed or bidirectional relationships between Records, allowing navigation and querying of related data. Relations support cardinality, directionality, and can be used in filtering, sorting, and querying Records. They enable complex data structures where Records reference each other, creating a graph database model on top of the object-oriented schema. Relations are essential for modeling real-world relationships between entities and enable powerful querying capabilities across connected Records.

### Add a connection to a relation

 - [PUT /api/v2/relations/{relationUuid}/connection/{from}/{to}](https://developer.caraer.com/apis/relations/addconnection.md): Creates a connection between two objects for a given relation. The 'from' and 'to' UUIDs identify the objects to connect.

### Delete a connection from a relation

 - [DELETE /api/v2/relations/{relationUuid}/connection/{from}/{to}](https://developer.caraer.com/apis/relations/deleteconnection.md): Deletes a connection between two objects for a given relation using the specified UUIDs.

### Update relation indices

 - [PUT /api/v2/relations/updateIndices](https://developer.caraer.com/apis/relations/updateindices.md): Updates the indices for relations. The request body should contain a mapping of relation UUIDs to their new index values. Returns a SuccessResponse containing the updated relation objects.

### Restore a deleted relation

 - [POST /api/v2/relations/{relationUuid}/restore](https://developer.caraer.com/apis/relations/restorerelation.md): Restores a previously deleted relation by its UUID. Returns a RestoreResponse with the restored relation details.

### Create or update a relation

 - [POST /api/v2/relations/{objectUuid}](https://developer.caraer.com/apis/relations/createrelationorupdate.md): Creates a new relation or updates an existing one for the specified object. If a relation with the same name exists, it is updated; otherwise, a new relation is created. Returns an UpdateResponse if updated or a CreateResponse if created.

### Fetch paginated relations

 - [POST /api/v2/relations/index](https://developer.caraer.com/apis/relations/getrelations.md): Retrieves a paginated list of relations. Returns a PaginationResponse containing RelationDTO objects based on the provided pagination criteria.

### Fetch relations for a specific object

 - [POST /api/v2/relations/index/{objectUuid}](https://developer.caraer.com/apis/relations/getrelationsbyobject.md): Returns relation definitions where this object participates in the schema graph for that relation name: either as origin (thisObject)-[:relationName]->(:Object) or as target (:Object)-[:relationName]->(thisObject). Unrelated relations (same name elsewhere, or no typed edge touching this object) are excluded. Uses the object’s name to filter; request path uses object UUID.

### Get all relations between two objects

 - [POST /api/v2/relations/index/{fromObjectUuid}/{toObjectUuid}](https://developer.caraer.com/apis/relations/getrelationsbetweenobjects.md): Retrieves all relations between two objects based on the provided object UUIDs.

### Get relation details

 - [GET /api/v2/relations/{relationUuid}](https://developer.caraer.com/apis/relations/getrelation.md): Retrieves the details of a relation by its UUID. Returns a ShowResponse containing a RelationDTO.

### Delete a relation

 - [DELETE /api/v2/relations/{relationUuid}](https://developer.caraer.com/apis/relations/deleterelation_1.md): Deletes a relation specified by its UUID. Returns a DeleteResponse with the deleted relation details.

### Get relation details for a specific object

 - [GET /api/v2/relations/{relationUuid}/{objectUuid}](https://developer.caraer.com/apis/relations/getrelationforobject.md): Retrieves a relation by its UUID and associates it with the specified object, returning a RelationDTO that includes details from the related object.

### Permanently delete archived relation

 - [DELETE /api/v2/relations/{relationUuid}/permanent](https://developer.caraer.com/apis/relations/permanentlydeletearchivedrelation.md): Hard-deletes a soft-deleted relation. Only relations with deletedAt set can be removed.

## Serverless Functions

Serverless functions are runtime+code units attached to Apps, used in Webhooks and other extensibility points.

### Get a serverless function

 - [GET /api/v2/apps/{appUuid}/serverless-functions/{uuid}](https://developer.caraer.com/apis/serverless-functions/show_1.md): Retrieves a serverless function by its UUID, ensuring it belongs to the specified app.

### Update a serverless function

 - [PUT /api/v2/apps/{appUuid}/serverless-functions/{uuid}](https://developer.caraer.com/apis/serverless-functions/update_2.md): Updates an existing serverless function's runtime and code, keeping it attached to the same app.

### Delete a serverless function

 - [DELETE /api/v2/apps/{appUuid}/serverless-functions/{uuid}](https://developer.caraer.com/apis/serverless-functions/delete_2.md): Tears down the GCP Cloud Function (if provisioned) and deletes the serverless function entity.

### Create a serverless function

 - [POST /api/v2/apps/{appUuid}/serverless-functions](https://developer.caraer.com/apis/serverless-functions/create_5.md): Creates a new serverless function attached to the specified app.

### Test a serverless function

 - [POST /api/v2/apps/{appUuid}/serverless-functions/{uuid}/test](https://developer.caraer.com/apis/serverless-functions/testserverlessfunction.md): Provisions (if needed) and invokes a serverless function for a given record and event type, using the same payload shape as webhooks.

### Generate a sample webhook payload

 - [POST /api/v2/apps/{appUuid}/serverless-functions/sample-payload](https://developer.caraer.com/apis/serverless-functions/samplepayload.md): Builds the same payload shape used for serverless invocations and webhook delivery from a record and event type, without invoking anything.

### List serverless functions for an app

 - [POST /api/v2/apps/{appUuid}/serverless-functions/index](https://developer.caraer.com/apis/serverless-functions/index_2.md): Retrieves a paginated list of serverless functions that belong to the specified app.

### Get serverless function logs

 - [GET /api/v2/apps/{appUuid}/serverless-functions/{uuid}/logs](https://developer.caraer.com/apis/serverless-functions/logs.md): Queries Cloud Logging for recent log entries emitted by the Cloud Function backing this serverless function.

## Sync

Sync configurations define automated data synchronization mappings between CaraerObjects. A Sync specifies how property values from source Records should be mapped to target Records, enabling automated data flow between different object types. Syncs use Mappings that define source and target properties, allowing data to be copied, transformed, or synchronized when source Records are created or updated. Syncs are used for data integration, automation workflows, and keeping related data in sync across the platform. They enable scenarios like automatically creating a Company Record when a User Record is created, or syncing Candidate data to an external system. Syncs support complex mapping rules and can trigger on various Record events.

### Get a sync

 - [GET /api/v2/sync/{uuid}](https://developer.caraer.com/apis/sync/getsync.md): Retrieves a sync by its UUID. Returns a SyncDTO containing the sync details.

### Update a sync

 - [PUT /api/v2/sync/{uuid}](https://developer.caraer.com/apis/sync/updatesync.md): Updates an existing sync. Returns a UpdateResponse containing the updated sync details.

### Delete a sync

 - [DELETE /api/v2/sync/{uuid}](https://developer.caraer.com/apis/sync/deletesync.md): Deletes an existing sync. Returns a DeleteResponse containing the deleted sync details.

### Restore a deleted sync

 - [POST /api/v2/sync/{uuid}/restore](https://developer.caraer.com/apis/sync/restoresync.md): Restores a previously deleted sync by its UUID. Returns a RestoreResponse containing the restored sync details.

### Fetch paginated syncs

 - [POST /api/v2/sync/index](https://developer.caraer.com/apis/sync/getsyncs.md): Retrieves a paginated list of syncs. Returns a PaginationResponse containing SyncDTO objects based on the provided pagination criteria.

### Create a sync

 - [POST /api/v2/sync/](https://developer.caraer.com/apis/sync/createsync.md): Creates a new sync. Returns a CreateResponse containing the created sync details.

## Traits

Traits are behavioral features that can be added to CaraerObjects to extend their functionality without modifying the core schema. Common traits include Flow (kanban-style workflow management), Table (tabular data display with sorting and filtering), Page (enables Records to have public-facing Webpages), and User (enables user authentication and user profile Records). Traits are composable - an Object can have multiple traits enabled simultaneously. Traits extend object functionality by adding specific behaviors, UI components, and capabilities. For example, the Flow trait adds workflow state management, the Table trait adds list view capabilities, and the Page trait enables CMS functionality. Traits enable flexible feature composition where objects can be customized with different capabilities based on business needs.

### Fetch a specific trait for an object

 - [GET /api/v2/traits/{objectUuid}/{traitName}](https://developer.caraer.com/apis/traits/gettrait.md): Retrieves details of a specific trait associated with the specified object, identified by the trait name. Returns a ShowResponse containing the TraitDTO. If the trait is not found, a NotFoundError is thrown.

### Create or update a trait for an object

 - [POST /api/v2/traits/{objectUuid}/{traitName}](https://developer.caraer.com/apis/traits/createtrait.md): Creates a new trait or updates an existing trait for the specified object. The trait name is provided in the URL, and trait details are supplied in the request body as a JSON map. If a trait with the specified name exists, it will be updated; otherwise, a new trait is created. Returns a CreateResponse containing the TraitDTO of the created or updated trait.

### Delete a trait from an object

 - [DELETE /api/v2/traits/{objectUuid}/{traitName}](https://developer.caraer.com/apis/traits/deletetrait.md): Removes a trait identified by its name from the specified object. Returns a DeleteResponse confirming that the trait has been removed.

### Respond to an event invitation (email link)

 - [GET /api/v2/traits/event/{companyUuid}/{eventUuid}/rsvp/{attendeeUuid}](https://developer.caraer.com/apis/traits/rsvpbrowserget.md): Public browser RSVP. Without partstat shows a choice page; with partstat applies after login when the attendee has a user trait. Non-user-trait attendees need no login.

### Update event RSVP (JSON)

 - [POST /api/v2/traits/event/{companyUuid}/{eventUuid}/rsvp/{attendeeUuid}](https://developer.caraer.com/apis/traits/rsvpjson.md): Patches partstat on the attendees edge. No tools @AccessControl — auth is bearer/session + self-only / partner login rules.

### Email/password login for RSVP

 - [POST /api/v2/traits/event/{companyUuid}/{eventUuid}/rsvp/{attendeeUuid}/login](https://developer.caraer.com/apis/traits/rsvpbrowserlogin.md)

### Fetch all traits for an object

 - [GET /api/v2/traits/{objectUuid}](https://developer.caraer.com/apis/traits/gettraits.md): Retrieves a list of traits associated with the specified object. Returns a paginated response containing TraitDTO objects. The page is set to 0 by default, with a maximum limit of 100.

### Start social login for RSVP

 - [GET /api/v2/traits/event/{companyUuid}/{eventUuid}/rsvp/{attendeeUuid}/social/{provider}](https://developer.caraer.com/apis/traits/rsvpbrowsersocial.md)

## Views

Views are saved configurations for displaying Records that define filters, sorting, visible properties (show), grouping, calculations, row heights, and display traits (table, flow). Views enable users to create custom perspectives on data (e.g., "My Active Candidates", "High Priority Vacancies", "Recent Applications"). Each View belongs to a CaraerObject and specifies how Records of that Object should be displayed. Views can be shared with other users, set as default views, and include query strings for search functionality. Views support different traits like Table (tabular display), Flow (kanban-style workflow), and can include calculations for aggregated data. Views improve UX by allowing users to bookmark common queries and share them with team members, ensuring consistent data presentation across the platform.

### Get view details

 - [GET /api/v2/objects/{objectUuid}/views/{viewUuid}](https://developer.caraer.com/apis/views/getview.md): Retrieves detailed information for a view identified by its UUID for the specified object. Returns a ShowResponse containing the ViewDTO.

### Update an existing view

 - [PUT /api/v2/objects/{objectUuid}/views/{viewUuid}](https://developer.caraer.com/apis/views/updateview.md): Updates the details of an existing view identified by its UUID for the specified object. The request body must contain the updated view details as a ViewDTO. Returns an UpdateResponse with the updated view data.

### Delete a view

 - [DELETE /api/v2/objects/{objectUuid}/views/{viewUuid}](https://developer.caraer.com/apis/views/deleteview.md): Deletes the view identified by its UUID from the specified object. Returns a DeleteResponse confirming the deletion.

### Toggle view favorite status

 - [PUT /api/v2/objects/{objectUuid}/views/{viewUuid}/favorite](https://developer.caraer.com/apis/views/favoriteview.md): Toggles the favorite status of the specified view. Returns an UpdateResponse containing the updated view details.

### Update view indices

 - [PUT /api/v2/objects/{objectUuid}/views/updateIndices](https://developer.caraer.com/apis/views/updateindices_1.md): Updates the indices for views associated with the specified object. The request body must include a mapping of view UUIDs to their new index values. Returns a SuccessResponse with the updated view DTOs.

### Fetch paginated views for an object

 - [POST /api/v2/objects/{objectUuid}/views/index](https://developer.caraer.com/apis/views/getviews.md): Retrieves a paginated list of views for the specified object. A custom Cypher query is used to filter views based on the object's UUID. Returns a PaginationResponse containing ViewDTO objects.

### Create a new view

 - [POST /api/v2/objects/{objectUuid}/views/](https://developer.caraer.com/apis/views/createview.md): Creates a new view for the specified object. The request body must contain the view details as a ViewDTO. Returns a CreateResponse containing the newly created view as a ViewDTO.

## WebMenus

WebMenus define navigation structures for public-facing websites. They specify menu items with labels and URLs, locations (header, footer, sidebar), environments (staging, production), and can include custom URLs or links to Records and Webpages. WebMenus enable dynamic navigation that adapts based on published content, allowing websites to automatically reflect changes in the data model. Menus can be activated/deactivated, organized hierarchically, and support staging and production environments. WebMenus are essential for building dynamic, content-driven navigation in career sites and public-facing applications.

### Show web menu

 - [GET /api/v2/webmenus/{uuid}](https://developer.caraer.com/apis/webmenus/getwebmenu.md): Show web menu

### Update web menu

 - [PUT /api/v2/webmenus/{uuid}](https://developer.caraer.com/apis/webmenus/updatewebmenu.md): Update web menu

### Delete web menu

 - [DELETE /api/v2/webmenus/{uuid}](https://developer.caraer.com/apis/webmenus/deletewebmenu.md): Delete web menu

### Create web menu

 - [POST /api/v2/webmenus](https://developer.caraer.com/apis/webmenus/createwebmenu.md): Create web menu

### Restore deleted web menu

 - [POST /api/v2/webmenus/{uuid}/restore](https://developer.caraer.com/apis/webmenus/restorewebmenu.md): Restore a deleted web menu by its UUID

### Index web menus

 - [POST /api/v2/webmenus/index](https://developer.caraer.com/apis/webmenus/indexwebmenus.md): Index web menus

## Webpages

Webpages are CMS pages associated with Records that enable public-facing content. They support dynamic content layouts using PageContent structures, staging and production environments, scheduled publishing (publish_at/unpublish_at), SEO metadata (title, excerpt, slug, image), custom CSS and JavaScript, and sidebar previews. Webpages are used to create career sites, landing pages, job detail pages, and other public-facing content. They integrate with Forms for data collection and Previews for displaying related Records. Webpages can be published/unpublished, support environment-specific content (staging vs production), and maintain publication timestamps. The Webpage system enables dynamic, data-driven public websites where content is managed through Records and automatically rendered as HTML pages.

### Get webpage details

 - [GET /api/v2/webpages/{uuid}](https://developer.caraer.com/apis/webpages/getwebpage.md): Retrieves detailed information for a webpage identified by its UUID. Optionally, the webpage title is 'smartened' if the smartened parameter is true.

### Update a webpage

 - [PUT /api/v2/webpages/{uuid}](https://developer.caraer.com/apis/webpages/updatewebpage.md): Updates an existing webpage identified by its UUID using the provided webpage details. Returns an UpdateResponse containing the updated webpage as a WebpageDTO. Validation: Webpage fields are validated according to the Webpage validation rules. Required fields and format constraints are enforced.

### Unpublish a webpage

 - [PUT /api/v2/webpages/{uuid}/unpublish](https://developer.caraer.com/apis/webpages/unpublishwebpage.md): Unpublishes a webpage by its UUID. Optionally, an unpublishAt timestamp (in seconds) may be provided. Returns an UpdateResponse containing the unpublished webpage details.

### Publish a webpage

 - [PUT /api/v2/webpages/{uuid}/publish](https://developer.caraer.com/apis/webpages/publishwebpage.md): Publishes a webpage by its UUID. Optionally, a publish_at timestamp (in seconds) may be provided. Returns an UpdateResponse containing the published webpage details.

### Upload a file for a webpage

 - [POST /api/v2/webpages/{uuid}/uploadFile](https://developer.caraer.com/apis/webpages/uploadfile.md): Uploads a file to S3 storage under the specified webpage's attachments folder, sets the file's ACL to public, and returns the public URL for the file in a SuccessResponse.

### Generate signed URL for protected webpage

 - [POST /api/v2/webpages/{uuid}/protection/signed-url](https://developer.caraer.com/apis/webpages/createsignedurl.md)

### Claim a webpage editing session

 - [POST /api/v2/webpages/{uuid}/editing-session](https://developer.caraer.com/apis/webpages/claimwebpageeditingsession.md): Registers the current user as editing this webpage so other users are blocked from opening the builder.

### Release a webpage editing session

 - [DELETE /api/v2/webpages/{uuid}/editing-session](https://developer.caraer.com/apis/webpages/releasewebpageeditingsession.md): Releases the editing session held by the current user for this webpage.

### Copy a webpage from one environment to another

 - [POST /api/v2/webpages/{uuid}/copy/{fromEnvironment}/{toEnvironment}](https://developer.caraer.com/apis/webpages/copywebpage.md): Copies a webpage by its UUID from one environment to another. Returns a CreateResponse containing the copied webpage as a WebpageDTO.

### Upload a file

 - [POST /api/v2/webpages/uploadFile](https://developer.caraer.com/apis/webpages/uploadfile_1.md): Uploads a file to S3 storage and returns the public URL for the file in a SuccessResponse.

### Get template webpage

 - [GET /api/v2/webpages/template/{objectName}/{environment}](https://developer.caraer.com/apis/webpages/gettemplatewebpage.md): Retrieves the template webpage for the given object name by querying the TemplateWebpage associated with it. Returns a ShowResponse containing TemplateWebpageDTO data.

### Create or update template webpage

 - [POST /api/v2/webpages/template/{objectName}/{environment}](https://developer.caraer.com/apis/webpages/createorupdatetemplatewebpage.md): Creates a new or updates an existing template webpage for the specified object. An event is published after the template is changed. Returns an UpdateResponse or CreateResponse with the template webpage details.

### Claim a template webpage editing session

 - [POST /api/v2/webpages/template/{objectName}/{environment}/editing-session](https://developer.caraer.com/apis/webpages/claimtemplatewebpageeditingsession.md): Registers the current user as editing the template webpage so other users are blocked from opening the builder.

### Release a template webpage editing session

 - [DELETE /api/v2/webpages/template/{objectName}/{environment}/editing-session](https://developer.caraer.com/apis/webpages/releasetemplatewebpageeditingsession.md): Releases the editing session held by the current user for this template webpage.

### Copy a template webpage from one environment to another

 - [POST /api/v2/webpages/template/{objectName}/copy/{fromEnvironment}/{toEnvironment}](https://developer.caraer.com/apis/webpages/copytemplatewebpage.md): Copies a template webpage by object name from one environment to another. Returns a CreateResponse containing the copied template webpage as a TemplateWebpageDTO.

### Unlock password-protected webpage

 - [POST /api/v2/webpages/public/uuid/{uuid}/unlock](https://developer.caraer.com/apis/webpages/unlockpublicwebpage.md): Validates password and returns a short-lived access token.

### Get previews for a public webpage

 - [POST /api/v2/webpages/public/previews/{pageUuid}/{componentUuid}/{layout}](https://developer.caraer.com/apis/webpages/getpublicpreviews.md): Retrieves a list of previews for a public webpage identified by its UUID. Returns a PaginationResponse containing PreviewDTO objects.

### Get filtered map markers for a public webpage

 - [POST /api/v2/webpages/public/maps/{pageUuid}/{componentUuid}](https://developer.caraer.com/apis/webpages/getpublicmaplocations.md): Resolves map markers for a public map component. Object-bound sources are filtered in Cypher before the 500-marker cap.

### Get a hydrated preview for one public map marker

 - [POST /api/v2/webpages/public/maps/{pageUuid}/{componentUuid}/marker-preview](https://developer.caraer.com/apis/webpages/getpublicmapmarkerpreview.md): Hydrates the hover preview selected on a bound map location for a published record.

### Get all environments

 - [GET /api/v2/webpages/environments](https://developer.caraer.com/apis/webpages/getenvironments.md): Retrieves a list of all environments.

### Create an environment

 - [POST /api/v2/webpages/environments](https://developer.caraer.com/apis/webpages/createenvironments.md): Creates an environment.

### Copy properties to environments

 - [POST /api/v2/webpages/environments/properties](https://developer.caraer.com/apis/webpages/copypropertytoenvironments.md): Copies selected properties for the chosen environments (e.g. production_title → german_production_title).

### Create a new webpage

 - [POST /api/v2/webpages/](https://developer.caraer.com/apis/webpages/createwebpage.md): Creates a new webpage using the provided webpage details. Returns a CreateResponse containing the newly created webpage as a WebpageDTO. Validation: Webpage fields are validated according to the Webpage validation rules. Required fields and format constraints are enforced.

### List signed URL grants for a webpage

 - [GET /api/v2/webpages/{uuid}/protection/grants](https://developer.caraer.com/apis/webpages/listprotectiongrants.md)

### Check if a webpage is being edited

 - [GET /api/v2/webpages/{uuid}/editing-status](https://developer.caraer.com/apis/webpages/getwebpageeditingstatus.md): Returns whether another user is actively editing this webpage (via an open builder session or collaborative WebSocket connection).

### Check if a template webpage is being edited

 - [GET /api/v2/webpages/template/{objectName}/{environment}/editing-status](https://developer.caraer.com/apis/webpages/gettemplatewebpageeditingstatus.md): Returns whether another user is actively editing the template webpage for the given object and environment.

### Get a public webpage by slug

 - [GET /api/v2/webpages/public/{rootSlug}/{slug}](https://developer.caraer.com/apis/webpages/getpublicwebpage.md): Retrieves a published webpage based on the provided root slug and slug. Returns a ShowResponse containing WebpageDTO data.

### Get a public webpage by UUID

 - [GET /api/v2/webpages/public/uuid/{uuid}](https://developer.caraer.com/apis/webpages/getpublicwebpagebyuuid.md): Retrieves a published webpage based on its UUID. Returns a ShowResponse containing WebpageDTO data.

### Get webpage protection metadata

 - [GET /api/v2/webpages/public/uuid/{uuid}/protection](https://developer.caraer.com/apis/webpages/getpublicwebpageprotection.md): Returns protection requirements without page content.

### Fetch public website module

 - [GET /api/v2/webpages/public/module/{moduleUuid}](https://developer.caraer.com/apis/webpages/getpublicwebsitemodule.md): Returns the PageContent tree for a module exposed by website settings, such as the custom footer or the cookie banner. Requires X-Caraer-Subdomain; only the UUIDs configured in website settings are accessible.

### Get all public webpage slugs

 - [GET /api/v2/webpages/public/getSlugs](https://developer.caraer.com/apis/webpages/getallslugs.md): Retrieves a list of all webpage slugs for the public site. Returns a PaginationResponse containing WebpageMapItemDTO objects.

### Fetch public web menus

 - [GET /api/v2/webpages/public/getMenus](https://developer.caraer.com/apis/webpages/getmenus.md): Retrieves a list of web menus for the public site. Returns a PaginationResponse containing WebMenuDTO objects.

### Fetch public company settings

 - [GET /api/v2/webpages/public/companySettings](https://developer.caraer.com/apis/webpages/getcompanysettings.md): Retrieves the public company configuration for the given subdomain. Returns a ShowResponse containing PublicCompanyDTO details.

### List webpages for picker dropdowns

 - [GET /api/v2/webpages/picker/pages](https://developer.caraer.com/apis/webpages/getwebpagepickerpages.md): Returns uuid and title for all webpage records across objects with a Page trait. Supports optional filters for published pages and excluding template-related pages.

### Revoke a signed URL grant

 - [DELETE /api/v2/webpages/{uuid}/protection/grants/{grantUuid}](https://developer.caraer.com/apis/webpages/revokeprotectiongrant.md)

### Delete an environment

 - [DELETE /api/v2/webpages/environments/{environment}](https://developer.caraer.com/apis/webpages/deleteenvironment.md): Soft deletes an environment.

