Skip to main content
131 methods across 11 resources. Every one returns the same envelope — 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

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).
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.