/** * AI Visibility backend endpoint paths. * * Paths are relative to the agent backend base URL * (``NEXT_PUBLIC_RECOMAZE_AGENT_BASE_URL``), which already ends with * ``/api/``. So constants here are bare paths (e.g. ``visibility/settings``) * - no leading ``/api/`` and no leading slash. Matches the convention used * by the other service route modules. */ export const VISIBILITY_SETTINGS = 'visibility/settings'; export const VISIBILITY_BRANDS = 'visibility/brands'; export const visibilityBrand = (brandId: string): string => `${VISIBILITY_BRANDS}/${encodeURIComponent(brandId)}`; export const visibilityBrandStoreContext = (brandId: string): string => `${visibilityBrand(brandId)}/store-context`; export const visibilityBrandStoreContextRegenerate = ( brandId: string ): string => `${visibilityBrandStoreContext(brandId)}/regenerate`; export const visibilityBrandScan = (brandId: string): string => `${visibilityBrand(brandId)}/scan`; export const visibilityBrandScanStatus = (brandId: string): string => `${visibilityBrandScan(brandId)}/status`; export const visibilityBrandScans = (brandId: string): string => `${visibilityBrand(brandId)}/scans`; export const visibilityBrandReport = ( brandId: string, weekIso: string ): string => `${visibilityBrand(brandId)}/reports/${encodeURIComponent(weekIso)}`; export const visibilityBrandCompetitors = (brandId: string): string => `${visibilityBrand(brandId)}/competitors`; export const visibilityTrackedCompetitors = (brandId: string): string => `${visibilityBrand(brandId)}/tracked-competitors`; export const visibilityTrackedCompetitor = ( brandId: string, competitorDomain: string ): string => `${visibilityTrackedCompetitors(brandId)}/${encodeURIComponent(competitorDomain)}`; /** * ``/api/visibility/brands/{brand_id}/excluded-competitors`` - GET/POST the * list of competitor domains the merchant has suppressed from the * leaderboard. Suppressed domains are also skipped at scan time so they * stop appearing on future weeks. * * @param {string} brandId - The brand identifier. * @returns {string} Fully-qualified path to the excluded-competitors collection. */ export const visibilityExcludedCompetitors = (brandId: string): string => `${visibilityBrand(brandId)}/excluded-competitors`; /** * ``/api/visibility/brands/{brand_id}/excluded-competitors/{domain}`` - * DELETE to bring a previously excluded competitor back into the leaderboard. * * @param {string} brandId - The brand identifier. * @param {string} competitorDomain - Canonical domain to un-exclude. * @returns {string} Fully-qualified path to the excluded-competitor resource. */ export const visibilityExcludedCompetitor = ( brandId: string, competitorDomain: string ): string => `${visibilityExcludedCompetitors(brandId)}/${encodeURIComponent(competitorDomain)}`; export const visibilityBrandPrompts = (brandId: string): string => `${visibilityBrand(brandId)}/prompts`; export const visibilityBrandPromptsRegenerate = (brandId: string): string => `${visibilityBrandPrompts(brandId)}/regenerate`; /** * ``visibility/brands/{brand_id}/prompts/metrics`` - GET per-prompt * composite-score trends for the tracked-prompts list. * * @param brandId {string} The brand identifier. * @returns {string} Fully-qualified path to the per-prompt metrics endpoint. */ export const visibilityBrandPromptMetrics = (brandId: string): string => `${visibilityBrandPrompts(brandId)}/metrics`; /** * ``/api/visibility/brands/{brand_id}/prompts/{prompt_id}`` - PATCH to * rewrite a single tracked prompt's text. Category, language, and the * enabled flag are preserved server-side. * * @param {string} brandId - The brand identifier. * @param {string} promptId - The prompt identifier. * @returns {string} Fully-qualified path to the prompt resource. */ export const visibilityPrompt = (brandId: string, promptId: string): string => `${visibilityBrandPrompts(brandId)}/${encodeURIComponent(promptId)}`; export const visibilityPromptRegenerate = ( brandId: string, promptId: string ): string => `${visibilityPrompt(brandId, promptId)}/regenerate`; export const visibilityPromptResponses = ( brandId: string, promptId: string ): string => `${visibilityBrandPrompts(brandId)}/${encodeURIComponent(promptId)}/responses`; /** * ``visibility/brands/{brand_id}/prompt-outcomes/{week_iso}`` - per-prompt * engine verdicts and rivals for one scanned week. * * @param {string} brandId - The brand identifier. * @param {string} weekIso - ISO week (``YYYY-WNN``). * @returns {string} Fully-qualified path to the prompt-outcomes endpoint. */ export const visibilityPromptOutcomes = ( brandId: string, weekIso: string ): string => `${visibilityBrand(brandId)}/prompt-outcomes/${encodeURIComponent(weekIso)}`; export const visibilityBrandProblems = (brandId: string): string => `${visibilityBrand(brandId)}/problems`; export const visibilityBrandSuggestions = (brandId: string): string => `${visibilityBrand(brandId)}/suggestions`; export const visibilityBrandSuggestionsRefresh = (brandId: string): string => `${visibilityBrandSuggestions(brandId)}/refresh`; /** * ``/api/visibility/brands/{brand_id}/suggestions/from-brief`` - POST to * generate up to five article ideas from a merchant-supplied brief. * * @param {string} brandId - The brand identifier. * @returns {string} Fully-qualified path to the brief-driven ideas endpoint. */ export const visibilityBrandSuggestionsFromBrief = (brandId: string): string => `${visibilityBrandSuggestions(brandId)}/from-brief`; export const visibilityBrandSuggestion = ( brandId: string, suggestionId: string ): string => `${visibilityBrandSuggestions(brandId)}/${encodeURIComponent(suggestionId)}`; /** * ``visibility/brands/{brand_id}/page-templates`` - GET list (optionally * ``?content_type=``) / POST create a reusable page-content brief. * * @param brandId {string} The brand identifier. * @returns {string} Fully-qualified path to the page-templates collection. */ export const visibilityPageTemplates = (brandId: string): string => `${visibilityBrand(brandId)}/page-templates`; /** * ``visibility/brands/{brand_id}/page-templates/{template_id}`` - GET one * / PATCH edit / DELETE a saved page-content brief. * * @param brandId {string} The brand identifier. * @param templateId {string} The page-template identifier. * @returns {string} Fully-qualified path to the page-template resource. */ export const visibilityPageTemplate = ( brandId: string, templateId: string ): string => `${visibilityPageTemplates(brandId)}/${encodeURIComponent(templateId)}`; /** * ``visibility/page-template-presets`` - GET the global Recomaze-shipped * preset catalog. Not brand-scoped: every merchant reads the same seeded list. */ export const VISIBILITY_PAGE_TEMPLATE_PRESETS = 'visibility/page-template-presets'; export const VISIBILITY_ARTICLES_GENERATE = 'visibility/articles/generate'; export const VISIBILITY_ARTICLES_BULK = 'visibility/articles/bulk'; export const visibilityArticlesBulkJob = (jobId: string): string => `${VISIBILITY_ARTICLES_BULK}/${encodeURIComponent(jobId)}`; export const VISIBILITY_ARTICLES = 'visibility/articles'; export const visibilityArticle = (articleId: string): string => `${VISIBILITY_ARTICLES}/${encodeURIComponent(articleId)}`; export const visibilityArticleRegenerate = (articleId: string): string => `${visibilityArticle(articleId)}/regenerate`; /** * ``/api/visibility/articles/{article_id}/prompt-impact`` - GET per-prompt * visibility impact since publish (Beta). * * @param {string} articleId - The article identifier. * @returns {string} Fully-qualified path to the article prompt-impact endpoint. */ export const visibilityArticlePromptImpact = (articleId: string): string => `${visibilityArticle(articleId)}/prompt-impact`; /** * ``/api/visibility/articles/{article_id}/publish`` - POST to flip a * ``ready`` article to ``published``. * * @param articleId {string} The article identifier. * @returns {string} Fully-qualified path to the article-publish endpoint. */ export const visibilityArticlePublish = (articleId: string): string => `${visibilityArticle(articleId)}/publish`; export const visibilityArticlePublishToBlog = (articleId: string): string => `${visibilityArticle(articleId)}/publish-to-blog`; /** * ``/api/visibility/articles/publish-schedule`` - POST to queue reviewed * articles for automatic live publishing, GET to list the merchant's queues * so each article row can show the day it is due. * * @returns {string} Fully-qualified path to the publish-schedule collection. */ export const visibilityArticlePublishSchedule = (): string => `${VISIBILITY_ARTICLES}/publish-schedule`; /** * ``/api/visibility/articles/publish-schedule/{schedule_id}`` - DELETE to * cancel a queue; anything already published stays published. * * @param {string} scheduleId - The queue identifier. * @returns {string} Fully-qualified path to the publish-schedule resource. */ export const visibilityArticlePublishScheduleCancel = ( scheduleId: string ): string => `${visibilityArticlePublishSchedule()}/${encodeURIComponent(scheduleId)}`; /** * ``/api/visibility/articles/{article_id}/publish-schedule`` - PATCH to move * one queued article to a different day; the rest of its batch keeps the days * it was already given. * * @param articleId {string} The queued article identifier. * @returns {string} Fully-qualified path to the article-reschedule endpoint. */ export const visibilityArticleReschedule = (articleId: string): string => `${visibilityArticle(articleId)}/publish-schedule`; /** * ``/api/visibility/articles/{article_id}/unpublish`` - POST to revert a * ``published`` article back to ``ready``. * * @param articleId {string} The article identifier. * @returns {string} Fully-qualified path to the article-unpublish endpoint. */ export const visibilityArticleUnpublish = (articleId: string): string => `${visibilityArticle(articleId)}/unpublish`; export const visibilityArticleVersions = (articleId: string): string => `${visibilityArticle(articleId)}/versions`; export const visibilityArticleVersion = ( articleId: string, versionId: string ): string => `${visibilityArticleVersions(articleId)}/${encodeURIComponent(versionId)}`; export const visibilityBrandChatVolumes = (brandId: string): string => `${visibilityBrand(brandId)}/chat-prompt-volumes`; export const visibilityBrandStopTrackingChat = (brandId: string): string => `${visibilityBrandPrompts(brandId)}/stop-tracking-chat`; /** ``visibility/brands/{brand_id}/funnel-coverage`` - GET (Beta). */ export const visibilityBrandFunnelCoverage = (brandId: string): string => `${visibilityBrand(brandId)}/funnel-coverage`; /** ``visibility/brands/{brand_id}/cited-sources`` - GET (Beta). */ export const visibilityBrandCitedSources = (brandId: string): string => `${visibilityBrand(brandId)}/cited-sources`;