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.

GenerateContentAsync

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

GenerateImageAsync

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.

GenerateTitleAsync

POST /ai/generateTitle Generate a title from text.

OptimizeArticleAsync

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.

OptimizeArticleStreamAsync

POST /ai/optimizeArticle/stream Optimize article SEO with streaming progress (Server-Sent Events).

RepurposeAsync

POST /ai/repurpose Repurpose article/text for social platforms.

RepurposeStreamAsync

POST /ai/repurpose/stream Repurpose article/text for social platforms with SSE.

RepurposeTemplateGETAsync

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.

RepurposeTemplatePUTAsync

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.

SeoOptimizeAsync

POST /ai/seoOptimize SEO optimize text (content + metaDescription).

SeoOptimizeStreamAsync

POST /ai/seoOptimize/stream SEO optimize text with streaming response (Server-Sent Events).

SocialConnectionsAsync

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

SocialLinkedinConnectAsync

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.

SocialLinkedinPublishAsync

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.

SocialTelegramConnectAsync

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.

SocialTelegramPublishAsync

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.

SocialTwitterConnectAsync

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.

SocialTwitterPublishAsync

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.

SummarizeArticleStreamAsync

POST /ai/summarizeArticle/stream Summarize an article by ID with streaming response.

SummarizeAsync

POST /ai/summarize Summarize text.

SummarizeStreamAsync

POST /ai/summarize/stream Summarize text with streaming response.

TranslateArticleAsync

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.

TranslateArticleStreamAsync

POST /ai/translateArticle/stream Translate article with streaming progress (Server-Sent Events).

TranslateAsync

POST /ai/translate Translate text.

TranslateFormAsync

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.

TranslateStreamAsync

POST /ai/translate/stream Translate text with streaming response (Server-Sent Events).

AIConversation

Multi-turn article drafting that keeps context between calls.

ConversationContinueAsync

POST /ai/conversation/continue Continue conversation with answers.

ConversationConversationIdAsync

GET /ai/conversation/{conversationId} Get conversation state.

ConversationGenerateAsync

POST /ai/conversation/generate Continue conversation and generate article (combined).

ConversationGenerateStreamAsync

POST /ai/conversation/generate/stream Continue and generate article with streaming (SSE).

ConversationRegenerateAsync

POST /ai/conversation/regenerate Regenerate article with SEO improvements.

ConversationStartAsync

POST /ai/conversation/start Start a new article generation conversation.

Article

Create, read, publish, archive and delete articles, plus comments, reactions and engagement settings.

AdvanceSearchAsync

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.

ArchiveAsync

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.

CommentsCommentIdDELETEAsync

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.

CommentsCommentIdPATCHAsync

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.

CommentsCommentIdReactionDELETEAsync

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.

CommentsCommentIdReactionPOSTAsync

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.

CommentsCommentIdReactionSummaryAsync

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

CommentsGetAllAsync

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.

CreateAsync

POST /articles/create Create article.

DeleteIdAsync

DELETE /articles/delete/{id} Delete article.

EngagementSettingsGETAsync

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.

EngagementSettingsPUTAsync

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.

GetAllAsync

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.

GetByAuthorIdAsync

GET /articles/getByAuthorId/{authorId} Get articles by author id (public).

GetByCategoryIdAsync

GET /articles/getByCategoryId/{categoryId} Get articles by category id (public).

GetByCategorySlugAsync

GET /articles/getByCategorySlug/{slug} Get articles by category slug (public).

GetByIdAsync

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.

GetBySlugAsync

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.

GetBySubCategoryIdAsync

GET /articles/getBySubCategoryId/{subCategoryId} Get articles by subcategory id (public).

GetBySubCategorySlugAsync

GET /articles/getBySubCategorySlug/{slug} Get articles by subcategory slug (public).

GetByTagAsync

GET /articles/getByTag/{tag} Get articles by tag (public).

IdCommentsGETAsync

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.

IdCommentsPOSTAsync

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.

IdReactionDELETEAsync

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.

IdReactionPOSTAsync

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.

IdReactionSummaryAsync

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

SearchAsync

GET /articles/search Search articles.

SeoAnalysisIdAsync

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.

UpdateAsync

PUT /articles/update Update article. Partial update. Provide only fields you want to change, plus the id.

Author

The people articles are attributed to.

CreateAsync

POST /authors/create Create author.

DeleteIdAsync

DELETE /authors/delete/{id} Delete author.

GetAllAsync

GET /authors/getAll Get all authors (public).

GetByIdAsync

GET /authors/getById/{id} Get author by id (public).

GetBySlugAsync

GET /authors/getBySlug/{slug} Get author by slug (public).

UpdateAsync

PUT /authors/update Update author. Partial update. Provide only fields to change, plus id.

Category

The top level of the content tree.

CreateAsync

POST /categories/create Create category.

DeleteIdAsync

DELETE /categories/delete/{id} Delete category. Soft-deletes the category and cascades isDeleted onto its sub-categories.

GetAllAsync

GET /categories/getAll Get all categories (public).

GetByIdAsync

GET /categories/getById/{id} Get category by id (public).

GetBySlugAsync

GET /categories/getBySlug/{slug} Get category by slug (public).

UpdateAsync

