{"openapi":"3.0.0","paths":{"/debug/check-indexation-state":{"post":{"operationId":"DebugController_checkIndexationState","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexationStateCheckOnePageDto"}}}},"responses":{"200":{"description":""}},"tags":["Debug"]}},"/debug/check-indexation-state-all-website":{"post":{"operationId":"DebugController_checkIndexationStateAllWebsites","parameters":[],"responses":{"200":{"description":""}},"tags":["Debug"]}},"/debug/indexation/check-non-indexed-pages":{"post":{"operationId":"DebugController_checkIndexationStateNonIndexedPages","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexationStateCheckNonIndexedPagesDto"}}}},"responses":{"200":{"description":""}},"tags":["Debug"]}},"/debug/sitemap/sync":{"post":{"operationId":"DebugController_sitemap_sync","parameters":[],"responses":{"200":{"description":""}},"tags":["Debug"]}},"/debug/check-indexation-state-filter":{"post":{"operationId":"DebugController_checkIndexationStateFilter","parameters":[],"responses":{"200":{"description":""}},"tags":["Debug"]}},"/debug/crash":{"get":{"operationId":"DebugController_crash","parameters":[],"responses":{"200":{"description":""}},"tags":["Debug"]}},"/debug/index":{"post":{"operationId":"DebugController_index","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexationStateCheckOnePageDto"}}}},"responses":{"200":{"description":""}},"tags":["Debug"]}},"/debug/check_if_api_is_connected_to_postgres_private":{"get":{"operationId":"DebugController_check_if_api_is_connected_to_postgres_private","parameters":[],"responses":{"200":{"description":""}},"tags":["Debug"]}},"/websites":{"post":{"operationId":"WebsitesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebsiteDto"}}}},"responses":{"200":{"description":""}},"tags":["Websites"]},"delete":{"operationId":"WebsitesController_removeWebsite","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDeleteDto"}}}},"responses":{"200":{"description":""}},"tags":["Websites"]},"get":{"operationId":"WebsitesController_findAll","parameters":[],"responses":{"200":{"description":""}},"tags":["Websites"]}},"/websites/reset":{"post":{"operationId":"WebsitesController_reset","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDeleteDto"}}}},"responses":{"200":{"description":""}},"tags":["Websites"]}},"/websites/set-analytics-activated":{"post":{"operationId":"WebsitesController_setAnalyticsActivated","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetAnalyticsActivatedDto"}}}},"responses":{"200":{"description":""}},"tags":["Websites"]}},"/websites/get-users":{"post":{"operationId":"WebsitesController_getUsers","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDtoFetchUsers"}}}},"responses":{"200":{"description":""}},"tags":["Websites"]}},"/websites/add-user":{"post":{"operationId":"WebsitesController_addUser","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDtoAddUser"}}}},"responses":{"200":{"description":""}},"tags":["Websites"]}},"/websites/remove-user":{"delete":{"operationId":"WebsitesController_removeUser","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDtoAddUser"}}}},"responses":{"200":{"description":""}},"tags":["Websites"]}},"/websites/setpublic":{"put":{"operationId":"WebsitesController_updatePublic","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebsitePublicDto"}}}},"responses":{"200":{"description":""}},"tags":["Websites"]}},"/websites/sources":{"put":{"operationId":"WebsitesController_updateSource","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebsiteSourceDto"}}}},"responses":{"200":{"description":""}},"tags":["Websites"]}},"/websites/all-stats-websites":{"get":{"operationId":"WebsitesController_getWebsiteStatsForUserWebsites","parameters":[],"responses":{"200":{"description":""}},"tags":["Websites"]}},"/websites/public/{websiteId}":{"get":{"operationId":"WebsitesController_findPublic","parameters":[{"name":"websiteId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Websites"]}},"/websites/check":{"get":{"operationId":"WebsitesController_checkWebsite","parameters":[{"name":"website","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Websites"]}},"/websites/update-google-cloud-api":{"put":{"operationId":"WebsitesController_updateGoogleCloudApi","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleCloudApiKeyDto"}}}},"responses":{"200":{"description":""}},"tags":["Websites"]}},"/websites/google":{"get":{"operationId":"WebsitesController_google","parameters":[],"responses":{"200":{"description":""}},"tags":["Websites"]}},"/websites/why-my-website-cannot-be-checked-by-google":{"post":{"operationId":"WebsitesController_why_my_website_cannot_be_checked_by_google","parameters":[],"responses":{"200":{"description":""}},"tags":["Websites"]}},"/websites/update-search-console-domain":{"put":{"operationId":"WebsitesController_updateSearchConsoleDomain","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSearchConsoleDomainDto"}}}},"responses":{"200":{"description":""}},"tags":["Websites"]}},"/v1/websites":{"get":{"description":"Returns the websites the API key owner can access. Use the website id with analytics endpoints.","operationId":"WebsitesPublicController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List websites","tags":["Public API"]}},"/playground":{"get":{"operationId":"PlaygroundBingController_getBingData","parameters":[],"responses":{"200":{"description":""}},"tags":["PlaygroundBing"]}},"/indexation":{"post":{"operationId":"IndexationController_index","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexDto"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/settings":{"post":{"operationId":"IndexationController_getSettings","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexationGetSettingsDto"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]},"put":{"operationId":"IndexationController_putSettings","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexationPutSettingsDto"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/check-indexation-state":{"post":{"operationId":"IndexationController_checkIndexationState","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexationStateCheckOnePageDto"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/settings/toggle-source":{"put":{"operationId":"IndexationController_putSettingsToggleSource","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexationPutSettingsToggleSourceDto"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/cron":{"post":{"operationId":"IndexationController_indexationCron","parameters":[],"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/cron/check":{"post":{"operationId":"IndexationController_cronIndexationStateCheck","parameters":[],"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/bulk":{"post":{"operationId":"IndexationController_bulkIndex","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexBulkDto"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/bulk/check":{"post":{"operationId":"IndexationController_bulkCheck","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexBulkDto"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/bulk/queue":{"post":{"operationId":"IndexationController_bulkIndexQueue","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexBulkDto"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/filters-to-queue":{"post":{"operationId":"IndexationController_advancedFilterToQueue","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindPagesDto"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/csv":{"post":{"operationId":"IndexationController_downloadCsv","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindPagesDto"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/filters-to-check":{"post":{"operationId":"IndexationController_advancedFilterToCheck","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindPagesDto"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/indexnow/check":{"post":{"operationId":"IndexationController_checkIndexNowInstallation","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckIndexNowDto"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/queue":{"post":{"operationId":"IndexationController_fetchQueue","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexationFetchQueueDto"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]},"delete":{"operationId":"IndexationController_emptyQueue","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexationGoogleCloudApiKeyDelete"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/report":{"post":{"operationId":"IndexationController_fetchReport","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexationFetchReportDto"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/google_cloud_api_keys/{website}":{"get":{"operationId":"IndexationController_GoogleCloudApiKeyGet","parameters":[{"name":"website","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/google_cloud_api_keys/check":{"put":{"operationId":"IndexationController_GoogleCloudApiKeyCheck","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexationGoogleCloudApiCheckDto"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/google_cloud_api_keys":{"post":{"operationId":"IndexationController_GoogleCloudApiKeyCreate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexationGoogleCloudApiKeyCreate"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]},"delete":{"operationId":"IndexationController_GoogleCloudApiKeyDelete","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexationGoogleCloudApiKeyDelete"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/indexation/check-error-unknown-pages":{"post":{"operationId":"IndexationController_checkErrorUnknownPages","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexationCheckErrorUnknownPagesDto"}}}},"responses":{"200":{"description":""}},"tags":["Indexation"]}},"/pages":{"get":{"operationId":"PagesController_findAll","parameters":[],"responses":{"200":{"description":""}},"tags":["Pages"]}},"/pages/count":{"get":{"operationId":"PagesController_countAll","parameters":[],"responses":{"200":{"description":""}},"tags":["Pages"]}},"/pages/stats":{"get":{"operationId":"PagesController_getStats","parameters":[],"responses":{"200":{"description":""}},"tags":["Pages"]}},"/pages/add-pages-manually":{"post":{"operationId":"PagesController_addPagesManually","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddPagesManuallyDto"}}}},"responses":{"200":{"description":""}},"tags":["Pages"]}},"/":{"get":{"operationId":"PingController_ping","parameters":[],"responses":{"200":{"description":""}},"tags":["Ping"]}},"/stats/users/total":{"get":{"operationId":"StatsController_getPaddlePrices","parameters":[],"responses":{"200":{"description":""}},"tags":["Stats"]}},"/stats/indexation/indexed/total":{"get":{"operationId":"StatsController_getPagesIndexed","parameters":[],"responses":{"200":{"description":""}},"tags":["Stats"]}},"/stats/users/newSince":{"get":{"operationId":"StatsController_getNewUsersSince","parameters":[{"name":"days","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Stats"]}},"/stats/increase/clicks/after":{"get":{"operationId":"StatsController_increaseClicksAfter","parameters":[{"name":"days","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Stats"]}},"/stats/indexation_through_time":{"post":{"operationId":"StatsController_IndexationThroughTimeGet","parameters":[],"responses":{"200":{"description":""}},"tags":["Stats"]}},"/stats/websites_indexation_through_time":{"post":{"operationId":"StatsController_WebsiteIndexationThroughTimeGet","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsGetWebsiteStatsIndexationDto"}}}},"responses":{"200":{"description":""}},"tags":["Stats"]}},"/stats/websites_indexation_through_time/recalculate":{"post":{"operationId":"StatsController_WebsiteIndexationThroughTimeRecalculate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsGetWebsiteStatsIndexationDto"}}}},"responses":{"200":{"description":""}},"tags":["Stats"]}},"/sitemap/fetch-all":{"post":{"operationId":"SitemapsController_fetchAll","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitemapFetchAllDto"}}}},"responses":{"200":{"description":""}},"tags":["Sitemaps"]}},"/sitemap/delete":{"delete":{"operationId":"SitemapsController_deleteSitemap","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitemapDeleteDto"}}}},"responses":{"200":{"description":""}},"tags":["Sitemaps"]}},"/sitemap":{"put":{"operationId":"SitemapsController_update","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebsiteDto"}}}},"responses":{"200":{"description":""}},"tags":["Sitemaps"]}},"/sitemap/sync":{"post":{"operationId":"SitemapsController_sync","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cronSitemapAndIndexationDto"}}}},"responses":{"200":{"description":""}},"tags":["Sitemaps"]}},"/sitemap/free-tool/run":{"post":{"operationId":"SitemapsController_run","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitemapRunDto"}}}},"responses":{"200":{"description":""}},"tags":["Sitemaps"]}},"/analytics/website":{"post":{"operationId":"AnalyticsController_fetchAnalyticsDataForOneWebsite","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStatsDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"tags":["Analytics"]}},"/analytics/website/date":{"post":{"description":"Retrieves date-based analytics statistics for a specific website. Returns a RankingStatsForFrontend object with global stats, date statistics, and source information.","operationId":"AnalyticsController_fetch_date_stats_for_one_website","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStatsDto"}}}},"responses":{"200":{"description":"Analytics statistics including date stats and global metrics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsFetchDateStatsResponseDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Fetch date statistics for a website","tags":["Analytics"]}},"/analytics/website/histogram":{"post":{"operationId":"AnalyticsController_getStatsForHistogram","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStatsHistogramDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"tags":["Analytics"]}},"/v1/analytics/website":{"post":{"description":"Returns Search Console analytics including clicks, impressions, position and CTR, broken down by date, country, device, query and page.","operationId":"AnalyticsPublicController_fetch_analytics_data_for_one_website","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStatsDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Fetch analytics data for a website","tags":["Public API"]}},"/v1/analytics/website/date":{"post":{"description":"Retrieves date-based analytics statistics for a specific website.","operationId":"AnalyticsPublicController_fetch_date_stats_for_one_website","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStatsDto"}}}},"responses":{"200":{"description":"Analytics statistics including date stats and global metrics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsFetchDateStatsResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Fetch date statistics for a website","tags":["Public API"]}},"/v1/analytics/website/histogram":{"post":{"description":"Retrieves histogram analytics broken down by query, source, country or device.","operationId":"AnalyticsPublicController_get_stats_for_histogram","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStatsHistogramDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Fetch histogram statistics for a website","tags":["Public API"]}},"/todos/create_todo":{"post":{"operationId":"TodoController_create_todo","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TodoCreateTodoDto"}}}},"responses":{"201":{"description":""}},"tags":["Todo"]}},"/todos/update_todo":{"post":{"operationId":"TodoController_update_todo","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TodoUpdateTodoDto"}}}},"responses":{"201":{"description":""}},"tags":["Todo"]}},"/todos/get_todos":{"post":{"operationId":"TodoController_get_todos","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TodoGetTodosDto"}}}},"responses":{"201":{"description":""}},"tags":["Todo"]}},"/todos/delete_todo":{"post":{"operationId":"TodoController_delete_todo","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TodoDeleteTodoDto"}}}},"responses":{"201":{"description":""}},"tags":["Todo"]}},"/keywords/create_keywords":{"post":{"operationId":"KeywordsController_create_keywords","parameters":[],"responses":{"201":{"description":""}},"tags":["Keywords"]}},"/keywords/delete_keywords":{"post":{"operationId":"KeywordsController_delete_keywords","parameters":[],"responses":{"201":{"description":""}},"tags":["Keywords"]}},"/keywords/get_keywords":{"post":{"operationId":"KeywordsController_get_keywords","parameters":[],"responses":{"201":{"description":""}},"tags":["Keywords"]}},"/keywords/get_keyword_with_position":{"post":{"operationId":"KeywordsController_get_positions","parameters":[],"responses":{"201":{"description":""}},"tags":["Keywords"]}},"/keywords/create-default-keywords-for-all-websites":{"post":{"operationId":"KeywordsController_create_default_keywords_for_all_websites","parameters":[],"responses":{"201":{"description":""}},"tags":["Keywords"]}},"/payments/paddle/webhook":{"post":{"description":"Receives Paddle webhook events (subscription_created, subscription_cancelled, subscription_payment_succeeded). Called by Paddle, not by clients.","operationId":"PaymentsController_receive_payment","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentWebhookBodyDto"}}}},"responses":{"200":{"description":"Webhook processed successfully"}},"summary":"Paddle webhook","tags":["Payments"]}},"/payments/me":{"get":{"description":"Returns the authenticated user's subscription(s). Requires JWT.","operationId":"PaymentsController_get_payment_profile","parameters":[],"responses":{"200":{"description":"List of user subscriptions","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PaymentEntityDto"}}}}}},"security":[{"JWT-auth":[]}],"summary":"Get payment profile","tags":["Payments"]}},"/payments/change-plan":{"post":{"description":"Changes the subscription plan (upgrade or downgrade). Uses proration without refund. Plan change is applied immediately. Requires JWT.","operationId":"PaymentsController_change_plan","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentsChangePlanDto"}}}},"responses":{"200":{"description":"Updated payment/subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentsChangePlanOutputDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Change plan","tags":["Payments"]}},"/payments/plans":{"get":{"description":"Returns the list of available slider pricing plans (9€ to 129€) with Paddle plan IDs, prices, and credit allocations. Public endpoint.","operationId":"PaymentsController_get_pricing_plans","parameters":[],"responses":{"200":{"description":"List of pricing plans","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PricingPlanItemDto"}}}}}},"summary":"Get pricing plans","tags":["Payments"]}},"/payments/invoices":{"get":{"description":"Returns all invoices for the authenticated user's subscriptions. Requires JWT.","operationId":"PaymentsController_get_invoices","parameters":[],"responses":{"200":{"description":"List of invoices","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceItemDto"}}}}}},"security":[{"JWT-auth":[]}],"summary":"Get invoices","tags":["Payments"]}},"/roast":{"post":{"operationId":"RoastController_roast","parameters":[],"responses":{"200":{"description":""}},"tags":["Roast"]},"get":{"operationId":"RoastController_fetch","parameters":[],"responses":{"200":{"description":""}},"tags":["Roast"]}},"/roast/fetch_websites":{"post":{"operationId":"RoastController_fetch_websites","parameters":[],"responses":{"200":{"description":""}},"tags":["Roast"]}},"/feedbacks/submit_nps_score":{"post":{"operationId":"FeedbacksController_submit_nps_score","parameters":[],"responses":{"201":{"description":""}},"tags":["Feedbacks"]}},"/feedbacks/should_ask_nps_score":{"post":{"operationId":"FeedbacksController_should_ask_nps_score","parameters":[],"responses":{"201":{"description":""}},"tags":["Feedbacks"]}},"/auth/google/url":{"get":{"operationId":"AuthenticationController_getGoogleAuthenticationUrl","parameters":[{"name":"callback","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Authentication"]}},"/auth/google/callback":{"post":{"operationId":"AuthenticationController_googleCallback","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleCallbackDto"}}}},"responses":{"200":{"description":""}},"tags":["Authentication"]}},"/auth/google/add-search-console/callback":{"post":{"operationId":"AuthenticationController_addSearchConsoleCallback","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleCallbackDto"}}}},"responses":{"200":{"description":""}},"tags":["Authentication"]}},"/auth/parents":{"get":{"operationId":"AuthenticationController_GoogleSearchConsoleGetParents","parameters":[],"responses":{"200":{"description":""}},"tags":["Authentication"]}},"/auth/children":{"get":{"operationId":"AuthenticationController_GoogleSearchConsoleGetChildren","parameters":[],"responses":{"200":{"description":""}},"tags":["Authentication"]}},"/auth/google-search-account":{"delete":{"operationId":"AuthenticationController_GoogleSearchConsoleDelete","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthGoogleSearchAccountDeleteDto"}}}},"responses":{"200":{"description":""}},"tags":["Authentication"]}},"/auth/bing/url":{"get":{"operationId":"AuthenticationController_getBingAuthenticationUrl","parameters":[{"name":"callback","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Authentication"]}},"/auth/bing/callback":{"post":{"operationId":"AuthenticationController_bingCallback","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BingCallbackDto"}}}},"responses":{"200":{"description":""}},"tags":["Authentication"]}},"/auth/yandex/url":{"get":{"operationId":"AuthenticationController_getYandexAuthenticationUrl","parameters":[{"name":"callback","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Authentication"]}},"/auth/yandex/callback":{"post":{"operationId":"AuthenticationController_yandexCallback","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BingCallbackDto"}}}},"responses":{"200":{"description":""}},"tags":["Authentication"]}},"/auth/profile":{"get":{"operationId":"AuthenticationController_getProfile","parameters":[],"responses":{"200":{"description":""}},"tags":["Authentication"]}},"/auth/sources":{"get":{"operationId":"AuthenticationController_getSources","parameters":[],"responses":{"200":{"description":""}},"tags":["Authentication"]}},"/ai_assistant/chat":{"post":{"description":"Chat with the AI assistant. Use the 'feature' parameter to customize the assistant's behavior: 'indexation' for indexation issues, 'seo_strategy' for SEO planning, or 'general' for general SEO questions.","operationId":"AiAssistantController_chat","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiAssistantChatRequestDto"}}}},"responses":{"200":{"description":"The AI assistant chat response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiAssistantChatResponseDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Start a chat with the AI assistant","tags":["AI Assistant"]}},"/ai_assistant/usage":{"get":{"description":"Returns the number of AI requests used in the current billing period and the limit for the user.","operationId":"AiAssistantController_get_usage","parameters":[],"responses":{"200":{"description":"Current AI usage statistics.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiUsageResponseDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Get current AI usage statistics","tags":["AI Assistant"]}},"/ai_assistant/chat/create":{"post":{"description":"Creates a new chat history with an empty messages array. Returns the created chat with its generated ID.","operationId":"AiAssistantController_create_chat","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiChatHistoryCreateDto"}}}},"responses":{"200":{"description":"The newly created chat history.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiChatHistoryGetResponseDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Create a new chat history","tags":["AI Assistant"]}},"/ai_assistant/chat/save":{"post":{"description":"Saves or updates a chat history. If the chat ID already exists, it will update the existing chat and preserve the created_at timestamp. Otherwise, it creates a new chat.","operationId":"AiAssistantController_save_chat","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiChatHistorySaveDto"}}}},"responses":{"200":{"description":"The saved chat history.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiChatHistoryGetResponseDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Save or update a chat history","tags":["AI Assistant"]}},"/ai_assistant/chat/list":{"post":{"description":"Returns all chat histories for the specified website, ordered by updated_at descending.","operationId":"AiAssistantController_list_chats","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiChatHistoryListDto"}}}},"responses":{"200":{"description":"List of chat histories for the website.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AiChatHistoryListResponseDto"}}}}}},"security":[{"JWT-auth":[]}],"summary":"Get all chat histories for a website","tags":["AI Assistant"]}},"/ai_assistant/get_chat":{"post":{"description":"Returns a chat history by its ID. The user must own the chat history and the associated website. Returns null if the chat history does not exist.","operationId":"AiAssistantController_get_chat","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiChatHistoryGetDto"}}}},"responses":{"200":{"description":"The chat history, or null if not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiChatHistoryGetResponseDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Get a chat history by ID","tags":["AI Assistant"]}},"/ai_assistant/rename_chat":{"post":{"description":"Renames a chat history by ID. The user must own the chat history and the associated website.","operationId":"AiAssistantController_rename_chat","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiChatHistoryRenameDto"}}}},"responses":{"200":{"description":"The renamed chat history.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiChatHistoryGetResponseDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Rename a chat history","tags":["AI Assistant"]}},"/ai_assistant/auto_rename_chat":{"post":{"description":"Automatically generates and sets a title for a chat history based on the first user message using AI. The user must own the chat history and the associated website.","operationId":"AiAssistantController_auto_rename_chat","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiChatHistoryAutoRenameDto"}}}},"responses":{"200":{"description":"The auto-renamed chat history.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiChatHistoryGetResponseDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Auto-rename a chat history based on first user message","tags":["AI Assistant"]}},"/ai_assistant/delete_chat":{"post":{"description":"Deletes a chat history by ID. The user must own the chat history and the associated website.","operationId":"AiAssistantController_delete_chat","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiChatHistoryDeleteDto"}}}},"responses":{"200":{"description":"Chat history successfully deleted."}},"security":[{"JWT-auth":[]}],"summary":"Delete a chat history","tags":["AI Assistant"]}},"/health/check":{"post":{"description":"Performs a comprehensive health check on a website including robots.txt, server configuration, and sitemap validation. Returns health issues found.","operationId":"HealthController_check","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthCheckInputDto"}}}},"responses":{"200":{"description":"Health check results for the website","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthIssueResponseDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Run health check for a website","tags":["Health"]}},"/health/get_website":{"post":{"description":"Retrieves existing health issues for a website. If no health issues exist, automatically runs a health check and returns the results.","operationId":"HealthController_get_website","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthGetWebsiteInputDto"}}}},"responses":{"200":{"description":"Health issues for the website","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthIssueResponseDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Get health issues for a website","tags":["Health"]}},"/audit/start":{"post":{"description":"Starts a new audit for a website. User must own the website. Only one audit can be in progress per website.","operationId":"AuditController_start","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditStartInputDto"}}}},"responses":{"200":{"description":"The created audit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditStartOutputDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Start an audit","tags":["Audit"]}},"/audit/quota":{"get":{"description":"Returns monthly audit quota usage for the user (limit, used, remaining). Optionally pass pages_to_crawl to check if starting an audit with that many pages is allowed. User must own the website.","operationId":"AuditController_quota","parameters":[{"name":"website_id","required":true,"in":"query","description":"Website ID to get quota for (user must own it)","schema":{"type":"string"}},{"name":"pages_to_crawl","required":false,"in":"query","description":"Optional. Number of pages to crawl for a planned audit; used to compute can_start.","schema":{"type":"number"}}],"responses":{"200":{"description":"Quota limit, used, remaining, and optionally can_start for requested pages","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditCheckQuotaOutputDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Get audits quota usage","tags":["Audit"]}},"/audit/cancel":{"post":{"description":"Cancels an audit. User must own the website associated with the audit.","operationId":"AuditController_cancel","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditCancelInputDto"}}}},"responses":{"200":{"description":"The audit was cancelled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditCancelOutputDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Cancel an audit","tags":["Audit"]}},"/audit/get_list_of_audits":{"post":{"description":"Retrieves all audits for a website. User must own the website.","operationId":"AuditController_get_list_of_audits","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditGetAuditsByWebsiteInputDto"}}}},"responses":{"200":{"description":"List of audits for the website","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditGetAuditsByWebsiteOutputDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Get list of audits for a website","tags":["Audit"]}},"/audit/get_last_audit":{"post":{"description":"Retrieves the most recent audit for a website. User must own the website. Returns null if no audits exist.","operationId":"AuditController_get_last_audit","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditGetLastAuditInputDto"}}}},"responses":{"200":{"description":"The last audit for the website, or null if no audits exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditGetLastAuditOutputDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Get last audit for a website","tags":["Audit"]}},"/audit/get_audit":{"post":{"description":"Retrieves a single audit by ID. User must own the website associated with the audit.","operationId":"AuditController_get_audit","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditGetAuditInputDto"}}}},"responses":{"200":{"description":"The audit details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditEntity"}}}}},"security":[{"JWT-auth":[]}],"summary":"Get audit by ID","tags":["Audit"]}},"/audit/get_audit_pages":{"post":{"description":"Retrieves audit pages with optional filter by issues and pagination (page, page_size). User must own the website associated with the audit.","operationId":"AuditController_get_audit_pages","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditGetAuditPagesInputDto"}}}},"responses":{"200":{"description":"List of audit pages with pagination metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditGetAuditPagesOutputDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Get audit pages with filters","tags":["Audit"]}},"/audit/get_issues_counts":{"post":{"description":"Retrieves the count of pages per issue type for an audit. User must own the website associated with the audit.","operationId":"AuditController_get_issues_counts","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditGetIssuesCountsInputDto"}}}},"responses":{"200":{"description":"The issues counts for the audit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditGetIssuesCountsOutputDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Get issues counts for an audit","tags":["Audit"]}},"/api-keys/create":{"post":{"description":"Creates an API key for the authenticated user. The plaintext key is returned only once.","operationId":"ApiKeysController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeysCreateDto"}}}},"responses":{"200":{"description":"Created API key. The `key` field is shown only in this response."}},"security":[{"JWT-auth":[]}],"summary":"Create an API key","tags":["API Keys"]}},"/api-keys/list":{"post":{"description":"Lists active API keys for the authenticated user.","operationId":"ApiKeysController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"List API keys","tags":["API Keys"]}},"/api-keys/revoke":{"post":{"description":"Revokes an API key owned by the authenticated user.","operationId":"ApiKeysController_revoke","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeysRevokeDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Revoke an API key","tags":["API Keys"]}}},"info":{"title":"Foudroyer API","description":"API documentation for Foudroyer","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"JWT-auth":{"scheme":"bearer","bearerFormat":"JWT","type":"http","name":"JWT","description":"Enter JWT token","in":"header"},"api-key":{"scheme":"bearer","bearerFormat":"API Key","type":"http","description":"API key (fdry_...)"}},"schemas":{"IndexationStateCheckOnePageDto":{"type":"object","properties":{}},"IndexationStateCheckNonIndexedPagesDto":{"type":"object","properties":{}},"CreateWebsiteDto":{"type":"object","properties":{}},"WebsiteDeleteDto":{"type":"object","properties":{}},"SetAnalyticsActivatedDto":{"type":"object","properties":{}},"WebsiteDtoFetchUsers":{"type":"object","properties":{}},"WebsiteDtoAddUser":{"type":"object","properties":{}},"UpdateWebsitePublicDto":{"type":"object","properties":{}},"UpdateWebsiteSourceDto":{"type":"object","properties":{}},"UpdateGoogleCloudApiKeyDto":{"type":"object","properties":{}},"UpdateSearchConsoleDomainDto":{"type":"object","properties":{}},"IndexDto":{"type":"object","properties":{}},"IndexationGetSettingsDto":{"type":"object","properties":{}},"IndexationPutSettingsDto":{"type":"object","properties":{}},"IndexationPutSettingsToggleSourceDto":{"type":"object","properties":{}},"IndexBulkDto":{"type":"object","properties":{}},"FindPagesDto":{"type":"object","properties":{}},"CheckIndexNowDto":{"type":"object","properties":{}},"IndexationFetchQueueDto":{"type":"object","properties":{}},"IndexationFetchReportDto":{"type":"object","properties":{}},"IndexationGoogleCloudApiCheckDto":{"type":"object","properties":{}},"IndexationGoogleCloudApiKeyCreate":{"type":"object","properties":{}},"IndexationGoogleCloudApiKeyDelete":{"type":"object","properties":{}},"IndexationCheckErrorUnknownPagesDto":{"type":"object","properties":{}},"AddPagesManuallyDto":{"type":"object","properties":{}},"StatsGetWebsiteStatsIndexationDto":{"type":"object","properties":{}},"SitemapFetchAllDto":{"type":"object","properties":{}},"SitemapDeleteDto":{"type":"object","properties":{}},"UpdateWebsiteDto":{"type":"object","properties":{}},"cronSitemapAndIndexationDto":{"type":"object","properties":{}},"SitemapRunDto":{"type":"object","properties":{}},"FilterEntity":{"type":"object","properties":{"source":{"type":"string","description":"Filter by source","example":"google"},"query":{"type":"string","description":"Filter by search query","example":"example query"},"country":{"type":"string","description":"Filter by country code","example":"US"},"device":{"type":"string","description":"Filter by device type","enum":["desktop","mobile","tablet"],"example":"desktop"},"page":{"type":"string","description":"Filter by page URL","example":"https://example.com/page"},"from":{"format":"date-time","type":"string","description":"Start date for the analytics period","example":"2024-01-01"},"to":{"format":"date-time","type":"string","description":"End date for the analytics period","example":"2024-01-31"}},"required":["from","to"]},"GetStatsDto":{"type":"object","properties":{"websiteId":{"type":"string","description":"The ID of the website to fetch analytics for","example":"website-123"},"filter":{"description":"Filter criteria for analytics data","allOf":[{"$ref":"#/components/schemas/FilterEntity"}]},"orderBy":{"type":"string","description":"Order by field for sorting results","enum":["clicks","click_through_rate","impressions","position","date"],"example":"clicks"}},"required":["websiteId","filter"]},"GlobalStatsDto":{"type":"object","properties":{"clicks":{"type":"number","description":"Total clicks","example":1000},"previous_clicks":{"type":"number","description":"Total clicks from previous period","example":500},"impressions":{"type":"number","description":"Total impressions","example":10000},"previous_impressions":{"type":"number","description":"Total impressions from previous period","example":5000},"position":{"type":"number","description":"Average position","example":5.2},"previous_position":{"type":"number","description":"Average position from previous period","example":10.5},"click_through_rate":{"type":"number","description":"Click-through rate percentage","example":10.5},"previous_click_through_rate":{"type":"number","description":"Click-through rate from previous period","example":10}},"required":["clicks","previous_clicks","impressions","previous_impressions","position","previous_position","click_through_rate","previous_click_through_rate"]},"DateStatItemDto":{"type":"object","properties":{"clicks":{"type":"number","description":"Number of clicks for this date","example":100},"impressions":{"type":"number","description":"Number of impressions for this date","example":1000},"position":{"type":"number","description":"Average position for this date","example":5.2},"click_through_rate":{"type":"number","description":"Click-through rate percentage","example":10.5},"date":{"type":"object","description":"Date of the stat","example":"2024-01-15"}},"required":["clicks","impressions","position","click_through_rate","date"]},"SourceStatItemDto":{"type":"object","properties":{"source":{"type":"string","description":"Source name","example":"google"},"clicks":{"type":"number","description":"Number of clicks","example":1000},"impressions":{"type":"number","description":"Number of impressions","example":10000},"position":{"type":"number","description":"Average position","example":5.2},"click_through_rate":{"type":"number","description":"Click-through rate percentage","example":10.5}},"required":["source","clicks","impressions","position","click_through_rate"]},"AnalyticsFetchDateStatsResponseDto":{"type":"object","properties":{"global":{"$ref":"#/components/schemas/GlobalStatsDto"},"date":{"type":"array","items":{"$ref":"#/components/schemas/DateStatItemDto"}},"sources":{"type":"array","items":{"$ref":"#/components/schemas/SourceStatItemDto"}},"devices":{"description":"Empty array","type":"array","items":{"$ref":"#/components/schemas/DateStatItemDto"}},"query":{"description":"Empty array","type":"array","items":{"$ref":"#/components/schemas/DateStatItemDto"}},"countries":{"description":"Empty array","type":"array","items":{"$ref":"#/components/schemas/DateStatItemDto"}},"pages":{"description":"Empty array","type":"array","items":{"$ref":"#/components/schemas/DateStatItemDto"}}},"required":["global","date","sources","devices","query","countries","pages"]},"GetStatsHistogramDto":{"type":"object","properties":{}},"TodoCreateTodoDto":{"type":"object","properties":{}},"TodoUpdateTodoDto":{"type":"object","properties":{}},"TodoGetTodosDto":{"type":"object","properties":{}},"TodoDeleteTodoDto":{"type":"object","properties":{}},"PaymentWebhookBodyDto":{"type":"object","properties":{"alert_name":{"type":"string","description":"Webhook event type","enum":["subscription_created","subscription_payment_succeeded","subscription_cancelled"]},"subscription_id":{"type":"string"},"subscription_plan_id":{"type":"string"},"cancel_url":{"type":"string"},"update_url":{"type":"string"},"user_id":{"type":"string"},"custom_data":{"type":"string"},"next_bill_date":{"format":"date-time","type":"string"},"cancellation_effective_date":{"format":"date-time","type":"string"}},"required":["alert_name"]},"PaymentEntityDto":{"type":"object","properties":{"id":{"type":"string"},"fk_user_id":{"type":"string"},"cancellation_effective_date":{"type":"object","nullable":true},"subscription_id":{"type":"string"},"cancel_url":{"type":"string"},"update_url":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"paddle_user_id":{"type":"string"},"plan":{"type":"string"},"interval":{"type":"string","enum":["monthly","yearly","lifetime"]},"paused_at":{"type":"object","nullable":true}},"required":["id","fk_user_id","cancellation_effective_date","subscription_id","cancel_url","update_url","created_at","paddle_user_id","plan","interval","paused_at"]},"PaymentsChangePlanDto":{"type":"object","properties":{"plan_id":{"type":"string","description":"Paddle plan ID (e.g. 858335 for 9€, 921925 for 19€)","example":"858335","enum":["858335","921925","851087","921926","884404","921928","921929","921930","921931","921932","921933","855460"]}},"required":["plan_id"]},"PaymentsChangePlanOutputDto":{"type":"object","properties":{"id":{"type":"string"},"fk_user_id":{"type":"string"},"cancellation_effective_date":{"type":"object","nullable":true},"subscription_id":{"type":"string"},"cancel_url":{"type":"string"},"update_url":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"paddle_user_id":{"type":"string"},"plan":{"type":"string"},"interval":{"type":"string","enum":["monthly","yearly","lifetime"]},"paused_at":{"type":"object","nullable":true}},"required":["id","fk_user_id","cancellation_effective_date","subscription_id","cancel_url","update_url","created_at","paddle_user_id","plan","interval","paused_at"]},"PricingPlanItemDto":{"type":"object","properties":{"plan_id":{"type":"string","description":"Paddle plan ID"},"name":{"type":"string","description":"Plan name (e.g. tier value)"},"price":{"type":"number","description":"Price in EUR (number)"},"ai_credits":{"type":"number","description":"AI credits included"},"crawl_credits":{"type":"number","description":"Crawl credits included"}},"required":["plan_id","name","price","ai_credits","crawl_credits"]},"InvoiceItemDto":{"type":"object","properties":{"id":{"type":"string"},"amount":{"type":"number"},"currency":{"type":"string"},"date":{"type":"string"},"status":{"type":"string"},"invoice_url":{"type":"string"}},"required":["id","amount","currency","date","status"]},"GoogleCallbackDto":{"type":"object","properties":{}},"AuthGoogleSearchAccountDeleteDto":{"type":"object","properties":{}},"BingCallbackDto":{"type":"object","properties":{}},"AiAssistantChatRequestDto":{"type":"object","properties":{"messages":{"type":"array","description":"Array of conversation messages","items":{"type":"object"}},"website_id":{"type":"string","description":"Website ID to work with"}},"required":["messages","website_id"]},"AiAssistantActionDto":{"type":"object","properties":{"type":{"type":"string","enum":["create_cards","update_cards","delete_cards"]},"description":{"type":"string","description":"Human readable explanation of why the action is needed"},"payload":{"type":"object","description":"Action payload structure changes depending on `type` (create/update/delete)."}},"required":["type","description","payload"]},"AiAssistantChatResponseDto":{"type":"object","properties":{"id":{"type":"object"},"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"object"},"timestamp":{"type":"string","format":"date-time"},"actions":{"type":"array","items":{"$ref":"#/components/schemas/AiAssistantActionDto"}}},"required":["id","role","content","timestamp","actions"]},"AiUsageResponseDto":{"type":"object","properties":{"used":{"type":"number","description":"Number of AI requests used in the current billing period","example":15},"limit":{"type":"number","description":"Maximum number of AI requests allowed per billing period","example":100},"billing_period_start":{"type":"string","description":"Start date of the current billing period","format":"date-time","example":"2024-01-01T00:00:00.000Z"}},"required":["used","limit","billing_period_start"]},"AiChatHistoryCreateDto":{"type":"object","properties":{"website_id":{"type":"string","description":"Website ID associated with the chat"}},"required":["website_id"]},"AiChatHistoryGetResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the chat history"},"user_id":{"type":"string","description":"User ID who owns the chat"},"website_id":{"type":"string","description":"Website ID associated with the chat"},"messages":{"type":"array","description":"Array of messages in the chat"},"name":{"type":"string","description":"Name of the chat"},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"updated_at":{"type":"string","description":"Last update timestamp","format":"date-time"}},"required":["id","user_id","website_id","messages","name","created_at","updated_at"]},"AiChatHistorySaveDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the chat history"},"website_id":{"type":"string","description":"Website ID associated with the chat"},"messages":{"type":"string","description":"Array of messages in the chat"},"name":{"type":"string","description":"Name of the chat"}},"required":["id","website_id","messages","name"]},"AiChatHistoryListDto":{"type":"object","properties":{"website_id":{"type":"string","description":"Website ID to fetch chat histories for"}},"required":["website_id"]},"AiChatHistoryListResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the chat history"},"user_id":{"type":"string","description":"User ID who owns the chat"},"website_id":{"type":"string","description":"Website ID associated with the chat"},"name":{"type":"string","description":"Name of the chat"},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"updated_at":{"type":"string","description":"Last update timestamp","format":"date-time"}},"required":["id","user_id","website_id","name","created_at","updated_at"]},"AiChatHistoryGetDto":{"type":"object","properties":{"chat_id":{"type":"string","description":"Chat history ID to fetch"}},"required":["chat_id"]},"AiChatHistoryRenameDto":{"type":"object","properties":{"chat_id":{"type":"string","description":"Chat history ID to rename"},"name":{"type":"string","description":"New name for the chat"}},"required":["chat_id","name"]},"AiChatHistoryAutoRenameDto":{"type":"object","properties":{"chat_id":{"type":"string","description":"Chat history ID to auto-rename"}},"required":["chat_id"]},"AiChatHistoryDeleteDto":{"type":"object","properties":{"chat_id":{"type":"string","description":"Chat history ID to delete"}},"required":["chat_id"]},"HealthCheckInputDto":{"type":"object","properties":{"website_id":{"type":"string","description":"The ID of the website to check","example":"website-123"}},"required":["website_id"]},"HealthIssueTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the issue","example":""},"type":{"type":"string","description":"Type of the issue","enum":["robots","server","sitemap"],"example":"robots"},"name":{"type":"string","description":"Name of the specific issue","enum":["robots/crawl-allowed","robots/empty","robots/javascript","server/error","server/not-https","server/not-sc-domain/not-same-url","server/not-sc-domain","server/no-index","sitemap/no-sitemap","sitemap/server-error","sitemap/bad-formed","sitemap/hreflang-without-loc","sitemap/contains-external-url","sitemap/no-same-website"],"example":"robots/empty"},"status":{"type":"string","description":"Status of the issue","enum":["pass","dont-pass","warning"],"example":"dont-pass"},"context":{"type":"object","description":"Additional context about the issue","example":{}},"created_at":{"format":"date-time","type":"string","description":"Date when the issue was created","example":"2024-01-01T00:00:00.000Z"},"updated_at":{"format":"date-time","type":"string","description":"Date when the issue was last updated","example":"2024-01-01T00:00:00.000Z"}},"required":["id","type","name","status","context","created_at","updated_at"]},"HealthIssueResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the health issue","example":"health-issue-123"},"fk_website_id":{"type":"string","description":"The website ID this health issue belongs to","example":"website-123"},"robots":{"description":"Robots.txt related issues","example":[{"id":"","type":"robots","name":"robots/empty","status":"dont-pass","context":{},"created_at":"2024-01-01T00:00:00.000Z","updated_at":"2024-01-01T00:00:00.000Z"}],"type":"array","items":{"$ref":"#/components/schemas/HealthIssueTypeDto"}},"server":{"description":"Server related issues","example":[{"id":"","type":"server","name":"server/not-https","status":"dont-pass","context":{},"created_at":"2024-01-01T00:00:00.000Z","updated_at":"2024-01-01T00:00:00.000Z"}],"type":"array","items":{"$ref":"#/components/schemas/HealthIssueTypeDto"}},"sitemap":{"description":"Sitemap related issues","example":[],"type":"array","items":{"$ref":"#/components/schemas/HealthIssueTypeDto"}},"synced_at":{"type":"object","description":"Date when the health check was last synced","example":"2024-01-01","nullable":true},"created_at":{"format":"date-time","type":"string","description":"Date when the health issue was created","example":"2024-01-01T00:00:00.000Z"},"updated_at":{"format":"date-time","type":"string","description":"Date when the health issue was last updated","example":"2024-01-01T00:00:00.000Z"}},"required":["id","fk_website_id","robots","server","sitemap","synced_at","created_at","updated_at"]},"HealthGetWebsiteInputDto":{"type":"object","properties":{"website_id":{"type":"string","description":"The ID of the website to get health issues for","example":"website-123"}},"required":["website_id"]},"AuditStartInputDto":{"type":"object","properties":{"website_id":{"type":"string","description":"Unique identifier of the website to audit"},"max_pages_limit":{"type":"number","description":"Maximum number of pages to crawl (limited by plan: indexation=10k, teams=20k, enterprise=40k)"}},"required":["website_id"]},"AuditEntity":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the audit"},"fk_website_id":{"type":"string","description":"Website ID the audit belongs to"},"status":{"type":"string","description":"Audit status","enum":["pending","in_progress","completed","failed","cancelled"]},"max_pages_limit":{"type":"number","description":"Maximum number of pages to crawl"},"started_at":{"format":"date-time","type":"string","description":"When the audit was started"},"completed_at":{"type":"object","description":"When the audit was completed","nullable":true},"cancelled_at":{"type":"object","description":"When the audit was cancelled","nullable":true},"total_pages_found":{"type":"number","description":"Total pages found during crawl"},"total_pages_crawled":{"type":"number","description":"Total pages crawled"},"total_orphan_pages":{"type":"number","description":"Total orphan pages found"},"max_depth_crawled":{"type":"number","description":"Maximum depth reached during crawl","nullable":true},"overall_score":{"type":"number","description":"Overall audit score","nullable":true},"http_code_distribution":{"type":"object","description":"HTTP status code distribution","additionalProperties":{"type":"number"},"nullable":true,"example":{"200":10,"404":2,"500":1}},"created_at":{"format":"date-time","type":"string","description":"When the audit was created"},"updated_at":{"format":"date-time","type":"string","description":"When the audit was last updated"}},"required":["id","fk_website_id","status","max_pages_limit","started_at","completed_at","cancelled_at","total_pages_found","total_pages_crawled","total_orphan_pages","max_depth_crawled","overall_score","http_code_distribution","created_at","updated_at"]},"AuditStartOutputDto":{"type":"object","properties":{"audit":{"description":"The created audit","allOf":[{"$ref":"#/components/schemas/AuditEntity"}]}},"required":["audit"]},"AuditCheckQuotaOutputDto":{"type":"object","properties":{"quota_limit":{"type":"number","description":"Monthly quota limit for audits"},"quota_used":{"type":"number","description":"Pages already used this month"},"quota_remaining":{"type":"number","description":"Remaining pages in the monthly quota"},"requested_pages":{"type":"number","description":"Requested pages for the audit"},"can_start":{"type":"boolean","description":"Whether the audit can be started"}},"required":["quota_limit","quota_used","quota_remaining","requested_pages","can_start"]},"AuditCancelInputDto":{"type":"object","properties":{"audit_id":{"type":"string","description":"Unique identifier of the audit to cancel"}},"required":["audit_id"]},"AuditCancelOutputDto":{"type":"object","properties":{"success":{"type":"boolean","description":"The audit was cancelled"}},"required":["success"]},"AuditGetAuditsByWebsiteInputDto":{"type":"object","properties":{"website_id":{"type":"string","description":"Website ID to fetch audits for"}},"required":["website_id"]},"AuditGetAuditsByWebsiteOutputDto":{"type":"object","properties":{"audits":{"description":"List of audits for the website","type":"array","items":{"$ref":"#/components/schemas/AuditEntity"}}},"required":["audits"]},"AuditGetLastAuditInputDto":{"type":"object","properties":{"website_id":{"type":"string","description":"Website ID to fetch the last audit for"}},"required":["website_id"]},"AuditGetLastAuditOutputDto":{"type":"object","properties":{"audit":{"description":"The last audit for the website, or null if no audits exist","nullable":true,"allOf":[{"$ref":"#/components/schemas/AuditEntity"}]}},"required":["audit"]},"AuditGetAuditInputDto":{"type":"object","properties":{"audit_id":{"type":"string","description":"Unique identifier of the audit to fetch"}},"required":["audit_id"]},"AuditGetAuditPagesInputDto":{"type":"object","properties":{"audit_id":{"type":"string","description":"Unique identifier of the audit"},"issues":{"type":"array","description":"Filter pages that have at least one of these issues","items":{"type":"string","enum":["orphan","redirect_3xx","error_4xx","crash_5xx","no_h1","no_title","duplicate_h1","multiple_h1"]}},"page":{"type":"number","description":"Page number (1-based)","minimum":1,"default":1},"page_size":{"type":"number","description":"Number of items per page","minimum":1,"default":20}},"required":["audit_id"]},"AuditPageEntity":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the page"},"fk_audit_id":{"type":"string","description":"Audit ID the page belongs to"},"url":{"type":"string","description":"Page URL"},"status_code":{"type":"number","description":"HTTP status code","nullable":true},"content_length":{"type":"number","description":"Response content length in bytes","nullable":true},"crawl_error_reason":{"type":"string","description":"Reason when crawl failed","nullable":true},"meta_title":{"type":"string","description":"Meta title from the page","nullable":true},"meta_description":{"type":"string","description":"Meta description from the page","nullable":true},"canonical_url":{"type":"string","description":"Canonical URL from the page","nullable":true},"meta_robots":{"type":"string","description":"Meta robots value","nullable":true},"h1":{"type":"array","description":"H1 headings found on the page","nullable":true,"items":{"type":"string"}},"h2":{"type":"array","description":"H2 headings found on the page","nullable":true,"items":{"type":"string"}},"h3":{"type":"array","description":"H3 headings found on the page","nullable":true,"items":{"type":"string"}},"h4":{"type":"array","description":"H4 headings found on the page","nullable":true,"items":{"type":"string"}},"h5":{"type":"array","description":"H5 headings found on the page","nullable":true,"items":{"type":"string"}},"h6":{"type":"array","description":"H6 headings found on the page","nullable":true,"items":{"type":"string"}},"hreflang":{"type":"array","description":"Hreflang alternate links","nullable":true,"items":{"type":"object","properties":{"lang":{"type":"string"},"href":{"type":"string"}}},"example":[{"lang":"en","href":"https://example.com/en"}]},"json_schema":{"type":"object","description":"JSON-LD schema from the page","nullable":true,"additionalProperties":true},"internal_links":{"type":"array","description":"Internal links found on the page","nullable":true,"items":{"type":"string"}},"external_links":{"type":"array","description":"External links found on the page","nullable":true,"items":{"type":"string"}},"crawled_at":{"format":"date-time","type":"string","description":"When the page was crawled","nullable":true},"crawl_depth":{"type":"number","description":"Crawl depth from root","nullable":true},"is_orphan":{"type":"boolean","description":"Whether the page is orphan (not linked from other crawled pages)"},"issues":{"type":"array","description":"Issues detected on the page","nullable":false,"items":{"type":"string","enum":["orphan","redirect_3xx","error_4xx","crash_5xx","no_h1","no_title","duplicate_h1","multiple_h1"]}},"created_at":{"format":"date-time","type":"string","description":"When the page record was created"},"updated_at":{"format":"date-time","type":"string","description":"When the page record was last updated"}},"required":["id","fk_audit_id","url","status_code","content_length","crawl_error_reason","meta_title","meta_description","canonical_url","meta_robots","h1","h2","h3","h4","h5","h6","hreflang","json_schema","internal_links","external_links","crawled_at","crawl_depth","is_orphan","issues","created_at","updated_at"]},"AuditGetAuditPagesOutputDto":{"type":"object","properties":{"pages":{"description":"List of audit pages matching the filters","type":"array","items":{"$ref":"#/components/schemas/AuditPageEntity"}},"total":{"type":"number","description":"Total number of items matching the filters"},"page":{"type":"number","description":"Current page number (1-based)"},"page_size":{"type":"number","description":"Number of items per page"},"total_pages":{"type":"number","description":"Total number of pages"},"has_next":{"type":"boolean","description":"Whether there is a next page"},"has_previous":{"type":"boolean","description":"Whether there is a previous page"}},"required":["pages","total","page","page_size","total_pages","has_next","has_previous"]},"AuditGetIssuesCountsInputDto":{"type":"object","properties":{"audit_id":{"type":"string","description":"Unique identifier of the audit"}},"required":["audit_id"]},"AuditGetIssuesCountsOutputDto":{"type":"object","properties":{"audit_id":{"type":"string","description":"Unique identifier of the audit"},"issues":{"type":"object","description":"Number of pages per issue type","example":{"orphan":2,"redirect_3xx":1,"error_4xx":0,"crash_5xx":0,"no_h1":3,"no_title":1,"duplicate_h1":0,"multiple_h1":1}}},"required":["audit_id","issues"]},"ApiKeysCreateDto":{"type":"object","properties":{"name":{"type":"string","description":"Label to identify this key","example":"MCP Cursor"},"scopes":{"type":"array","description":"Permissions granted to this key","example":["analytics:read","websites:read"],"items":{"type":"string","enum":["analytics:read","websites:read"]}}},"required":["name"]},"ApiKeysRevokeDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the API key to revoke","example":"550e8400-e29b-41d4-a716-446655440000"}},"required":["id"]}}}}