API Reference v1

Rasepi Developer Documentation

Build integrations with the Rasepi multilingual documentation platform. This reference covers every API endpoint for managing hubs, entries, translations, expiry workflows, and more.

Base URL https://api.rasepi.io All endpoints use the /api/ prefix. Responses are JSON with string-serialized enums.

🔒 Authentication

All API requests require a Bearer token in the Authorization header. Tokens are scoped to a specific tenant and user.

Authorization: Bearer <your-token> // Every request is scoped to a tenant. // The tenant_id claim in the JWT determines data isolation.

Multi-tenant isolation: All data is automatically scoped to your tenant via EF global query filters. Cross-tenant access is impossible by design.

Development Tokens

In development mode, use the dev auth endpoints to get test tokens:

// 1. Get available dev tenants GET /auth/dev-tenants // 2. Login with a dev persona POST /auth/dev-login { "persona": "alice", "tenantId": "<tenant-guid>" } // 3. Use the returned token // Format: Bearer dev-token-{tenantId}:{userId}
📚

Key Concepts

Before diving into endpoints, understand the core ideas that make Rasepi unique.

🧩 Block-Level Translation

Entries are composed of blocks (paragraphs, headings, etc.). Translations happen at the block level, not the whole entry. When a single paragraph changes, only that block's translations are marked stale, saving up to 94% in translation costs.

🔓 Content Hashing

Each block has a SHA256 content hash. When the original block changes, its hash is recalculated. Translation blocks compare their SourceContentHash to the current hash. Mismatches trigger a Stale status.

⏰ Forced Expiry

Every entry has an expiration date. When it expires, owners are notified and content is flagged. Expiry templates define the rules: warning periods, grace periods, review requirements, and auto-renewal conditions.

🗑️ Soft Delete

Blocks are never truly deleted when translations exist. Instead, an IsDeleted flag preserves the block structure so translated entries maintain correct alignment. The UI shows a "[Content removed]" placeholder.

🏠 Hubs & Entries

Hubs are collaborative workspaces (like Confluence spaces). Each hub contains entries (documents). Hubs have a root entry (home page) and can define default expiry rules, member roles, and language settings.

🛠️ TipTap JSON

Content is stored as TipTap JSON. Each top-level node carries a blockId UUID for tracking. The API accepts and returns this format, making it easy to integrate with TipTap-based editors.

🔒

Authentication

OAuth login flow and development-mode authentication helpers.

GET /auth/login?provider=google OAuth provider redirect
✅ Public

Redirects the user to the specified OAuth provider for authentication.

Query Parameters
NameTypeDescription
providerrequiredstringOAuth provider name (e.g., google, github)
POST /auth/callback Exchange auth code for token
✅ Public

Exchanges an OAuth authorization code for a user session and bearer token.

Request Body
NameTypeDescription
coderequiredstringAuthorization code from the OAuth provider
200 OK
{ "user": { "id": "guid", "displayName": "Alice", ... }, "token": "eyJhbGci..." }
POST /auth/logout End session
✅ Public

Logs the user out and invalidates the session.

200 OK
🏠

Hubs

Hubs are collaborative workspaces that contain entries. Each hub has a unique key, default expiry settings, and membership-based access control.

GET /api/hubs List accessible hubs
🔒 Authenticated

Returns all hubs the authenticated user has access to.

200 OK - Hub[]
[ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "key": "engineering", "name": "Engineering", "defaultExpiryDays": 90, "ownerId": "...", "createdAt": "2026-01-15T10:30:00Z" } ]
GET /api/hubs/{key} Get hub by key
👥 Hub Viewer+

Retrieves a single hub by its unique key.

Path Parameters
NameTypeDescription
keyrequiredstringUnique hub key (slug)
200 OK 404 Not Found
GET /api/hubs/{key}/permissions Get your role in hub
🔒 Authenticated

Returns the current user's role in the specified hub and whether they are a global admin.

200 OK
{ "role": "Editor", "isGlobalAdmin": false }
POST /api/hubs Create a new hub
🛡️ Global Admin

Creates a new hub. The creator automatically becomes the hub owner.

Request Body
NameTypeDescription
keyrequiredstringUnique hub slug (URL-safe)
namerequiredstringDisplay name for the hub
defaultExpiryDaysrequiredintegerDefault expiry days for entries in this hub
categoryIdoptionalguidCategory to assign
tagIdsoptionalguid[]Tags to assign
previewImageoptionalstringURL for hub preview image
201 Created 400 Bad Request 409 Conflict (key exists)
PUT /api/hubs/{key} Update hub
👥 Hub Admin

