success, statusCode, message and data — so a caller reads ok first and touches data only when it is set.
Method names follow the route segments, which is why some read as a name and a verb at once —
captchaConfigGET, socialLinkedinPublish. That is the generator being literal, not a mistake.How to read this page
Each resource opens with a table of its methods and the route each one calls, then a section per method with the full parameter list. Every parameter says where it goes (path, query or body), its type, and whether it is required.
Resources
ai— AI automationaiConversation— AI conversationarticle— Articlesauthor— Authorscategory— CategoriesformSubmission— Form submissionsform— Formslanguage— Languagesreport— Reportssubcategory— Subcategoriestag— Tags
ai
Summarize, translate, SEO, repurpose, generate and social publishing.
generateContent
POST /ai/generateContent
Generate full content (title, slug, summary, body).
Multi-step pipeline with timeouts & fallbacks. body is returned as a stringified HTML-wrapper like <div>{"body":"<div>…</div>"}</div>.
generateImage
POST /ai/generateImage
Generate a featured image.
Either prompt or articleId must be provided. When articleId is given and prompt is omitted, the prompt is derived from the article’s title, summary, tags and a content excerpt. setAsThumbnail stores the generated image as the article thumbnail.
generateTitle
POST /ai/generateTitle
Generate a title from text.
optimizeArticle
POST /ai/optimizeArticle
Optimize an article for SEO and save the result.
Optimizes each target language of the article and persists the patched fields plus the recomputed seo.perLanguage metrics. When languages is omitted, every language present on the article is optimized. title, summary and content default to true; tags defaults to false.
optimizeArticleStream
POST /ai/optimizeArticle/stream
Optimize article SEO with streaming progress (Server-Sent Events).
repurpose
POST /ai/repurpose
Repurpose article/text for social platforms.
repurposeStream
POST /ai/repurpose/stream
Repurpose article/text for social platforms with SSE.
repurposeTemplateGET
GET /ai/repurpose/template
Get the tenant repurpose template.
Returns the stored template for the tenant, creating it with the service defaults (en / professional / medium and per-platform tone, length, CTA, hashtag style and max hashtag counts) on first read.
repurposeTemplatePUT
PUT /ai/repurpose/template
Update the tenant repurpose template.
Deep-merges the supplied values into the stored template. Omitted keys keep their current values, and unknown keys are stripped before validation. The per-platform sub-objects all have identical fields.
seoOptimize
POST /ai/seoOptimize
SEO optimize text (content + metaDescription).
seoOptimizeStream
POST /ai/seoOptimize/stream
SEO optimize text with streaming response (Server-Sent Events).
socialConnections
GET /ai/social/connections
List the tenant’s social publishing connections.
Returns every stored connection for the tenant. Only linkedin, telegram and twitter are supported. Secrets are stored encrypted and are always masked in the response (abcd...wxyz).
socialLinkedinConnect
PUT /ai/social/linkedin/connect
Connect or replace the tenant’s LinkedIn account.
Upserts the LinkedIn connection. The access token is encrypted at rest and masked in the response. Re-calling this endpoint replaces the stored credentials and marks the connection active.
socialLinkedinPublish
POST /ai/social/linkedin/publish
Publish a text post to the connected LinkedIn account.
Requires an active LinkedIn connection for the tenant. Posts a UGC share with lifecycleState: PUBLISHED and no media. visibility defaults to PUBLIC. Upstream LinkedIn failures are surfaced as 502.
socialTelegramConnect
PUT /ai/social/telegram/connect
Connect or replace the tenant’s Telegram bot.
Upserts the Telegram connection. The bot token is encrypted at rest and masked in the response. Re-calling this endpoint replaces the stored credentials and marks the connection active.
socialTelegramPublish
POST /ai/social/telegram/publish
Send a message to the connected Telegram chat.
Requires an active Telegram connection for the tenant. Sends via the bot’s sendMessage to the stored chatId. parseMode defaults to HTML. Upstream Telegram failures are surfaced as 502.
socialTwitterConnect
PUT /ai/social/twitter/connect
Connect or replace the tenant’s Twitter/X bearer token.
Upserts the Twitter connection. The bearer token is encrypted at rest and masked in the response. Re-calling this endpoint replaces the stored credential and marks the connection active.
socialTwitterPublish
POST /ai/social/twitter/publish
Post a tweet to the connected Twitter/X account.
Requires an active Twitter connection for the tenant. Posts to the Twitter v2 tweets endpoint using the stored bearer token. Upstream Twitter failures are surfaced as 502.
summarize
POST /ai/summarize
Summarize text.
summarizeArticleStream
POST /ai/summarizeArticle/stream
Summarize an article by ID with streaming response.
summarizeStream
POST /ai/summarize/stream
Summarize text with streaming response.
translate
POST /ai/translate
Translate text.
translateArticle
POST /ai/translateArticle
Translate an article into one or more languages.
Requires articleId, a non-empty targetLanguages array and at least one selected field (all fields default to false, so a request without fields is rejected). The source language is detected from the article unless sourceLanguage is given. If a target language already has a translation for a selected multilingual field and sourceLanguage is omitted, the request fails with 409 instead of overwriting.
translateArticleStream
POST /ai/translateArticle/stream
Translate article with streaming progress (Server-Sent Events).
translateForm
POST /ai/translateForm
Translate a form into one or more languages.
Translates a form’s multilingual text, section titles/descriptions, field labels/placeholders and option labels. The source language is detected from the form unless sourceLanguage is provided. Every flag in fields defaults to true, so an empty fields object translates the whole form. A target language that already holds a translation and no explicit sourceLanguage fails with 400 rather than overwriting.
translateStream
POST /ai/translate/stream
Translate text with streaming response (Server-Sent Events).
aiConversation
Multi-turn article drafting that keeps context between calls.
conversationContinue
POST /ai/conversation/continue
Continue conversation with answers.
conversationConversationId
GET /ai/conversation/{conversationId}
Get conversation state.
conversationGenerate
POST /ai/conversation/generate
Continue conversation and generate article (combined).
conversationGenerateStream
POST /ai/conversation/generate/stream
Continue and generate article with streaming (SSE).
conversationRegenerate
POST /ai/conversation/regenerate
Regenerate article with SEO improvements.
conversationStart
POST /ai/conversation/start
Start a new article generation conversation.
article
Create, read, publish, archive and delete articles, plus comments, reactions and engagement settings.
advanceSearch
GET /articles/advanceSearch
Advanced search articles.
Combine filters (category, subCategory, author, tags, keyword) with pagination & sorting. Always restricted to published, non-private, non-deleted articles.
archive
PUT /articles/archive
Archive article.
Archives an article by soft-deleting it (sets isDeleted=true). The record is retained and the publish state is left unchanged.
A soft delete — the row is hidden but not removed.
deleteId is the real remove.commentsCommentIdDELETE
DELETE /articles/comments/{commentId}
Delete comment.
Soft-deletes the comment (sets isDeleted), removes its reactions, and detaches it from the article. A caller may only delete their own comment; a privileged role (SUPER_USER, MANAGER, CHIEF_EDITOR, PUBLISHER, EDITOR) may delete any comment in the tenant.
commentsCommentIdPATCH
PATCH /articles/comments/{commentId}
Update comment.
Partial update — send content, status, or both (at least one is required). A caller may only edit their own comment; changing status additionally requires a privileged role (SUPER_USER, MANAGER, CHIEF_EDITOR, PUBLISHER, EDITOR) and is rejected with 403 otherwise.
commentsCommentIdReactionDELETE
DELETE /articles/comments/{commentId}/reaction
Remove reaction from comment.
Deletes the caller’s own reaction for an approved comment. Removing a reaction that does not exist still succeeds, and the returned totals reflect the comment after refresh.
commentsCommentIdReactionPOST
POST /articles/comments/{commentId}/reaction
Set reaction on comment.
Creates or updates the caller’s reaction for an approved comment. One reaction per actor (authenticated user, or guest fingerprint) is kept, so submitting like after dislike switches it. Rejected with 403 when the parent article, its category, or its sub-category disables reactions.
commentsCommentIdReactionSummary
GET /articles/comments/{commentId}/reactionSummary
Get comment reaction summary.
Returns the stored like/dislike totals for an approved comment. userReaction is the caller’s own reaction (like, dislike, or null when the caller has none or cannot be identified as a user or guest).
commentsGetAll
GET /articles/comments/getAll
Get all comments for tenant (moderation).
Paginated moderation feed of every non-deleted comment in the tenant, newest first, including pending and rejected ones. Each row is joined with its article, the article’s categories, and the comment author. All filters are optional and combine together.
create
POST /articles/create
Create article.
deleteId
DELETE /articles/delete/{id}
Delete article.
engagementSettingsGET
GET /articles/engagementSettings
Get tenant engagement settings (public).
Returns the effective engagement configuration for your tenant. When the tenant has no stored record, the built-in defaults are returned. Article and category/sub-category overrides are applied separately and are not reflected here.
engagementSettingsPUT
PUT /articles/engagementSettings
Update tenant engagement settings.
Upserts the engagement configuration for your tenant. Every field is optional — omitted fields keep their current value, and a tenant with no record yet starts from the built-in defaults. Booleans and numbers are validated server-side; out-of-range values are rejected with 400. The authenticated user id is stored as updatedBy.
getAll
GET /articles/getAll
Get all articles (public).
Returns a paginated list. Public view defaults to published & active & not private/deleted. Use filters to refine results.
Paginated.
page is 1-based and limit caps the page size; the totals come back in the response metadata.getByAuthorId
GET /articles/getByAuthorId/{authorId}
Get articles by author id (public).
getByCategoryId
GET /articles/getByCategoryId/{categoryId}
Get articles by category id (public).
getByCategorySlug
GET /articles/getByCategorySlug/{slug}
Get articles by category slug (public).
getById
GET /articles/getById/{id}
Get article by id (public).
Multilingual fields are localized from the lang or accept-language request header. Omit the headers to receive every configured language.
getBySlug
GET /articles/getBySlug/{slug}
Get article by slug (public).
Multilingual fields are localized from the lang request header. Omit the header to receive every configured language.
getBySubCategoryId
GET /articles/getBySubCategoryId/{subCategoryId}
Get articles by subcategory id (public).
getBySubCategorySlug
GET /articles/getBySubCategorySlug/{slug}
Get articles by subcategory slug (public).
getByTag
GET /articles/getByTag/{tag}
Get articles by tag (public).
idCommentsGET
GET /articles/{id}/comments
Get comments for article (public).
Paginated list of approved, non-deleted comments for the article, each with the author (firstName, lastName, avatar) and the caller’s own reaction. When comments are disabled for the article, category, or sub-category, an empty list is returned with 200 instead of an error.
idCommentsPOST
POST /articles/{id}/comments
Create comment on article.
Adds a comment to the article. The stored status is approved or pending depending on the tenant/article autoApproveComments setting. Pass parentId to reply to an existing comment on the same article; the parent must exist and not be deleted. Rejected with 403 when the article, its category, or its sub-category disables comments.
idReactionDELETE
DELETE /articles/{id}/reaction
Remove reaction from article.
Deletes the caller’s own reaction for the article. Removing a reaction that does not exist still succeeds, and the returned totals reflect the article after refresh. Rejected with 403 when the article, its category, or its sub-category disables reactions.
idReactionPOST
POST /articles/{id}/reaction
Set reaction on article.
Creates or updates the caller’s reaction for the article. One reaction per actor (authenticated user, or guest fingerprint) is kept, so submitting like after dislike switches it. Reactions are rejected with 403 when the article, its category, or its sub-category disables reactions.
idReactionSummary
GET /articles/{id}/reactionSummary
Get article reaction summary.
Returns the stored like/dislike totals for the article. userReaction is the caller’s own reaction (like, dislike, or null when the caller has none or cannot be identified as a user or guest).
search
GET /articles/search
Search articles.
seoAnalysisId
GET /articles/seoAnalysis/{id}
Get SEO analysis for article.
Returns comprehensive SEO analysis including keyword analysis, link/image metrics, readability scores, and technical SEO checks. Supports filtering by language via query parameter.
update
PUT /articles/update
Update article.
Partial update. Provide only fields you want to change, plus the id.
Takes the whole document in its body, so
id is a field of that body rather than a separate argument.author
The people articles are attributed to.
create
POST /authors/create
Create author.
deleteId
DELETE /authors/delete/{id}
Delete author.
getAll
GET /authors/getAll
Get all authors (public).
Paginated.
page is 1-based and limit caps the page size; the totals come back in the response metadata.getById
GET /authors/getById/{id}
Get author by id (public).
getBySlug
GET /authors/getBySlug/{slug}
Get author by slug (public).
update
PUT /authors/update
Update author.
Partial update. Provide only fields to change, plus id.
Takes the whole document in its body, so
id is a field of that body rather than a separate argument.category
The top level of the content tree.
create
POST /categories/create
Create category.
deleteId
DELETE /categories/delete/{id}
Delete category.
Soft-deletes the category and cascades isDeleted onto its sub-categories.
getAll
GET /categories/getAll
Get all categories (public).
Paginated.
page is 1-based and limit caps the page size; the totals come back in the response metadata.getById
GET /categories/getById/{id}
Get category by id (public).
getBySlug
GET /categories/getBySlug/{slug}
Get category by slug (public).
update
PUT /categories/update
Update category.
Partial update. Provide only fields to change, plus id.
Takes the whole document in its body, so
id is a field of that body rather than a separate argument.formSubmission
Submitted answers and the relations between them and other records.
getSubmissionById
GET /forms/getSubmissionById/{id}
Get submission by id.
Requires auth.
idGetAllSubmissions
GET /forms/{id}/getAllSubmissions
Get submissions by form id.
Returns submissions for the given form with optional filters and pagination. Requires auth. Callers whose role is WRITER are restricted to forms they created.
idInternalSubmit
POST /forms/{id}/internal-submit
Submit a form from the backend (internal).
Server-to-server submission endpoint. Shares its implementation with the public /forms/{id}/submit route but runs on the internal channel, which changes three things: - the form is not restricted to formType: public — internal forms are reachable; - CAPTCHA is not verified, even when the form has captcha.enabled=true; - the stored status is taken from the request body’s status instead of being forced to pending. Required-field, disabled-field and type validation still run, as do field relation checks. The caller must present the form.read permission, and the tenant’s seat limit for form submissions is enforced; a tenant at its limit is rejected with 426. “Internal” describes the calling party (a trusted backend), not a separate authentication scheme.
Server-to-server. Skips captcha, so call it only from a trusted backend.
idSubmit
POST /forms/{id}/submit
Submit a form (public).
Public submission endpoint. Backend enforces required fields, disabled fields, and type-based validation. For “select”, “multi-select”, and “multi-checkbox”, values must be taken from form options[].value. If a field has relation, submitted values must be related submission ids from the target form. one-to-one and many-to-one accept a single id string. one-to-many and many-to-many accept an array of id strings. Requires the gateway (publicRoutes) and a valid the service status header (enforceTenantStatus, otherwise 400/423/403). checkLimits("formSubmissions") applies the tenant’s seat limit and rejects with 426 once the limit is reached. Status is always stored as pending on this route; only /forms/{id}/internal-submit honours a body status.
The public path. Validates captcha when the form requires it.
submissionDeleteId
DELETE /forms/submission/delete/{id}
Delete submission.
Soft-deletes a submission by its ID — the record is retained with isDeleted: true and excluded from all list queries.
submissionIdRelations
GET /forms/submission/{id}/relations
Get submission relations.
Returns resolved forward relations and reverse relations for a submission. Optional fieldName query narrows forward relations to one field.
submissionIdRelationsFieldNameConnect
POST /forms/submission/{id}/relations/{fieldName}/connect
Connect relation.
Connects one related submission to a relation field. For single-value relations, the existing value is replaced.
submissionIdRelationsFieldNameDisconnect
POST /forms/submission/{id}/relations/{fieldName}/disconnect
Disconnect relation.
Removes one related submission from a relation field. For single-value relations, the field is cleared. For multi-value relations, omit relatedSubmissionId to clear all.
submissionIdRelationsFieldNameReorder
POST /forms/submission/{id}/relations/{fieldName}/reorder
Reorder multi relation.
Reorders the ids of a multi-value relation field. The provided array must contain exactly the same ids currently connected. Only one-to-many and many-to-many fields support reorder.
submissionUpdateId
PUT /forms/submission/update/{id}
Update submission (partial).
Update submission values and/or status. Values are validated against the form definition (same rules as on submission). At least one of values or status must be present. status is the stored numeric enum, not a name: 0 = pending, 1 = approved, 2 = rejected. Changing status is restricted to SUPER_USER, MANAGER, CHIEF_EDITOR, PUBLISHER and EDITOR; any other role receives 403.
submissionsGetAll
GET /forms/submissions/getAll
Get all submissions for the tenant.
Lists submissions across every form in the calling tenant (not scoped to a single form), newest first, with the owning form’s title, slug and type joined onto each row. Requires the form.submission.read permission. Callers whose role is WRITER (5) are automatically restricted to submissions on forms they created; a WRITER whose identity cannot be resolved is rejected with 401. Soft-deleted submissions are always excluded.
submissionsRelationsBackfill
POST /forms/submissions/relations/backfill
Backfill normalized submission relations.
Recomputes and persists the normalized relations array for existing submissions. Optionally scope to one form.
form
Form definitions, captcha configuration, and both submit paths.
captchaConfigGET
GET /forms/captcha/config
Get tenant captcha config.
Returns tenant captcha config metadata (masked secret), never returns raw secret.
captchaConfigPUT
PUT /forms/captcha/config
Upsert tenant captcha config.
Stores or updates CAPTCHA provider settings for the current tenant. Secret key is stored encrypted server-side.
captchaConfigSecret
PATCH /forms/captcha/config/secret
Rotate tenant captcha secret.
Rotates only the CAPTCHA secret key for the current tenant, keeping other config fields unchanged.
create
POST /forms/create
Create form.
Creates a new form with multilingual text fields, sections, and fields. Keys inside multilingual objects must be valid language codes configured in your system (e.g., “en”, “fa”, …).
delete
DELETE /forms/delete
Delete form.
Deletes a form by ID supplied in the request body.
getAll
GET /forms/getAll
Get all forms.
Returns a paginated list. Requires auth. Soft-deleted forms are always excluded; forms are returned regardless of isActive unless the status filter is used. Each row carries a submissionsCount.
Paginated.
page is 1-based and limit caps the page size; the totals come back in the response metadata.getById
GET /forms/getById/{id}
Get form by id.
Requires auth.
getBySlug
GET /forms/getBySlug/{slug}
Get form by slug.
Public endpoint to fetch a form definition by its slug.
getNextById
GET /forms/getNextById/{id}
Get next form by current form id.
Public endpoint for multi-step flows. Returns nextForm=null if no next form is configured.
update
PUT /forms/update
Update form.
Partial update. Provide only the fields to change. ID is required in the body.
Takes the whole document in its body, so
id is a field of that body rather than a separate argument.language
The locales a multilingual field can be written in.
create
POST /languages/create
Create a language.
Creates a new language record for the current tenant.
Request body (validated): - code (string, required): Short language code. Must be exactly 2 characters (e.g., “en”, “es”, “fa”). - name (string, required): Human-readable language name. Must be a non-empty string (e.g., “English”).
Uniqueness: - The pair (code, tenant) must be unique. If a language with the same code already exists for the current tenant, the request fails with 409 Conflict.
Defaults: - Newly created records are active (isActive=true) and not deleted (isDeleted=false).
deleteId
DELETE /languages/delete/{id}
Delete a language (soft delete).
Marks a language as deleted for the current tenant.
Path parameters: - id (string, required): The language identifier to delete. Must be a 24-character hexadecimal string.
Behavior: - This is a soft delete (the record remains but is flagged as deleted). - Subsequent reads (e.g., list, getById) do not return deleted records.
getAll
GET /languages/getAll
List languages (paginated).
Returns a paginated list of languages for the current tenant.
Query parameters: - page (integer, optional): 1-based page index. Must be >= 1. Defaults to 1. - limit (integer, optional): Items per page. Must be >= 1. Defaults to 10.
Notes: - Only non-deleted records are returned. - Results are tenant-scoped. - page and limit are used only to compute the pagination block; the returned languages array is not currently sliced by them.
Paginated.
page is 1-based and limit caps the page size; the totals come back in the response metadata.getById
GET /languages/getById
Get a language by id.
Fetch a single language for the current tenant using its identifier.
Request body: - id (string, required): The language identifier. Must be a 24-character hexadecimal string. Note: despite the endpoint using GET, the identifier is read from the request body, not from the query string.
Behavior: - Returns 404 if the identifier does not match a language owned by the current tenant.
update
PUT /languages/update
Update a language.
Updates an existing language for the current tenant.
The payload is read from the bodyData property of the request body, i.e. the validated fields below are nested inside a bodyData object.
Request body (validated): - id (string, required): The language identifier to update. - code (string, required): Updated language code. Must be exactly 2 characters. - name (string, required): Updated language name. Must be a non-empty string.
Notes: - If id does not belong to an existing language in the current tenant, returns 404. - Validation failures (including a missing field) return 409.
Takes the whole document in its body, so
id is a field of that body rather than a separate argument.report
Statistics, charts and dashboard configuration.
aiContentImpact
GET /reports/aiContentImpact
Compare AI-generated and human-authored content performance.
aiUsageBreakdown
GET /reports/aiUsageBreakdown
Get AI usage breakdown report for the authenticated tenant.
categoryPerformance
GET /reports/categoryPerformance
Get category performance report for the authenticated tenant.
chartContentTrend
GET /reports/chart/contentTrend
Get content trend chart for the authenticated tenant.
chartEngagementTrend
GET /reports/chart/engagementTrend
Get engagement trend chart for the authenticated tenant.
chartSubmissionFunnel
GET /reports/chart/submissionFunnel
Get submission funnel chart for the authenticated tenant.
commentOverview
GET /reports/commentOverview
Get comment and moderation overview for the authenticated tenant.
contentHealth
GET /reports/contentHealth
Get content health report for the authenticated tenant.
contentOverview
GET /reports/contentOverview
Get content overview report for the authenticated tenant.
dashboardConfigGET
GET /reports/dashboardConfig
Get the dashboard layout preference for the authenticated user.
Returns the stored dashboard configuration for the tenant and user resolved from the request context. If the user has never saved a configuration, the built-in default is returned instead of a 404.
dashboardConfigPUT
PUT /reports/dashboardConfig
Save the dashboard layout preference for the authenticated user.
Upserts the dashboard configuration for the tenant and user resolved from the request context and returns the normalized result. The whole body is optional — an empty body, a body with no slots, or an empty slots array all fall back to the built-in default configuration. The response is always the fully normalized config, so unknown widget types, spans and ranges are replaced by their defaults. The authenticated user id is stored as updatedBy.
formsOverview
GET /reports/formsOverview
Get forms overview report for the authenticated tenant.
getAllAuthorsStatistics
GET /reports/getAllAuthorsStatistics
Get statistics of all authors (aggregated).
getAllUsersStatistics
GET /reports/getAllUsersStatistics
Get statistics of all users (aggregated).
getAuthorStatisticsAuthorId
GET /reports/getAuthorStatistics/{authorId}
Get statistics for a specific author.
getStatistics
GET /reports/getStatistics
Get tenant usage statistics for the authenticated tenant.
getUserStatisticsUserId
GET /reports/getUserStatistics/{userId}
Get statistics for a specific user (secure).
periodComparison
GET /reports/periodComparison
Compare the current report period against the previous equal-length period.
publishingPerformance
GET /reports/publishingPerformance
Get publishing performance report for the authenticated tenant.
submissionsOverview
GET /reports/submissionsOverview
Get submissions overview report for the authenticated tenant.
topArticles
GET /reports/topArticles
Get top articles report for the authenticated tenant.
subcategory
The optional second level under a category.
create
POST /subcategories/create
Create subCategory.
deleteId
DELETE /subcategories/delete/{id}
Delete subCategory.
getAll
GET /subcategories/getAll
Get all subCategories (public).
Paginated.
page is 1-based and limit caps the page size; the totals come back in the response metadata.getByCategoryId
GET /subcategories/getByCategoryId/{categoryId}
Get subCategories by parent category id (public).
getById
GET /subcategories/getById/{id}
Get subCategory by id (public).
getBySlug
GET /subcategories/getBySlug/{slug}
Get subCategory by slug (public).
update
PUT /subcategories/update
Update subCategory.
Partial update. Provide only fields to change, plus id.
Takes the whole document in its body, so
id is a field of that body rather than a separate argument.tag
Free-form labels attached to articles.
create
POST /tags/create
Create a new tag.
Manually create a new tag
getAll
GET /tags/getAll
Get all tags for current tenant.
Returns a paginated list of all tags for your tenant. No user authentication is required.
Paginated.
page is 1-based and limit caps the page size; the totals come back in the response metadata.search
GET /tags/search
Search tags.
Case-insensitive partial name match against the tags of your tenant. No user authentication is required.