PUT /categories/update Update category. Partial update. Provide only fields to change, plus id.

FormSubmission

Submitted answers and the relations between them and other records.

GetSubmissionByIdAsync

GET /forms/getSubmissionById/{id} Get submission by id. Requires auth.

IdGetAllSubmissionsAsync

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.

IdInternalSubmitAsync

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.

IdSubmitAsync

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.

SubmissionDeleteIdAsync

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.

SubmissionIdRelationsAsync

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.

SubmissionIdRelationsFieldNameConnectAsync

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.

SubmissionIdRelationsFieldNameDisconnectAsync

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.

SubmissionIdRelationsFieldNameReorderAsync

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.

SubmissionUpdateIdAsync

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.

SubmissionsGetAllAsync

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.

SubmissionsRelationsBackfillAsync

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.

CaptchaConfigGETAsync

GET /forms/captcha/config Get tenant captcha config. Returns tenant captcha config metadata (masked secret), never returns raw secret.

CaptchaConfigPUTAsync

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.

CaptchaConfigSecretAsync

PATCH /forms/captcha/config/secret Rotate tenant captcha secret. Rotates only the CAPTCHA secret key for the current tenant, keeping other config fields unchanged.

CreateAsync

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”, …).

DeleteAsync

DELETE /forms/delete Delete form. Deletes a form by ID supplied in the request body.

GetAllAsync

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.

GetByIdAsync

GET /forms/getById/{id} Get form by id. Requires auth.

GetBySlugAsync

GET /forms/getBySlug/{slug} Get form by slug. Public endpoint to fetch a form definition by its slug.

GetNextByIdAsync

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.

UpdateAsync

PUT /forms/update Update form. Partial update. Provide only the fields to change. ID is required in the body.

Language

The locales a multilingual field can be written in.

CreateAsync

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

DeleteIdAsync

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.

GetAllAsync

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.

GetByIdAsync

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.

UpdateAsync

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.

Report

Statistics, charts and dashboard configuration.

AiContentImpactAsync

GET /reports/aiContentImpact Compare AI-generated and human-authored content performance.

AiUsageBreakdownAsync

GET /reports/aiUsageBreakdown Get AI usage breakdown report for the authenticated tenant.

CategoryPerformanceAsync

GET /reports/categoryPerformance Get category performance report for the authenticated tenant.

ChartContentTrendAsync

GET /reports/chart/contentTrend Get content trend chart for the authenticated tenant.

ChartEngagementTrendAsync

GET /reports/chart/engagementTrend Get engagement trend chart for the authenticated tenant.

ChartSubmissionFunnelAsync

GET /reports/chart/submissionFunnel Get submission funnel chart for the authenticated tenant.

CommentOverviewAsync

GET /reports/commentOverview Get comment and moderation overview for the authenticated tenant.

ContentHealthAsync

GET /reports/contentHealth Get content health report for the authenticated tenant.

ContentOverviewAsync

GET /reports/contentOverview Get content overview report for the authenticated tenant.

DashboardConfigGETAsync

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.

DashboardConfigPUTAsync

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.

FormsOverviewAsync

GET /reports/formsOverview Get forms overview report for the authenticated tenant.

GetAllAuthorsStatisticsAsync

GET /reports/getAllAuthorsStatistics Get statistics of all authors (aggregated).

GetAllUsersStatisticsAsync

GET /reports/getAllUsersStatistics Get statistics of all users (aggregated).

GetAuthorStatisticsAuthorIdAsync

GET /reports/getAuthorStatistics/{authorId} Get statistics for a specific author.

GetStatisticsAsync

GET /reports/getStatistics Get tenant usage statistics for the authenticated tenant.

GetUserStatisticsUserIdAsync

GET /reports/getUserStatistics/{userId} Get statistics for a specific user (secure).

PeriodComparisonAsync

GET /reports/periodComparison Compare the current report period against the previous equal-length period.

PublishingPerformanceAsync

GET /reports/publishingPerformance Get publishing performance report for the authenticated tenant.

SubmissionsOverviewAsync

GET /reports/submissionsOverview Get submissions overview report for the authenticated tenant.

TopArticlesAsync

GET /reports/topArticles Get top articles report for the authenticated tenant.

Subcategory

The optional second level under a category.

CreateAsync

POST /subcategories/create Create subCategory.

DeleteIdAsync

DELETE /subcategories/delete/{id} Delete subCategory.

GetAllAsync

GET /subcategories/getAll Get all subCategories (public).

GetByCategoryIdAsync

GET /subcategories/getByCategoryId/{categoryId} Get subCategories by parent category id (public).

GetByIdAsync

GET /subcategories/getById/{id} Get subCategory by id (public).

GetBySlugAsync

GET /subcategories/getBySlug/{slug} Get subCategory by slug (public).

UpdateAsync

PUT /subcategories/update Update subCategory. Partial update. Provide only fields to change, plus id.

Tag

Free-form labels attached to articles.

CreateAsync

POST /tags/create Create a new tag. Manually create a new tag

GetAllAsync

GET /tags/getAll Get all tags for current tenant. Returns a paginated list of all tags for your tenant. No user authentication is required.

SearchAsync

GET /tags/search Search tags. Case-insensitive partial name match against the tags of your tenant. No user authentication is required.