Updates hub properties such as name, expiry defaults, and preview image.

Request Body
NameTypeDescription
namerequiredstringNew display name
defaultExpiryDaysrequiredintegerNew default expiry
previewImageoptionalstringPreview image URL
defaultOrgRoleoptionalstringDefault role for org members
defaultExpiryTemplateIdoptionalguidDefault expiry template
200 OK
DELETE /api/hubs/{key} Delete hub
🛡️ Owner Only

Permanently deletes a hub and all its entries. Only the hub owner or a global admin can perform this action.

204 No Content 403 Forbidden
POST /api/hubs/{key}/transfer-ownership Transfer hub ownership
👥 Hub Admin

Transfers ownership of the hub to another user.

Request Body
NameTypeDescription
newOwnerIdrequiredguidUser ID of the new owner
200 OK
📄

Entries

Entries are the core content units: multilingual documents with block-level structure, expiry tracking, and TipTap JSON content.

GET /api/entries/hubs/{hubKey} List entries in hub
👥 Hub Viewer+

Returns all entries in the specified hub.

Path Parameters
NameTypeDescription
hubKeyrequiredstringHub key (slug)
200 OK - Entry[]
GET /api/entries/hubs/{hubKey}/root-entry Get hub root page
👥 Hub Viewer+

Returns the root (home) entry for the hub.

200 OK 404 No root entry set
GET /api/entries/{id}?language=en Get entry in language
👥 Entry Viewer+

Retrieves an entry in the specified language. If the requested language has a translation, it returns translated content. May trigger a first-visit auto-translation.

Parameters
NameTypeDescription
idrequiredguidEntry ID
languageoptionalstringLanguage code (default: en)
200 OK
{ "id": "...", "title": "Onboarding Guide", "key": "onboarding-guide", "content": "{\"type\":\"doc\",\"content\":[...]}", "originalLanguage": "en", "status": "Published", "expiryDate": "2026-06-15T00:00:00Z", "hubId": "...", "ownerId": "..." }
POST /api/entries Create a new entry
🔒 Authenticated

Creates a new entry with TipTap JSON content. Blocks are automatically extracted and assigned UUIDs.

Request Body
NameTypeDescription
hubKeyrequiredstringHub to create the entry in
keyrequiredstringUnique entry slug
originalLanguagerequiredstringLanguage code of the content (e.g., en)
titlerequiredstringEntry title
contentrequiredstring (JSON)TipTap document JSON
expiryDaysoptionalintegerCustom expiry (overrides hub default)
previewImageoptionalstringPreview image URL
201 Created 400 Validation Error
PUT /api/entries/{id}?language=en Update entry content
👥 Entry Editor+

Updates an entry's title and/or content. Triggers block hash recalculation and marks affected translations as stale.

Request Body
NameTypeDescription
titlerequiredstringUpdated title
contentrequiredstring (JSON)Updated TipTap JSON
previewImageoptionalstringPreview image URL
statusoptionalstringEntry status override
200 OK
DELETE /api/entries/{id} Delete entry
🛡️ Owner Only

Permanently deletes an entry. Cannot delete the root entry of a hub.

204 No Content 403 Forbidden 400 Cannot delete root
GET /api/entries/search?q=onboarding Full-text search
🔒 Authenticated

Searches entries by title. Minimum 2 characters required.

Query Parameters
NameTypeDescription
qrequiredstringSearch query (min 2 chars)
hubKeyoptionalstringFilter to specific hub
takeoptionalintegerMax results (default: 15)
200 OK - EntrySearchResult[]
POST /api/entries/{id}/publish Publish entry
👥 Entry Editor+

Publishes a draft entry. Runs plugin action guards before publishing; if any guard blocks, the action fails.

200 OK 403 Guard blocked
PUT /api/entries/{id}/renew Renew entry (reset expiry)
👥 Entry Editor+

Resets the expiry clock on an entry using its configured expiry duration.

200 OK
GET /api/entries/expired List expired entries
🔒 Authenticated

Returns all entries that have passed their expiration date.

200 OK - Entry[]
POST /api/entries/{id}/transfer-ownership Transfer entry ownership
👥 Entry Editor+
Request Body
NameTypeDescription
newOwnerIdrequiredguidUser ID of the new owner
PATCH /api/entries/{id}/original-language Change source language
👥 Entry Editor+

Changes the original (source) language of an entry. Use with caution as this affects all translation relationships.

Request Body
NameTypeDescription
languageCoderequiredstringNew language code (e.g., de)
PUT /api/entries/{id}/set-root Make entry hub root page
👥 Entry Editor+

Designates this entry as the hub's root (home) page. Replaces any previous root entry.

200 OK
🌐

Translations

Block-level translation management. Translations track individual blocks via content hashing, enabling efficient stale detection and partial retranslation.

GET /api/entries/{entryId}/translations List all translations
👥 Entry Viewer+

Returns all available translations for an entry, including their status (Draft, UpToDate, Stale).

200 OK - EntryTranslation[]
[ { "language": "de", "title": "Einführungsleitfaden", "status": "UpToDate", "staleBlockCount": 0, "totalBlockCount": 12 }, { "language": "fr", "title": "Guide d'intégration", "status": "Stale", "staleBlockCount": 2, "totalBlockCount": 12 } ]
GET /api/entries/{entryId}/translations/{language} Get translation
👥 Entry Viewer+

Retrieves the full translation for a specific language.

200 OK 404 Not Found
POST /api/entries/{entryId}/translations/{language} Create translation
👥 Entry Editor+

Creates a new translation for the entry. Can optionally use automatic translation via a configured provider.

Request Body
NameTypeDescription
titlerequiredstringTranslated title
contentrequiredstring (JSON)Translated TipTap JSON content
useAutoTranslationoptionalbooleanAuto-translate via provider
provideroptionalstringTranslation provider name
201 Created
GET /api/entries/{entryId}/translations/{language}/status Get translation status
👥 Entry Viewer+

Returns the current status of a translation: Draft, UpToDate, or Stale.

200 OK
{ "status": "Stale" }
PUT /api/entries/{entryId}/translations/{language}/mark-uptodate Mark translation up-to-date
👥 Entry Editor+

Manually marks a translation as up-to-date, resetting all stale flags on its blocks.

200 OK
GET /api/entries/{entryId}/translations/{language}/stale-blocks List stale blocks
👥 Entry Viewer+

Returns blocks whose source content has changed since they were last translated. These blocks need retranslation.

200 OK - TranslationBlock[]
DELETE /api/entries/{entryId}/translations/{language} Delete translation
👥 Entry Editor+

Removes a translation and all its blocks for the specified language.

204 No Content

Expiry & Reviews

Content freshness workflows: expiry tracking, review submissions, renewal eligibility, and configurable expiry templates.

GET /api/entries/{entryId}/expiry-status Get expiry status
🔒 Authenticated

Returns the current expiry state of an entry including days until expiry and warning status.

200 OK
{ "expiryDate": "2026-06-15T00:00:00Z", "daysUntilExpiry": 78, "isInWarningPeriod": false, "isPaused": false }
GET /api/entries/{entryId}/expiry-config Get expiry configuration
🔒 Authenticated

Returns the resolved expiry template applied to this entry (may be inherited from hub or tenant).

GET /api/entries/{entryId}/effective-template Get effective expiry template
🔒 Authenticated

Returns the effective template with full fallback resolution: entry custom → hub default → tenant default.

POST /api/entries/{entryId}/change-template Assign expiry template
👥 Entry Editor+
Request Body
NameTypeDescription
templateIdrequiredguidExpiry template ID
reasonoptionalstringReason for change
POST /api/entries/{entryId}/review Submit content review
👥 Entry Editor+

Records a content review. May be a quick review, full review, or attestation. After review, expiry may be renewed.

Request Body
NameTypeDescription
reviewTyperequiredstringQuickReview, FullReview, or Attestation
timeSpentSecondsrequiredintegerTime spent reviewing
notesoptionalstringReviewer notes
blocksChangedoptionalintegerNumber of blocks updated
contentWasUpdatedoptionalbooleanWhether content changed
checklistJsonoptionalstringCompleted checklist state
200 OK - EntryReviewHistory
GET /api/entries/{entryId}/review-history Get review history
🔒 Authenticated

Returns the complete review history for an entry.

GET /api/entries/{entryId}/renewal-eligibility Check renewal eligibility
🔒 Authenticated

Checks whether the entry can be renewed and returns any blockers.

{ "canRenew": false, "blockers": ["Review required before renewal"] }
POST /api/entries/{entryId}/renew Renew entry
👥 Entry Editor+

Renews an entry, resetting its expiry clock. May require a review first depending on the expiry template.

Request Body
NameTypeDescription
customExpiryDaysoptionalintegerOverride expiry duration
notesoptionalstringReason for renewal
📊

Expiry Dashboard

Multi-level expiry analytics: personal dashboard, tenant-wide summaries, and per-hub breakdowns.

GET /api/expiry-dashboard/me Personal dashboard
🔒 Authenticated

Returns expiry counts and upcoming deadlines for entries owned by the current user.

GET /api/expiry-dashboard/summary Tenant-wide summary
🔒 Authenticated

Returns per-hub expiry counts across the tenant.

GET /api/expiry-dashboard/hubs/{hubKey}/entries Hub entry-level details
🔒 Authenticated

Returns detailed expiry status for every entry in the specified hub.

📜

Entry Templates

Reusable block structures that can be applied to new entries. Templates have categories, ratings, and import/export support.

GET /api/templates?search=&category=&filter=all&page=1&pageSize=30 List templates
🔒 Authenticated

Returns paginated templates with filtering. Response includes X-Total-Count header.

Query Parameters
NameTypeDescription
searchoptionalstringSearch by name
categoryoptionalstringFilter by category
filteroptionalstringall | mine | official | community
pageoptionalintegerPage number (default: 1)
pageSizeoptionalintegerResults per page (default: 30)
GET /api/templates/{id} Get template detail
🔒 Authenticated

Returns full template details including blocks.

GET /api/templates/{id}/preview Preview template
🔒 Authenticated

Returns the fully assembled TipTap JSON document for preview rendering.

POST /api/templates/{id}/apply Apply template to editor
🔒 Authenticated

Returns blocks ready to inject into the TipTap editor. Records a usage event.

POST /api/templates Create template
🔒 Authenticated

Creates a new entry template from a block structure.

201 Created
PUT /api/templates/{id} Update template
👥 Owner or Admin
DELETE /api/templates/{id} Delete template
👥 Owner or Admin
POST /api/templates/{id}/rate Rate template (1-5 stars)
🔒 Authenticated
Request Body
NameTypeDescription
starsrequiredintegerRating from 1 to 5
GET /api/templates/categories List template categories
🔒 Authenticated

Returns distinct category strings used across templates.

POST /api/templates/import Import template (JSON)
🛡️ Global Admin

Imports a template from portable JSON format.

GET /api/templates/{id}/export Export template (JSON)
🛡️ Global Admin

Exports a template as portable JSON for sharing between tenants.

📈

Analytics

Activity tracking, engagement metrics, and inactive content detection.

GET /api/analytics/entries/{id}/summary Entry activity summary
👥 Entry Viewer+

Aggregated KPIs: total reads, unique editors, last read time, average and total time spent.

{ "totalReads": 142, "uniqueEditors": 5, "lastReadAt": "2026-03-28T14:22:00Z", "averageTimeSpentSeconds": 185, "totalTimeSpentSeconds": 26270 }
GET /api/analytics/entries/{id}/events?eventType=&skip=0&take=50 Paginated activity events
👥 Entry Viewer+

Returns raw activity events with pagination. Filter by event type.

Query Parameters
NameTypeDescription
eventTypeoptionalstringDocumentRead, DocumentEdited, or TimeSpent
skipoptionalintegerOffset (default: 0)
takeoptionalintegerLimit 1-200 (default: 50)
POST /api/analytics/entries/{id}/time-spent Report time on page
🔒 Authenticated

Client reports time spent reading. Minimum 5 seconds to filter out drive-by visits.

Request Body
NameTypeDescription
secondsrequiredintegerTime spent in seconds (min: 5)
languageoptionalstringLanguage being read
GET /api/analytics/inactive?days=90 Inactive entries
🔒 Authenticated

Returns entries not read within the specified number of days. Useful for identifying stale content.

Query Parameters
NameTypeDescription
daysoptionalintegerDays threshold, 1-3650 (default: 90)
👥

Hub Memberships

Manage hub members and their roles. Members can be users or groups.

GET /api/hubs/{hubId}/memberships List hub members
👥 Hub Viewer+
POST /api/hubs/{hubId}/memberships/users Add user to hub
👥 Hub Admin
Request Body
NameTypeDescription
targetUserIdrequiredguidUser ID to add
rolerequiredstringViewer, Editor, or Admin
POST /api/hubs/{hubId}/memberships/groups Add group to hub
👥 Hub Admin
Request Body
NameTypeDescription
groupIdrequiredguidGroup ID
rolerequiredstringRole for all group members
PUT /api/hubs/{hubId}/memberships/{membershipId}/role Change member role
👥 Hub Admin
DELETE /api/hubs/{hubId}/memberships/{membershipId} Remove member
👥 Hub Admin
🔒

Entry Permissions

Entry-level sharing for user and group access control.

GET /api/entries/{entryId}/permissions List entry permissions
👥 Entry Viewer+
POST /api/entries/{entryId}/permissions/users Grant user access
👥 Entry Editor+
Request Body
NameTypeDescription
targetUserIdrequiredguidUser to grant access
rolerequiredstringViewer or Editor
POST /api/entries/{entryId}/permissions/groups Grant group access
👥 Entry Editor+
DELETE /api/entries/{entryId}/permissions/{permissionId} Revoke permission
👥 Entry Editor+
👥

Groups

User group management. Groups can be assigned to hubs and entries for bulk permission management.

GET /api/groups List all groups
🔒 Authenticated
POST /api/groups Create group
🛡️ Global Admin
Request Body
NameTypeDescription
namerequiredstringGroup name
descriptionoptionalstringGroup description
GET /api/groups/{groupId}/members List group members
🔒 Authenticated
POST /api/groups/{groupId}/members Add user to group
🛡️ Global Admin
DELETE /api/groups/{groupId}/members/{targetUserId} Remove from group
🛡️ Global Admin
👤

Users

User profile and preferences.

GET /api/users/me Get current user
🔒 Authenticated

Returns the authenticated user's profile.

GET /api/users List tenant users
🔒 Authenticated

Returns all users in the current tenant. Used for share dialogs and user pickers.

PUT /api/users/me/preferred-language Set preferred language
🔒 Authenticated
Request Body
NameTypeDescription
languageCoderequiredstringPreferred language code
DELETE /api/users/me/preferred-language Clear language preference
🔒 Authenticated
🇧🇪

Tenant Languages

Configure which languages are available in your tenant, set defaults, and configure translation triggers.

GET /api/admin/languages List all languages
🔒 Authenticated
[ { "code": "en", "displayName": "English", "isEnabled": true, "isDefault": true, "trigger": "AlwaysTranslate", "provider": "deepl" } ]
GET /api/admin/languages/enabled Enabled languages only
🔒 Authenticated
GET /api/admin/languages/default Get default language
🔒 Authenticated
POST /api/admin/languages Add language
🛡️ Global Admin
Request Body
NameTypeDescription
coderequiredstringISO language code (e.g., de)
displayNamerequiredstringDisplay name (e.g., "German")
triggeroptionalstringAlwaysTranslate, OnDemand, or Never
provideroptionalstringTranslation provider name
sortOrderoptionalintegerDisplay order
PUT /api/admin/languages/{languageCode} Update language config
🛡️ Global Admin
PUT /api/admin/languages/{languageCode}/set-default Set default language
🛡️ Global Admin
DELETE /api/admin/languages/{languageCode} Remove language
🛡️ Global Admin
📋

Expiry Templates

Reusable expiry configurations that define warning periods, grace periods, review requirements, and auto-renewal rules.

GET /api/expiry-templates?activeOnly=true List expiry templates
🔒 Authenticated
GET /api/expiry-templates/default Get default template
🔒 Authenticated
GET /api/expiry-templates/{id} Get template by ID
🔒 Authenticated
GET /api/expiry-templates/{id}/usage-stats Template usage count
🔒 Authenticated

Returns the number of entries using this template.

POST /api/expiry-templates Create template
🛡️ Global Admin
PUT /api/expiry-templates/{id} Update template
🛡️ Global Admin
DELETE /api/expiry-templates/{id} Delete template
🛡️ Global Admin

Cannot delete a template that is in use by entries.

POST /api/expiry-templates/{id}/set-default Set as default
🛡️ Global Admin
🏷️

Categories

Hub taxonomy for organizing workspaces.

GET /api/categories List categories
🔒 Authenticated
GET /api/categories/{id} Get category
🔒 Authenticated
POST /api/categories Create category
🛡️ Global Admin
PUT /api/categories/{id} Update category
🛡️ Global Admin
DELETE /api/categories/{id} Delete category
🛡️ Global Admin
🏷️

Tags

Content tags for cross-hub organization and discoverability.

GET /api/tags List tags
🔒 Authenticated
GET /api/tags/search?q=engineering Search tags
🔒 Authenticated
POST /api/tags Create tag
🛡️ Global Admin
PUT /api/tags/{id} Update tag
🛡️ Global Admin
DELETE /api/tags/{id} Delete tag
🛡️ Global Admin
🔔

Expiry Notifications

Manage expiry warning notifications and bulk renewals.

GET /api/notifications/expiry-warnings Get unread warnings
🔒 Authenticated

Returns unacknowledged expiry warnings for the current user.

POST /api/notifications/{id}/acknowledge Acknowledge notification
🔒 Authenticated
POST /api/notifications/bulk-renew Bulk renew entries
🔒 Authenticated
Request Body
NameTypeDescription
entryIdsrequiredguid[]Array of entry IDs to renew
📨

Notification Channels

Webhook channels for delivering expiry and activity notifications to external systems (Slack, Teams, etc.).

GET /api/notification-channels List channels
🔒 Authenticated
POST /api/notification-channels Create channel
🛡️ Global Admin
POST /api/notification-channels/{id}/test Test channel
🛡️ Global Admin

Sends a test payload to verify channel configuration.

GET /api/notification-channels/{id}/stats Channel delivery stats
🔒 Authenticated
{ "successCount": 142, "failureCount": 3, "lastUsedAt": "2026-03-28T10:00:00Z" }
PUT /api/notification-channels/{id} Update channel
🛡️ Global Admin
DELETE /api/notification-channels/{id} Delete channel
🛡️ Global Admin
📜

Content Rules

Hub-level and tenant-level content rules (e.g., mandatory fields, naming conventions).

GET /api/hubs/{hubKey}/rules Get hub rules
🔒 Authenticated
PUT /api/hubs/{hubKey}/rules Update hub rules
🔒 Authenticated
Request Body
NameTypeDescription
isEnabledrequiredbooleanEnable/disable rules
rulesJsonrequiredstringRules configuration JSON
GET /api/plugins/rules/tenant/global Get global tenant rules
🔒 Authenticated
PUT /api/plugins/rules/tenant/global Update global tenant rules
🛡️ Global Admin
🏗️

Tenant Setup

Onboarding endpoints for creating new tenants. These are public (no auth required).

GET /api/tenant/known-languages Platform supported languages
✅ Public

Returns all languages the platform supports.

GET /api/tenant/known-plugins Available plugins
✅ Public

Returns registered plugin manifests with metadata.

POST /api/tenant/create Create tenant
✅ Public

Creates a new tenant (workspace) during onboarding.

Request Body
NameTypeDescription
namerequiredstringTenant display name
slugrequiredstringURL-safe identifier
domainoptionalstringCustom domain
allowAllUsersoptionalbooleanOpen registration
enabledLanguagesoptionalstring[]Initial language codes
enabledPluginsoptionalstring[]Plugin IDs to enable

Review Checklists

Configurable checklists that reviewers must complete during content reviews.

GET /api/review-checklists?hubId= List checklists
🔒 Authenticated
POST /api/review-checklists Create checklist
🛡️ Global Admin
PUT /api/review-checklists/{id} Update checklist
🛡️ Global Admin
DELETE /api/review-checklists/{id} Delete checklist
🛡️ Global Admin
🧩

Block Type Heuristics

Semantic block classification rules for automatic content categorization.

GET /api/blocktypeheuristics List heuristics
🔒 Authenticated
POST /api/blocktypeheuristics Create heuristic
🛡️ Global Admin
PUT /api/blocktypeheuristics/{id} Update heuristic
🛡️ Global Admin
DELETE /api/blocktypeheuristics/{id} Delete heuristic
🛡️ Global Admin
📦

Data Models & Enums

Key types used across the API. All responses use string-serialized enums.

EntryStatus

Lifecycle status of an entry.

Draft Published ExpiringSoon Warning Expired

TranslationStatus

Freshness status for block-level translations.

Draft UpToDate Stale

PermissionLevel

Access levels for hub memberships and entry permissions.

Viewer Editor Admin

ReviewType

Types of content review for expiry workflow.

QuickReview FullReview Attestation

ActivityEventType

Types of analytics events.

DocumentRead DocumentEdited TimeSpent

TranslationTrigger

When auto-translation should fire for a language.

AlwaysTranslate OnDemand Never

TenantRole

User roles at the tenant level.

Owner Member Guest