{"openapi":"3.0.3","info":{"title":"Builderly API","version":"2026-11-09","description":"Generated from the running server: every mounted route, its access, the parameters its handler reads and the models it uses.\n\n## For AI assistants: getting a token\n\nPublic endpoints (Access: Public) need no token. Everything else - changing the site, or reading its orders, bookings, customers and other private data - needs the site owner's API token.\n\nYou cannot create a token yourself, and you must not ask for the owner's password. Ask the user for a token instead - you can send them this message as it is:\n\n> To work with your site through its API, I need an API token from you:\n> 1. Sign in to your Builderly admin: https://admin.max-media.io\n> 2. Open Developers > API reference (or go straight to https://admin.max-media.io/tabs/site-builder/api-docs).\n> 3. Press \"Generate token\", copy the token and paste it here.\n> The token acts as you, so only share it in this chat. You can cancel it at any time by signing out of all devices.\n\nThen send it with every request as `Authorization: Bearer <token>`, and add `?ionic=true` to get JSON. Calls go to the site's own address (its domain), not to the reference's.\n\nThe token acts as the user: say what you will change and wait for their yes before any request that creates, changes or deletes something, never repeat the token back, and never put it in a link or a file you share.\n"},"servers":[{"url":"http://bulgariandebateassociation.max-media.io"}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}},"schemas":{"AboutPage":{"type":"object","properties":{"requiresLogin":{"type":"boolean","default":false,"description":"Only signed-in users can see the page."},"requiresSubscription":{"type":"boolean","default":false,"description":"Only subscribers of one of price_plan_ids can see the page."},"price_plan_ids":{"type":"array","items":{"type":"string"},"description":"The price plans whose subscribers can see the page, with requiresSubscription."},"title":{"type":"string","description":"The page's title, shown in the browser tab and in the admin."},"url":{"type":"string","description":"The page's address on the site: /<url>. Unique."},"redirectUrl":{"type":"string","description":"When set, visitors who open the page are sent to this address instead."},"legal_kind":{"type":"string","description":"For legal pages: which document it is, in English (Privacy Policy, Terms of Service...)."},"isPartial":{"type":"boolean","default":false,"description":"A part of other pages (a banner, a block inside a product page), not a page of its own."},"showTo":{"type":"string","default":"0","description":"Who sees the page: \"0\" everyone, \"1\" signed-in users only, \"2\" visitors who are not signed in."},"showHeader":{"type":"boolean","default":true,"description":"Show the site's header on the page."},"showFooter":{"type":"boolean","default":true,"description":"Show the site's footer on the page."},"ai_context_v2":{"type":"object","description":"Legacy, no longer written: the AI context is built on demand. Old copies are not selected and are removed by npm run migrate:strip-about-page-ai-context."},"ai_surfaces_v2":{"type":"object","description":"The editable regions the AI page modifier found on the page last time it read it; written by the AI builder."},"ai_overview":{"type":"string","description":"A short summary of the page the AI builder keeps for its own use."},"ai_generation_metadata":{"type":"object","default":null,"description":"How the AI builder generated the page (mode, prompt, timings); written by the AI builder."},"containers":{"type":"array","items":{"type":"object","properties":{"isFluid":{"type":"boolean","default":false},"parallaxEnabled":{"type":"boolean"},"parallaxAmount":{"type":"number"},"parallaxZoom":{"type":"number"},"continuousEnabled":{"type":"boolean","default":false},"continuousEffect":{"type":"string","default":"none"},"continuousDuration":{"type":"number","default":2400},"continuousIntensity":{"type":"number","default":4},"backgroundImage":{"type":"string"},"backgroundSize":{"type":"string"},"backgroundPosition":{"type":"string"},"backgroundRepeat":{"type":"string"},"backgroundVideo":{"type":"string"},"backgroundColor":{"type":"string"},"backgroundParallax":{"type":"boolean","default":false},"minHeight":{"type":"number"},"minHeightMobile":{"type":"number"},"allowOffset":{"type":"boolean","default":false},"offsetX":{"type":"number","default":0},"offsetY":{"type":"number","default":0},"offsetMobileX":{"type":"number","default":0},"offsetMobileY":{"type":"number","default":0},"zIndex":{"type":"number","default":0},"wrap_reverse":{"type":"boolean","default":false},"borderRadius":{"type":"number","default":0},"marginX":{"type":"number","default":0},"editorName":{"type":"string"},"horizontalScroll":{"type":"boolean","default":false},"horizontalScrollWidth":{"type":"number","default":100},"overflowX":{"type":"string","default":"hidden"},"columns":{"type":"array","items":{"type":"object","properties":{"size":{"type":"string"},"hoverGroup":{"type":"boolean"},"parallaxEnabled":{"type":"boolean"},"parallaxAmount":{"type":"number"},"parallaxZoom":{"type":"number"},"continuousEnabled":{"type":"boolean","default":false},"continuousEffect":{"type":"string","default":"none"},"continuousDuration":{"type":"number","default":2400},"continuousIntensity":{"type":"number","default":4},"sticky":{"type":"boolean","default":false},"justify":{"type":"string"},"align":{"type":"string"},"onHoverActions":{"type":"boolean","default":false},"onHoverTransition":{"type":"number","default":0.3},"backgroundColor":{"type":"string"},"backgroundColorOnHover":{"type":"string"},"innerBackgroundColor":{"type":"string"},"innerBackgroundColorOnHover":{"type":"string"},"backgroundImage":{"type":"string"},"backgroundSize":{"type":"string"},"backgroundPosition":{"type":"string"},"backgroundRepeat":{"type":"string"},"backgroundVideo":{"type":"string"},"paddingX":{"type":"number","default":0},"paddingXOnHover":{"type":"number","default":0},"paddingY":{"type":"number","default":0},"paddingYOnHover":{"type":"number","default":0},"innerPaddingX":{"type":"number","default":0},"innerPaddingXOnHover":{"type":"number","default":0},"innerPaddingY":{"type":"number","default":0},"allowOffset":{"type":"boolean","default":false},"offsetX":{"type":"number","default":0},"offsetY":{"type":"number","default":0},"offsetMobileX":{"type":"number","default":0},"offsetMobileY":{"type":"number","default":0},"zIndex":{"type":"number","default":0},"innerPaddingYOnHover":{"type":"number","default":0},"paddingOptions":{"type":"string"},"paddingOptionsOnHover":{"type":"string"},"innerPaddingOptions":{"type":"string"},"borderOptions":{"type":"string"},"borderOptionsOnHover":{"type":"string"},"card":{"type":"boolean","default":false},"borderRadius":{"type":"number","default":0},"borderRadiusOnHover":{"type":"number","default":0},"borderType":{"type":"string","default":"none"},"borderTypeOnHover":{"type":"string","default":"none"},"borderWidth":{"type":"number","default":0},"borderWidthOnHover":{"type":"number","default":0},"borderColor":{"type":"string","default":""},"borderColorOnHover":{"type":"string","default":""},"components":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"size":{"type":"string","default":"12"},"sticky":{"type":"boolean","default":false},"paddingX":{"type":"number","default":0},"paddingY":{"type":"number","default":0},"allowOffset":{"type":"boolean","default":false},"offsetX":{"type":"number","default":0},"offsetY":{"type":"number","default":0},"offsetMobileX":{"type":"number","default":0},"offsetMobileY":{"type":"number","default":0},"zIndex":{"type":"number","default":0},"position":{"type":"string","enum":["static","relative","absolute","fixed","sticky"],"default":"static"},"custom_measurements":{"type":"boolean","default":false},"edit_type":{"type":"string","default":"simple"},"object_fit":{"type":"string","default":"none"},"min_height":{"type":"number","default":0},"specific_border_radius":{"type":"boolean","default":false},"box_shadows":{"type":"array","items":{"type":"object","properties":{}}},"mix_blend_mode":{"type":"string","enum":["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],"default":"normal"},"paddingOptions":{"type":"string"},"backgroundColor":{"type":"string"},"card":{"type":"boolean","default":false},"borderRadius":{"type":"number","default":0},"borderType":{"type":"string","default":"none"},"borderWidth":{"type":"number","default":0},"borderColor":{"type":"string","default":""},"borderOptions":{"type":"string"},"showOnMobile":{"type":"boolean","default":true},"showOnDesktop":{"type":"boolean","default":true},"icon":{"type":"string"},"heading":{"type":"string"},"subHeading":{"type":"string"},"heading_alignment":{"type":"string"},"innerHTML":{"type":"string"},"innerCSS":{"type":"string"},"innerJS":{"type":"string"},"lineHeight":{"type":"string","default":"normal"},"medias":{"type":"array","items":{"type":"object","properties":{}}},"products":{"type":"array","items":{"type":"string"},"description":"Id of a Product."},"services":{"type":"array","items":{"type":"string"},"description":"Id of a Service."},"blogposts":{"type":"array","items":{"type":"string"},"description":"Id of a BlogPost."},"videos":{"type":"array","items":{"type":"string"},"description":"Id of a Video."},"price_plans":{"type":"array","items":{"type":"string"},"description":"Id of a PricePlan."},"href":{"type":"string","default":"#"},"router_link":{"type":"string"},"map":{"type":"string"},"animation":{"type":"string","default":"none"},"animationDuration":{"type":"number","default":0},"animationStrength":{"type":"number"},"parallaxEnabled":{"type":"boolean"},"parallaxAmount":{"type":"number"},"parallaxZoom":{"type":"number"},"textReveal":{"type":"string"},"animationDelay":{"type":"number","default":0},"animationReplay":{"type":"string","default":"once"},"animationEasing":{"type":"string","default":"power3.out"},"animationBreakpoint":{"type":"string","default":"all"},"scrollScrubEnabled":{"type":"boolean","default":false},"scrollScrubAxis":{"type":"string","default":"y"},"scrollScrubDistance":{"type":"number","default":80},"motionOrigin":{"type":"string","default":"center center"},"hoverEnabled":{"type":"boolean","default":false},"hoverEffect":{"type":"string","default":"none"},"hoverDuration":{"type":"number","default":240},"hoverIntensity":{"type":"number","default":4},"continuousEnabled":{"type":"boolean","default":false},"continuousEffect":{"type":"string","default":"none"},"continuousDuration":{"type":"number","default":2400},"continuousIntensity":{"type":"number","default":4},"statefulEnabled":{"type":"boolean","default":false},"statefulEffect":{"type":"string","default":"none"},"statefulDuration":{"type":"number","default":260},"statefulStagger":{"type":"number","default":60},"opacity":{"type":"object"},"transitionDuration":{"type":"object"},"transitionEasing":{"type":"string"},"states":{"type":"object"},"useIframe":{"type":"boolean","default":false},"collapsible_container":{"type":"array","items":{"type":"object","properties":{}}},"dynamicField":{"type":"string"},"useDynamicField":{"type":"boolean","default":false},"_id":{"type":"string"},"top":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"left":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"right":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"bottom":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"custom_width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"custom_min_width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"custom_max_width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"custom_height":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"custom_min_height":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"custom_max_height":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"aspect_ratio":{"type":"object","properties":{"custom":{"type":"boolean"},"ratio":{"type":"string"}}},"margin_left":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"margin_right":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"margin_top":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"margin_bottom":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_left":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_right":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_top":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_bottom":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"border_left":{"type":"object","properties":{"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"style":{"type":"string"}}},"border_right":{"type":"object","properties":{"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"style":{"type":"string"}}},"border_top":{"type":"object","properties":{"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"style":{"type":"string"}}},"border_bottom":{"type":"object","properties":{"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"style":{"type":"string"}}},"border_top_left_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"border_top_right_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"border_bottom_left_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"border_bottom_right_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"custom_border_radius":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string"}}},"backgroundGradient":{"type":"object","properties":{"enabled":{"type":"boolean"},"type":{"type":"string"},"degrees":{"type":"number"},"radialShape":{"type":"string"},"radialPosition":{"type":"string"},"colors":{"type":"string"},"css":{"type":"string"}}},"iconSettings":{"type":"object","properties":{"size":{"type":"number"},"color":{"type":"string"}}},"product_gallery":{"type":"object","properties":{"design_layout":{"type":"string"},"mode":{"type":"string"},"columns":{"type":"number"},"placeholderItems":{"type":"string"},"placeholderPlateColor":{"type":"string"},"showName":{"type":"boolean"},"showPrice":{"type":"boolean"},"showDescription":{"type":"boolean"},"showBrand":{"type":"boolean"},"showRibbon":{"type":"boolean"},"showRating":{"type":"boolean"},"showCart":{"type":"boolean"},"showLink":{"type":"boolean"},"linkLabel":{"type":"string"},"imageAspectRatio":{"type":"string"},"imageHeight":{"type":"number"},"imageRadius":{"type":"number"},"imageObjectFit":{"type":"string"},"cardBackgroundColor":{"type":"string"},"cardBorderRadius":{"type":"number"},"cardBorderWidth":{"type":"number"},"cardBorderColor":{"type":"string"},"cardPaddingX":{"type":"number"},"cardPaddingY":{"type":"number"},"gap":{"type":"number"},"boxShadowColor":{"type":"string"},"boxShadowOffsetY":{"type":"number"},"boxShadowBlurRadius":{"type":"number"},"boxShadowSpreadRadius":{"type":"number"},"fieldBackground":{"type":"string"},"hairlineColor":{"type":"string"},"hairlineWidth":{"type":"number"},"maxWidth":{"type":"number"},"scrimGradient":{"type":"string"},"align":{"type":"string"},"accentColor":{"type":"string"},"nameColor":{"type":"string"},"nameFontSize":{"type":"string"},"nameFontWeight":{"type":"string"},"nameFontFamily":{"type":"string"},"nameTransform":{"type":"string"},"priceColor":{"type":"string"},"priceFontSize":{"type":"string"},"priceFontWeight":{"type":"string"},"priceFontFamily":{"type":"string"},"priceFontStyle":{"type":"string"},"metaColor":{"type":"string"},"titlePosition":{"type":"string"},"imageSide":{"type":"string"},"imagePadding":{"type":"number"},"boxShadowOffsetX":{"type":"number"},"descFontSize":{"type":"string"},"descFontWeight":{"type":"string"},"animation":{"type":"string"},"animationDuration":{"type":"number"},"animationDelay":{"type":"number"},"showCustomFields":{"type":"boolean"},"cardDesign":{"type":"string"},"carouselLoop":{"type":"boolean"},"carouselControls":{"type":"boolean"},"customCss":{"type":"string"}}},"service_gallery":{"type":"object","properties":{"design_layout":{"type":"string"},"mode":{"type":"string"},"columns":{"type":"number"},"placeholderItems":{"type":"string"},"placeholderPlateColor":{"type":"string"},"showTitle":{"type":"boolean"},"showPrice":{"type":"boolean"},"showDescription":{"type":"boolean"},"showDuration":{"type":"boolean"},"durationLabel":{"type":"string"},"showImage":{"type":"boolean"},"showLink":{"type":"boolean"},"linkLabel":{"type":"string"},"imageAspectRatio":{"type":"string"},"imageHeight":{"type":"number"},"imageRadius":{"type":"number"},"imageObjectFit":{"type":"string"},"cardBackgroundColor":{"type":"string"},"cardBorderRadius":{"type":"number"},"cardBorderWidth":{"type":"number"},"cardBorderColor":{"type":"string"},"cardPaddingX":{"type":"number"},"cardPaddingY":{"type":"number"},"gap":{"type":"number"},"boxShadowColor":{"type":"string"},"boxShadowOffsetY":{"type":"number"},"boxShadowBlurRadius":{"type":"number"},"boxShadowSpreadRadius":{"type":"number"},"fieldBackground":{"type":"string"},"hairlineColor":{"type":"string"},"hairlineWidth":{"type":"number"},"rowRuleColor":{"type":"string"},"rowRuleWidth":{"type":"number"},"maxWidth":{"type":"number"},"scrimGradient":{"type":"string"},"align":{"type":"string"},"accentColor":{"type":"string"},"titleColor":{"type":"string"},"titleFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"titleFontFamily":{"type":"string"},"titleTransform":{"type":"string"},"priceColor":{"type":"string"},"priceFontSize":{"type":"string"},"priceFontWeight":{"type":"string"},"priceFontFamily":{"type":"string"},"priceFontStyle":{"type":"string"},"metaColor":{"type":"string"},"titlePosition":{"type":"string"},"imageSide":{"type":"string"},"imagePadding":{"type":"number"},"boxShadowOffsetX":{"type":"number"},"descFontSize":{"type":"string"},"descFontWeight":{"type":"string"},"animation":{"type":"string"},"animationDuration":{"type":"number"},"animationDelay":{"type":"number"},"showCustomFields":{"type":"boolean"},"cardDesign":{"type":"string"},"carouselLoop":{"type":"boolean"},"carouselControls":{"type":"boolean"},"customCss":{"type":"string"}}},"blog_gallery":{"type":"object","properties":{"design_layout":{"type":"string"},"mode":{"type":"string"},"columns":{"type":"number"},"leadLayout":{"type":"string"},"leadWidth":{"type":"number"},"placeholderItems":{"type":"string"},"placeholderPlateColor":{"type":"string"},"showTitle":{"type":"boolean"},"showExcerpt":{"type":"boolean"},"showDate":{"type":"boolean"},"showImage":{"type":"boolean"},"showLink":{"type":"boolean"},"linkLabel":{"type":"string"},"showCustomFields":{"type":"boolean"},"imageAspectRatio":{"type":"string"},"imageHeight":{"type":"number"},"imageRadius":{"type":"number"},"imageObjectFit":{"type":"string"},"imagePadding":{"type":"number"},"imageSide":{"type":"string"},"cardBackgroundColor":{"type":"string"},"cardBorderRadius":{"type":"number"},"cardBorderWidth":{"type":"number"},"cardBorderColor":{"type":"string"},"cardPaddingX":{"type":"number"},"cardPaddingY":{"type":"number"},"gap":{"type":"number"},"boxShadowColor":{"type":"string"},"boxShadowOffsetX":{"type":"number"},"boxShadowOffsetY":{"type":"number"},"boxShadowBlurRadius":{"type":"number"},"boxShadowSpreadRadius":{"type":"number"},"fieldBackground":{"type":"string"},"hairlineColor":{"type":"string"},"hairlineWidth":{"type":"number"},"rowRuleColor":{"type":"string"},"rowRuleWidth":{"type":"number"},"maxWidth":{"type":"number"},"scrimGradient":{"type":"string"},"align":{"type":"string"},"accentColor":{"type":"string"},"titleColor":{"type":"string"},"titleFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"titleFontFamily":{"type":"string"},"titleTransform":{"type":"string"},"dateColor":{"type":"string"},"dateFontSize":{"type":"string"},"dateFontWeight":{"type":"string"},"dateFontFamily":{"type":"string"},"dateFontStyle":{"type":"string"},"metaColor":{"type":"string"},"excerptFontSize":{"type":"string"},"excerptFontWeight":{"type":"string"},"excerptFontFamily":{"type":"string"},"titlePosition":{"type":"string"},"animation":{"type":"string"},"animationDuration":{"type":"number"},"animationDelay":{"type":"number"},"cardDesign":{"type":"string"},"customCss":{"type":"string"}}},"multi_booking":{"type":"object","properties":{"layout":{"type":"string"},"columns":{"type":"number"},"pickerBackground":{"type":"string"},"gap":{"type":"number"},"align":{"type":"string"},"showPrice":{"type":"boolean"},"showDuration":{"type":"boolean"},"showDescription":{"type":"boolean"},"showImage":{"type":"boolean"},"itemPaddingX":{"type":"number"},"itemPaddingY":{"type":"number"},"itemRadius":{"type":"number"},"itemBorderWidth":{"type":"number"},"itemBorderColor":{"type":"string"},"itemBackground":{"type":"string"},"itemTextColor":{"type":"string"},"itemSubTextColor":{"type":"string"},"selectedBackground":{"type":"string"},"selectedTextColor":{"type":"string"},"selectedSubTextColor":{"type":"string"},"selectedBorderColor":{"type":"string"},"hoverBackground":{"type":"string"},"titleFontSize":{"type":"number"},"titleFontWeight":{"type":"string"},"subFontSize":{"type":"number"},"dividerColor":{"type":"string"},"dividerWidth":{"type":"number"},"autoScroll":{"type":"boolean"},"cardBackground":{"type":"string"},"cardRadius":{"type":"number"},"cardBorderWidth":{"type":"number"},"cardBorderColor":{"type":"string"},"cardMaxWidth":{"type":"number"},"cardLayout":{"type":"string"},"splitWidth":{"type":"number"},"shadowColor":{"type":"string"},"shadowOffsetY":{"type":"number"},"shadowBlur":{"type":"number"},"shadowSpread":{"type":"number"},"sectionPaddingX":{"type":"number"},"sectionPaddingY":{"type":"number"},"sectionDividerColor":{"type":"string"},"sectionDividerWidth":{"type":"number"},"showStepLabels":{"type":"boolean"},"serviceStepLabel":{"type":"string"},"dayStepLabel":{"type":"string"},"staffStepLabel":{"type":"string"},"timeStepLabel":{"type":"string"},"stepLabelColor":{"type":"string"},"stepLabelSize":{"type":"number"},"stepLabelWeight":{"type":"string"},"stepLabelSpacing":{"type":"number"},"stepLabelUppercase":{"type":"boolean"},"dayCount":{"type":"number"},"dayLayout":{"type":"string"},"dayBorderColor":{"type":"string"},"dayShape":{"type":"string"},"daySize":{"type":"number"},"dayGap":{"type":"number"},"dayShowWeekday":{"type":"boolean"},"dayBackground":{"type":"string"},"dayTextColor":{"type":"string"},"daySelectedBackground":{"type":"string"},"daySelectedTextColor":{"type":"string"},"dayDisabledOpacity":{"type":"number"},"timeGap":{"type":"number"},"timeRadius":{"type":"number"},"timeBorderWidth":{"type":"number"},"timeBorderColor":{"type":"string"},"timeSelectedBorderColor":{"type":"string"},"timePaddingX":{"type":"number"},"timePaddingY":{"type":"number"},"timeBackground":{"type":"string"},"timeTextColor":{"type":"string"},"timeSelectedBackground":{"type":"string"},"timeSelectedTextColor":{"type":"string"},"buttonText":{"type":"string"},"buttonBackground":{"type":"string"},"buttonTextColor":{"type":"string"},"buttonRadius":{"type":"number"},"buttonPaddingY":{"type":"number"},"buttonFontSize":{"type":"number"},"buttonFontWeight":{"type":"string"},"buttonFullWidth":{"type":"boolean"}}},"buttonOptions":{"type":"object","properties":{"fill":{"type":"string"},"expand":{"type":"string"},"size":{"type":"string"},"color":{"type":"string"},"class":{"type":"string"},"customColor":{"type":"string"},"customColorContrast":{"type":"string"},"customColorHover":{"type":"string"},"hoverRoll":{"type":"boolean"},"fontWeight":{"type":"number"},"letterSpacing":{"type":"number"},"fontSize":{"type":"number"},"borderRadius":{"type":"number"},"customColorA":{"type":"string"},"customColorB":{"type":"string"},"customColorC":{"type":"string"},"custom_measurements":{"type":"boolean"},"height":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}}}},"carousel":{"type":"object","properties":{"showArrows":{"type":"boolean"},"showIndicators":{"type":"boolean"},"height":{"type":"number"},"automaticHeight":{"type":"boolean"},"carouselMedias":{"type":"string"}}},"contactForm":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"subject":{"type":"string"},"body":{"type":"string"},"button":{"type":"string"},"hideNewsletter":{"type":"boolean"},"placeholders":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"subject":{"type":"string"},"body":{"type":"string"}}},"style":{"type":"object","properties":{"backgroundColor":{"type":"string"},"textColor":{"type":"string"},"accentColor":{"type":"string"},"border":{"type":"object","properties":{"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"style":{"type":"string"}}},"borderRadius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"padding":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"labelFontSize":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"consentFontSize":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"inputBackgroundColor":{"type":"string"},"inputTextColor":{"type":"string"},"placeholderColor":{"type":"string"},"inputFocusColor":{"type":"string"},"inputFontSize":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"inputPadding":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"textareaMinHeight":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"inputMargin":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"inputBorder":{"type":"object","properties":{"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"style":{"type":"string"}}},"inputBorderRadius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"buttonBackgroundColor":{"type":"string"},"buttonTextColor":{"type":"string"},"buttonAlign":{"type":"string"},"buttonFontSize":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"buttonBorder":{"type":"object","properties":{"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"style":{"type":"string"}}},"buttonBorderRadius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"buttonWidth":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}}}},"additional":{"type":"string"}}},"instagram":{"type":"object","properties":{"columns":{"type":"number"},"first":{"type":"number"},"skip":{"type":"number"},"showInfo":{"type":"boolean"},"gridType":{"type":"number"},"profile":{"type":"string"}}},"facebook":{"type":"object","properties":{"url":{"type":"string"},"width":{"type":"string"},"height":{"type":"string"}}},"transform":{"type":"object","properties":{"enabled":{"type":"boolean"},"translateX":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string"}}},"translateY":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string"}}},"scaleX":{"type":"number"},"scaleY":{"type":"number"},"rotate":{"type":"number"},"rotateX":{"type":"number"},"rotateY":{"type":"number"},"skewX":{"type":"number"},"skewY":{"type":"number"},"perspective":{"type":"number"},"originX":{"type":"string"},"originY":{"type":"string"}}},"popup":{"type":"object","properties":{"text":{"type":"string"},"backgroundColor":{"type":"string"},"fullScreen":{"type":"boolean"},"about_page":{"type":"string"}}},"custom_component":{"type":"object","properties":{"html":{"type":"string"},"compiled_html":{"type":"string"},"css":{"type":"string"},"compiled_css":{"type":"string"},"js":{"type":"string"},"iframe":{"type":"boolean"},"variables":{"type":"string"}}},"hoverable_media":{"type":"object","properties":{"before_hover_media":{"type":"object","properties":{"media":{"type":"string"},"gcs_url":{"type":"string"},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"youtube_url":{"type":"string"},"vimeo_url":{"type":"string"},"href":{"type":"string"},"router_link":{"type":"string"},"thumbnail":{"type":"string"},"autoplay":{"type":"boolean"},"loop":{"type":"boolean"},"show_controls":{"type":"boolean"}}},"after_hover_media":{"type":"object","properties":{"media":{"type":"string"},"gcs_url":{"type":"string"},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"youtube_url":{"type":"string"},"vimeo_url":{"type":"string"},"href":{"type":"string"},"router_link":{"type":"string"},"thumbnail":{"type":"string"},"autoplay":{"type":"boolean"},"loop":{"type":"boolean"},"show_controls":{"type":"boolean"}}}}},"collapsible_container_settings":{"type":"object","properties":{"enable_customization":{"type":"boolean"},"title_color":{"type":"string"},"title_color_checked":{"type":"string"},"title_background":{"type":"string"},"title_background_checked":{"type":"string"},"title_font_size":{"type":"string"},"title_border_radius":{"type":"string"},"title_border_color":{"type":"string"},"title_border_width":{"type":"string"},"body_color":{"type":"string"},"body_background":{"type":"string"},"body_border_radius":{"type":"string"},"body_border_color":{"type":"string"},"body_border_width":{"type":"string"},"body_font_size":{"type":"string"},"icon_color":{"type":"string"},"icon_glyph_color":{"type":"string"},"icon_background_color":{"type":"string"}}},"quiz":{"type":"object","properties":{"title":{"type":"string"},"header":{"type":"string"},"questions":{"type":"string"},"score_results":{"type":"string"},"show_right_answers":{"type":"boolean"},"mutliple_choice":{"type":"boolean"}}},"partners":{"type":"object","properties":{"defaultCollection":{"type":"string"},"defaultView":{"type":"string"}}},"scroll_sequence":{"type":"object","properties":{"media":{"type":"string"},"scroll_length":{"type":"number"},"fit":{"type":"string"},"background_color":{"type":"string"},"overlay_color":{"type":"string"},"overlay_opacity":{"type":"number"},"rows_over":{"type":"boolean"},"rows_effect":{"type":"string"},"snap_points":{"type":"string"},"snap_scroll_speed":{"type":"number"},"snap_down":{"type":"boolean"},"snap_up":{"type":"boolean"},"stop_momentum":{"type":"boolean"}}},"smart_search":{"type":"object","properties":{"placeholder":{"type":"string"},"kinds":{"type":"string"},"collections":{"type":"string"},"items":{"type":"string"},"showKindFilter":{"type":"boolean"},"showPriceFilter":{"type":"boolean"},"showDateFilter":{"type":"boolean"},"showSort":{"type":"boolean"},"dateMode":{"type":"string"},"layout":{"type":"string"},"columns":{"type":"number"},"perPage":{"type":"number"},"instant":{"type":"boolean"},"showImages":{"type":"boolean"},"showPrices":{"type":"boolean"},"showInitial":{"type":"boolean"},"showAnswer":{"type":"boolean"}}},"countdown":{"type":"object","properties":{"targetDate":{"type":"string"},"expiredText":{"type":"string"},"hideOnExpire":{"type":"boolean"},"textColor":{"type":"string"},"boxColor":{"type":"string"},"align":{"type":"string"}}},"swiper":{"type":"object","properties":{"slides":{"type":"string"},"autoplay":{"type":"boolean"},"loop":{"type":"boolean"},"show_controls":{"type":"boolean"},"dynamic_bullets":{"type":"boolean"},"pagination":{"type":"boolean"}}},"text_auto_slider":{"type":"object","properties":{"speed":{"type":"number"},"aspect_ratio":{"type":"string"},"text_color":{"type":"string"},"background_color":{"type":"string"},"delimiter_color":{"type":"string"},"direction":{"type":"string"},"width":{"type":"number"},"font_size":{"type":"number"},"text_transform":{"type":"string"},"texts":{"type":"string"}}},"image_auto_slider":{"type":"object","properties":{"speed":{"type":"number"},"aspect_ratio":{"type":"string"},"direction":{"type":"string"},"width":{"type":"number"},"medias":{"type":"string"}}},"image_dragger":{"type":"object","properties":{"aspect_ratio":{"type":"string"},"media_1":{"type":"object","properties":{"media":{"type":"string"},"gcs_url":{"type":"string"},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"vimeo_url":{"type":"string"},"youtube_url":{"type":"string"}}},"media_2":{"type":"object","properties":{"media":{"type":"string"},"gcs_url":{"type":"string"},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"vimeo_url":{"type":"string"},"youtube_url":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"},"textColor":{"type":"string"},"href":{"type":"string"},"router_link":{"type":"string"}}}}}}}},"sections":{"type":"array","items":{"type":"object","properties":{"position":{"type":"string","enum":["static","relative","absolute","fixed","sticky"],"default":"static"},"overflow":{"type":"string","enum":["visible","hidden","scroll","auto"],"default":"visible"},"editorName":{"type":"string"},"display":{"type":"string","enum":["block","inline","flex"],"default":"block"},"flex_direction":{"type":"string","enum":["row","row-reverse","column","column-reverse"],"default":"row"},"flex_direction_mobile":{"type":"string","default":""},"backdropFilter":{"type":"string","default":""},"justify":{"type":"string","enum":["start","end","center","space-between","space-around","stretch"],"default":"start"},"justify_mobile":{"type":"string","default":""},"align":{"type":"string","enum":["start","end","center","space-between","space-around","stretch"],"default":"start"},"align_mobile":{"type":"string","default":""},"animation":{"type":"string","default":"none"},"animationDuration":{"type":"number","default":0},"animationStrength":{"type":"number"},"parallaxEnabled":{"type":"boolean"},"parallaxAmount":{"type":"number"},"parallaxZoom":{"type":"number"},"animationDelay":{"type":"number","default":0},"animationReplay":{"type":"string","default":"once"},"animationEasing":{"type":"string","default":"power3.out"},"animationBreakpoint":{"type":"string","default":"all"},"scrollScrubEnabled":{"type":"boolean","default":false},"scrollScrubAxis":{"type":"string","default":"y"},"scrollScrubDistance":{"type":"number","default":80},"motionOrigin":{"type":"string","default":"center center"},"hoverEnabled":{"type":"boolean","default":false},"hoverEffect":{"type":"string","default":"none"},"hoverDuration":{"type":"number","default":240},"hoverIntensity":{"type":"number","default":4},"continuousEnabled":{"type":"boolean","default":false},"continuousEffect":{"type":"string","default":"none"},"continuousDuration":{"type":"number","default":2400},"continuousIntensity":{"type":"number","default":4},"statefulEnabled":{"type":"boolean","default":false},"statefulEffect":{"type":"string","default":"none"},"statefulDuration":{"type":"number","default":260},"statefulStagger":{"type":"number","default":60},"opacity":{"type":"object"},"transitionDuration":{"type":"object"},"transitionEasing":{"type":"string"},"states":{"type":"object"},"hoverGroup":{"type":"boolean"},"flex_wrap":{"type":"string","enum":["nowrap","wrap","wrap-reverse"],"default":"wrap"},"flex_wrap_mobile":{"type":"string","default":""},"object_fit":{"type":"string"},"specific_border_radius":{"type":"boolean","default":false},"box_shadows":{"type":"array","items":{"type":"object","properties":{}}},"backgroundColor":{"type":"string"},"backgroundVideo":{"type":"string"},"backgroundImage":{"type":"string"},"backgroundSize":{"type":"string"},"backgroundPosition":{"type":"string"},"backgroundRepeat":{"type":"string"},"showOnMobile":{"type":"boolean","default":true},"showOnDesktop":{"type":"boolean","default":true},"components":{"type":"array","items":{"type":"object","properties":{}}},"sections":{"type":"array","items":{"type":"object","properties":{}}},"_id":{"type":"string"},"top":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"left":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"right":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"bottom":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"transform":{"type":"object","properties":{"enabled":{"type":"boolean"},"translateX":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string"}}},"translateY":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string"}}},"scaleX":{"type":"number"},"scaleY":{"type":"number"},"rotate":{"type":"number"},"rotateX":{"type":"number"},"rotateY":{"type":"number"},"skewX":{"type":"number"},"skewY":{"type":"number"},"perspective":{"type":"number"},"originX":{"type":"string"},"originY":{"type":"string"}}},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"min_width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"max_width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"height":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"min_height":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"max_height":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"aspect_ratio":{"type":"object","properties":{"custom":{"type":"boolean"},"ratio":{"type":"string"}}},"margin_left":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"margin_right":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"margin_top":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"margin_bottom":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_left":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_right":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_top":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_bottom":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"border_left":{"type":"object","properties":{"style":{"type":"string"},"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}}}},"border_right":{"type":"object","properties":{"style":{"type":"string"},"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}}}},"border_top":{"type":"object","properties":{"style":{"type":"string"},"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}}}},"border_bottom":{"type":"object","properties":{"style":{"type":"string"},"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}}}},"border_top_left_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"border_top_right_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"border_bottom_left_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"border_bottom_right_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"border_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"backgroundGradient":{"type":"object","properties":{"enabled":{"type":"boolean"},"type":{"type":"string"},"degrees":{"type":"number"},"radialShape":{"type":"string"},"radialPosition":{"type":"string"},"colors":{"type":"string"},"css":{"type":"string"}}}}}},"_id":{"type":"string"},"backgroundGradient":{"type":"object","properties":{"enabled":{"type":"boolean"},"type":{"type":"string"},"degrees":{"type":"number"},"radialShape":{"type":"string"},"radialPosition":{"type":"string"},"colors":{"type":"string"},"css":{"type":"string"}}},"innerBackgroundGradient":{"type":"object","properties":{"enabled":{"type":"boolean"},"type":{"type":"string"},"degrees":{"type":"number"},"radialShape":{"type":"string"},"radialPosition":{"type":"string"},"colors":{"type":"string"},"css":{"type":"string"}}}}}},"ai_meta":{"type":"object","default":null},"_id":{"type":"string"},"backgroundGradient":{"type":"object","properties":{"enabled":{"type":"boolean"},"type":{"type":"string"},"degrees":{"type":"number"},"radialShape":{"type":"string"},"radialPosition":{"type":"string"},"colors":{"type":"string"},"css":{"type":"string"}}},"padding_top":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_right":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_bottom":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_left":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}}}},"description":"The page's content: sections, each with columns of components."},"suitability_price_plans":{"type":"array","items":{"type":"string"},"description":"PricePlan ids. Id of a PricePlan."},"isSuitable":{"type":"boolean","description":"Set per request, not stored: whether the signed-in user's price plans match the page's suitability plans."},"archived":{"type":"boolean","default":false,"description":"Hidden from the site and the admin's page list without being deleted."},"archivedAt":{"type":"string","format":"date-time","description":"When the page was archived."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"AboutPageImport":{"type":"object","properties":{"title":{"type":"string","description":"Name of the imported file."},"url":{"type":"string","description":"Address the import was read from, when it came from a link."},"media":{"type":"string","description":"The uploaded file's bytes."},"metadata":{"type":"string","description":"Details read from the file (type, size, source) as JSON text."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"ActivityLog":{"type":"object","properties":{"action":{"type":"string","description":"What happened, in domain terms: create, update, delete, order, add_to_cart, login, login_failed, logout, ... See ACTIONS in utils/activity-log.js."},"entity":{"type":"string","description":"What it happened to. `entity` is a model name ('Product'); `label` is the human-readable name captured at write time, so the log still reads correctly after the underlying record is renamed or deleted."},"entity_id":{"type":"string","description":"Id of the record the action changed."},"label":{"type":"string","description":"What was done, in words (\"Updated product\")."},"method":{"type":"string","description":"Where it came from, for tracing an entry back to a specific request."},"path":{"type":"string","description":"The API path that was called."},"status":{"type":"number","description":"The HTTP status the call answered with."},"changes":{"type":"object","description":"The fields the call sent, as they were written."},"ip":{"type":"string","description":"IP address the call came from."},"user_agent":{"type":"string","description":"Browser or client that made the call."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"actor":{"type":"object","properties":{"user":{"type":"string"},"email":{"type":"string"},"name":{"type":"string"},"kind":{"type":"string"}}}}},"Advertisment":{"type":"object","properties":{"name":{"type":"string","description":"Internal name of the ad."},"media":{"type":"string","description":"Media.id of the ad's picture."},"alt":{"type":"string","description":"Alternative text of the picture."},"link":{"type":"string","description":"Where clicking the ad leads."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Alert":{"type":"object","properties":{"type":{"type":"string","description":"INFO = 0; WARNING = 1; DANGER = 2;."},"heading":{"type":"string","description":"What is the alert about."},"message":{"type":"string","description":"Alert message."},"meta_id":{"type":"string","description":"Meta.id. Id of a Meta."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"AttributedRevenue":{"type":"object","properties":{"value":{"type":"number","description":"Amount of revenue attributed to the owner, in the site's currency."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Automation":{"type":"object","properties":{"title":{"type":"string","description":"Name of the automation."},"webhook_url":{"type":"string","description":"The URL called when the event happens."},"event_type":{"type":"string","description":"The event that triggers the call (new order, new booking...)."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Beds24Settings":{"type":"object","properties":{"sync_enabled":{"type":"boolean","default":true,"description":"Bookings and availability sync with Beds24; false: nothing moves in either direction."},"sync_from":{"type":"string","format":"date-time","description":"Ignore anything before this day; blank means from today."},"last_pull_at":{"type":"string","format":"date-time","description":"When bookings were last pulled from Beds24."},"last_error":{"type":"string","description":"Why the last sync failed, if it did."},"last_error_at":{"type":"string","format":"date-time","description":"Nothing clears last_error, so the age is what tells a one-off failure from a standing one — compare it against last_pull_at."},"room_mappings":{"type":"array","items":{"type":"object","properties":{"beds24_room_id":{"type":"string"},"beds24_room_name":{"type":"string"},"service":{"type":"string","description":"Id of a Service."},"_id":{"type":"string"}}},"description":"Which Beds24 room each service is: the service and the room id."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"connected_account_owner_id":{"type":"string","description":"User.id. Id of a User."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"BlogPost":{"type":"object","properties":{"title":{"type":"string","description":"Title of blogpost."},"url":{"type":"string","description":"Generated from title, no need to set it manually."},"static_url":{"type":"string","description":"A fixed address kept when the post's url changes, so old links keep working."},"header":{"type":"string","description":"Short header of blogpost."},"description":{"type":"string","description":"Body text of blogpost."},"medias":{"type":"array","items":{"type":"object","properties":{"media":{"type":"string","description":"Id of a Media."},"gcs_url":{"type":"string"},"gcs_480_30_url":{"type":"string"},"gcs_720_30_url":{"type":"string"},"gcs_1080_30_url":{"type":"string"},"duration":{"type":"number"},"thumbnail":{"type":"string"},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"vimeo_url":{"type":"string"},"youtube_url":{"type":"string"},"youtube_picture":{"type":"string"},"_id":{"type":"string"}}},"description":"Attached media objects with ids."},"published":{"type":"boolean","default":true,"description":"True if not set."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"connected_account_owner_id":{"type":"string","description":"User.id. Id of a User."},"collection_id":{"type":"string","description":"Collection, to which the blog post belongs. Id of a Collection."},"selected":{"type":"boolean","default":false,"description":"False if not set."},"custom_1":{"type":"string","description":"Custom defined field 1."},"custom_2":{"type":"string","description":"Custom defined field 2."},"custom_3":{"type":"string","description":"Custom defined field 3."},"about_page":{"type":"string","description":"Reference to AboutPage model, shown at the bottom of the post page. Id of a AboutPage."},"suitability_price_plans":{"type":"array","items":{"type":"string"},"description":"A list of references to PricePlan model, marks post as suitable for users with those plans. Id of a PricePlan."},"isSuitable":{"type":"boolean","description":"Set per request, not stored: whether the signed-in user's price plans match the post's suitability plans."},"reference_id":{"type":"string","description":"Id of the record the post was made from (an import or a clone)."},"wildcard_url":{"type":"object","description":"The wildcard route this post answers on, when it has one."},"likes":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"views":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"total_views":{"type":"number","default":0,"description":"How many times the post was opened."},"saves":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"times_showed":{"type":"number","default":0,"description":"How many times the post was shown in a list."},"requiresLogin":{"type":"boolean","default":false,"description":"Only signed-in users can read the post."},"requiresSubscription":{"type":"boolean","default":false,"description":"Only subscribers of the post's price plans can read it."},"price_plan_ids":{"type":"array","items":{"type":"string"},"description":"A list of price plan id strings that grant access to this post."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Booking":{"type":"object","properties":{"date":{"type":"string","description":"Booking date."},"date_iso":{"type":"string","format":"date-time","description":"The booked date as an ISO string."},"depart_date":{"type":"string","description":"End date of a stay (date-range bookings)."},"depart_date_iso":{"type":"string","format":"date-time","description":"End date as an ISO string."},"price":{"type":"number","description":"What the booking costs."},"time":{"type":"string","description":"Booking time."},"local_time":{"type":"string","description":"The booked time in the customer's time zone."},"isLastHour":{"type":"boolean","description":"The booking took the day's last free slot, so the day is marked fully booked."},"organization_name":{"type":"string","description":"For invoicing."},"name":{"type":"string","description":"Customer's full name."},"firstname":{"type":"string","description":"Customer's first name."},"lastname":{"type":"string","description":"Customer's last name."},"email":{"type":"string","description":"Customer's email."},"phone_number":{"type":"string","description":"Customer's phone number."},"address":{"type":"string","description":"Customer's address."},"city":{"type":"string","description":"Customer's city."},"state":{"type":"string","description":"Customer's state or region."},"country":{"type":"string","description":"Customer's country."},"zip_code":{"type":"string","description":"Customer's postal code."},"tax_identification_number":{"type":"string","description":"For invoicing."},"notes":{"type":"string","description":"What the customer wrote with the booking."},"service_id":{"type":"string","description":"Id of booked service. Id of a Service."},"staff_member":{"type":"string","description":"Booked staff member. Id of a User."},"coupon":{"type":"string","description":"Applied coupon."},"discount_value":{"type":"number","default":0,"description":"Discount value of service with applied coupon."},"finalized":{"type":"boolean","default":false,"description":"The booking went through (payment done or not needed)."},"confirmed":{"type":"boolean","default":false,"description":"The business confirmed the booking."},"confirmed_timestamp":{"type":"string","format":"date-time","description":"When it was confirmed."},"week_reminder_sent":{"type":"boolean","description":"The reminder a week before was sent."},"day_reminder_sent":{"type":"boolean","description":"The reminder a day before was sent."},"status":{"type":"string","description":"Follow-up outcome with the customer: other, churnet, not_upsell or upsell."},"upsell":{"type":"string","description":"Order.id. Id of a Order."},"staffmember_notes":{"type":"string","description":"Notes the staff member keeps on the booking."},"rating_mail_sent":{"type":"boolean","default":false,"description":"The email asking for a rating was sent."},"call_attempts":{"type":"number","default":0,"description":"How many times the AI phone agent called about it."},"last_call_attempt":{"type":"string","format":"date-time","description":"When the last call was made."},"attached_dynamic_models":{"type":"array","items":{"type":"object","properties":{"model":{"type":"string","description":"Id of a DynamicModel."},"document":{"type":"string"},"_id":{"type":"string"}}},"description":"Records of custom models attached to the booking."},"beds24_booking_id":{"type":"string","description":"The booking's id in Beds24, when synced."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"BoxNowSettings":{"type":"object","properties":{"shipping":{"type":"string","description":"Shipping.id. Id of a Shipping."},"create_label":{"type":"boolean","default":false,"description":"Shipments are created at BoxNow automatically when an order is placed."},"client_id":{"type":"string","description":"BoxNow API client id."},"contactNumber":{"type":"string","description":"Sender's phone number."},"contactEmail":{"type":"string","description":"Sender's email."},"contactName":{"type":"string","description":"Sender's name."},"locationId":{"type":"string","description":"Warehouse ID."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"box":{"type":"array","items":{"type":"object","properties":{"height":{"type":"number"},"length":{"type":"number"},"width":{"type":"number"},"_id":{"type":"string"}}},"description":"Box sizes the business ships in."},"multiple_items":{"type":"string","enum":["box","sum"],"default":"sum","description":"One of: box, sum."},"divide_by":{"type":"number","description":"When several items are summed into one parcel, their added dimensions are divided by this to estimate it."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"product_default_dimensions":{"type":"object","properties":{"height":{"type":"number"},"width":{"type":"number"},"length":{"type":"number"},"weight":{"type":"number"}}}}},"Brand":{"type":"object","properties":{"name":{"type":"string","description":"The brand's name."},"header":{"type":"string","description":"Short heading shown on the brand's page."},"description":{"type":"string","description":"About the brand."},"slogan":{"type":"string","description":"The brand's slogan."},"logo":{"type":"string","description":"Media.id of the brand's logo."},"_id":{"type":"string"}}},"Cart":{"type":"object","properties":{"session":{"type":"string","description":"The visitor's session the cart belongs to."},"items":{"type":"array","items":{"type":"object","properties":{"item":{"type":"string","description":"Id of a Products."},"options":{"type":"string"},"_id":{"type":"string"}}},"description":"What is in the cart: product, quantity and chosen options."},"coupon":{"type":"string","description":"Code of the applied coupon."},"discount_value":{"type":"number","default":0,"description":"The discount the coupon gives."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"ip_guessed":{"type":"object","properties":{"country":{"type":"string"},"country_code":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"zip_code":{"type":"string"},"dialing_code":{"type":"string"}}}}},"ChatHistory":{"type":"object","properties":{"user":{"type":"string","description":"User.id. Id of a User."},"title":{"type":"string","description":"Name of the chat, shown in the chat list."},"stop_requested_at":{"type":"string","format":"date-time","description":"When the owner last pressed Stop: an agent turn begun before it ends at its next call."},"language":{"type":"string","description":"The language the owner writes in, kept for the whole chat: replies, briefs and new content follow it, whatever language the site's existing content is in."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"ChatMessage":{"type":"object","properties":{"chat_id":{"type":"string","description":"ChatHistory.id. Id of a ChatHistory."},"role":{"type":"string","enum":["user","model"],"description":"One of: user, model."},"text":{"type":"string","description":"The message's text."},"target_url":{"type":"string","description":"Admin page the message links to."},"action":{"type":"string","enum":["RESPONSE","REDIRECT","OBJECT_RESPONSE","ERROR","CLARIFY","PROPOSED_ACTION"],"description":"One of: RESPONSE, REDIRECT, OBJECT_RESPONSE, ERROR, CLARIFY, PROPOSED_ACTION."},"options":{"type":"array","items":{"type":"string"},"description":"Quick replies offered under the message."},"medias":{"type":"array","items":{"type":"object","properties":{"media":{"type":"string","description":"Id of a Media."},"gcs_url":{"type":"string"},"gemini_uri":{"type":"string"},"gemini_interaction_id":{"type":"string"},"_id":{"type":"string"}}},"description":"Pictures attached to the message."},"products":{"type":"array","items":{"type":"string"},"description":"Product ids. Id of a Product."},"services":{"type":"array","items":{"type":"string"},"description":"Service ids. Id of a Service."},"blogposts":{"type":"array","items":{"type":"string"},"description":"BlogPost ids. Id of a BlogPost."},"programs":{"type":"array","items":{"type":"string"},"description":"Program ids. Id of a Program."},"suggestions":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"route":{"type":"string"},"item_id":{"type":"string"},"medias":{"type":"array","items":{"type":"object"}},"picture":{"type":"string"},"_id":{"type":"string"}}},"description":"Next steps suggested under the message."},"is_system":{"type":"boolean","default":false,"description":"Written by the platform, not by the owner or the AI."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"data":{"type":"object","properties":{"object":{"type":"string"},"object_type":{"type":"string"},"edit_summary":{"type":"string"},"edit_diff":{"type":"string"},"undo_record":{"type":"string"},"hero_animation_offer":{"type":"string"},"preview_state":{"type":"string"},"pending_credit_cost":{"type":"number"},"target_restore":{"type":"string"},"media_request":{"type":"string"},"item_request":{"type":"string"},"reference_request":{"type":"string"},"section_options":{"type":"string"},"section_blueprint":{"type":"string"},"section_style_options":{"type":"string"},"section_style_blueprint":{"type":"string"},"section_role_picker":{"type":"string"},"small_section_regeneration_options":{"type":"string"},"small_section_regeneration_target":{"type":"string"},"small_section_regeneration_prompt":{"type":"string"},"selected_small_section_action":{"type":"string"},"component_regeneration_input":{"type":"string"},"selected_section_role":{"type":"string"},"selected_section_option":{"type":"string"},"selected_section_style":{"type":"string"},"section_options_target":{"type":"string"},"section_options_prompt":{"type":"string"},"style_options_target":{"type":"string"},"style_options_prompt":{"type":"string"},"previous_container":{"type":"string"},"preserved_custom_components":{"type":"string"},"selection_request":{"type":"string"},"proposed_action":{"type":"string"},"plan_result":{"type":"string"},"parsed_intent":{"type":"string"},"parsed_intent_version":{"type":"number"},"parsed_intent_at":{"type":"string"},"item_id":{"type":"string"},"design_archetype":{"type":"string"},"design_palette":{"type":"string"},"out_of_credits":{"type":"boolean"},"site_wide_edit":{"type":"string"},"redesign":{"type":"string"}}}}},"Click":{"type":"object","properties":{"url":{"type":"string","description":"The link that was clicked."},"ip":{"type":"string","description":"IP address of the visitor who clicked."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Collection":{"type":"object","properties":{"name":{"type":"string","description":"Written \"<kind>/<Name>\": the prefix is where it shows - product/ (a store category), service/ (a service category), blogpost/, program-category/, donation-category/; filters: grouping/ (in a product category), calendar-filter/ (on the booking page). \"service/Deep cleaning\". A name without a prefix shows nowhere."},"parent_collection":{"type":"string","description":"Collection.id of the parent collection. Id of a Collection."},"picture":{"type":"string","description":"Media.id. Id of a Media."},"about_page":{"type":"string","description":"Reference to AboutPage. Id of a AboutPage."},"match_to_option":{"type":"boolean","default":false,"description":"Matches all products which have an option with match_to_collection true."},"is_color":{"type":"boolean","default":false,"description":"Used for products with color options."},"color":{"type":"string","description":"Used to visually show the color on the page when is_color is true."},"position":{"type":"number","description":"Order among collections of the same kind; lower first."},"items":{"type":"array","items":{"type":"string"},"description":"Array<Product.id> deprecated."},"thumbnail":{"type":"string","description":"Media.id, shown on the store cards instead of picture. Id of a Media."},"_id":{"type":"string"}}},"Comment":{"type":"object","properties":{"user":{"type":"string","description":"User.id. Id of a User."},"connected_account_user":{"type":"string","description":"User.id. Id of a User."},"commented_on":{"type":"string","description":"Id of the record commented on (a post, product, service...)."},"comment":{"type":"string","description":"Comment message."},"likes":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"replies":{"type":"array","items":{"type":"object","properties":{"comment":{"type":"string"},"user":{"type":"string","description":"Id of a User."},"likes":{"type":"array","items":{"type":"string"},"description":"Id of a User."},"createdAt":{"type":"string","format":"date-time"},"isHidden":{"type":"boolean","default":false},"_id":{"type":"string"}}},"description":"Message."},"mentions":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"isHidden":{"type":"boolean","default":false,"description":"Hidden by a moderator; kept but not shown."},"medias":{"type":"array","items":{"type":"object","properties":{"media":{"type":"string","description":"Id of a Media."},"_id":{"type":"string"}}},"description":"Pictures attached to the comment."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"ConnectedAccount":{"type":"object","properties":{"on_behalf_of":{"type":"string","description":"The profile that gives authority to other user to alter his account. Id of a User."},"user_account":{"type":"string","description":"The account which will receive certain privileges over over the account of the authorizer. Id of a User."},"status":{"type":"string","default":"pending","description":"State of the connection (connected, expired...)."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"is_authorized_to":{"type":"object","properties":{"create_posts":{"type":"boolean"},"send_messages":{"type":"boolean"},"answer_delete_comments":{"type":"boolean"},"access_engagements":{"type":"boolean"},"access_boosted_posts":{"type":"boolean"},"access_analytics":{"type":"boolean"},"alter_profile_settings":{"type":"boolean"},"catalogue_access":{"type":"object","properties":{"alter_products":{"type":"boolean"},"alter_services":{"type":"boolean"},"alter_blogposts":{"type":"boolean"},"alter_price_plans":{"type":"boolean"},"alter_programs":{"type":"boolean"},"alter_orders":{"type":"boolean"},"alter_bookings":{"type":"boolean"},"alter_subscriptions":{"type":"boolean"},"alter_purchases":{"type":"boolean"}}}}}}},"Consent":{"type":"object","properties":{"title":{"type":"string","description":"Consent title."},"text":{"type":"string","description":"Consent text."},"_id":{"type":"string"}}},"Coupon":{"type":"object","properties":{"code":{"type":"string","description":"Coupon code."},"name":{"type":"string","description":"Coupon name (not shown to end user)."},"fixed_discount":{"type":"number","description":"Fixed amount of discount."},"percentage_discount":{"type":"number","description":"Discount in percent, e.g. 90 for 90% off."},"shipping_discount":{"type":"number","description":"Shipping discount discount."},"sale_discount":{"type":"number","description":"Sale discount discount."},"apply_to_all_orders":{"type":"boolean","description":"The coupon works on any order."},"apply_to_all_products":{"type":"boolean","description":"The coupon works on every product."},"apply_to_product":{"type":"string","description":"The NAME of the one product the coupon works on, exactly as the product is named (not its id): the cart matches it against product names."},"apply_to_event":{"type":"string","description":"The NAME of the one event the coupon works on, exactly as the event is named."},"apply_to_all_events":{"type":"boolean","description":"The coupon works on every event."},"apply_to_collection":{"type":"string","description":"The full NAME of the one category the coupon works on (\"product/Candles\"), not its id: the cart matches it against category names."},"apply_to_minimum_subtotal":{"type":"number","description":"Minimum total amount."},"start_date":{"type":"string","format":"date-time","description":"When the coupon starts working; now when left out."},"end_date":{"type":"string","format":"date-time","description":"When it stops working, unless no_end_date is set."},"no_end_date":{"type":"boolean","default":false,"description":"The coupon never expires; end_date is ignored."},"limit_uses":{"type":"number","default":null,"description":"How many times the coupon can be used in all; null (the default) for unlimited."},"uses":{"type":"number","default":0,"description":"How many times it has been used (do not set)."},"_id":{"type":"string"},"quantity_discount":{"type":"object","properties":{"buy":{"type":"number"},"get":{"type":"number"}}}}},"CustomComponent":{"type":"object","properties":{"name":{"type":"string","description":"Name of the component, shown in the editor."},"html":{"type":"string","description":"The component's HTML as written."},"compiled_html":{"type":"string","description":"HTML with its variables filled in, as rendered."},"css":{"type":"string","description":"The component's CSS as written."},"compiled_css":{"type":"string","description":"CSS as rendered."},"js":{"type":"string","description":"The component's script."},"variables":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"_id":{"type":"string"}}},"description":"Values the owner can set in the editor without touching the code."},"iframe":{"type":"boolean","default":false,"description":"Rendered in an iframe, isolated from the page."},"media":{"type":"string","description":"Media.id. Id of a Media."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"CustomFont":{"type":"object","properties":{"family":{"type":"string","description":"CSS font-family value, e.g. \"'Comic Neue', sans-serif\"."},"link":{"type":"string","description":"Google Fonts stylesheet URL."},"name":{"type":"string","description":"Bare family name as Google spells it, e.g. \"Comic Neue\"."},"weights":{"type":"string","description":"Roman weights, comma-separated, e.g. \"300,400,700\"."},"italics":{"type":"array","items":{"type":"string"},"description":"Italic weights as the picker spells them, e.g. [\"i400\"]."},"subsets":{"type":"array","items":{"type":"string"},"description":"Unicode subsets Google serves, e.g. [\"latin\",\"cyrillic\"]."},"generic":{"type":"string","description":"CSS generic fallback: sans-serif | serif | cursive."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"CustomForm":{"type":"object","properties":{"obj":{"type":"object","description":"Free object."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"CustomPage":{"type":"object","properties":{"title":{"type":"string","description":"The page's title."},"url":{"type":"string","description":"The page's address on the site."},"html_content":{"type":"string","description":"The page's HTML."},"css_content":{"type":"string","description":"The page's CSS."},"js_content":{"type":"string","description":"The page's script."},"_id":{"type":"string"}}},"DigitalContent":{"type":"object","properties":{"name":{"type":"string","description":"Name of the file or content."},"type":{"type":"string","description":"File type: image, pdf, gif ...;."},"file":{"type":"string","description":"File to upload."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Donation":{"type":"object","properties":{"enabled":{"type":"boolean","default":false,"description":"The campaign accepts donations."},"has_shippable_items":{"type":"boolean","default":false,"description":"Donors get something shipped, so an address is asked for."},"medias":{"type":"array","items":{"type":"object","properties":{"media":{"type":"string","description":"Id of a Media."},"gcs_url":{"type":"string"},"gcs_480_30_url":{"type":"string"},"gcs_720_30_url":{"type":"string"},"gcs_1080_30_url":{"type":"string"},"duration":{"type":"number"},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"vimeo_url":{"type":"string"},"youtube_url":{"type":"string"},"youtube_picture":{"type":"string"},"thumbnail":{"type":"string"},"_id":{"type":"string"}}},"description":"The campaign's pictures."},"url":{"type":"string","description":"Generated from name, no need to set it manually."},"static_url":{"type":"string","description":"A fixed address kept when the url changes."},"title":{"type":"string","description":"Name of the campaign, required."},"description":{"type":"string","description":"Full body text describing the campaign and its goals, in HTML format, required."},"about_page":{"type":"string","description":"AboutPage.id. Id of a AboutPage."},"collection_id":{"type":"string","description":"Reference to a Collection with name starting with 'donation-category/', optional. Id of a Collection."},"topics":{"type":"array","items":{"type":"object","properties":{"collection_id":{"type":"string","description":"Id of a Collection."},"_id":{"type":"string"}}},"description":"Causes a donor can choose to give to."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"options":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"options":{"type":"array","items":{"type":"object","properties":{"option":{"type":"string"},"match_to_collection":{"type":"string","description":"Id of a Collection."},"quantity":{"type":"number"},"badge":{"type":"string"},"option_specific_media":{"type":"string","description":"Id of a Media."},"_id":{"type":"string"}}}},"_id":{"type":"string"}}},"description":"Purchasable add-on option groups for the donation (e.g. \"Include a gift\", \"Select a reward tier\")."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"target_amount":{"type":"object","properties":{"enabled":{"type":"boolean"},"amount":{"type":"number"}}},"predefined_amounts":{"type":"object","properties":{"enabled":{"type":"boolean"},"amounts":{"type":"string"}}}}},"DynamicModel":{"type":"object","properties":{"name":{"type":"string","description":"Name of the custom model."},"fields":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"required":{"type":"boolean"},"default":{"type":"object"},"patchable":{"type":"boolean","default":true},"ref":{"type":"string"},"ref_value_field":{"type":"string","default":"_id"},"ref_text_field":{"type":"string","default":"_id"},"depends_on":{"type":"string"},"populate":{"type":"boolean"},"wysiwyg":{"type":"boolean"},"fields":{"type":"array","items":{"type":"object"}},"show_field_in_cms_table":{"type":"boolean","default":true},"enumerator_values":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"_id":{"type":"string"}}}},"_id":{"type":"string"},"validations":{"type":"object","properties":{"minLength":{"type":"string"},"maxLength":{"type":"string"}}}}},"description":"Recursive reference for nesting fields,."},"attach_in":{"type":"array","items":{"type":"object","properties":{"ref":{"type":"string"},"ref_value_field":{"type":"string","default":"_id"},"ref_text_field":{"type":"string","default":"_id"},"user_input":{"type":"boolean","default":false},"_id":{"type":"string"}}},"description":"Where its records can be attached (bookings, orders...). Id of a [object Object]."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"auth":{"type":"object","properties":{"create":{"type":"boolean"},"read":{"type":"boolean"},"update":{"type":"boolean"},"delete":{"type":"boolean"}}},"ownership_settings":{"type":"object","properties":{"enable_ownership_identification":{"type":"boolean"},"ownership_based_auth":{"type":"string"},"profile_use":{"type":"boolean"}}},"routers":{"type":"object","properties":{"post":{"type":"object","properties":{"replace_all":{"type":"boolean"},"code":{"type":"string"}}},"get":{"type":"object","properties":{"replace_all":{"type":"boolean"},"code":{"type":"string"}}},"get_one":{"type":"object","properties":{"replace_all":{"type":"boolean"},"code":{"type":"string"}}},"patch":{"type":"object","properties":{"replace_all":{"type":"boolean"},"code":{"type":"string"}}},"delete":{"type":"object","properties":{"replace_all":{"type":"boolean"},"code":{"type":"string"}}}}}}},"DynamicPage":{"type":"object","properties":{"name":{"type":"string","description":"Name of the page."},"url":{"type":"string","description":"The page's address in the app."},"dynamic_models":{"type":"array","items":{"type":"string"},"description":"The custom models the page shows."},"page_type":{"type":"string","enum":["cms-table","display-single","display-multiple-rows","display-multiple-cards","display-single-custom","statistics-basic"],"description":"One of: cms-table, display-single, display-multiple-rows, display-multiple-cards, display-single-custom, statistics-basic."},"value_containers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"},"wysiwyg":{"type":"boolean","default":false},"editable":{"type":"boolean","default":false},"label":{"type":"string"},"required":{"type":"boolean"},"default":{"type":"object"},"ref":{"type":"string"},"ref_value_field":{"type":"string","default":"_id"},"ref_text_field":{"type":"string","default":"_id"},"depends_on":{"type":"string"},"populate":{"type":"boolean","default":false},"enumerator_values":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"_id":{"type":"string"}}}},"due_date":{"type":"boolean","default":false},"fields":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"required":{"type":"boolean"},"default":{"type":"object"},"ref":{"type":"string"},"ref_value_field":{"type":"string","default":"_id"},"ref_text_field":{"type":"string","default":"_id"},"depends_on":{"type":"string"},"populate":{"type":"boolean"},"wysiwyg":{"type":"boolean"},"enumerator_values":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"_id":{"type":"string"}}}},"due_date":{"type":"boolean","default":false},"fields":{"type":"array","items":{"type":"object"}},"_id":{"type":"string"},"validations":{"type":"object","properties":{"minLength":{"type":"string"},"maxLength":{"type":"string"}}}}}},"_id":{"type":"string"},"validations":{"type":"object","properties":{"minLength":{"type":"number"},"maxLength":{"type":"number"}}}}},"description":"The blocks that show the records' values."},"quick_link":{"type":"boolean","default":false,"description":"Shown as a shortcut on the app's home."},"quick_link_icon":{"type":"string","description":"Icon of the shortcut."},"quick_link_text":{"type":"string","description":"Text of the shortcut."},"quick_link_auth_guard":{"type":"string","enum":["none","user","admin"],"default":"none","description":"One of: none, user, admin."},"on_click_action":{"type":"string","enum":["none","navigate"],"description":"One of: none, navigate."},"secondary_cta":{"type":"boolean","default":false,"description":"Shows extra buttons."},"secondary_ctas":{"type":"array","items":{"type":"object","properties":{"icon":{"type":"string"},"text":{"type":"string"},"auth_guard":{"type":"string","enum":["none","user","admin"],"default":"none"},"on_click_action":{"type":"string","enum":["none","navigate"]},"_id":{"type":"string"},"navigate":{"type":"object","properties":{"link":{"type":"string"},"query_params":{"type":"string"}}}}},"description":"The extra buttons."},"edit_page":{"type":"boolean","default":false,"description":"Records can be edited from the page."},"create_page":{"type":"boolean","default":false,"description":"Records can be created from the page."},"auth_guard":{"type":"string","enum":["none","user","admin"],"default":"none","description":"One of: none, user, admin."},"enable_additional_filters":{"type":"boolean","default":false,"description":"Shows additional_filters."},"additional_filters":{"type":"object","description":"Filters the visitor can apply to the list."},"containers":{"type":"array","items":{"type":"object","properties":{"isFluid":{"type":"boolean","default":false},"parallaxEnabled":{"type":"boolean"},"parallaxAmount":{"type":"number"},"parallaxZoom":{"type":"number"},"continuousEnabled":{"type":"boolean","default":false},"continuousEffect":{"type":"string","default":"none"},"continuousDuration":{"type":"number","default":2400},"continuousIntensity":{"type":"number","default":4},"backgroundImage":{"type":"string"},"backgroundSize":{"type":"string"},"backgroundPosition":{"type":"string"},"backgroundRepeat":{"type":"string"},"backgroundVideo":{"type":"string"},"backgroundColor":{"type":"string"},"backgroundParallax":{"type":"boolean","default":false},"minHeight":{"type":"number"},"minHeightMobile":{"type":"number"},"allowOffset":{"type":"boolean","default":false},"offsetX":{"type":"number","default":0},"offsetY":{"type":"number","default":0},"offsetMobileX":{"type":"number","default":0},"offsetMobileY":{"type":"number","default":0},"zIndex":{"type":"number","default":0},"wrap_reverse":{"type":"boolean","default":false},"borderRadius":{"type":"number","default":0},"marginX":{"type":"number","default":0},"editorName":{"type":"string"},"horizontalScroll":{"type":"boolean","default":false},"horizontalScrollWidth":{"type":"number","default":100},"overflowX":{"type":"string","default":"hidden"},"columns":{"type":"array","items":{"type":"object","properties":{"size":{"type":"string"},"hoverGroup":{"type":"boolean"},"parallaxEnabled":{"type":"boolean"},"parallaxAmount":{"type":"number"},"parallaxZoom":{"type":"number"},"continuousEnabled":{"type":"boolean","default":false},"continuousEffect":{"type":"string","default":"none"},"continuousDuration":{"type":"number","default":2400},"continuousIntensity":{"type":"number","default":4},"sticky":{"type":"boolean","default":false},"justify":{"type":"string"},"align":{"type":"string"},"onHoverActions":{"type":"boolean","default":false},"onHoverTransition":{"type":"number","default":0.3},"backgroundColor":{"type":"string"},"backgroundColorOnHover":{"type":"string"},"innerBackgroundColor":{"type":"string"},"innerBackgroundColorOnHover":{"type":"string"},"backgroundImage":{"type":"string"},"backgroundSize":{"type":"string"},"backgroundPosition":{"type":"string"},"backgroundRepeat":{"type":"string"},"backgroundVideo":{"type":"string"},"paddingX":{"type":"number","default":0},"paddingXOnHover":{"type":"number","default":0},"paddingY":{"type":"number","default":0},"paddingYOnHover":{"type":"number","default":0},"innerPaddingX":{"type":"number","default":0},"innerPaddingXOnHover":{"type":"number","default":0},"innerPaddingY":{"type":"number","default":0},"allowOffset":{"type":"boolean","default":false},"offsetX":{"type":"number","default":0},"offsetY":{"type":"number","default":0},"offsetMobileX":{"type":"number","default":0},"offsetMobileY":{"type":"number","default":0},"zIndex":{"type":"number","default":0},"innerPaddingYOnHover":{"type":"number","default":0},"paddingOptions":{"type":"string"},"paddingOptionsOnHover":{"type":"string"},"innerPaddingOptions":{"type":"string"},"borderOptions":{"type":"string"},"borderOptionsOnHover":{"type":"string"},"card":{"type":"boolean","default":false},"borderRadius":{"type":"number","default":0},"borderRadiusOnHover":{"type":"number","default":0},"borderType":{"type":"string","default":"none"},"borderTypeOnHover":{"type":"string","default":"none"},"borderWidth":{"type":"number","default":0},"borderWidthOnHover":{"type":"number","default":0},"borderColor":{"type":"string","default":""},"borderColorOnHover":{"type":"string","default":""},"components":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"size":{"type":"string","default":"12"},"sticky":{"type":"boolean","default":false},"paddingX":{"type":"number","default":0},"paddingY":{"type":"number","default":0},"allowOffset":{"type":"boolean","default":false},"offsetX":{"type":"number","default":0},"offsetY":{"type":"number","default":0},"offsetMobileX":{"type":"number","default":0},"offsetMobileY":{"type":"number","default":0},"zIndex":{"type":"number","default":0},"position":{"type":"string","enum":["static","relative","absolute","fixed","sticky"],"default":"static"},"custom_measurements":{"type":"boolean","default":false},"edit_type":{"type":"string","default":"simple"},"object_fit":{"type":"string","default":"none"},"min_height":{"type":"number","default":0},"specific_border_radius":{"type":"boolean","default":false},"box_shadows":{"type":"array","items":{"type":"object","properties":{}}},"mix_blend_mode":{"type":"string","enum":["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],"default":"normal"},"paddingOptions":{"type":"string"},"backgroundColor":{"type":"string"},"card":{"type":"boolean","default":false},"borderRadius":{"type":"number","default":0},"borderType":{"type":"string","default":"none"},"borderWidth":{"type":"number","default":0},"borderColor":{"type":"string","default":""},"borderOptions":{"type":"string"},"showOnMobile":{"type":"boolean","default":true},"showOnDesktop":{"type":"boolean","default":true},"icon":{"type":"string"},"heading":{"type":"string"},"subHeading":{"type":"string"},"heading_alignment":{"type":"string"},"innerHTML":{"type":"string"},"innerCSS":{"type":"string"},"innerJS":{"type":"string"},"lineHeight":{"type":"string","default":"normal"},"medias":{"type":"array","items":{"type":"object","properties":{}}},"products":{"type":"array","items":{"type":"string"},"description":"Id of a Product."},"services":{"type":"array","items":{"type":"string"},"description":"Id of a Service."},"blogposts":{"type":"array","items":{"type":"string"},"description":"Id of a BlogPost."},"videos":{"type":"array","items":{"type":"string"},"description":"Id of a Video."},"price_plans":{"type":"array","items":{"type":"string"},"description":"Id of a PricePlan."},"href":{"type":"string","default":"#"},"router_link":{"type":"string"},"map":{"type":"string"},"animation":{"type":"string","default":"none"},"animationDuration":{"type":"number","default":0},"animationStrength":{"type":"number"},"parallaxEnabled":{"type":"boolean"},"parallaxAmount":{"type":"number"},"parallaxZoom":{"type":"number"},"textReveal":{"type":"string"},"animationDelay":{"type":"number","default":0},"animationReplay":{"type":"string","default":"once"},"animationEasing":{"type":"string","default":"power3.out"},"animationBreakpoint":{"type":"string","default":"all"},"scrollScrubEnabled":{"type":"boolean","default":false},"scrollScrubAxis":{"type":"string","default":"y"},"scrollScrubDistance":{"type":"number","default":80},"motionOrigin":{"type":"string","default":"center center"},"hoverEnabled":{"type":"boolean","default":false},"hoverEffect":{"type":"string","default":"none"},"hoverDuration":{"type":"number","default":240},"hoverIntensity":{"type":"number","default":4},"continuousEnabled":{"type":"boolean","default":false},"continuousEffect":{"type":"string","default":"none"},"continuousDuration":{"type":"number","default":2400},"continuousIntensity":{"type":"number","default":4},"statefulEnabled":{"type":"boolean","default":false},"statefulEffect":{"type":"string","default":"none"},"statefulDuration":{"type":"number","default":260},"statefulStagger":{"type":"number","default":60},"opacity":{"type":"object"},"transitionDuration":{"type":"object"},"transitionEasing":{"type":"string"},"states":{"type":"object"},"useIframe":{"type":"boolean","default":false},"collapsible_container":{"type":"array","items":{"type":"object","properties":{}}},"dynamicField":{"type":"string"},"useDynamicField":{"type":"boolean","default":false},"_id":{"type":"string"},"top":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"left":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"right":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"bottom":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"custom_width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"custom_min_width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"custom_max_width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"custom_height":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"custom_min_height":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"custom_max_height":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"aspect_ratio":{"type":"object","properties":{"custom":{"type":"boolean"},"ratio":{"type":"string"}}},"margin_left":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"margin_right":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"margin_top":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"margin_bottom":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_left":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_right":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_top":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_bottom":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"border_left":{"type":"object","properties":{"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"style":{"type":"string"}}},"border_right":{"type":"object","properties":{"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"style":{"type":"string"}}},"border_top":{"type":"object","properties":{"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"style":{"type":"string"}}},"border_bottom":{"type":"object","properties":{"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"style":{"type":"string"}}},"border_top_left_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"border_top_right_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"border_bottom_left_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"border_bottom_right_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"custom_border_radius":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string"}}},"backgroundGradient":{"type":"object","properties":{"enabled":{"type":"boolean"},"type":{"type":"string"},"degrees":{"type":"number"},"radialShape":{"type":"string"},"radialPosition":{"type":"string"},"colors":{"type":"string"},"css":{"type":"string"}}},"iconSettings":{"type":"object","properties":{"size":{"type":"number"},"color":{"type":"string"}}},"product_gallery":{"type":"object","properties":{"design_layout":{"type":"string"},"mode":{"type":"string"},"columns":{"type":"number"},"placeholderItems":{"type":"string"},"placeholderPlateColor":{"type":"string"},"showName":{"type":"boolean"},"showPrice":{"type":"boolean"},"showDescription":{"type":"boolean"},"showBrand":{"type":"boolean"},"showRibbon":{"type":"boolean"},"showRating":{"type":"boolean"},"showCart":{"type":"boolean"},"showLink":{"type":"boolean"},"linkLabel":{"type":"string"},"imageAspectRatio":{"type":"string"},"imageHeight":{"type":"number"},"imageRadius":{"type":"number"},"imageObjectFit":{"type":"string"},"cardBackgroundColor":{"type":"string"},"cardBorderRadius":{"type":"number"},"cardBorderWidth":{"type":"number"},"cardBorderColor":{"type":"string"},"cardPaddingX":{"type":"number"},"cardPaddingY":{"type":"number"},"gap":{"type":"number"},"boxShadowColor":{"type":"string"},"boxShadowOffsetY":{"type":"number"},"boxShadowBlurRadius":{"type":"number"},"boxShadowSpreadRadius":{"type":"number"},"fieldBackground":{"type":"string"},"hairlineColor":{"type":"string"},"hairlineWidth":{"type":"number"},"maxWidth":{"type":"number"},"scrimGradient":{"type":"string"},"align":{"type":"string"},"accentColor":{"type":"string"},"nameColor":{"type":"string"},"nameFontSize":{"type":"string"},"nameFontWeight":{"type":"string"},"nameFontFamily":{"type":"string"},"nameTransform":{"type":"string"},"priceColor":{"type":"string"},"priceFontSize":{"type":"string"},"priceFontWeight":{"type":"string"},"priceFontFamily":{"type":"string"},"priceFontStyle":{"type":"string"},"metaColor":{"type":"string"},"titlePosition":{"type":"string"},"imageSide":{"type":"string"},"imagePadding":{"type":"number"},"boxShadowOffsetX":{"type":"number"},"descFontSize":{"type":"string"},"descFontWeight":{"type":"string"},"animation":{"type":"string"},"animationDuration":{"type":"number"},"animationDelay":{"type":"number"},"showCustomFields":{"type":"boolean"},"cardDesign":{"type":"string"},"carouselLoop":{"type":"boolean"},"carouselControls":{"type":"boolean"},"customCss":{"type":"string"}}},"service_gallery":{"type":"object","properties":{"design_layout":{"type":"string"},"mode":{"type":"string"},"columns":{"type":"number"},"placeholderItems":{"type":"string"},"placeholderPlateColor":{"type":"string"},"showTitle":{"type":"boolean"},"showPrice":{"type":"boolean"},"showDescription":{"type":"boolean"},"showDuration":{"type":"boolean"},"durationLabel":{"type":"string"},"showImage":{"type":"boolean"},"showLink":{"type":"boolean"},"linkLabel":{"type":"string"},"imageAspectRatio":{"type":"string"},"imageHeight":{"type":"number"},"imageRadius":{"type":"number"},"imageObjectFit":{"type":"string"},"cardBackgroundColor":{"type":"string"},"cardBorderRadius":{"type":"number"},"cardBorderWidth":{"type":"number"},"cardBorderColor":{"type":"string"},"cardPaddingX":{"type":"number"},"cardPaddingY":{"type":"number"},"gap":{"type":"number"},"boxShadowColor":{"type":"string"},"boxShadowOffsetY":{"type":"number"},"boxShadowBlurRadius":{"type":"number"},"boxShadowSpreadRadius":{"type":"number"},"fieldBackground":{"type":"string"},"hairlineColor":{"type":"string"},"hairlineWidth":{"type":"number"},"rowRuleColor":{"type":"string"},"rowRuleWidth":{"type":"number"},"maxWidth":{"type":"number"},"scrimGradient":{"type":"string"},"align":{"type":"string"},"accentColor":{"type":"string"},"titleColor":{"type":"string"},"titleFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"titleFontFamily":{"type":"string"},"titleTransform":{"type":"string"},"priceColor":{"type":"string"},"priceFontSize":{"type":"string"},"priceFontWeight":{"type":"string"},"priceFontFamily":{"type":"string"},"priceFontStyle":{"type":"string"},"metaColor":{"type":"string"},"titlePosition":{"type":"string"},"imageSide":{"type":"string"},"imagePadding":{"type":"number"},"boxShadowOffsetX":{"type":"number"},"descFontSize":{"type":"string"},"descFontWeight":{"type":"string"},"animation":{"type":"string"},"animationDuration":{"type":"number"},"animationDelay":{"type":"number"},"showCustomFields":{"type":"boolean"},"cardDesign":{"type":"string"},"carouselLoop":{"type":"boolean"},"carouselControls":{"type":"boolean"},"customCss":{"type":"string"}}},"blog_gallery":{"type":"object","properties":{"design_layout":{"type":"string"},"mode":{"type":"string"},"columns":{"type":"number"},"leadLayout":{"type":"string"},"leadWidth":{"type":"number"},"placeholderItems":{"type":"string"},"placeholderPlateColor":{"type":"string"},"showTitle":{"type":"boolean"},"showExcerpt":{"type":"boolean"},"showDate":{"type":"boolean"},"showImage":{"type":"boolean"},"showLink":{"type":"boolean"},"linkLabel":{"type":"string"},"showCustomFields":{"type":"boolean"},"imageAspectRatio":{"type":"string"},"imageHeight":{"type":"number"},"imageRadius":{"type":"number"},"imageObjectFit":{"type":"string"},"imagePadding":{"type":"number"},"imageSide":{"type":"string"},"cardBackgroundColor":{"type":"string"},"cardBorderRadius":{"type":"number"},"cardBorderWidth":{"type":"number"},"cardBorderColor":{"type":"string"},"cardPaddingX":{"type":"number"},"cardPaddingY":{"type":"number"},"gap":{"type":"number"},"boxShadowColor":{"type":"string"},"boxShadowOffsetX":{"type":"number"},"boxShadowOffsetY":{"type":"number"},"boxShadowBlurRadius":{"type":"number"},"boxShadowSpreadRadius":{"type":"number"},"fieldBackground":{"type":"string"},"hairlineColor":{"type":"string"},"hairlineWidth":{"type":"number"},"rowRuleColor":{"type":"string"},"rowRuleWidth":{"type":"number"},"maxWidth":{"type":"number"},"scrimGradient":{"type":"string"},"align":{"type":"string"},"accentColor":{"type":"string"},"titleColor":{"type":"string"},"titleFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"titleFontFamily":{"type":"string"},"titleTransform":{"type":"string"},"dateColor":{"type":"string"},"dateFontSize":{"type":"string"},"dateFontWeight":{"type":"string"},"dateFontFamily":{"type":"string"},"dateFontStyle":{"type":"string"},"metaColor":{"type":"string"},"excerptFontSize":{"type":"string"},"excerptFontWeight":{"type":"string"},"excerptFontFamily":{"type":"string"},"titlePosition":{"type":"string"},"animation":{"type":"string"},"animationDuration":{"type":"number"},"animationDelay":{"type":"number"},"cardDesign":{"type":"string"},"customCss":{"type":"string"}}},"multi_booking":{"type":"object","properties":{"layout":{"type":"string"},"columns":{"type":"number"},"pickerBackground":{"type":"string"},"gap":{"type":"number"},"align":{"type":"string"},"showPrice":{"type":"boolean"},"showDuration":{"type":"boolean"},"showDescription":{"type":"boolean"},"showImage":{"type":"boolean"},"itemPaddingX":{"type":"number"},"itemPaddingY":{"type":"number"},"itemRadius":{"type":"number"},"itemBorderWidth":{"type":"number"},"itemBorderColor":{"type":"string"},"itemBackground":{"type":"string"},"itemTextColor":{"type":"string"},"itemSubTextColor":{"type":"string"},"selectedBackground":{"type":"string"},"selectedTextColor":{"type":"string"},"selectedSubTextColor":{"type":"string"},"selectedBorderColor":{"type":"string"},"hoverBackground":{"type":"string"},"titleFontSize":{"type":"number"},"titleFontWeight":{"type":"string"},"subFontSize":{"type":"number"},"dividerColor":{"type":"string"},"dividerWidth":{"type":"number"},"autoScroll":{"type":"boolean"},"cardBackground":{"type":"string"},"cardRadius":{"type":"number"},"cardBorderWidth":{"type":"number"},"cardBorderColor":{"type":"string"},"cardMaxWidth":{"type":"number"},"cardLayout":{"type":"string"},"splitWidth":{"type":"number"},"shadowColor":{"type":"string"},"shadowOffsetY":{"type":"number"},"shadowBlur":{"type":"number"},"shadowSpread":{"type":"number"},"sectionPaddingX":{"type":"number"},"sectionPaddingY":{"type":"number"},"sectionDividerColor":{"type":"string"},"sectionDividerWidth":{"type":"number"},"showStepLabels":{"type":"boolean"},"serviceStepLabel":{"type":"string"},"dayStepLabel":{"type":"string"},"staffStepLabel":{"type":"string"},"timeStepLabel":{"type":"string"},"stepLabelColor":{"type":"string"},"stepLabelSize":{"type":"number"},"stepLabelWeight":{"type":"string"},"stepLabelSpacing":{"type":"number"},"stepLabelUppercase":{"type":"boolean"},"dayCount":{"type":"number"},"dayLayout":{"type":"string"},"dayBorderColor":{"type":"string"},"dayShape":{"type":"string"},"daySize":{"type":"number"},"dayGap":{"type":"number"},"dayShowWeekday":{"type":"boolean"},"dayBackground":{"type":"string"},"dayTextColor":{"type":"string"},"daySelectedBackground":{"type":"string"},"daySelectedTextColor":{"type":"string"},"dayDisabledOpacity":{"type":"number"},"timeGap":{"type":"number"},"timeRadius":{"type":"number"},"timeBorderWidth":{"type":"number"},"timeBorderColor":{"type":"string"},"timeSelectedBorderColor":{"type":"string"},"timePaddingX":{"type":"number"},"timePaddingY":{"type":"number"},"timeBackground":{"type":"string"},"timeTextColor":{"type":"string"},"timeSelectedBackground":{"type":"string"},"timeSelectedTextColor":{"type":"string"},"buttonText":{"type":"string"},"buttonBackground":{"type":"string"},"buttonTextColor":{"type":"string"},"buttonRadius":{"type":"number"},"buttonPaddingY":{"type":"number"},"buttonFontSize":{"type":"number"},"buttonFontWeight":{"type":"string"},"buttonFullWidth":{"type":"boolean"}}},"buttonOptions":{"type":"object","properties":{"fill":{"type":"string"},"expand":{"type":"string"},"size":{"type":"string"},"color":{"type":"string"},"class":{"type":"string"},"customColor":{"type":"string"},"customColorContrast":{"type":"string"},"customColorHover":{"type":"string"},"hoverRoll":{"type":"boolean"},"fontWeight":{"type":"number"},"letterSpacing":{"type":"number"},"fontSize":{"type":"number"},"borderRadius":{"type":"number"},"customColorA":{"type":"string"},"customColorB":{"type":"string"},"customColorC":{"type":"string"},"custom_measurements":{"type":"boolean"},"height":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}}}},"carousel":{"type":"object","properties":{"showArrows":{"type":"boolean"},"showIndicators":{"type":"boolean"},"height":{"type":"number"},"automaticHeight":{"type":"boolean"},"carouselMedias":{"type":"string"}}},"contactForm":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"subject":{"type":"string"},"body":{"type":"string"},"button":{"type":"string"},"hideNewsletter":{"type":"boolean"},"placeholders":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"subject":{"type":"string"},"body":{"type":"string"}}},"style":{"type":"object","properties":{"backgroundColor":{"type":"string"},"textColor":{"type":"string"},"accentColor":{"type":"string"},"border":{"type":"object","properties":{"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"style":{"type":"string"}}},"borderRadius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"padding":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"labelFontSize":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"consentFontSize":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"inputBackgroundColor":{"type":"string"},"inputTextColor":{"type":"string"},"placeholderColor":{"type":"string"},"inputFocusColor":{"type":"string"},"inputFontSize":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"inputPadding":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"textareaMinHeight":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"inputMargin":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"inputBorder":{"type":"object","properties":{"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"style":{"type":"string"}}},"inputBorderRadius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"buttonBackgroundColor":{"type":"string"},"buttonTextColor":{"type":"string"},"buttonAlign":{"type":"string"},"buttonFontSize":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"buttonBorder":{"type":"object","properties":{"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"style":{"type":"string"}}},"buttonBorderRadius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"buttonWidth":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}}}},"additional":{"type":"string"}}},"instagram":{"type":"object","properties":{"columns":{"type":"number"},"first":{"type":"number"},"skip":{"type":"number"},"showInfo":{"type":"boolean"},"gridType":{"type":"number"},"profile":{"type":"string"}}},"facebook":{"type":"object","properties":{"url":{"type":"string"},"width":{"type":"string"},"height":{"type":"string"}}},"transform":{"type":"object","properties":{"enabled":{"type":"boolean"},"translateX":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string"}}},"translateY":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string"}}},"scaleX":{"type":"number"},"scaleY":{"type":"number"},"rotate":{"type":"number"},"rotateX":{"type":"number"},"rotateY":{"type":"number"},"skewX":{"type":"number"},"skewY":{"type":"number"},"perspective":{"type":"number"},"originX":{"type":"string"},"originY":{"type":"string"}}},"popup":{"type":"object","properties":{"text":{"type":"string"},"backgroundColor":{"type":"string"},"fullScreen":{"type":"boolean"},"about_page":{"type":"string"}}},"custom_component":{"type":"object","properties":{"html":{"type":"string"},"compiled_html":{"type":"string"},"css":{"type":"string"},"compiled_css":{"type":"string"},"js":{"type":"string"},"iframe":{"type":"boolean"},"variables":{"type":"string"}}},"hoverable_media":{"type":"object","properties":{"before_hover_media":{"type":"object","properties":{"media":{"type":"string"},"gcs_url":{"type":"string"},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"youtube_url":{"type":"string"},"vimeo_url":{"type":"string"},"href":{"type":"string"},"router_link":{"type":"string"},"thumbnail":{"type":"string"},"autoplay":{"type":"boolean"},"loop":{"type":"boolean"},"show_controls":{"type":"boolean"}}},"after_hover_media":{"type":"object","properties":{"media":{"type":"string"},"gcs_url":{"type":"string"},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"youtube_url":{"type":"string"},"vimeo_url":{"type":"string"},"href":{"type":"string"},"router_link":{"type":"string"},"thumbnail":{"type":"string"},"autoplay":{"type":"boolean"},"loop":{"type":"boolean"},"show_controls":{"type":"boolean"}}}}},"collapsible_container_settings":{"type":"object","properties":{"enable_customization":{"type":"boolean"},"title_color":{"type":"string"},"title_color_checked":{"type":"string"},"title_background":{"type":"string"},"title_background_checked":{"type":"string"},"title_font_size":{"type":"string"},"title_border_radius":{"type":"string"},"title_border_color":{"type":"string"},"title_border_width":{"type":"string"},"body_color":{"type":"string"},"body_background":{"type":"string"},"body_border_radius":{"type":"string"},"body_border_color":{"type":"string"},"body_border_width":{"type":"string"},"body_font_size":{"type":"string"},"icon_color":{"type":"string"},"icon_glyph_color":{"type":"string"},"icon_background_color":{"type":"string"}}},"quiz":{"type":"object","properties":{"title":{"type":"string"},"header":{"type":"string"},"questions":{"type":"string"},"score_results":{"type":"string"},"show_right_answers":{"type":"boolean"},"mutliple_choice":{"type":"boolean"}}},"partners":{"type":"object","properties":{"defaultCollection":{"type":"string"},"defaultView":{"type":"string"}}},"scroll_sequence":{"type":"object","properties":{"media":{"type":"string"},"scroll_length":{"type":"number"},"fit":{"type":"string"},"background_color":{"type":"string"},"overlay_color":{"type":"string"},"overlay_opacity":{"type":"number"},"rows_over":{"type":"boolean"},"rows_effect":{"type":"string"},"snap_points":{"type":"string"},"snap_scroll_speed":{"type":"number"},"snap_down":{"type":"boolean"},"snap_up":{"type":"boolean"},"stop_momentum":{"type":"boolean"}}},"smart_search":{"type":"object","properties":{"placeholder":{"type":"string"},"kinds":{"type":"string"},"collections":{"type":"string"},"items":{"type":"string"},"showKindFilter":{"type":"boolean"},"showPriceFilter":{"type":"boolean"},"showDateFilter":{"type":"boolean"},"showSort":{"type":"boolean"},"dateMode":{"type":"string"},"layout":{"type":"string"},"columns":{"type":"number"},"perPage":{"type":"number"},"instant":{"type":"boolean"},"showImages":{"type":"boolean"},"showPrices":{"type":"boolean"},"showInitial":{"type":"boolean"},"showAnswer":{"type":"boolean"}}},"countdown":{"type":"object","properties":{"targetDate":{"type":"string"},"expiredText":{"type":"string"},"hideOnExpire":{"type":"boolean"},"textColor":{"type":"string"},"boxColor":{"type":"string"},"align":{"type":"string"}}},"swiper":{"type":"object","properties":{"slides":{"type":"string"},"autoplay":{"type":"boolean"},"loop":{"type":"boolean"},"show_controls":{"type":"boolean"},"dynamic_bullets":{"type":"boolean"},"pagination":{"type":"boolean"}}},"text_auto_slider":{"type":"object","properties":{"speed":{"type":"number"},"aspect_ratio":{"type":"string"},"text_color":{"type":"string"},"background_color":{"type":"string"},"delimiter_color":{"type":"string"},"direction":{"type":"string"},"width":{"type":"number"},"font_size":{"type":"number"},"text_transform":{"type":"string"},"texts":{"type":"string"}}},"image_auto_slider":{"type":"object","properties":{"speed":{"type":"number"},"aspect_ratio":{"type":"string"},"direction":{"type":"string"},"width":{"type":"number"},"medias":{"type":"string"}}},"image_dragger":{"type":"object","properties":{"aspect_ratio":{"type":"string"},"media_1":{"type":"object","properties":{"media":{"type":"string"},"gcs_url":{"type":"string"},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"vimeo_url":{"type":"string"},"youtube_url":{"type":"string"}}},"media_2":{"type":"object","properties":{"media":{"type":"string"},"gcs_url":{"type":"string"},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"vimeo_url":{"type":"string"},"youtube_url":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"},"textColor":{"type":"string"},"href":{"type":"string"},"router_link":{"type":"string"}}}}}}}},"sections":{"type":"array","items":{"type":"object","properties":{"position":{"type":"string","enum":["static","relative","absolute","fixed","sticky"],"default":"static"},"overflow":{"type":"string","enum":["visible","hidden","scroll","auto"],"default":"visible"},"editorName":{"type":"string"},"display":{"type":"string","enum":["block","inline","flex"],"default":"block"},"flex_direction":{"type":"string","enum":["row","row-reverse","column","column-reverse"],"default":"row"},"flex_direction_mobile":{"type":"string","default":""},"backdropFilter":{"type":"string","default":""},"justify":{"type":"string","enum":["start","end","center","space-between","space-around","stretch"],"default":"start"},"justify_mobile":{"type":"string","default":""},"align":{"type":"string","enum":["start","end","center","space-between","space-around","stretch"],"default":"start"},"align_mobile":{"type":"string","default":""},"animation":{"type":"string","default":"none"},"animationDuration":{"type":"number","default":0},"animationStrength":{"type":"number"},"parallaxEnabled":{"type":"boolean"},"parallaxAmount":{"type":"number"},"parallaxZoom":{"type":"number"},"animationDelay":{"type":"number","default":0},"animationReplay":{"type":"string","default":"once"},"animationEasing":{"type":"string","default":"power3.out"},"animationBreakpoint":{"type":"string","default":"all"},"scrollScrubEnabled":{"type":"boolean","default":false},"scrollScrubAxis":{"type":"string","default":"y"},"scrollScrubDistance":{"type":"number","default":80},"motionOrigin":{"type":"string","default":"center center"},"hoverEnabled":{"type":"boolean","default":false},"hoverEffect":{"type":"string","default":"none"},"hoverDuration":{"type":"number","default":240},"hoverIntensity":{"type":"number","default":4},"continuousEnabled":{"type":"boolean","default":false},"continuousEffect":{"type":"string","default":"none"},"continuousDuration":{"type":"number","default":2400},"continuousIntensity":{"type":"number","default":4},"statefulEnabled":{"type":"boolean","default":false},"statefulEffect":{"type":"string","default":"none"},"statefulDuration":{"type":"number","default":260},"statefulStagger":{"type":"number","default":60},"opacity":{"type":"object"},"transitionDuration":{"type":"object"},"transitionEasing":{"type":"string"},"states":{"type":"object"},"hoverGroup":{"type":"boolean"},"flex_wrap":{"type":"string","enum":["nowrap","wrap","wrap-reverse"],"default":"wrap"},"flex_wrap_mobile":{"type":"string","default":""},"object_fit":{"type":"string"},"specific_border_radius":{"type":"boolean","default":false},"box_shadows":{"type":"array","items":{"type":"object","properties":{}}},"backgroundColor":{"type":"string"},"backgroundVideo":{"type":"string"},"backgroundImage":{"type":"string"},"backgroundSize":{"type":"string"},"backgroundPosition":{"type":"string"},"backgroundRepeat":{"type":"string"},"showOnMobile":{"type":"boolean","default":true},"showOnDesktop":{"type":"boolean","default":true},"components":{"type":"array","items":{"type":"object","properties":{}}},"sections":{"type":"array","items":{"type":"object","properties":{}}},"_id":{"type":"string"},"top":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"left":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"right":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"bottom":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"transform":{"type":"object","properties":{"enabled":{"type":"boolean"},"translateX":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string"}}},"translateY":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string"}}},"scaleX":{"type":"number"},"scaleY":{"type":"number"},"rotate":{"type":"number"},"rotateX":{"type":"number"},"rotateY":{"type":"number"},"skewX":{"type":"number"},"skewY":{"type":"number"},"perspective":{"type":"number"},"originX":{"type":"string"},"originY":{"type":"string"}}},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"min_width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"max_width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"height":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"min_height":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"max_height":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"aspect_ratio":{"type":"object","properties":{"custom":{"type":"boolean"},"ratio":{"type":"string"}}},"margin_left":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"margin_right":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"margin_top":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"margin_bottom":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_left":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_right":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_top":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_bottom":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"border_left":{"type":"object","properties":{"style":{"type":"string"},"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}}}},"border_right":{"type":"object","properties":{"style":{"type":"string"},"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}}}},"border_top":{"type":"object","properties":{"style":{"type":"string"},"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}}}},"border_bottom":{"type":"object","properties":{"style":{"type":"string"},"color":{"type":"string"},"width":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}}}},"border_top_left_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"border_top_right_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"border_bottom_left_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"border_bottom_right_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"border_radius":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"}}},"backgroundGradient":{"type":"object","properties":{"enabled":{"type":"boolean"},"type":{"type":"string"},"degrees":{"type":"number"},"radialShape":{"type":"string"},"radialPosition":{"type":"string"},"colors":{"type":"string"},"css":{"type":"string"}}}}}},"_id":{"type":"string"},"backgroundGradient":{"type":"object","properties":{"enabled":{"type":"boolean"},"type":{"type":"string"},"degrees":{"type":"number"},"radialShape":{"type":"string"},"radialPosition":{"type":"string"},"colors":{"type":"string"},"css":{"type":"string"}}},"innerBackgroundGradient":{"type":"object","properties":{"enabled":{"type":"boolean"},"type":{"type":"string"},"degrees":{"type":"number"},"radialShape":{"type":"string"},"radialPosition":{"type":"string"},"colors":{"type":"string"},"css":{"type":"string"}}}}}},"ai_meta":{"type":"object","default":null},"_id":{"type":"string"},"backgroundGradient":{"type":"object","properties":{"enabled":{"type":"boolean"},"type":{"type":"string"},"degrees":{"type":"number"},"radialShape":{"type":"string"},"radialPosition":{"type":"string"},"colors":{"type":"string"},"css":{"type":"string"}}},"padding_top":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_right":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_bottom":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}},"padding_left":{"type":"object","properties":{"value":{"type":"string"},"unit":{"type":"string"},"mobile_value":{"type":"string"},"mobile_unit":{"type":"string"}}}}},"description":"The page's layout."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"navigate":{"type":"object","properties":{"link":{"type":"string"},"query_params":{"type":"string"}}},"statistics_options":{"type":"object","properties":{"filter_fields":{"type":"string"},"functions":{"type":"string"},"period_options":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"},"period":{"type":"string"},"period_field":{"type":"string"},"value_field":{"type":"string"}}}}}}},"DynamicTrigger":{"type":"object","properties":{"enabled":{"type":"boolean","default":false,"description":"The trigger runs."},"name":{"type":"string","description":"Name of the trigger."},"model":{"type":"string","description":"The model whose changes start it."},"type":{"type":"string","enum":["CREATE","READ","UPDATE","DELETE"],"description":"Which change of a model's record starts it. One of: CREATE, READ, UPDATE, DELETE."},"code":{"type":"string","description":"The script the trigger runs."},"last_run_at":{"type":"string","format":"date-time","default":null,"description":"When it last ran."},"last_run_status":{"type":"string","enum":[null,"success","failed"],"default":null,"description":"One of: success, failed."},"last_error":{"type":"string","default":null,"description":"The error of the last run, if it failed."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"EcontSettings":{"type":"object","properties":{"shipping":{"type":"string","description":"Shipping.id. Id of a Shipping."},"create_label":{"type":"boolean","default":false,"description":"Shipments are created at Econt automatically when an order is placed."},"username":{"type":"string","description":"Econt account username."},"from_office":{"type":"boolean","default":false,"description":"Shipments leave from an Econt office; false: picked up from the sender's door."},"automatic_courier":{"type":"boolean","default":false,"description":"A courier is ordered to pick shipments up automatically."},"sender":{"type":"string","description":"Sender's name on shipments."},"payAfterAccept":{"type":"boolean","default":false,"description":"Customers may inspect the parcel before paying."},"multiple_items":{"type":"string","enum":["box","sum"],"default":"sum","description":"One of: box, sum."},"divide_by":{"type":"number","description":"When several items are summed into one parcel, their added dimensions are divided by this to estimate it."},"box":{"type":"array","items":{"type":"object","properties":{"height":{"type":"number"},"length":{"type":"number"},"width":{"type":"number"},"_id":{"type":"string"}}},"description":"Box sizes the business ships in."},"email_delivery":{"type":"boolean","default":false,"description":"Econt emails the customer about the delivery."},"sms_delivery":{"type":"boolean","default":false,"description":"Econt texts the customer about the delivery."},"free_delivery_method":{"type":"string","enum":["cash","credit","voucher"],"default":"cash","description":"One of: cash, credit, voucher."},"invoice_num":{"type":"string","description":"Number of the business's agreement with Econt."},"cdPayOptionsTemplate":{"type":"string","description":"Econt's cash-on-delivery payout template used for the business's shipments."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"connected_account_owner_id":{"type":"string","description":"User.id. Id of a User."},"_id":{"type":"string"},"sender_address":{"type":"object","properties":{"city":{"type":"object","properties":{"country":{"type":"object","properties":{"code2":{"type":"string"}}},"name":{"type":"string"},"postCode":{"type":"string"}}},"quarter":{"type":"string"},"street":{"type":"string"},"other":{"type":"string"},"num":{"type":"string"}}},"sender_office":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"}}},"sender_agent":{"type":"object","properties":{"name":{"type":"string"},"phones":{"type":"string"},"email":{"type":"string"}}},"product_default_dimensions":{"type":"object","properties":{"height":{"type":"number"},"width":{"type":"number"},"length":{"type":"number"},"weight":{"type":"number"}}}}},"Email":{"type":"object","properties":{"title":{"type":"string","description":"The email's heading."},"text1":{"type":"string","description":"Main text of the email; what each text slot means depends on type."},"text2":{"type":"string","description":"Second text slot of the email."},"text3":{"type":"string","description":"Third text slot of the email."},"text4":{"type":"string","description":"Fourth text slot of the email."},"text5":{"type":"string","description":"Fifth text slot of the email."},"text6":{"type":"string","description":"Sixth text slot of the email."},"text7":{"type":"string","description":"Seventh text slot of the email."},"text8":{"type":"string","description":"Eighth text slot of the email."},"text9":{"type":"string","description":"Ninth text slot of the email."},"text10":{"type":"string","description":"Tenth text slot of the email."},"type":{"type":"string","description":"Which email this is (welcome, confirmation, resetPassword, newsletter...)."},"google_calendar":{"type":"string","default":"Add to Google Calendar","description":"Label of the add-to-Google-Calendar link."},"outlook_calendar":{"type":"string","default":"Add to Outlook Calendar","description":"Label of the add-to-Outlook link."},"apple_calendar":{"type":"string","default":"Add to Apple Calendar","description":"Label of the add-to-Apple-Calendar link."},"product_text":{"type":"string","description":"Text for an order of products."},"program_text":{"type":"string","description":"Text for a program purchase."},"priceplan_text":{"type":"string","description":"Text for a subscription."},"template_id":{"type":"string","description":"EmailTemplate.id. Id of a EmailTemplate."},"show_phone":{"type":"boolean","default":false,"description":"Show the business's phone number in the email."},"product_text_fulfilled":{"type":"string","description":"Text when the order was fulfilled."},"booking_text":{"type":"string","description":"Text for a booking."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"EmailTemplate":{"type":"object","properties":{"name":{"type":"string","description":"Name of the template."},"rows":{"type":"array","items":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"object","properties":{"content":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["text","image","logo","link","email","firstname","lastname","name","address","phone_number","city","state","country","imgSrc","icon","custom"]},"width":{"type":"number","default":100},"fallbackText":{"type":"string"},"fontSize":{"type":"number"},"fontWeight":{"type":"string","enum":["100","200","300","400","500","600","700","800","900"]},"fontColor":{"type":"string","default":"#000000"},"fontFamily":{"type":"string","default":"Arial,Helvetica Neue,Helvetica,sans-serif"},"fontStyle":{"type":"string","enum":["normal","italic","oblique"]},"textAlign":{"type":"string","enum":["left","right","center"]},"display":{"type":"string","enum":["block","inline"],"default":"block"},"icon":{"type":"string"},"image":{"type":"string"},"backgroundColor":{"type":"string"},"innerHTML":{"type":"string"},"link":{"type":"string"},"_id":{"type":"string"}}}},"width":{"type":"number","default":100},"justifyContent":{"type":"string","enum":["start","end","center","space-between","space-around","space-evenly"]},"paddingLeft":{"type":"number","default":0},"paddingRight":{"type":"number","default":0},"paddingTop":{"type":"number","default":0},"paddingBottom":{"type":"number","default":0},"backgroundColor":{"type":"string"},"_id":{"type":"string"},"borderLeft":{"type":"object","properties":{"width":{"type":"number"},"color":{"type":"string"}}},"borderRight":{"type":"object","properties":{"width":{"type":"number"},"color":{"type":"string"}}},"borderTop":{"type":"object","properties":{"width":{"type":"number"},"color":{"type":"string"}}},"borderBottom":{"type":"object","properties":{"width":{"type":"number"},"color":{"type":"string"}}}}}},"_id":{"type":"string"}}},"description":"The template's layout, row by row, as the editor keeps it."},"previewHTML":{"type":"string","description":"HTML for the editor's preview."},"compiledHTML":{"type":"string","description":"HTML sent in emails, with placeholders."},"fallbackValues":{"type":"object","description":"Values used for placeholders that have none."},"owner_id":{"type":"string","description":"User.id of who made it."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Event":{"type":"object","properties":{"name":{"type":"string","description":"Name of the event."},"venue":{"type":"string","description":"Venue.id. Id of a Venue."},"description":{"type":"string","description":"About the event."},"medias":{"type":"array","items":{"type":"object","properties":{"media":{"type":"string","description":"Id of a Media."},"gcs_url":{"type":"string"},"gcs_480_30_url":{"type":"string"},"gcs_720_30_url":{"type":"string"},"gcs_1080_30_url":{"type":"string"},"duration":{"type":"number"},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"vimeo_url":{"type":"string"},"youtube_url":{"type":"string"},"youtube_picture":{"type":"string"},"thumbnail":{"type":"string"},"_id":{"type":"string"}}},"description":"The event's pictures."},"dates":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date-time"},"_id":{"type":"string"},"seating_plan":{"type":"object","properties":{"id":{"type":"string"},"sections":{"type":"string"}}}}},"description":"When it takes place, one entry per date."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"tier_1":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}},"tier_2":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}},"tier_3":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}},"tier_4":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}},"tier_5":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}},"tier_6":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}},"tier_7":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}},"tier_8":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}},"tier_9":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}},"tier_10":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}},"tier_11":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}},"tier_12":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}},"tier_13":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}},"tier_14":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}},"tier_15":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}}}},"FileRoute":{"type":"object","properties":{"url":{"type":"string","description":"Root path the file is served at, e.g. 'google1a2b3c4d.html'."},"content_type":{"type":"string","description":"Optional content type override."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Form":{"type":"object","properties":{"name":{"type":"string","description":"Name of sender."},"email":{"type":"string","description":"Email of sender."},"subject":{"type":"string","description":"Subject."},"body":{"type":"string","description":"Body of text."},"medias":{"type":"array","items":{"type":"string"},"description":"Files sent with the form."},"additional":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"option":{"type":"string"},"_id":{"type":"string"}}},"description":"Additional fields - types - text field - 0, radio buttons - 1, single select - 2, multiple select - 3, media - 4."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Gdpr":{"type":"object","properties":{"text":{"type":"string","description":"Terms of use text."},"_id":{"type":"string"}}},"GeoLocation":{"type":"object","properties":{"service_id":{"type":"string","description":"Service.id. Id of a Service."},"address":{"type":"string","description":"The address as written."},"latitude":{"type":"number","description":"Latitude of the address."},"longitude":{"type":"number","description":"Longitude of the address."},"formatted_address":{"type":"string","description":"The address as the geocoder formats it."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Group":{"type":"object","properties":{"type":{"type":"string","description":"Public / private;."},"avatar":{"type":"string","description":"Media.id. Id of a Media."},"cover":{"type":"string","description":"Media.id. Id of a Media."},"name":{"type":"string","description":"The group's name."},"handle":{"type":"string","description":"The group's unique @handle."},"bio":{"type":"string","description":"About the group."},"participants":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"who_can_post":{"type":"string","default":"all","description":"All, admin."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"GroupJoinRequest":{"type":"object","properties":{"group":{"type":"string","description":"Group.id the user asks to join. Id of a GroupJoinRequest."},"user":{"type":"string","description":"User.id. Id of a User."},"status":{"type":"string","default":"pending","description":"Pending, rejected or accepted."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"HomePageSettings":{"type":"object","properties":{"useDifferentLayoutForApp":{"type":"boolean","default":false,"description":"The mobile app shows its own home layout instead of the website's."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"IndexComponent":{"type":"object","properties":{"type":{"type":"string","description":"What the block shows: about_page (a page), or a list - products, products_latest, products_top, services, services_all, services_latest, services_top, blogposts, blogposts_latest, blogposts_top, videos, videos_latest, price_plans."},"position":{"type":"number","description":"Order on the home page; lower first."},"about_page":{"type":"string","description":"For an about_page block: the URL of the page it shows (AboutPage.url, e.g. \"our-story\"), not its id. POST /index-components/append takes either and stores the url."},"isFluid":{"type":"boolean","default":false,"description":"Spans the full width of the screen."},"isAppComponent":{"type":"boolean","default":false,"description":"Shown in the mobile app's home instead of the website's."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Inventory":{"type":"object","properties":{"product":{"type":"string","description":"Product.id. Id of a Product."},"option":{"type":"string","description":"The product option this stock line is for (\"Red / L\")."},"quantity":{"type":"number","default":0,"description":"How many of this product option are in stock: the number the store sells from and orders take away. Only counted, and shown in the admin, when track is on."},"sku":{"type":"string","description":"Stock keeping unit code."},"track":{"type":"boolean","default":false,"description":"Stock is counted and goes down with orders."},"trackSku":{"type":"boolean","default":false,"description":"Stock is counted per SKU."},"name":{"type":"object","description":"The product's name, per language."},"media":{"type":"object","description":"The product's picture."},"category":{"type":"object","description":"The product's category."},"price":{"type":"object","description":"The product's price."},"status":{"type":"object","description":"Stock state (in stock, low, out)."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Invoice":{"type":"object","properties":{"stripeNumber":{"type":"string","description":"Invoice number we get from Stripe (foreign key)."},"is_credit_note":{"type":"boolean","default":false,"description":"This document is a credit note for an earlier invoice."},"credit_note_invoice_number":{"type":"string","description":"Number of the invoice the credit note corrects."},"credit_note_invoice_date":{"type":"string","description":"Date of the invoice the credit note corrects."},"is_debit_note":{"type":"boolean","default":false,"description":"This document is a debit note for an earlier invoice."},"debit_note_invoice_number":{"type":"string","description":"Number of the invoice the debit note adds to."},"debit_note_invoice_date":{"type":"string","description":"Date of the invoice the debit note adds to."},"number":{"type":"number","description":"Our invoice number."},"stripeInvoiceId":{"type":"string","description":"Id of invoice stripe gives us."},"has_price_quote":{"type":"boolean","default":false,"description":"Flag which shows if we created invoice from price quote."},"customer_name":{"type":"string","description":"Name of customer."},"customer_address":{"type":"string","description":"Address of customer."},"customer_postal_code":{"type":"string","description":"Postal code of customer."},"customer_city":{"type":"string","description":"City of customer."},"customer_country":{"type":"string","description":"Country of customer."},"customer_phone":{"type":"string","description":"Phone of customer."},"customer_email":{"type":"string","description":"Email of customer."},"customer_tax_id":{"type":"string","description":"Tax id of customer."},"customer_vat_id":{"type":"string","description":"Customer's VAT number."},"customer_responsible_official":{"type":"string","description":"Person responsible on the customer's side."},"customer_organization_name":{"type":"string","description":"Customer's company name."},"billing_customer_address":{"type":"string","description":"Address of billed customer."},"billing_customer_postal_code":{"type":"string","description":"Postal code billed of customer."},"billing_customer_city":{"type":"string","description":"City of billed customer."},"billing_customer_country":{"type":"string","description":"Country of billed customer."},"billing_customer_phone":{"type":"string","description":"Phone of billed customer."},"subtotal":{"type":"number","description":"Invoice subtotal."},"amount":{"type":"number","description":"Invoice amount."},"day_of_issue":{"type":"string","description":"Day of issue of invoice."},"paid_on":{"type":"string","description":"Day the invoice was paid (day_of_issue when empty)."},"foreign":{"type":"boolean","description":"Flag which shows if invoice is from foreign to company country."},"home_tax":{"type":"number","default":0,"description":"Home country tax amount."},"foreign_tax":{"type":"number","default":0,"description":"Foreign country tax amount."},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"qty":{"type":"number"},"unit_price":{"type":"number"},"discount":{"type":"number"},"amount":{"type":"number"},"_id":{"type":"string"}}},"description":"Array of sold products which contains their name, cost, quantity and discount."},"grounds_for_transaction":{"type":"string","description":"Legal grounds for the transaction (e.g. a VAT exemption)."},"description_of_transaction":{"type":"string","description":"What the transaction is for."},"place_of_transaction":{"type":"string","description":"Where the transaction took place."},"payment":{"type":"string","description":"How it is paid (cash, bank transfer, card)."},"dateDue":{"type":"string","description":"Date the invoice must be paid by."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"invoice_settings":{"type":"object","properties":{"number":{"type":"number"},"price_quote_number":{"type":"string"},"bic":{"type":"string"},"swift":{"type":"string"},"tax_id":{"type":"string"},"vat_id":{"type":"string"},"logo":{"type":"string"},"business_name":{"type":"string"},"business_name_translated":{"type":"string"},"responsible_official":{"type":"string"},"responsible_official_translated":{"type":"string"},"business_email":{"type":"string"},"company_id":{"type":"string"},"business_address":{"type":"string"},"business_address_translated":{"type":"string"},"business_phone_number":{"type":"string"},"business_country":{"type":"string"},"business_country_translated":{"type":"string"},"footer":{"type":"string"},"footer_translated":{"type":"string"},"foreign_tax":{"type":"number"},"home_tax":{"type":"number"},"currency_symbol":{"type":"string"}}}}},"InvoiceSettings":{"type":"object","properties":{"number":{"type":"number","description":"Invoice starting number."},"price_quote_number":{"type":"string","description":"Price quote starting number."},"bic":{"type":"string","description":"Bic of bank account."},"swift":{"type":"string","description":"Swift of bank account."},"tax_id":{"type":"string","description":"The business's tax identification number."},"vat_id":{"type":"string","description":"The business's VAT number."},"logo":{"type":"string","description":"Id of media used as logo on invoices."},"business_name":{"type":"string","description":"Name of bussines."},"business_name_translated":{"type":"string","description":"Name of bussines."},"responsible_official":{"type":"string","description":"Responsible official."},"responsible_official_translated":{"type":"string","description":"Responsible official."},"business_email":{"type":"string","description":"Email of bussines."},"company_id":{"type":"string","description":"Id of company."},"business_address":{"type":"string","description":"Address of business."},"business_address_translated":{"type":"string","description":"Address of business."},"business_phone_number":{"type":"string","description":"Phone number of business."},"business_country":{"type":"string","description":"Country of business."},"business_country_translated":{"type":"string","description":"Country of business."},"footer":{"type":"string","description":"Footer text placed at bottom of invoice."},"footer_translated":{"type":"string","description":"Footer text placed at bottom of invoice."},"foreign_tax":{"type":"number","default":0,"description":"Tax which is applied to foreign to business countries customers."},"home_tax":{"type":"number","default":0,"description":"Tax which is applied to the home country customers."},"currency_symbol":{"type":"string","description":"Currency symbol printed on invoices."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Keyword":{"type":"object","properties":{"word":{"type":"string","description":"The search phrase the site wants to rank for."},"_id":{"type":"string"}}},"KeywordBlacklist":{"type":"object","properties":{"keyword":{"type":"array","items":{"type":"string"},"description":"Words that are not allowed in posts and comments."},"_id":{"type":"string"}}},"Lead":{"type":"object","properties":{"seq":{"type":"number","default":0,"description":"Running number of the customer."},"organization_name":{"type":"string","description":"Customer's company name."},"firstname":{"type":"string","description":"Customer's first name."},"lastname":{"type":"string","description":"Customer's last name."},"email":{"type":"string","description":"Customer's email."},"phone_number":{"type":"string","description":"Customer's phone number."},"address":{"type":"string","description":"Customer's address."},"city":{"type":"string","description":"Customer's city."},"state":{"type":"string","description":"Customer's state or region."},"country":{"type":"string","description":"Customer's country."},"zip_code":{"type":"string","description":"Customer's postal code."},"tax_identification_number":{"type":"string","description":"Customer's tax number."},"vat_id":{"type":"string","description":"Customer's VAT number."},"notes":{"type":"string","description":"Notes kept on the customer."},"products":{"type":"array","items":{"type":"string"},"description":"Product ids the customer bought."},"products_obj":{"type":"array","items":{"type":"object","properties":{"product_id":{"type":"string","description":"Id of a Product."},"name":{"type":"string"},"options":{"type":"string"},"price":{"type":"number"},"quantity":{"type":"number"},"_id":{"type":"string"}}},"description":"The products bought, as they were when ordered."},"programs":{"type":"array","items":{"type":"string"},"description":"Program ids the customer bought."},"programs_obj":{"type":"array","items":{"type":"object","properties":{"program_id":{"type":"string","description":"Id of a Program."},"title":{"type":"string"},"price":{"type":"number"},"_id":{"type":"string"}}},"description":"The programs bought, as they were when ordered."},"tickets":{"type":"array","items":{"type":"string"},"description":"Ticket ids. Id of a Ticket."},"donations":{"type":"array","items":{"type":"string"},"description":"Donation ids. Id of a Donation."},"donations_obj":{"type":"array","items":{"type":"object","properties":{"donation_id":{"type":"string","description":"Id of a Donation."},"name":{"type":"string"},"options":{"type":"string"},"price":{"type":"number"},"quantity":{"type":"number"},"_id":{"type":"string"}}},"description":"The donations made."},"lifetime_value":{"type":"number","default":0,"description":"Everything the customer has spent."},"last_order_value":{"type":"number","description":"Value of the customer's last order."},"services":{"type":"array","items":{"type":"string"},"description":"Service ids. Id of a Service."},"stripe_id":{"type":"string","description":"The customer's id in Stripe."},"delivery_method":{"type":"string","description":"The customer's last delivery method."},"shipping_option":{"type":"string","enum":["address","office"],"default":"address","description":"One of: address, office."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Locales":{"type":"object","properties":{"locales_object":{"type":"object","description":"The site's words as JSON text: { <key>: <text shown> }, the key being the English source wording. Only the newest record is used."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Media":{"type":"object","properties":{"file":{"type":"string","description":"(buffer) base64 image data."},"file_path":{"type":"string","description":"The bytes in Cloud Storage instead of `file` (utils/media-store.js): the object - named by the bytes' sha256, so identical pictures share one - and that hash."},"alt":{"type":"string","description":"Img alt (same as filename if not specified)."},"filename":{"type":"string","description":"Name of the stored file."},"filetype":{"type":"string","description":"MIME type of the file."},"vimeo_uri":{"type":"string","description":"The video's Vimeo id, for videos hosted there."},"vimeo_picture":{"type":"string","description":"Thumbnail Vimeo made."},"duration":{"type":"number","description":"Length of a video in seconds."},"vimeo_url":{"type":"string","description":"Link to the video on Vimeo."},"youtube_url":{"type":"string","description":"Link to the video on YouTube."},"youtube_picture":{"type":"string","description":"Thumbnail of the YouTube video."},"thumbnail":{"type":"string","description":"Small preview of the file."},"gcs_url":{"type":"string","description":"The file's address in cloud storage."},"gcs_480_30_url":{"type":"string","description":"The video transcoded to 480p."},"gcs_720_30_url":{"type":"string","description":"The video transcoded to 720p."},"gcs_1080_30_url":{"type":"string","description":"The video transcoded to 1080p."},"picture_gcs_url":{"type":"string","description":"The picture's address in cloud storage."},"transcode_status":{"type":"string","default":"not_started","description":"'not_started' | 'pending' | 'error' | 'completed'."},"owner_id":{"type":"string","description":"User id of owner. Id of a User."},"source_url":{"type":"string","description":"Site-clone real-asset reuse: the original URL this Media was downloaded from (asset-fetcher.js). Lets repeated/duplicate clone runs reuse the same stored asset instead of re-downloading it."},"source_framing":{"type":"string","description":"How a downloaded picture was prepared before it was stored (asset-fetcher.js FRAMING): a copy made before the frame its site baked in was taken off is not reused for one made after."},"origin":{"type":"string","description":"'ai' for images the AI builder generated (validators.js). The site-readiness checklist counts the items still showing one, so people know which photos to replace with their own. Unset on uploads and on media created before it."},"width":{"type":"number","description":"Displayed size of an image file (utils/image-size.js), so pages can give the <img> width/height and reserve its space before it loads. Set on save; older media by scripts/backfill-media-size.js."},"height":{"type":"number","description":"Height of the picture in pixels."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"sequence":{"type":"object","properties":{"status":{"type":"string"},"started_at":{"type":"string"},"updated_at":{"type":"string"},"step":{"type":"string"},"done":{"type":"number"},"total":{"type":"number"},"ext":{"type":"string"},"trim_start":{"type":"number"},"trim_end":{"type":"number"},"build_id":{"type":"string"},"previous_base":{"type":"string"},"frame_count":{"type":"number"},"fps":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"desktop_path":{"type":"string"},"mobile_path":{"type":"string"},"portrait_path":{"type":"string"},"poster":{"type":"string"},"error":{"type":"string"}}}}},"Message":{"type":"object","properties":{"sender_id":{"type":"string","description":"User.id of sender is automatically set from auth. Id of a User."},"receiver_id":{"type":"string","description":"User.id of receiver. Id of a User."},"product_id":{"type":"string","description":"Product.id of product, that the message is about. Id of a Product."},"service_id":{"type":"string","description":"Service.id. Id of a Service."},"isOpened":{"type":"boolean","default":false,"description":"The recipient has read it."},"blogpost_id":{"type":"string","description":"BlogPost.id. Id of a BlogPost."},"isDirectMessage":{"type":"boolean","default":false,"description":"Between two users, not in a group."},"message":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string","description":"Id of a User."},"text":{"type":"string"},"createdAt":{"type":"string"},"sent":{"type":"boolean","default":false},"seen":{"type":"boolean","default":false},"seen_by":{"type":"array","items":{"type":"string"},"description":"Id of a User."},"postId":{"type":"string","description":"Id of a Post."},"userId":{"type":"string","description":"Id of a User."},"medias":{"type":"array","items":{"type":"object","properties":{"media":{"type":"string","description":"Id of a Media."},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"vimeo_url":{"type":"string"},"youtube_url":{"type":"string"},"youtube_picture":{"type":"string"},"gcs_url":{"type":"string"},"_id":{"type":"string"}}}},"isSystem":{"type":"boolean","default":false},"groupId":{"type":"string","description":"Id of a Group."},"_id":{"type":"string"}}},"description":"Message."},"isGroup":{"type":"boolean","default":false,"description":"A group conversation."},"group_users":{"type":"array","items":{"type":"string"},"description":"Keeps the messages after user leaves the group. Id of a User."},"current_group_users":{"type":"array","items":{"type":"string"},"description":"Update when user leaves or joins. Id of a User."},"users_nicknames":{"type":"array","items":{"type":"object","properties":{"nickname":{"type":"string"},"user":{"type":"string","description":"Id of a User."},"_id":{"type":"string"}}},"description":"Nicknames members set for each other in the conversation."},"group_avatar":{"type":"string","description":"Media.id. Id of a Media."},"group_name":{"type":"string","description":"Name of the group conversation."},"delete_chat":{"type":"array","items":{"type":"object","properties":{"isDeleted":{"type":"boolean","default":false},"user":{"type":"string","description":"Id of a User."},"createdAt":{"type":"string","format":"date-time"},"_id":{"type":"string"}}},"description":"Users who deleted the conversation for themselves, and when."},"program_id":{"type":"string","description":"Program.id. Id of a Program."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Meta":{"type":"object","properties":{"title":{"type":"string","description":"Title shown in search results and link previews."},"url":{"type":"string","description":"The page the tags are for."},"description":{"type":"string","description":"Description shown in search results and link previews."},"site_name":{"type":"string","description":"Site name shown in link previews."},"image":{"type":"string","description":"Picture shown in link previews."},"_id":{"type":"string"}}},"MiniApp":{"type":"object","properties":{"title":{"type":"string","description":"The mini app's name."},"header":{"type":"string","description":"Short heading shown in the app store."},"description":{"type":"string","description":"About the mini app."},"referer":{"type":"string","description":"The address the mini app is served from."},"requiresLogin":{"type":"boolean","default":true,"description":"Only signed-in users can open it."},"icon":{"type":"string","description":"Media.id. Id of a Media."},"previews":{"type":"array","items":{"type":"object","properties":{"media":{"type":"string","description":"Id of a Media."},"_id":{"type":"string"}}},"description":"Screenshots shown in the store."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"reviewed":{"type":"boolean","default":false,"description":"A moderator reviewed it."},"approved":{"type":"boolean","default":false,"description":"Approved to be listed."},"total_opened":{"type":"number","default":0,"description":"How many times it was opened."},"opened_by":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"minimum_age":{"type":"number","description":"Youngest age allowed to use it."},"language":{"type":"array","items":{"type":"string"},"description":"Languages it supports."},"collection_id":{"type":"string","description":"Collection.id. Id of a Collection."},"total_views":{"type":"number","default":0,"description":"How many times its store page was viewed."},"views":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"privacy_policy":{"type":"string","description":"Link to its privacy policy."},"support_url":{"type":"string","description":"Link to support."},"marketing_url":{"type":"string","description":"Link to its marketing site."},"copyright":{"type":"string","description":"Copyright line."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"data_collection":{"type":"object","properties":{"contact_info":{"type":"string"},"health_info":{"type":"string"},"payment_info":{"type":"string"},"location_info":{"type":"string"},"other_info":{"type":"string"},"user_info":{"type":"string"},"identifiers_info":{"type":"string"},"usage_data":{"type":"string"},"diagnostics_data":{"type":"string"}}}}},"Model":{"type":"object","properties":{"name":{"type":"string"},"make":{"type":"string","description":"Id of a Make."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"MyContact":{"type":"object","properties":{"zip_code":{"type":"string","description":"Postal/ZIP code."},"city":{"type":"string","description":"The city where the business is located."},"address":{"type":"string","description":"The street address."},"contact":{"type":"string","description":"Html format."},"email":{"type":"string","description":"The public contact email address."},"google_app":{"type":"string","description":"Link to the business's app on Google Play."},"workhours":{"type":"string","description":"Opening hours as text."},"logo":{"type":"string","description":"Media.id."},"site_name":{"type":"string","description":"The business/site name shown publicly."},"domain":{"type":"string","description":"The site's own domain."},"stock_domain":{"type":"string","description":"The platform subdomain the site always answers on."},"isMarket":{"type":"boolean","default":false,"description":"The site is a marketplace."},"forbidden_collections":{"type":"array","items":{"type":"object","properties":{"collection_id":{"type":"string","description":"Id of a Collection."},"_id":{"type":"string"}}},"description":"Array of {collection_id}."},"isInit":{"type":"boolean","default":false,"description":"The site was set up from a template."},"template":{"type":"string","default":"0000","description":"The template the site was made from."},"lang":{"type":"string","description":"2-letter language code (e.g. \"en\", \"fr\", \"de\")."},"favicon":{"type":"string","description":"Media.id of the browser tab icon."},"cacheEnabled":{"type":"boolean","description":"Pages are cached for faster loading."},"has_completed_startup_prompt":{"type":"boolean","default":true,"description":"The owner went through the first AI prompt."},"gmb_location":{"type":"string","description":"The Google Business Profile location linked to the site."},"ga_property":{"type":"string","description":"The Google Analytics property linked to the site."},"site_generated_at":{"type":"string","format":"date-time","description":"When the AI builder first built this site (a plan that made the homepage). Written once (runPlan); starts the admin's 15-minute launch offer."},"admin_first_opened_at":{"type":"string","format":"date-time","description":"When the owner first opened the admin; with admin_last_opened_at it tells \"never opened it\" from \"opened it and left\"."},"admin_last_opened_at":{"type":"string","format":"date-time","description":"When the owner last opened the admin."},"admin_in_app_browser":{"type":"boolean","description":"The owner last opened the admin inside an app's browser."},"domain_suggestions":{"type":"object","description":"Domain names suggested to the owner, kept so they are not suggested again."},"_id":{"type":"string"},"allowedComponents":{"type":"object","properties":{"services":{"type":"boolean"},"products":{"type":"boolean"},"blogposts":{"type":"boolean"},"programs":{"type":"boolean"}}}}},"NewsletterContact":{"type":"object","properties":{"name":{"type":"string","description":"Subscriber's name."},"age":{"type":"number","description":"Subscriber's age."},"email":{"type":"string","description":"Subscriber's email."},"city":{"type":"string","description":"Subscriber's city."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Order":{"type":"object","properties":{"organization_name":{"type":"string","description":"Customer's company name."},"firstname":{"type":"string","description":"Customer's first name."},"lastname":{"type":"string","description":"Customer's last name."},"email":{"type":"string","description":"Customer's email."},"phone_number":{"type":"string","description":"Customer's phone number."},"address":{"type":"string","description":"Delivery address."},"city":{"type":"string","description":"Delivery city."},"state":{"type":"string","description":"Delivery state or region."},"country":{"type":"string","description":"Delivery country."},"zip_code":{"type":"string","description":"Delivery postal code."},"tax_identification_number":{"type":"string","description":"Customer's tax number, for an invoice."},"notes":{"type":"string","description":"What the customer wrote with the order."},"products":{"type":"array","items":{"type":"string"},"description":"Product ids ordered."},"products_obj":{"type":"array","items":{"type":"object","properties":{"product_id":{"type":"string","description":"Id of a Product."},"name":{"type":"string"},"options":{"type":"string"},"price":{"type":"number"},"quantity":{"type":"number"},"_id":{"type":"string"}}},"description":"The products ordered, as they were then: options, quantity and price."},"programs":{"type":"array","items":{"type":"string"},"description":"Program ids ordered."},"programs_obj":{"type":"array","items":{"type":"object","properties":{"program_id":{"type":"string","description":"Id of a Program."},"title":{"type":"string"},"price":{"type":"number"},"_id":{"type":"string"}}},"description":"The programs ordered, as they were then."},"tickets":{"type":"array","items":{"type":"string"},"description":"Ticket ids. Id of a Ticket."},"donations":{"type":"array","items":{"type":"string"},"description":"Donation ids. Id of a Donation."},"donations_obj":{"type":"array","items":{"type":"object","properties":{"donation_id":{"type":"string","description":"Id of a Donation."},"name":{"type":"string"},"options":{"type":"string"},"price":{"type":"number"},"quantity":{"type":"number"},"_id":{"type":"string"}}},"description":"The donations made with the order."},"value":{"type":"number","description":"Total of the order."},"finalized":{"type":"boolean","default":false,"description":"Checkout was completed."},"fulfilled":{"type":"boolean","default":false,"description":"The order was sent or handed over."},"paid":{"type":"boolean","default":false,"description":"The order is paid."},"delivery_method":{"type":"string","description":"How it is delivered (courier, office, pickup...)."},"payment_method":{"type":"string","description":"How it is paid (card, cash, invoice, PayPal)."},"shipping_cost":{"type":"number","description":"What delivery costs."},"coupon_code":{"type":"string","description":"The coupon used."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"reference_id":{"type":"string","description":"The order's id at the payment provider."},"rating_mail_sent":{"type":"boolean","default":false,"description":"The email asking for a rating was sent."},"shipping_label":{"type":"string","description":"The courier's shipment label."},"shipping_option":{"type":"string","enum":["address","office"],"default":"address","description":"One of: address, office."},"shipping_message":{"type":"string","description":"The courier's last status message."},"shipping_office":{"type":"string","description":"The courier office it is delivered to."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"OriginAddress":{"type":"object","properties":{"title":{"type":"string","description":"Name of the address (\"Warehouse\")."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Partner":{"type":"object","properties":{"name":{"type":"string","description":"The location's or partner's name."},"venue":{"type":"string","description":"Deprecated, superseded by venue_types."},"venue_types":{"type":"array","items":{"type":"object","properties":{"collection_id":{"type":"string","description":"Id of a Collection."},"_id":{"type":"string"}}},"description":"[{ collection_id }] refs to 'partner/' Collections."},"city":{"type":"string","description":"City."},"country":{"type":"string","description":"Not required - records created before the split still carry the country inside city, and forcing it would reject every update to them."},"address":{"type":"string","description":"Street address."},"contact":{"type":"string","description":"Contact person."},"additional_information":{"type":"string","description":"Anything else visitors should know."},"phone":{"type":"string","description":"Phone number."},"email":{"type":"string","description":"Email."},"website":{"type":"string","description":"Website."},"hours":{"type":"string","description":"Opening hours."},"latitude":{"type":"number","default":null,"description":"Latitude, for the map."},"longitude":{"type":"number","default":null,"description":"Longitude, for the map."},"formatted_address":{"type":"string","description":"The address as the geocoder formats it."},"geo_status":{"type":"string","enum":["pending","ok","failed"],"default":"pending","description":"Pending | ok | failed. One of: pending, ok, failed."},"custom_1":{"type":"string","description":"Custom defined field 1."},"custom_2":{"type":"string","description":"Custom defined field 2."},"custom_3":{"type":"string","description":"Custom defined field 3."},"medias":{"type":"array","items":{"type":"object","properties":{"media":{"type":"string","description":"Id of a Media."},"_id":{"type":"string"}}},"description":"Pictures of the location."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"PaymentMethod":{"type":"object","properties":{"has_cash":{"type":"boolean","default":false,"description":"Cash on delivery is offered."},"cash_locale":{"type":"string","default":"Pay by cash","description":"Label of the cash option."},"cash_instructions":{"type":"string","description":"Instructions shown for cash payment."},"cash_increase":{"type":"number","default":0,"description":"Extra charged for cash payment."},"has_card":{"type":"boolean","default":false,"description":"Card payment is offered."},"card_locale":{"type":"string","default":"Pay with credit card","description":"Label of the card option."},"email":{"type":"string","description":"The business's email for payments."},"country":{"type":"string","description":"The business's country for payments."},"has_invoicing":{"type":"boolean","default":false,"description":"Payment by invoice is offered."},"invoice_locale":{"type":"string","default":"Pay via invoice","description":"Label of the invoice option."},"invoicing_instructions":{"type":"string","description":"Instructions shown for paying by invoice."},"currency":{"type":"string","description":"Currency prices are in."},"agreedToTerms":{"type":"boolean","default":false,"description":"The owner accepted the payment terms."},"agreedToTermsAt":{"type":"string","description":"When the owner accepted them."},"merchant_id":{"type":"string","description":"The business's merchant id at the card processor."},"has_paypal":{"type":"boolean","default":false,"description":"PayPal is offered."},"paypal_increase":{"type":"number","default":0,"description":"Extra charged for PayPal."},"paypal_id":{"type":"string","description":"The business's PayPal id."},"lock_currency":{"type":"boolean","default":false,"description":"Visitors cannot switch the currency."},"commission_percentage":{"type":"number","default":4.4,"description":"The platform's commission on payments."},"two_currencies":{"type":"boolean","default":false,"description":"Prices are shown in a second currency too."},"second_currency":{"type":"string","description":"The second currency."},"calculate_rate":{"type":"boolean","default":false,"description":"The second price is converted at the current rate."},"currency_rate":{"type":"number","description":"Fixed rate for the second currency, when not calculated."},"_id":{"type":"string"}}},"PixelData":{"type":"object","properties":{"id":{"type":"string","description":"Id of the site the event came from."},"uid":{"type":"string","description":"Id of the visitor (cookie)."},"ev":{"type":"string","description":"The event (pageload, purchase...)."},"v":{"type":"string","description":"Version of the tracking script."},"dl":{"type":"string","description":"The page's address."},"rl":{"type":"string","description":"The referring address."},"ts":{"type":"string","description":"When the event happened."},"de":{"type":"string","description":"The page's character encoding."},"sr":{"type":"string","description":"Screen resolution."},"vp":{"type":"string","description":"Viewport size."},"cd":{"type":"string","description":"Screen colour depth."},"dt":{"type":"string","description":"The page's title."},"bn":{"type":"string","description":"Browser name and version."},"md":{"type":"string","description":"Whether the device is mobile."},"ua":{"type":"string","description":"User agent."},"tz":{"type":"string","description":"Visitor's time zone offset in minutes."},"utm_source":{"type":"string","description":"UTM source of the visit."},"utm_medium":{"type":"string","description":"UTM medium."},"utm_term":{"type":"string","description":"UTM term."},"utm_content":{"type":"string","description":"UTM content."},"utm_campaign":{"type":"string","description":"UTM campaign."},"utm_source_platform":{"type":"string","description":"UTM source platform."},"utm_creative_format":{"type":"string","description":"UTM creative format."},"utm_marketing_tactic":{"type":"string","description":"UTM marketing tactic."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"ed":{"type":"object","properties":{"currency":{"type":"string"},"value":{"type":"number"},"payment_type":{"type":"string"},"coupon":{"type":"string"},"items":{"type":"string"},"shipping_tier":{"type":"string"},"virtual_currency_name":{"type":"string"},"group_id":{"type":"string"},"level_name":{"type":"string"},"success":{"type":"boolean"},"level":{"type":"number"},"character":{"type":"string"},"method":{"type":"string"},"score":{"type":"number"},"transaction_id":{"type":"string"},"shipping":{"type":"number"},"tax":{"type":"number"},"search_term":{"type":"string"},"content_type":{"type":"string"},"content_id":{"type":"string"},"creative_name":{"type":"string"},"creative_slot":{"type":"string"},"promotion_id":{"type":"string"},"promotion_name":{"type":"string"},"achievement_id":{"type":"string"}}}}},"Popup":{"type":"object","properties":{"title":{"type":"string","description":"Internal admin label for this popup (e.g. \"Welcome discount\", \"Newsletter signup\", \"Cookie consent\")."},"body":{"type":"string","description":"The full landing page the user sees after clicking accept. Id of a AboutPage."},"decline_button_text":{"type":"string","description":"Text on the dismiss button (e.g. \"No thanks\", \"Maybe later\", \"Close\")."},"accept_button_text":{"type":"string","description":"Text on the primary CTA button of the popup modal (e.g. \"Sign up\", \"Learn more\", \"Claim offer\")."},"accept_button_link":{"type":"string","description":"Where the popup's button leads."},"wide_modal":{"type":"boolean","default":false,"description":"True for wider popup modal, false (default) for compact."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Post":{"type":"object","properties":{"posted_by":{"type":"string","description":"User.id. Id of a User."},"repost_of":{"type":"string","description":"Post.id. Id of a Post."},"connected_account_posted_by":{"type":"string","description":"User.id. Id of a User."},"text":{"type":"string","description":"The post's text."},"title":{"type":"string","description":"The post's title."},"likes":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"shares":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string","description":"Id of a User."},"to":{"type":"string","description":"Id of a User."},"_id":{"type":"string"}}},"description":"Who shared it, and when."},"views":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"comments":{"type":"array","items":{"type":"string"},"description":"Comment ids. Id of a Comment."},"medias":{"type":"array","items":{"type":"object","properties":{"media":{"type":"string","description":"Id of a Media."},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"vimeo_url":{"type":"string"},"youtube_url":{"type":"string"},"youtube_picture":{"type":"string"},"gcs_url":{"type":"string"},"gcs_480_30_url":{"type":"string"},"gcs_720_30_url":{"type":"string"},"gcs_1080_30_url":{"type":"string"},"duration":{"type":"number"},"transcode_status":{"type":"string","default":"not_started"},"_id":{"type":"string"}}},"description":"Pictures and videos of the post."},"keywords":{"type":"array","items":{"type":"string"},"description":"Words it is found by."},"emotion":{"type":"string","description":"Positive, neutral, negative."},"political_spectrum":{"type":"string","description":"Far left, left, far right, right, middle."},"explicit":{"type":"string","description":"Yes, no, middle."},"harmful":{"type":"string","description":"Yes, no, maybe."},"propaganda":{"type":"string","description":"Yes, no, middle."},"advertisement":{"type":"string","description":"Yes, no, maybe."},"engaging":{"type":"string","description":"Yes, no, maybe."},"language":{"type":"string","description":"Language of the post."},"interests":{"type":"array","items":{"type":"string"},"description":"From Google Segments."},"app_category":{"type":"array","items":{"type":"string"},"description":"From Google Segments."},"user_profile":{"type":"array","items":{"type":"string"},"description":"Profiles the post is shown to."},"user_economics":{"type":"string","description":"Low, middle, high."},"user_education":{"type":"string","description":"Low, middle, high."},"marital_status":{"type":"string","description":"Single, married."},"age":{"type":"string","description":"0-18, 18-25, 25-30, 30-35, 35-45, 45-60."},"sex":{"type":"string","description":"Male - female."},"attractiveness":{"type":"string","description":"Low, medium, high,."},"isAdvertisment":{"type":"boolean","default":false,"description":"A paid ad."},"saves":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"expirable":{"type":"boolean","default":false,"description":"Disappears after a while."},"exclusive":{"type":"boolean","default":false,"description":"Only for subscribers."},"price_plans":{"type":"array","items":{"type":"string"},"description":"PricePlan ids. Id of a PricePlan."},"mentions":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"total_views":{"type":"number","default":0,"description":"How many times it was opened."},"times_showed":{"type":"number","default":0,"description":"How many times it was shown in a feed."},"attached_to":{"type":"string","description":"Post.id. Id of a Post."},"attached_to_cta_text":{"type":"string","description":"Text of the post's call-to-action button."},"isBlacklist":{"type":"boolean","default":false,"description":"Contains blacklisted words."},"isReviewed":{"type":"boolean","default":false,"description":"A moderator reviewed it."},"posted_in":{"type":"string","description":"Group.id. Id of a Group."},"attached_to_service":{"type":"string","description":"Service.id. Id of a Service."},"attached_to_product":{"type":"string","description":"Product.id. Id of a Product."},"attached_to_blogpost":{"type":"string","description":"BlogPost.id. Id of a BlogPost."},"attached_to_program":{"type":"string","description":"Program.id. Id of a Program."},"attached_to_priceplans":{"type":"boolean","default":false,"description":"Only subscribers of the attached price plans see it."},"isWhitelisted":{"type":"boolean","default":false,"description":"Allowed past moderation."},"attached_to_group":{"type":"string","description":"Group.id. Id of a Group."},"reach":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"showAds":{"type":"boolean","default":true,"description":"The author allows ads next to it."},"adminShowAds":{"type":"boolean","default":true,"description":"The admin allows ads next to it."},"isAddReviewed":{"type":"boolean","default":false,"description":"The ad was reviewed."},"reposts":{"type":"array","items":{"type":"string"},"description":"Post ids. Id of a Post."},"original_post":{"type":"string","description":"The first reposted post. Id of a Post."},"isHidden":{"type":"boolean","default":false,"description":"Hidden by a moderator."},"dislikes":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"frames":{"type":"array","items":{"type":"object","properties":{"media":{"type":"string","description":"Id of a Media."},"timestamp":{"type":"number"},"_id":{"type":"string"}}},"description":"The frames of a story."},"privacy":{"type":"string","enum":["everyone","followers","private"],"default":"everyone","description":"One of: everyone, followers, private."},"isPinned":{"type":"boolean","default":false,"description":"Pinned to the top of the author's profile."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"thumbnail":{"type":"object","properties":{"media":{"type":"string"}}},"targeting":{"type":"object","properties":{"keywords":{"type":"string"},"language":{"type":"string"},"interests":{"type":"string"},"app_category":{"type":"string"},"user_economics":{"type":"string"},"user_education":{"type":"string"},"marital_status":{"type":"string"},"age":{"type":"string"},"sex":{"type":"string"},"isCpc":{"type":"boolean"},"cost_per_click":{"type":"number"},"cost_per_mile":{"type":"number"},"daily_budget":{"type":"number"},"duration":{"type":"number"},"outer_link":{"type":"object","properties":{"text":{"type":"string"},"url":{"type":"string"}}},"locations":{"type":"string"},"total":{"type":"number"},"created_on":{"type":"string"},"inner_link":{"type":"object","properties":{"text":{"type":"string"},"profile_segment":{"type":"string"}}},"total_clicks":{"type":"number"},"unique_clicks":{"type":"string"},"campaign_type":{"type":"string"},"related_videos":{"type":"string"}}},"poll":{"type":"object","properties":{"question":{"type":"string"},"answers":{"type":"string"}}},"custom_link":{"type":"object","properties":{"heading":{"type":"string"},"url":{"type":"string"}}},"embeded_link":{"type":"object","properties":{"og:image":{"type":"string"},"og:site_name":{"type":"string"},"og:title":{"type":"string"},"og:url":{"type":"string"}}}}},"PricePlan":{"type":"object","properties":{"name":{"type":"string","description":"The plan's name."},"description":{"type":"string","description":"What the plan gives."},"statement_descriptor":{"type":"string","description":"Short description of product."},"plan_features":{"type":"array","items":{"type":"object","properties":{"feature_type":{"type":"string"},"feature_name":{"type":"string"},"feature_value":{"type":"string"},"_id":{"type":"string"}}},"description":"The plan's features, listed on its card."},"price":{"type":"number","description":"Price per period."},"link":{"type":"string","description":"Stripe payment page link."},"image":{"type":"string","description":"Media.id. Id of a Media."},"price_id":{"type":"string","description":"Id of stripe price object."},"payment_link_id":{"type":"string","description":"Id of string payment page link."},"free_trial_days":{"type":"number","default":0,"description":"Days free before the first payment."},"billing_address_collection":{"type":"string","default":"auto","description":"Wheter to collect billing information."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"times_showed":{"type":"number","default":0,"description":"How many times it was shown."},"views":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"total_views":{"type":"number","default":0,"description":"How many times it was opened."},"disabled":{"type":"boolean","default":false,"description":"Cannot be subscribed to."},"ribbon":{"type":"string","description":"Label on the card (\"Popular\")."},"linked_plans":{"type":"array","items":{"type":"string"},"description":"PricePlan ids. Id of a PricePlan."},"is_hidden":{"type":"boolean","default":false,"description":"Not listed on the site."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"recurring_options":{"type":"object","properties":{"interval":{"type":"string"},"interval_count":{"type":"number"}}}}},"PriceQuote":{"type":"object","properties":{"customer_name":{"type":"string","description":"Name of customer."},"customer_address":{"type":"string","description":"Address of customer."},"customer_postal_code":{"type":"string","description":"Postal code of customer."},"customer_city":{"type":"string","description":"City of customer."},"customer_country":{"type":"string","description":"Country of customer."},"customer_phone":{"type":"string","description":"Phone of customer."},"customer_email":{"type":"string","description":"Email of customer."},"customer_tax_id":{"type":"string","description":"Tax id of customer."},"customer_vat_id":{"type":"string","description":"Customer's VAT number."},"customer_responsible_official":{"type":"string","description":"Person responsible on the customer's side."},"customer_organization_name":{"type":"string","description":"Customer's company name."},"billing_customer_address":{"type":"string","description":"Address of billed customer."},"billing_customer_postal_code":{"type":"string","description":"Postal code billed of customer."},"billing_customer_city":{"type":"string","description":"City of billed customer."},"billing_customer_country":{"type":"string","description":"Country of billed customer."},"billing_customer_phone":{"type":"string","description":"Phone of billed customer."},"subtotal":{"type":"number","description":"Invoice subtotal."},"amount":{"type":"number","description":"Invoice amount."},"day_of_issue":{"type":"string","description":"Day of issue of invoice."},"number":{"type":"number","description":"The quote's number."},"foreign":{"type":"boolean","description":"Flag which shows if invoice is from foreign to company country."},"home_tax":{"type":"number","default":0,"description":"Home country tax amount."},"foreign_tax":{"type":"number","default":0,"description":"Foreign country tax amount."},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"qty":{"type":"number"},"unit_price":{"type":"number"},"discount":{"type":"number"},"amount":{"type":"number"},"_id":{"type":"string"}}},"description":"Array of sold products which contains their name, cost, quantity and discount."},"grounds_for_transaction":{"type":"string","description":"Legal grounds for the transaction."},"description_of_transaction":{"type":"string","description":"What it is for."},"place_of_transaction":{"type":"string","description":"Where it takes place."},"payment":{"type":"string","description":"How it would be paid."},"dateDue":{"type":"string","description":"Date the quote is valid until."},"invoice_id":{"type":"string","description":"Id of invoice created from this price quote. Id of a invoice."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"invoice_settings":{"type":"object","properties":{"number":{"type":"number"},"price_quote_number":{"type":"string"},"bic":{"type":"string"},"swift":{"type":"string"},"tax_id":{"type":"string"},"vat_id":{"type":"string"},"logo":{"type":"string"},"business_name":{"type":"string"},"business_name_translated":{"type":"string"},"responsible_official":{"type":"string"},"responsible_official_translated":{"type":"string"},"business_email":{"type":"string"},"company_id":{"type":"string"},"business_address":{"type":"string"},"business_address_translated":{"type":"string"},"business_phone_number":{"type":"string"},"business_country":{"type":"string"},"business_country_translated":{"type":"string"},"footer":{"type":"string"},"footer_translated":{"type":"string"},"foreign_tax":{"type":"number"},"home_tax":{"type":"number"},"currency_symbol":{"type":"string"}}}}},"Product":{"type":"object","properties":{"name":{"type":"string","description":"Name of product."},"url":{"type":"string","description":"Generated from name, no need to set it manually."},"static_url":{"type":"string","description":"A fixed address kept when the url changes, so old links keep working."},"ribbon":{"type":"string","description":"Short label shown on the product's card, e.g. \"New\" or \"-20%\"."},"striked":{"type":"string","description":"The old price, shown crossed out next to price: for a sale (\"was 12, now 9\") set price to 9 and striked to \"12\". Empty for no sale."},"price":{"type":"number","description":"Price of the product in the site's currency."},"description":{"type":"string","description":"Description of product in html format."},"product_informations":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"_id":{"type":"string"}}},"description":"Extra details listed on the product page, each { name, description } (\"Material\": \"Soy wax\")."},"product_options":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"options":{"type":"array","items":{"type":"object","properties":{"option":{"type":"string"},"match_to_collection":{"type":"string","description":"Id of a Collection."},"quantity":{"type":"number"},"badge":{"type":"string"},"option_specific_media":{"type":"string","description":"Id of a Media."},"_id":{"type":"string"}}}},"informations":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"_id":{"type":"string"}}}},"_id":{"type":"string"}}},"description":"The choices a buyer makes (Size, Colour): each { name, options: [{ option }] }. An option's text may carry a price change in brackets, \"Large (+5)\", added to price. Changing the options rebuilds the product's stock lines."},"published":{"type":"boolean","default":true,"description":"Shown on the site. False hides it from the store and lists without deleting it."},"available_for_purchase":{"type":"boolean","default":true,"description":"The whole product can be bought; false stops every option of it. One option sold out (\"the white mug ran out\") is that option's stock line: quantity 0, tracked."},"medias":{"type":"array","items":{"type":"object","properties":{"media":{"type":"string","description":"Id of a Media."},"gcs_url":{"type":"string"},"gcs_480_30_url":{"type":"string"},"gcs_720_30_url":{"type":"string"},"gcs_1080_30_url":{"type":"string"},"duration":{"type":"number"},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"vimeo_url":{"type":"string"},"youtube_url":{"type":"string"},"youtube_picture":{"type":"string"},"thumbnail":{"type":"string"},"_id":{"type":"string"}}},"description":"Array of {media}."},"collection_id":{"type":"string","description":"Collection.id. Id of a Collection."},"grouping":{"type":"array","items":{"type":"object","properties":{"collection_id":{"type":"string","description":"Id of a Collection."},"_id":{"type":"string"}}},"description":"The grouping/ filters it appears under inside its category: each { collection_id }."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"connected_account_owner_id":{"type":"string","description":"User.id. Id of a User."},"qty":{"type":"number","default":1,"description":"Not the stock: nothing reads it as stock. Stock is kept per option in stock lines (Inventory): read GET /inventory/:product_id/:option, set it with PATCH /inventory/:id {quantity}."},"origin_address":{"type":"string","description":"Name of the address, taken from OriginAdress model, used for filtering."},"selected":{"type":"boolean","default":false,"description":"Featured: the home page's highlighted products block shows these first."},"custom_1":{"type":"string","description":"Custom defined field 1."},"custom_2":{"type":"string","description":"Custom defined field 2."},"custom_3":{"type":"string","description":"Custom defined field 3."},"about_page":{"type":"string","description":"Reference to AboutPage model, shown in product page. Id of a AboutPage."},"is_digital":{"type":"boolean","default":false,"description":"Delivered as a download, not shipped."},"digital_contents":{"type":"array","items":{"type":"object","properties":{"content":{"type":"string","description":"Id of a DigitalContent."},"option":{"type":"string"},"_id":{"type":"string"}}},"description":"The files a buyer gets."},"suitability_price_plans":{"type":"array","items":{"type":"string"},"description":"PricePlan ids: a signed-in user with one of them sees the product as suitable (isSuitable). Id of a PricePlan."},"isSuitable":{"type":"boolean","description":"Set per request, not stored: whether the signed-in user's price plans match the product's suitability plans."},"brand":{"type":"string","description":"Name of the product brand."},"brand_logo":{"type":"string","description":"Logo of the brand, reference to Media model. Id of a Media."},"weight":{"type":"number","default":0,"description":"Weight of the product in kg, for delivery."},"height":{"type":"number","default":0,"description":"Height of the product in cm, for delivery."},"length":{"type":"number","default":0,"description":"Length of the product in cm, for delivery."},"width":{"type":"number","default":0,"description":"Width of the product in cm, for delivery."},"delivery_type":{"type":"string","default":"parcel","description":"Used for delivery, default is parcel, allowed values are books, bulk, letter, parcel or parcel_letter."},"reference_id":{"type":"string","description":"Id of the record it was made from (an import or a clone)."},"wildcard_url":{"type":"object","description":"The wildcard route the product answers on, when it has one."},"sku":{"type":"object","description":"Stock keeping unit code, when the product has one."},"reviewed":{"type":"boolean","description":"A moderator reviewed it (marketplace)."},"approved":{"type":"boolean","description":"Approved to be listed (marketplace)."},"expired":{"type":"boolean","default":false,"description":"Past expires_on and no longer listed."},"expires_on":{"type":"string","format":"date-time","description":"When the listing expires."},"expire_reminder_sent":{"type":"boolean","default":false,"description":"The owner was reminded it expires."},"likes":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"views":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"total_views":{"type":"number","default":0,"description":"How many times it was opened."},"saves":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"times_showed":{"type":"number","default":0,"description":"How many times it was shown in a list."},"requiresLogin":{"type":"boolean","default":false,"description":"Only signed-in users can see it."},"requiresSubscription":{"type":"boolean","default":false,"description":"Only subscribers can see it."},"price_plan_ids":{"type":"array","items":{"type":"string"},"description":"Reference to PricePlan ids."},"linked_products":{"type":"array","items":{"type":"object","properties":{"product":{"type":"string","description":"Id of a Product."},"option":{"type":"string"},"_id":{"type":"string"}}},"description":"List of products that are shown for quick add to cart in the product page."},"about_section":{"type":"string","description":"Reference to AboutPage model, shown below the add to cart button. Id of a AboutPage."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"secondary_cta":{"type":"object","properties":{"show":{"type":"boolean"},"title":{"type":"string"},"webUrl":{"type":"string"},"appUrl":{"type":"string"}}},"attached_priceplans":{"type":"object","properties":{"name":{"type":"string"},"priceplans":{"type":"string"}}}}},"ProfessionalAccount":{"type":"object","properties":{"user":{"type":"string","description":"Id of user, who has created the account. Id of a User."},"reviewed":{"type":"boolean","default":false,"description":"A moderator reviewed the request."},"approved":{"type":"boolean","default":false,"description":"The account was approved as professional."},"cover":{"type":"string","description":"Media.id. Id of a Media."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"show":{"type":"object","properties":{"services":{"type":"boolean"},"staff_members":{"type":"boolean"},"blogposts":{"type":"boolean"},"programs":{"type":"boolean"},"products":{"type":"boolean"},"events":{"type":"boolean"},"price_plans":{"type":"boolean"},"posts":{"type":"boolean"}}}}},"Program":{"type":"object","properties":{"title":{"type":"string","description":"Name of the program, required."},"url":{"type":"string","description":"Generated from title, no need to set it manually."},"static_url":{"type":"string","description":"A fixed address kept when the url changes."},"header":{"type":"string","description":"Short tagline or subtitle shown in listings, optional."},"body":{"type":"string","description":"Full program description in HTML format, optional."},"medias":{"type":"array","items":{"type":"object","properties":{"media":{"type":"string","description":"Id of a Media."},"gcs_url":{"type":"string"},"gcs_480_30_url":{"type":"string"},"gcs_720_30_url":{"type":"string"},"gcs_1080_30_url":{"type":"string"},"duration":{"type":"number"},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"vimeo_url":{"type":"string"},"youtube_url":{"type":"string"},"youtube_picture":{"type":"string"},"thumbnail":{"type":"string"},"_id":{"type":"string"}}},"description":"The program's pictures."},"video":{"type":"string","description":"Video.id. Id of a Video."},"about_page":{"type":"string","description":"AboutPage.id. Id of a AboutPage."},"weeks":{"type":"array","items":{"type":"object","properties":{"isCompleted":{"type":"object"},"progress":{"type":"object"},"title":{"type":"string"},"days":{"type":"array","items":{"type":"object","properties":{"isCompleted":{"type":"object"},"progress":{"type":"object"},"title":{"type":"string"},"steps":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"body":{"type":"string"},"video":{"type":"string","description":"Id of a Video."},"medias":{"type":"array","items":{"type":"object","properties":{}}},"about_page":{"type":"string","description":"Id of a AboutPage."},"timer":{"type":"number","default":0},"_id":{"type":"string"}}}},"_id":{"type":"string"}}}},"_id":{"type":"string"}}},"description":"A list of week objects, required."},"suitability_price_plans":{"type":"array","items":{"type":"string"},"description":"A list of PricePlan ids, marks program as suitable for users with those plans. Id of a PricePlan."},"isSuitable":{"type":"boolean","description":"Set per request, not stored: whether the signed-in user's price plans match the program's suitability plans."},"price":{"type":"number","default":0,"description":"Price in the user's currency, default 0."},"collection_id":{"type":"string","description":"Reference to a Collection with name starting with 'program-category/', required. Id of a Collection."},"topics":{"type":"array","items":{"type":"object","properties":{"collection_id":{"type":"string","description":"Id of a Collection."},"_id":{"type":"string"}}},"description":"Topics it covers."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"connected_account_owner_id":{"type":"string","description":"User.id. Id of a User."},"ribbon":{"type":"string","description":"Short badge text shown on the card (e.g. \"New\", \"Best seller\"), optional."},"striked":{"type":"string","description":"Original price shown as strikethrough next to the real price, optional."},"isConsistent":{"type":"boolean","default":false,"description":"Every week has the same structure."},"isAcademic":{"type":"boolean","default":true,"description":"Free-order course, not weeks and days: progress is not tied to a week and day."},"wildcard_url":{"type":"object","description":"The wildcard route it answers on, when it has one."},"reviewed":{"type":"boolean","description":"A moderator reviewed it."},"approved":{"type":"boolean","description":"Approved to be listed."},"likes":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"views":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"total_views":{"type":"number","default":0,"description":"How many times it was opened."},"saves":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"requiresLogin":{"type":"boolean","default":false,"description":"Only signed-in users can see it."},"requiresSubscription":{"type":"boolean","default":false,"description":"Only subscribers can see it."},"price_plan_ids":{"type":"array","items":{"type":"string"},"description":"A list of price plan id strings that grant access to this program."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"popup":{"type":"object","properties":{"title":{"type":"string"},"points":{"type":"string"}}}}},"ProgramProgress":{"type":"object","properties":{"program":{"type":"string","description":"Program.id. Id of a Program."},"user":{"type":"string","description":"User.id. Id of a User."},"no_steps":{"type":"number","description":"Number of steps in the program."},"is_completed":{"type":"boolean","default":false,"description":"The whole program is completed."},"weeks_completed":{"type":"array","items":{"type":"string"},"description":"Weeks completed, as \"<week>\"."},"days_completed":{"type":"array","items":{"type":"string"},"description":"Days completed, as \"<week>-<day>\"."},"steps_completed":{"type":"array","items":{"type":"string"},"description":"Steps completed, as \"<week>-<day>-<step>\"."},"selectedWeek":{"type":"object","description":"The week the user is on."},"selectedWeekIndex":{"type":"object","description":"Index of that week."},"selectedDay":{"type":"object","description":"The day the user is on."},"selectedDayIndex":{"type":"object","description":"Index of that day."},"selectedStep":{"type":"object","description":"The step the user is on."},"selectedStepIndex":{"type":"object","description":"Index of that step."},"about_section":{"type":"object","description":"The program's intro section."},"selected":{"type":"boolean","default":false,"description":"The user has this program open."},"percentage":{"type":"object","description":"How much of the program is done."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Publish":{"type":"object","properties":{"web":{"type":"boolean","description":"The site is published on the web."},"ios":{"type":"boolean","description":"Published as an iOS app."},"android":{"type":"boolean","description":"Published as an Android app."},"pwaSwitch":{"type":"string","description":"Install-as-app prompt: '0' off, '1' on."},"android_app_id":{"type":"string","description":"The Android app's package id."},"ios_app_id":{"type":"string","description":"The iOS app's App Store id."},"_id":{"type":"string"}}},"PushNotification":{"type":"object","properties":{"title":{"type":"string","description":"The notification's heading."},"body":{"type":"string","description":"The notification's text."},"image":{"type":"string","description":"Picture shown with it."},"send_to":{"type":"string","description":"Who it goes to (all users, a segment...)."},"type":{"type":"string","description":"Push, system, both."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"PushToken":{"type":"object","properties":{"user":{"type":"string","description":"User.id the device belongs to."},"is_admin":{"type":"boolean","default":false,"description":"The device belongs to an admin, for admin notifications."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"PwaSettings":{"type":"object","properties":{"name":{"type":"string","description":"The app's name when installed."},"short_name":{"type":"string","description":"Name under the home screen icon."},"logo":{"type":"string","description":"Media.id. Id of a Media."},"background_color":{"type":"string","description":"Splash screen colour."},"description":{"type":"string","description":"About the app."},"screenshots":{"type":"array","items":{"type":"object","properties":{"media":{"type":"string","description":"Id of a Media."},"is_mobile_preview":{"type":"boolean","default":false},"_id":{"type":"string"}}},"description":"Screenshots shown in the install prompt."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"QrCode":{"type":"object","properties":{"ticket":{"type":"string","description":"Ticket.id. Id of a Ticket."},"status":{"type":"string","enum":["used","not-used"],"default":"not-used","description":"One of: used, not-used."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Rating":{"type":"object","properties":{"email":{"type":"string","description":"Email of who rated."},"text":{"type":"string","description":"The review's text."},"medias":{"type":"array","items":{"type":"object","properties":{"media":{"type":"string","description":"Id of a Media."},"_id":{"type":"string"}}},"description":"Pictures added to the review."},"stars":{"type":"number","description":"Rating from 1 to 5."},"product":{"type":"string","description":"Product.id. Id of a Product."},"service":{"type":"string","description":"Service.id. Id of a Service."},"program":{"type":"string","description":"Program.id. Id of a Program."},"price_plan":{"type":"string","description":"PricePlan.id. Id of a PricePlan."},"name":{"type":"string","description":"Name of who rated."},"miniapp":{"type":"string","description":"MiniApp.id. Id of a MiniApp."},"staff_member":{"type":"string","description":"User.id. Id of a User."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"RatingSettings":{"type":"object","properties":{"type":{"type":"string","description":"Product,service, program, priceplan."},"send":{"type":"boolean","default":false,"description":"Rating emails are sent after orders and bookings."},"days":{"type":"number","description":"Days after the order or booking the rating email is sent."},"title":{"type":"string","description":"Heading of the rating email."},"text1":{"type":"string","description":"Main text of the rating email."},"text2":{"type":"string","description":"Extra text of the rating email."},"useCustomLink":{"type":"boolean","default":false,"description":"The email links to customLinkUrl (e.g. a Google review page) instead of the site's form."},"customLinkUrl":{"type":"string","description":"Where the email's link leads when useCustomLink is set."},"linkText":{"type":"string","description":"Text of the email's link."},"startDate":{"type":"string","format":"date-time","description":"Orders and bookings from this date on get the email."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"ReceiptAdjustment":{"type":"object","properties":{"about_page":{"type":"string","description":"AboutPage.id. Id of a AboutPage."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"RecurringInvoice":{"type":"object","properties":{"title":{"type":"string","default":"","description":"Name of the recurring invoice."},"active":{"type":"boolean","default":true,"description":"It keeps issuing invoices."},"auto_send":{"type":"boolean","default":false,"description":"Each invoice is emailed to the customer when issued."},"interval_count":{"type":"number","default":1,"description":"How many interval_units pass between two invoices."},"interval_unit":{"type":"string","enum":["day","week","month","year"],"default":"month","description":"One of: day, week, month, year."},"start_date":{"type":"string","format":"date-time","description":"First date an invoice is issued."},"end_date":{"type":"string","format":"date-time","description":"Last date an invoice may be issued; empty for no end."},"due_days":{"type":"number","default":0,"description":"Days after the issue date the invoice is due (0: the same day)."},"next_run_at":{"type":"string","format":"date-time","description":"When the next invoice is issued."},"customer_name":{"type":"string","description":"Customer's name, printed on each quote and invoice."},"customer_address":{"type":"string","description":"Customer's address."},"customer_postal_code":{"type":"string","description":"Customer's postal code."},"customer_city":{"type":"string","description":"Customer's city."},"customer_country":{"type":"string","description":"Customer's country."},"customer_phone":{"type":"string","description":"Customer's phone."},"customer_email":{"type":"string","description":"Customer's email, where invoices are sent."},"customer_tax_id":{"type":"string","description":"Customer's tax number."},"customer_vat_id":{"type":"string","description":"Customer's VAT number."},"customer_responsible_official":{"type":"string","description":"Person responsible on the customer's side."},"customer_organization_name":{"type":"string","description":"Customer's company name."},"billing_customer_address":{"type":"string","description":"Billing address, when different."},"billing_customer_postal_code":{"type":"string","description":"Billing postal code."},"billing_customer_city":{"type":"string","description":"Billing city."},"billing_customer_country":{"type":"string","description":"Billing country."},"billing_customer_phone":{"type":"string","description":"Billing phone."},"foreign":{"type":"boolean","default":false,"description":"The customer is abroad, so the foreign tax rate applies."},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"qty":{"type":"number","default":1},"unit_price":{"type":"number","default":0},"discount":{"type":"number","default":0},"_id":{"type":"string"}}},"description":"What is invoiced each time: name, quantity, price."},"payment":{"type":"string","description":"How it is paid."},"grounds_for_transaction":{"type":"string","description":"Legal grounds for the transaction."},"description_of_transaction":{"type":"string","description":"What it is for."},"place_of_transaction":{"type":"string","description":"Where it takes place."},"runs":{"type":"number","default":0,"description":"How many invoices it has issued."},"last_run_at":{"type":"string","format":"date-time","description":"When the last invoice was issued."},"last_price_quote_id":{"type":"string","description":"PriceQuote.id of the last quote issued."},"last_invoice_id":{"type":"string","description":"UserInvoice.id of the last invoice issued."},"last_error":{"type":"string","description":"Why the last run failed, if it did."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"SeatingPlan":{"type":"object","properties":{"name":{"type":"string","description":"Name of the seating plan."},"sections":{"type":"array","items":{"type":"object","properties":{"subsections":{"type":"array","items":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"object","properties":{}}},"top":{"type":"number"},"left":{"type":"number"},"formated_row_index":{"type":"number"}}}},"edit":{"type":"boolean"},"widest_column":{"type":"number"},"justify":{"type":"string"},"left":{"type":"number"},"top":{"type":"number"}}}},"section_type":{"type":"string"},"name":{"type":"string"},"top":{"type":"number"},"left":{"type":"number"},"color":{"type":"string"},"premium_color":{"type":"string"},"rotation":{"type":"number"},"max_seats":{"type":"number"}}},"description":"The hall's sections, each with its rows and seats."},"venue":{"type":"string","description":"Venue.id. Id of a Venue."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Service":{"type":"object","properties":{"title":{"type":"string","description":"Title of service."},"url":{"type":"string","description":"Generated from title, no need to set it manually."},"static_url":{"type":"string","description":"A fixed address kept when the url changes, so old links keep working."},"header":{"type":"string","description":"Short header of service."},"description":{"type":"string","description":"Body text of service."},"bookable":{"type":"boolean","default":true,"description":"True if not set."},"expirable":{"type":"boolean","default":false,"description":"The listing expires."},"confirm_bookings":{"type":"boolean","default":false,"description":"Bookings wait for the business to confirm them."},"show_notes":{"type":"boolean","default":false,"description":"Customers can write a note when booking."},"minutes_delete_bookings":{"type":"number","description":"Number of minutes before the booking expires before being confirmed and is set 'expirable:true'."},"medias":{"type":"array","items":{"type":"object","properties":{"media":{"type":"string","description":"Id of a Media."},"gcs_url":{"type":"string"},"gcs_480_30_url":{"type":"string"},"gcs_720_30_url":{"type":"string"},"gcs_1080_30_url":{"type":"string"},"duration":{"type":"number"},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"vimeo_url":{"type":"string"},"youtube_url":{"type":"string"},"youtube_picture":{"type":"string"},"thumbnail":{"type":"string"},"_id":{"type":"string"}}},"description":"Attached media objects with ids."},"collection_id":{"type":"string","description":"Collection, to which the blog post belongs. Id of a Collection."},"price":{"type":"number","description":"The price of the service in the globally set currency."},"online_payment":{"type":"boolean","default":false,"description":"Bookings are paid online."},"book_by_date":{"type":"boolean","default":false,"description":"Whole days are booked, not time slots."},"book_date_range":{"type":"boolean","default":false,"description":"A range of days is booked (a stay)."},"start_date":{"type":"string","format":"date-time","description":"Date."},"end_date":{"type":"string","format":"date-time","description":"Date."},"day_offset":{"type":"number","default":0,"description":"How many days ahead of today booking opens; 0 allows today."},"is_recurring":{"type":"boolean","default":false,"description":"The service repeats on a schedule."},"max_participants":{"type":"number","description":"How many people can book one slot."},"session_duration":{"type":"number","description":"Length of a slot in minutes."},"time_between_sessions":{"type":"number","default":0,"description":"Break added after each slot, in minutes."},"discount":{"type":"array","items":{"type":"object","properties":{"days":{"type":"number"},"per_total_price":{"type":"number"},"fixed_price":{"type":"number"},"per_day":{"type":"number"},"_id":{"type":"string"}}},"description":"Discounts by number of sessions booked."},"address":{"type":"string","description":"Where is the service performed."},"staff_member":{"type":"array","items":{"type":"string"},"description":"[User.id]. Id of a User."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"connected_account_owner_id":{"type":"string","description":"User.id. Id of a User."},"timezone":{"type":"number","default":false,"description":"Time zone offset the slots are in, in hours."},"choose_timezone":{"type":"boolean","description":"Customers pick the time zone slots are shown in."},"origin_address":{"type":"string","description":"OriginAddress.id where the service is given."},"selected":{"type":"boolean","default":false,"description":"False if not set."},"custom_1":{"type":"string","description":"Custom defined field 1."},"custom_2":{"type":"string","description":"Custom defined field 2."},"custom_3":{"type":"string","description":"Custom defined field 3."},"about_page":{"type":"string","description":"AboutPage.id. Id of a AboutPage."},"show_only_about_page":{"type":"boolean","default":false,"description":"The service page shows only its attached page."},"suitability_price_plans":{"type":"array","items":{"type":"string"},"description":"PricePlan ids. Id of a PricePlan."},"isSuitable":{"type":"boolean","description":"Set per request, not stored: whether the signed-in user's price plans match the service's suitability plans."},"booking_only":{"type":"boolean","description":"If the booking page should not show a header and footer."},"dates_disabled":{"type":"array","items":{"type":"string"},"description":"Closed days: dates on which the service cannot be booked (a holiday, a day off). Add a date here to close it."},"dates_booked":{"type":"array","items":{"type":"string"},"description":"Days that are fully booked."},"receipt_about_page":{"type":"string","description":"AboutPage.id. Id of a AboutPage."},"wildcard_url":{"type":"object","description":"The wildcard route it answers on, when it has one."},"locked_hours":{"type":"array","items":{"type":"string"},"description":"Hours that cannot be booked."},"reviewed":{"type":"boolean","description":"A moderator reviewed it (marketplace)."},"approved":{"type":"boolean","description":"Approved to be listed (marketplace)."},"likes":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"views":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"total_views":{"type":"number","default":0,"description":"How many times it was opened."},"saves":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"times_showed":{"type":"number","default":0,"description":"How many times it was shown in a list."},"email_text":{"type":"string","description":"The text the client will receive inside the email."},"calendar_description":{"type":"string","description":"The text the client will see when adding the appointment inside their calendar."},"requiresLogin":{"type":"boolean","default":false,"description":"Only signed-in users can see it."},"requiresSubscription":{"type":"boolean","default":false,"description":"Only subscribers of price_plan_ids can see it."},"price_plan_ids":{"type":"array","items":{"type":"string"},"description":"Price plans whose subscribers can see it, with requiresSubscription."},"calendar_filter":{"type":"array","items":{"type":"object","properties":{"collection_id":{"type":"string","description":"Id of a Collection."},"_id":{"type":"string"}}},"description":"Filters shown on the booking calendar."},"locked_ranges":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"_id":{"type":"string"}}},"description":"Date and time ranges that cannot be booked."},"connected_services":{"type":"array","items":{"type":"string"},"description":"Service ids. Id of a Service."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"monday":{"type":"object","properties":{"active":{"type":"boolean"},"hours":{"type":"string"}}},"tuesday":{"type":"object","properties":{"active":{"type":"boolean"},"hours":{"type":"string"}}},"wednesday":{"type":"object","properties":{"active":{"type":"boolean"},"hours":{"type":"string"}}},"thursday":{"type":"object","properties":{"active":{"type":"boolean"},"hours":{"type":"string"}}},"friday":{"type":"object","properties":{"active":{"type":"boolean"},"hours":{"type":"string"}}},"saturday":{"type":"object","properties":{"active":{"type":"boolean"},"hours":{"type":"string"}}},"sunday":{"type":"object","properties":{"active":{"type":"boolean"},"hours":{"type":"string"}}},"analytics_locales":{"type":"object","properties":{"google_event_custom_title":{"type":"string"},"facebook_event_custom_title":{"type":"string"},"tiktok_event_custom_title":{"type":"string"},"linkedin_event_custom_title":{"type":"string"},"chatgpt_event_custom_title":{"type":"string"}}}}},"Shipping":{"type":"object","properties":{"region":{"type":"string","description":"The region this delivery setting is for."},"has_store_pickup":{"type":"boolean","default":false,"description":"Customers can pick the order up at the pickup point instead of having it delivered."},"pickup_title":{"type":"string","description":"Name of the pickup point."},"pickup_address":{"type":"string","description":"Address of the pickup point."},"pickup_available":{"type":"string","description":"When pickup is possible."},"pickup_instructions":{"type":"string","description":"What customers should know about pickup."},"delivery":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"estimated_delivery_time":{"type":"string"},"fixed_rate":{"type":"number"},"rate_per_total":{"type":"number"},"rate_per_unit":{"type":"number"},"has_free_delivery":{"type":"boolean","default":false},"free_delivery_requirement":{"type":"number","default":0},"delivery_days":{"type":"number","default":3},"hasIntegration":{"type":"boolean","default":true},"has_time_window":{"type":"boolean","default":false},"available_from":{"type":"string"},"available_to":{"type":"string"},"timezone":{"type":"string"},"_id":{"type":"string"}}},"description":"The delivery options offered in this region, each { name, estimated_delivery_time, fixed_rate (its price), has_free_delivery, free_delivery_requirement }. Free delivery over an amount: has_free_delivery true and free_delivery_requirement the minimum order total (threshold) above which it costs nothing. Send the whole list: it replaces the old one."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"connected_account_owner_id":{"type":"string","description":"User.id. Id of a User."},"min_order_value":{"type":"number","default":0,"description":"Smallest order delivery is offered for."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"SiteMenu":{"type":"object","properties":{"title":{"type":"string","description":"The menu link label shown to users, required."},"url":{"type":"string","description":"Where it leads. The site's own pages as \"../<path>\": \"../about-pages/<page url>\" for a custom page, \"../products\", \"../services?collection=service/<name>\", \"../contacts\"; '' for the homepage; a link elsewhere (https://, mailto:) as it is."},"position":{"type":"number","description":"Display order starting from 0, optional."},"submenus":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string"},"position":{"type":"number"},"badge":{"type":"string"},"badge_background":{"type":"string"},"badge_color":{"type":"string"},"badge_radius":{"type":"number"},"_id":{"type":"string"}}},"description":"The dropdown's links under this entry, each { title, url, position }; url in the same \"../<path>\" form."},"customDropdown":{"type":"boolean","default":false,"description":"Has custom page attached to this menu."},"customDropdownId":{"type":"string","description":"Id of the about page. Id of a AboutPage."},"sideMenu":{"type":"boolean","default":false,"description":"Shown in the side menu instead of the top bar."},"sidemenus":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"submenus":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string"},"position":{"type":"number"},"icon":{"type":"string"},"img":{"type":"string","description":"Id of a Media."},"badge":{"type":"string"},"badge_background":{"type":"string"},"badge_color":{"type":"string"},"badge_radius":{"type":"number"},"submenus":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string"},"position":{"type":"number"},"icon":{"type":"string"},"img":{"type":"string","description":"Id of a Media."},"badge":{"type":"string"},"badge_background":{"type":"string"},"badge_color":{"type":"string"},"badge_radius":{"type":"number"},"_id":{"type":"string"}}}},"_id":{"type":"string"}}}},"_id":{"type":"string"}}},"description":"Groups of links shown in the side menu, when sideMenu is true."},"icon":{"type":"string","description":"FontAwesome 5 class (e.g. \"fas fa-home\"), optional."},"_id":{"type":"string"}}},"SocialComment":{"type":"object","properties":{"platform":{"type":"string","enum":["facebook","instagram"],"default":"facebook","description":"One of: facebook, instagram."},"kind":{"type":"string","enum":["comment","message"],"default":"comment","description":"One of: comment, message."},"conversation_id":{"type":"string","description":"The conversation a message belongs to (messages)."},"window_expires_at":{"type":"string","format":"date-time","description":"When the platform's reply window closes."},"page_id":{"type":"string","description":"The Facebook page or Instagram account it came to."},"comment_id":{"type":"string","description":"The comment's id on the platform."},"post_id":{"type":"string","description":"The post it is under."},"post_url":{"type":"string","description":"Link to that post."},"post_message":{"type":"string","description":"Text of that post."},"post_links":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":"string"}}},"description":"Links in that post."},"parent_id":{"type":"string","description":"The comment it answers, for a reply."},"page_replied":{"type":"boolean","default":false,"description":"The page has already answered it."},"post_type":{"type":"string","default":"organic","description":"Kind of item (comment, review, message)."},"message":{"type":"string","description":"The comment's text."},"author_id":{"type":"string","description":"Who wrote it, on the platform."},"author_name":{"type":"string","description":"Their name."},"comment_created_at":{"type":"string","format":"date-time","description":"When it was written."},"suggested_action":{"type":"string","description":"What the AI suggests (reply, hide, delete, ignore)."},"reply_message":{"type":"string","description":"The reply written for it."},"status":{"type":"string","enum":["new","clean","pending","auto_actioned","approved","rejected","answered_by_page","hidden","failed","expired"],"default":"new","description":"One of: new, clean, pending, auto_actioned, approved, rejected, answered_by_page, hidden, failed, expired."},"action_taken":{"type":"string","description":"What was done."},"actioned_by":{"type":"string","description":"Who did it (the owner or auto)."},"actioned_at":{"type":"string","format":"date-time","description":"When."},"reply_comment_id":{"type":"string","description":"The reply's id on the platform."},"undone_at":{"type":"string","format":"date-time","description":"When the action was undone."},"error":{"type":"string","description":"Why the last action failed."},"error_source":{"type":"string","description":"Which step failed."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"classification":{"type":"object","properties":{"category":{"type":"string"},"score":{"type":"number"},"should_reply":{"type":"boolean"},"answer_available":{"type":"boolean"},"reasoning":{"type":"string"},"language":{"type":"string"}}},"credits":{"type":"object","properties":{"classify":{"type":"number"},"reply":{"type":"number"}}}}},"SocialModeSettings":{"type":"object","properties":{"social_mode":{"type":"boolean","default":false,"description":"The site runs as a social network (feed, profiles)."},"allow_products":{"type":"boolean","default":false,"description":"Users can sell products."},"allow_services":{"type":"boolean","default":false,"description":"Users can offer services."},"allow_services_stp":{"type":"boolean","default":false,"description":"Users can take service payments themselves."},"allow_blogposts":{"type":"boolean","default":false,"description":"Users can write blog posts."},"allow_programs":{"type":"boolean","default":false,"description":"Users can sell programs."},"allow_programs_stp":{"type":"boolean","default":false,"description":"Users can take program payments themselves."},"allow_posts":{"type":"boolean","default":false,"description":"Users can post to the feed."},"allow_ai":{"type":"boolean","default":false,"description":"AI features are on for users."},"allow_bites":{"type":"boolean","default":false,"description":"Short videos are on."},"allow_long_videos":{"type":"boolean","default":false,"description":"Long videos are on."},"allow_explore":{"type":"boolean","default":false,"description":"The explore page is on."},"allow_online_payments":{"type":"boolean","default":false,"description":"Users can take online payments."},"allow_price_plans":{"type":"boolean","default":false,"description":"Users can sell subscriptions."},"allow_boosting_posts":{"type":"boolean","default":false,"description":"Users can pay to boost posts."},"allow_single_ai":{"type":"boolean","default":false,"description":"Users get the single-chat AI."},"merchant_agreement":{"type":"string","description":"AboutPage.id. Id of a AboutPage."},"verification_popup":{"type":"string","description":"AboutPage.id. Id of a AboutPage."},"commission":{"type":"number","description":"Platform commission on users' sales, in percent."},"home_page":{"type":"string","default":"home","description":"What opens first (feed, store, about page...)."},"allow_google_login":{"type":"boolean","default":true,"description":"Sign in with Google is on."},"use_cdn_for_medias":{"type":"boolean","default":false,"description":"Pictures and videos load from cdn_for_medias."},"cdn_for_medias":{"type":"string","description":"CDN address for media."},"use_cdn_for_microservices":{"type":"boolean","default":false,"description":"Microservices are called through cdn_for_microservices."},"cdn_for_microservices":{"type":"string","description":"CDN address for microservices."},"cdn_for_sockets":{"type":"string","description":"Address of the socket server."},"allow_chat":{"type":"boolean","default":true,"description":"Users can message each other."},"allow_in_app_notifications":{"type":"boolean","default":true,"description":"In-app notifications are on."},"feed_menus":{"type":"string","default":"grid","description":"Grid, row."},"allow_miniapps":{"type":"boolean","default":false,"description":"Mini apps are on."},"user_groups":{"type":"boolean","default":true,"description":"Users can create groups."},"allow_professional_pages":{"type":"boolean","default":false,"description":"Professional accounts get their own pages."},"allow_professional_account_registration":{"type":"boolean","default":false,"description":"Users can apply for a professional account."},"use_companion_bookings":{"type":"boolean","default":false,"description":"Bookings are handled by the companion app."},"confirm_bookings_call":{"type":"boolean","default":false,"description":"The AI phone agent calls to confirm bookings."},"hide_feed_menus":{"type":"boolean","default":false,"description":"Feed menus are hidden."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"navigation_pages":{"type":"object","properties":{"bites":{"type":"boolean"},"long_videos":{"type":"boolean"},"vouchers":{"type":"boolean"},"store":{"type":"boolean"},"programs":{"type":"boolean"},"services":{"type":"boolean"},"blogposts":{"type":"boolean"},"subscription":{"type":"boolean"},"playlists":{"type":"boolean"},"partners":{"type":"boolean"},"contacts":{"type":"boolean"},"tracker":{"type":"boolean"},"more":{"type":"boolean"},"claims":{"type":"boolean"},"miniapps":{"type":"boolean"},"events":{"type":"boolean"},"professional_pages":{"type":"boolean"}}},"paywall":{"type":"object","properties":{"store":{"type":"object","properties":{"has_paywall":{"type":"boolean"},"priceplans":{"type":"string"}}},"programs":{"type":"object","properties":{"has_paywall":{"type":"boolean"},"priceplans":{"type":"string"}}},"services":{"type":"object","properties":{"has_paywall":{"type":"boolean"},"priceplans":{"type":"string"}}},"blogposts":{"type":"object","properties":{"has_paywall":{"type":"boolean"},"priceplans":{"type":"string"}}},"subscription":{"type":"object","properties":{"has_paywall":{"type":"boolean"},"priceplans":{"type":"string"}}},"post":{"type":"object","properties":{"has_paywall":{"type":"boolean"},"priceplans":{"type":"string"}}},"groups":{"type":"object","properties":{"has_paywall":{"type":"boolean"},"priceplans":{"type":"string"}}},"professional_pages":{"type":"object","properties":{"has_paywall":{"type":"boolean"},"priceplans":{"type":"string"}}}}},"dashboard_pages":{"type":"object","properties":{"following":{"type":"boolean"},"recent":{"type":"boolean"},"threads":{"type":"boolean"},"long_videos":{"type":"boolean"},"groups":{"type":"boolean"},"about_pages":{"type":"boolean"},"mini_apps":{"type":"boolean"},"blogposts":{"type":"boolean"},"products":{"type":"boolean"},"services":{"type":"boolean"},"price_plans":{"type":"boolean"},"programs":{"type":"boolean"},"claims":{"type":"boolean"},"bites":{"type":"boolean"},"playlists":{"type":"boolean"},"partners":{"type":"boolean"},"contacts":{"type":"boolean"},"tracker":{"type":"boolean"},"vouchers":{"type":"boolean"},"explore":{"type":"boolean"}}},"about_pages":{"type":"object","properties":{"groups":{"type":"string"}}},"locations_map":{"type":"object","properties":{"enabled":{"type":"boolean"}}},"require_professional_account":{"type":"object","properties":{"services":{"type":"boolean"},"products":{"type":"boolean"},"programs":{"type":"boolean"},"blogposts":{"type":"boolean"},"subscriptions":{"type":"boolean"}}}}},"SocialModerationSettings":{"type":"object","properties":{"platform":{"type":"string","default":"facebook","description":"Facebook or Instagram."},"page_id":{"type":"string","description":"The connected page's id."},"page_name":{"type":"string","description":"The connected page's name."},"connected_by":{"type":"string","description":"User.id. Id of a User."},"last_polled_at":{"type":"string","format":"date-time","description":"When comments were last fetched."},"replies_disabled_at":{"type":"string","format":"date-time","description":"When replying stopped working (permissions lost)."},"enabled":{"type":"boolean","default":false,"description":"Moderation is on."},"auto_threshold":{"type":"number","default":0.9,"description":"Score above which the AI acts on its own."},"custom_instructions":{"type":"string","description":"The owner's instructions for judging comments."},"auto_action":{"type":"boolean","default":false,"description":"The AI hides or deletes on its own."},"allow_auto_delete":{"type":"boolean","default":false,"description":"Automatic actions may delete, not only hide."},"auto_reply":{"type":"boolean","default":false,"description":"The AI writes replies."},"auto_post_replies":{"type":"boolean","default":false,"description":"Replies are posted without the owner approving them."},"reply_instructions":{"type":"string","description":"The owner's instructions for replies."},"notify_new_comments":{"type":"boolean","default":false,"description":"The owner is notified of new comments."},"start_date":{"type":"string","format":"date-time","description":"Comments from this date on are handled."},"message_instructions":{"type":"string","description":"The owner's instructions for answering messages."},"granted_scopes":{"type":"array","items":{"type":"string"},"description":"Permissions the owner granted."},"instagram_user_id":{"type":"string","description":"The linked Instagram account's id."},"instagram_username":{"type":"string","description":"The linked Instagram account's username."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"sources":{"type":"object","properties":{"facebook_posts":{"type":"boolean"},"facebook_reviews":{"type":"boolean"},"instagram_comments":{"type":"boolean"},"facebook_messages":{"type":"boolean"},"instagram_messages":{"type":"boolean"}}}}},"SpeedySettings":{"type":"object","properties":{"shipping":{"type":"string","description":"Shipping.id. Id of a Shipping."},"create_label":{"type":"boolean","default":false,"description":"Shipments are created at Speedy automatically when an order is placed."},"username":{"type":"string","description":"Speedy account username."},"account_id":{"type":"string","description":"The Speedy client contract shipments are sent under."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"connected_account_owner_id":{"type":"string","description":"User.id. Id of a User."},"from_office":{"type":"boolean","default":false,"description":"Shipments leave from a Speedy office; false: picked up from the sender's door."},"contactName":{"type":"string","description":"Sender's name on shipments."},"multiple_items":{"type":"string","enum":["box","sum"],"default":"sum","description":"One of: box, sum."},"divide_by":{"type":"number","description":"When several items are summed into one parcel, their added dimensions are divided by this to estimate it."},"box":{"type":"array","items":{"type":"object","properties":{"height":{"type":"number"},"length":{"type":"number"},"width":{"type":"number"},"_id":{"type":"string"}}},"description":"Box sizes the business ships in."},"payAfterAccept":{"type":"boolean","default":false,"description":"Customers may inspect the parcel before paying."},"returnShipmentServiceId":{"type":"string","description":"Speedy service used for returns."},"returnShipmentPayer":{"type":"string","enum":["SENDER","RECIPIENT","THIRD_PARTY"],"description":"One of: SENDER, RECIPIENT, THIRD_PARTY."},"bank_transfer_payment":{"type":"boolean","default":false,"description":"Cash on delivery is paid to the business by bank transfer."},"cash_receipt":{"type":"boolean","default":false,"description":"Speedy issues the fiscal receipt for cash on delivery."},"cash_vat_group":{"type":"string","description":"VAT group printed on those receipts."},"_id":{"type":"string"},"address":{"type":"object","properties":{"countryId":{"type":"number"},"country":{"type":"string"},"stateId":{"type":"string"},"siteId":{"type":"string"},"postCode":{"type":"string"},"streetName":{"type":"string"},"streetNo":{"type":"string"},"blockNo":{"type":"string"},"entranceNo":{"type":"string"},"floorNo":{"type":"string"},"apartmentNo":{"type":"string"},"complexName":{"type":"string"},"fullAddressString":{"type":"string"}}},"office":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"}}},"services":{"type":"object","properties":{"abroad":{"type":"string"},"local":{"type":"string"}}},"senderBankAccount":{"type":"object","properties":{"accountHolder":{"type":"string"}}},"product_default_dimensions":{"type":"object","properties":{"height":{"type":"number"},"width":{"type":"number"},"length":{"type":"number"},"weight":{"type":"number"}}}}},"Subscription":{"type":"object","properties":{"stripe_subscription_id":{"type":"string","description":"Id of stripe substring object."},"user_id":{"type":"string","description":"Id of user who subscribet to price plan. Id of a User."},"status":{"type":"number","default":0,"description":"1 active, 0 cancelled or unpaid."},"payment_intent_id":{"type":"string","description":"Id of stripe payment intend object."},"price_plan":{"type":"string","description":"Id of the subscribed price plan. Id of a PricePlan."},"rating_mail_sent":{"type":"boolean","default":false,"description":"The email asking for a rating was sent."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Tax":{"type":"object","properties":{"country":{"type":"string","description":"Country to apply the tax rate."},"tax_rate":{"type":"number","description":"Tax rate."},"apply_to_shipping":{"type":"boolean","default":false,"description":"Tax rate."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Theme":{"type":"object","properties":{"primary":{"type":"string","default":"#3880ff","description":"Primary color."},"primary_darkmode":{"type":"string","default":"#3880ff","description":"Primary colour in dark mode."},"secondary":{"type":"string","default":"#0cd1e8","description":"Secondary color."},"tertiary":{"type":"string","default":"#7044ff","description":"Tertiary color."},"success":{"type":"string","default":"#10dc60","description":"Success color."},"warning":{"type":"string","default":"#ffce00","description":"Warning color."},"danger":{"type":"string","default":"#f04141","description":"Danger color."},"dark":{"type":"string","default":"#222428","description":"Dark color."},"dark_darkmode":{"type":"string","default":"#222428","description":"Dark colour in dark mode."},"medium":{"type":"string","default":"#989aa2","description":"Medium color."},"light":{"type":"string","default":"#f4f5f8","description":"Light color."},"light_darkmode":{"type":"string","default":"#f4f5f8","description":"Light colour in dark mode."},"lightContrast":{"type":"string","default":"#000000","description":"Text colour on light backgrounds."},"lightContrast_darkmode":{"type":"string","default":"#f4f5f8","description":"The same in dark mode."},"headerA":{"type":"string","default":"#f4f5f8","description":"Header A color."},"headerB":{"type":"string","default":"#f4f5f8","description":"Header B color."},"headerA_darkmode":{"type":"string","default":"#f4f5f8","description":"Header gradient start in dark mode."},"headerB_darkmode":{"type":"string","default":"#f4f5f8","description":"Header gradient end in dark mode."},"headerText":{"type":"string","description":"Header text colour."},"headerText_darkmode":{"type":"string","description":"Header text colour in dark mode."},"headerGradientDeg":{"type":"number","default":0,"description":"Angle of the header gradient, in degrees."},"footerA":{"type":"string","default":"#222428","description":"Footer A color."},"footerB":{"type":"string","default":"#222428","description":"Footer B color."},"footerA_darkmode":{"type":"string","default":"#222428","description":"Footer gradient start in dark mode."},"footerB_darkmode":{"type":"string","default":"#222428","description":"Footer gradient end in dark mode."},"footerGradientDeg":{"type":"number","default":0,"description":"Angle of the footer gradient, in degrees."},"footerText":{"type":"string","description":"Footer text colour."},"footerText_darkmode":{"type":"string","description":"Footer text colour in dark mode."},"headingFontFamily":{"type":"string","default":"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif","description":"Heading Font-Family."},"headingFontLink":{"type":"string","default":"","description":"Stylesheet URL that loads the heading font; empty when the font needs no webfont."},"headingFontWeight":{"type":"string","default":"400","description":"Weight of heading text."},"headingFontStyle":{"type":"string","default":"normal","description":"Style of heading text (normal, italic)."},"bodyFontFamily":{"type":"string","default":"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif","description":"Body Font-Family."},"bodyFontStyle":{"type":"string","default":"normal","description":"Style of body text."},"bodyFontLink":{"type":"string","default":"","description":"Stylesheet URL that loads the body font; empty when the font needs no webfont."},"primary_contrast":{"type":"string","default":"#3880ff","description":"Primary contrast color."},"primary_contrast_darkmode":{"type":"string","default":"#3880ff","description":"Text colour on the primary colour in dark mode."},"headerMinHeight":{"type":"string","default":"5rem","description":"Header min-height."},"backgroundImage":{"type":"string","default":"","description":"Background picture."},"backgroundVideo":{"type":"string","default":"","description":"Background video."},"backgroundAttachment":{"type":"string","default":"fixed","description":"Whether the background scrolls or stays fixed."},"backgroundOpacity":{"type":"number","default":1,"description":"Opacity of the background picture or video."},"transparentCard":{"type":"boolean","default":false,"description":"Cards are see-through."},"cardColor":{"type":"string","description":"Opacity of cards, from 0 to 1."},"cardColor_color":{"type":"string","description":"Card colour."},"cardColor_color_darkmode":{"type":"string","description":"Card colour in dark mode."},"showMorePages":{"type":"boolean","default":true,"description":"Shows the More pages menu."},"allow_darkmode":{"type":"boolean","default":false,"description":"Allows site/app to switch between light and dark mode, default value is false."},"use_darkmode_on_site":{"type":"boolean","default":false,"description":"Allows the site to switch between light and dark mode, default value is false."},"headerA_secondary":{"type":"string","default":"#f4f5f8","description":"Secondary header gradient start."},"headerB_secondary":{"type":"string","default":"#f4f5f8","description":"Secondary header gradient end."},"headerA_secondary_darkmode":{"type":"string","default":"#f4f5f8","description":"The same in dark mode."},"headerB_secondary_darkmode":{"type":"string","default":"#f4f5f8","description":"The same in dark mode."},"headerText_secondary":{"type":"string","description":"Secondary header text colour."},"headerText_secondary_darkmode":{"type":"string","description":"The same in dark mode."},"customDropdown_background":{"type":"string","default":"#fff","description":"Background of custom dropdown menus."},"customDropdown_text":{"type":"string","default":"#212529","description":"Text colour of custom dropdown menus."},"breadCrumbs_backgroundColor":{"type":"string","default":"#e8ebf0","description":"Breadcrumbs background."},"breadCrumbs_textColor":{"type":"string","default":"#97a0b0","description":"Breadcrumbs text colour."},"breadCrumbs_darkmode_backgroundColor":{"type":"string","default":"#e8ebf0","description":"Breadcrumbs background in dark mode."},"breadCrumbs_darkmode_textColor":{"type":"string","default":"#97a0b0","description":"Breadcrumbs text colour in dark mode."},"cardColor_secondary":{"type":"string","default":"#757c8d","description":"Secondary card colour."},"cardColor_secondary_darkmode":{"type":"string","default":"#757c8d","description":"Secondary card colour in dark mode."},"show_inapp_message":{"type":"boolean","default":true,"description":"Shows the in-app message banner."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"product":{"type":"object","properties":{"title":{"type":"string"},"gallery":{"type":"string"},"galleryType":{"type":"string"},"options":{"type":"string"},"infos":{"type":"string"},"infosShow":{"type":"boolean"},"description":{"type":"string"},"cartBtn":{"type":"string"},"comments":{"type":"boolean"},"sku":{"type":"boolean"},"brand":{"type":"boolean"},"cardDesign":{"type":"string"},"likes":{"type":"boolean"},"rating":{"type":"boolean"},"titleColor":{"type":"string"},"priceColor":{"type":"string"},"descriptionColor":{"type":"string"},"borderRadius":{"type":"string"},"titleFontSize":{"type":"string"},"descriptionFontSize":{"type":"string"},"priceFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"descriptionFontWeight":{"type":"string"},"priceFontWeight":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"cardBackgroundColor":{"type":"string"},"imageAspectRatio":{"type":"string"},"ratingList":{"type":"boolean"},"customCss":{"type":"string"},"scroll_next":{"type":"boolean"},"ratingBackgroundColor":{"type":"string"},"quantity_counter":{"type":"string"},"view_counter":{"type":"boolean"},"contactInfo":{"type":"boolean"},"cartBanner":{"type":"boolean"},"navigation":{"type":"boolean"},"price":{"type":"string"},"optionsColor":{"type":"string"},"optionsBackground":{"type":"string"},"optionsFontSize":{"type":"string"},"optionsFontWeight":{"type":"string"},"optionsColorSelected":{"type":"string"},"optionsBackgroundSelected":{"type":"string"},"viewMultiplier":{"type":"number"},"cartColor":{"type":"string"},"cartBackground":{"type":"string"},"cartFontSize":{"type":"string"},"cartFontWeight":{"type":"string"},"ctaColor":{"type":"string"},"ctaBorderColor":{"type":"string"},"ctaFontSize":{"type":"string"},"ctaFontWeight":{"type":"string"},"selectOption":{"type":"boolean"},"skin":{"type":"string"},"mode":{"type":"string"},"accentColor":{"type":"string"},"fieldBackground":{"type":"string"},"imageRadius":{"type":"number"},"titleFontFamily":{"type":"string"},"titleTransform":{"type":"string"},"priceFontFamily":{"type":"string"},"priceFontStyle":{"type":"string"},"buttonRadius":{"type":"number"},"hairlineWidth":{"type":"number"},"hairlineColor":{"type":"string"},"boxShadowColor":{"type":"string"},"boxShadowOffsetX":{"type":"number"},"boxShadowOffsetY":{"type":"number"},"boxShadowBlurRadius":{"type":"number"},"boxShadowSpreadRadius":{"type":"number"},"chipBackground":{"type":"string"},"chipBorderColor":{"type":"string"},"chipTextColor":{"type":"string"}}},"service":{"type":"object","properties":{"title":{"type":"string"},"gallery":{"type":"string"},"galleryType":{"type":"string"},"options":{"type":"string"},"infos":{"type":"string"},"description":{"type":"string"},"comments":{"type":"boolean"},"cardDesign":{"type":"string"},"likes":{"type":"boolean"},"rating":{"type":"boolean"},"titleColor":{"type":"string"},"priceColor":{"type":"string"},"descriptionColor":{"type":"string"},"borderRadius":{"type":"string"},"titleFontSize":{"type":"string"},"descriptionFontSize":{"type":"string"},"priceFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"descriptionFontWeight":{"type":"string"},"priceFontWeight":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"cardBackgroundColor":{"type":"string"},"imageAspectRatio":{"type":"string"},"ratingList":{"type":"boolean"},"customCss":{"type":"string"},"calendarColor":{"type":"string"},"dateBackground":{"type":"string"},"dateTextColor":{"type":"string"},"skin":{"type":"string"},"mode":{"type":"string"},"accentColor":{"type":"string"},"fieldBackground":{"type":"string"},"imageRadius":{"type":"number"},"buttonRadius":{"type":"number"},"titleFontFamily":{"type":"string"},"titleTransform":{"type":"string"},"priceFontFamily":{"type":"string"},"priceFontStyle":{"type":"string"},"hairlineWidth":{"type":"number"},"hairlineColor":{"type":"string"},"boxShadowColor":{"type":"string"},"boxShadowOffsetX":{"type":"number"},"boxShadowOffsetY":{"type":"number"},"boxShadowBlurRadius":{"type":"number"},"boxShadowSpreadRadius":{"type":"number"},"chipBackground":{"type":"string"},"chipBorderColor":{"type":"string"},"chipTextColor":{"type":"string"},"hideContactInfo":{"type":"boolean"}}},"blogpost":{"type":"object","properties":{"title":{"type":"string"},"gallery":{"type":"string"},"galleryType":{"type":"string"},"description":{"type":"string"},"comments":{"type":"boolean"},"cardDesign":{"type":"string"},"likes":{"type":"boolean"},"titleColor":{"type":"string"},"descriptionColor":{"type":"string"},"borderRadius":{"type":"string"},"titleFontSize":{"type":"string"},"descriptionFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"descriptionFontWeight":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"cardBackgroundColor":{"type":"string"},"imageAspectRatio":{"type":"string"},"customCss":{"type":"string"},"scroll_next":{"type":"boolean"},"galleryPosition":{"type":"string"},"contactInfo":{"type":"boolean"},"bodyFontSize":{"type":"string"},"bodyFontWeight":{"type":"string"},"bodyColor":{"type":"string"},"skin":{"type":"string"},"mode":{"type":"string"},"accentColor":{"type":"string"},"fieldBackground":{"type":"string"},"imageRadius":{"type":"number"},"buttonRadius":{"type":"number"},"titleFontFamily":{"type":"string"},"titleTransform":{"type":"string"},"hairlineWidth":{"type":"number"},"hairlineColor":{"type":"string"},"boxShadowColor":{"type":"string"},"boxShadowOffsetX":{"type":"number"},"boxShadowOffsetY":{"type":"number"},"boxShadowBlurRadius":{"type":"number"},"boxShadowSpreadRadius":{"type":"number"},"chipBackground":{"type":"string"},"chipBorderColor":{"type":"string"},"chipTextColor":{"type":"string"},"showDate":{"type":"boolean"},"dateColor":{"type":"string"},"dateFontSize":{"type":"number"},"dateFontWeight":{"type":"string"},"dateFontFamily":{"type":"string"},"dateFontStyle":{"type":"string"}}},"products":{"type":"object","properties":{"gridStyle":{"type":"string"},"align":{"type":"string"},"title":{"type":"string"},"image":{"type":"string"},"filters":{"type":"string"},"description":{"type":"boolean"},"transparent":{"type":"boolean"},"price":{"type":"boolean"},"showFilters":{"type":"boolean"},"showBanner":{"type":"boolean"},"animation":{"type":"string"},"animationDuration":{"type":"number"},"animationDelay":{"type":"number"},"titleColor":{"type":"string"},"priceColor":{"type":"string"},"descriptionColor":{"type":"string"},"borderRadius":{"type":"string"},"titleFontSize":{"type":"string"},"descriptionFontSize":{"type":"string"},"priceFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"descriptionFontWeight":{"type":"string"},"priceFontWeight":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"cardBackgroundColor":{"type":"string"},"imageAspectRatio":{"type":"string"},"customCss":{"type":"string"},"filtersBackgroundColor":{"type":"string"},"filtersTextColor":{"type":"string"},"filtersBorderRadius":{"type":"string"},"filtersCardDesign":{"type":"string"},"boxShadowColor":{"type":"string"},"boxShadowOffsetX":{"type":"number"},"boxShadowOffsetY":{"type":"number"},"boxShadowBlurRadius":{"type":"string"},"boxShadowSpreadRadius":{"type":"string"},"hideOriginAddress":{"type":"boolean"},"categories":{"type":"object","properties":{"layout":{"type":"string"},"showHeading":{"type":"boolean"},"showSubtitle":{"type":"boolean"},"showImage":{"type":"boolean"},"imageSize":{"type":"string"},"imageRadius":{"type":"string"},"imageAspectRatio":{"type":"string"},"imageFit":{"type":"string"},"imagePadding":{"type":"number"},"fallback":{"type":"string"},"showChevron":{"type":"boolean"},"titleColor":{"type":"string"},"titleFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"cardBackgroundColor":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"customCss":{"type":"string"},"site":{"type":"object","properties":{"showImage":{"type":"boolean"},"imageSize":{"type":"string"},"imageAspectRatio":{"type":"string"},"titleColor":{"type":"string"},"titleFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"cardBackgroundColor":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"cardPadding":{"type":"string"},"gap":{"type":"string"},"align":{"type":"string"},"titleTransform":{"type":"string"}}}}},"hideRibbon":{"type":"boolean"},"hideCustomFields":{"type":"boolean"},"showLink":{"type":"boolean"},"linkLabel":{"type":"string"},"imageObjectFit":{"type":"string"},"imageRadius":{"type":"number"},"cardPaddingX":{"type":"number"},"cardPaddingY":{"type":"number"},"titleTransform":{"type":"string"},"priceFontStyle":{"type":"string"},"fieldBackground":{"type":"string"},"showRating":{"type":"boolean"},"gap":{"type":"number"},"titleFontFamily":{"type":"string"},"priceFontFamily":{"type":"string"},"mode":{"type":"string"},"hairlineWidth":{"type":"number"},"hairlineColor":{"type":"string"},"scrimGradient":{"type":"string"},"skin":{"type":"string"},"columns":{"type":"number"},"columnsMobile":{"type":"number"},"accentColor":{"type":"string"},"filtersSkin":{"type":"string"},"filtersAccentColor":{"type":"string"},"filtersHeadingFontFamily":{"type":"string"},"filtersHeadingTransform":{"type":"string"},"filtersBorderWidth":{"type":"number"},"filtersBorderColor":{"type":"string"},"filtersPanelBackground":{"type":"string"},"filtersBoxShadowColor":{"type":"string"},"filtersBoxShadowOffsetX":{"type":"number"},"filtersBoxShadowOffsetY":{"type":"number"},"filtersBoxShadowBlurRadius":{"type":"number"},"filtersBoxShadowSpreadRadius":{"type":"number"},"showViews":{"type":"boolean"},"viewsColor":{"type":"string"}}},"services":{"type":"object","properties":{"gridStyle":{"type":"string"},"align":{"type":"string"},"title":{"type":"string"},"image":{"type":"string"},"filters":{"type":"string"},"description":{"type":"boolean"},"transparent":{"type":"boolean"},"price":{"type":"boolean"},"showFilters":{"type":"boolean"},"showCategoryFilters":{"type":"boolean"},"showBanner":{"type":"boolean"},"animation":{"type":"string"},"animationDuration":{"type":"number"},"animationDelay":{"type":"number"},"rating":{"type":"boolean"},"titleColor":{"type":"string"},"priceColor":{"type":"string"},"descriptionColor":{"type":"string"},"borderRadius":{"type":"string"},"titleFontSize":{"type":"string"},"descriptionFontSize":{"type":"string"},"priceFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"descriptionFontWeight":{"type":"string"},"priceFontWeight":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"cardBackgroundColor":{"type":"string"},"imageAspectRatio":{"type":"string"},"customCss":{"type":"string"},"filtersBackgroundColor":{"type":"string"},"filtersTextColor":{"type":"string"},"filtersBorderRadius":{"type":"string"},"boxShadowColor":{"type":"string"},"boxShadowOffsetX":{"type":"number"},"boxShadowOffsetY":{"type":"number"},"boxShadowBlurRadius":{"type":"string"},"boxShadowSpreadRadius":{"type":"string"},"showBreadCrumbs":{"type":"boolean"},"imagePadding":{"type":"number"},"categories":{"type":"object","properties":{"layout":{"type":"string"},"showHeading":{"type":"boolean"},"showSubtitle":{"type":"boolean"},"showImage":{"type":"boolean"},"imageSize":{"type":"string"},"imageRadius":{"type":"string"},"imageAspectRatio":{"type":"string"},"imageFit":{"type":"string"},"imagePadding":{"type":"number"},"fallback":{"type":"string"},"showChevron":{"type":"boolean"},"titleColor":{"type":"string"},"titleFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"cardBackgroundColor":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"customCss":{"type":"string"},"site":{"type":"object","properties":{"showImage":{"type":"boolean"},"imageSize":{"type":"string"},"imageAspectRatio":{"type":"string"},"titleColor":{"type":"string"},"titleFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"cardBackgroundColor":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"cardPadding":{"type":"string"},"gap":{"type":"string"},"align":{"type":"string"},"titleTransform":{"type":"string"}}}}},"titleTransform":{"type":"string"},"priceFontStyle":{"type":"string"},"cardPaddingX":{"type":"number"},"cardPaddingY":{"type":"number"},"fieldBackground":{"type":"string"},"imageObjectFit":{"type":"string"},"imageRadius":{"type":"number"},"accentColor":{"type":"string"},"gap":{"type":"number"},"hideCustomFields":{"type":"boolean"},"showDuration":{"type":"boolean"},"durationLabel":{"type":"string"},"showLink":{"type":"boolean"},"linkLabel":{"type":"string"},"titleFontFamily":{"type":"string"},"priceFontFamily":{"type":"string"},"columns":{"type":"number"},"columnsMobile":{"type":"number"},"skin":{"type":"string"},"mode":{"type":"string"},"hairlineWidth":{"type":"number"},"hairlineColor":{"type":"string"},"scrimGradient":{"type":"string"},"filtersSkin":{"type":"string"},"filtersAccentColor":{"type":"string"},"filtersHeadingFontFamily":{"type":"string"},"filtersHeadingTransform":{"type":"string"},"filtersBorderWidth":{"type":"number"},"filtersBorderColor":{"type":"string"},"filtersPanelBackground":{"type":"string"},"filtersBoxShadowColor":{"type":"string"},"filtersBoxShadowOffsetX":{"type":"number"},"filtersBoxShadowOffsetY":{"type":"number"},"filtersBoxShadowBlurRadius":{"type":"number"},"filtersBoxShadowSpreadRadius":{"type":"number"},"hideCalendarDuration":{"type":"boolean"},"calendar":{"type":"boolean"},"rowRuleWidth":{"type":"number"},"rowRuleColor":{"type":"string"},"maxWidth":{"type":"number"},"showViews":{"type":"boolean"},"viewsColor":{"type":"string"}}},"blogposts":{"type":"object","properties":{"gridStyle":{"type":"string"},"align":{"type":"string"},"title":{"type":"string"},"image":{"type":"string"},"filters":{"type":"string"},"description":{"type":"boolean"},"showFilters":{"type":"boolean"},"header":{"type":"boolean"},"showBanner":{"type":"boolean"},"animation":{"type":"string"},"animationDuration":{"type":"number"},"animationDelay":{"type":"number"},"titleColor":{"type":"string"},"descriptionColor":{"type":"string"},"borderRadius":{"type":"string"},"titleFontSize":{"type":"string"},"descriptionFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"descriptionFontWeight":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"cardBackgroundColor":{"type":"string"},"imageAspectRatio":{"type":"string"},"customCss":{"type":"string"},"sort":{"type":"number"},"showBreadCrumbs":{"type":"boolean"},"filtersBackgroundColor":{"type":"string"},"filtersTextColor":{"type":"string"},"filtersBorderRadius":{"type":"string"},"boxShadowColor":{"type":"string"},"boxShadowOffsetX":{"type":"number"},"boxShadowOffsetY":{"type":"number"},"boxShadowBlurRadius":{"type":"string"},"boxShadowSpreadRadius":{"type":"string"},"imagePadding":{"type":"number"},"categories":{"type":"object","properties":{"layout":{"type":"string"},"showHeading":{"type":"boolean"},"showSubtitle":{"type":"boolean"},"showImage":{"type":"boolean"},"imageSize":{"type":"string"},"imageRadius":{"type":"string"},"imageAspectRatio":{"type":"string"},"imageFit":{"type":"string"},"imagePadding":{"type":"number"},"fallback":{"type":"string"},"showChevron":{"type":"boolean"},"titleColor":{"type":"string"},"titleFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"cardBackgroundColor":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"customCss":{"type":"string"},"site":{"type":"object","properties":{"showImage":{"type":"boolean"},"imageSize":{"type":"string"},"imageAspectRatio":{"type":"string"},"titleColor":{"type":"string"},"titleFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"cardBackgroundColor":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"cardPadding":{"type":"string"},"gap":{"type":"string"},"align":{"type":"string"},"titleTransform":{"type":"string"}}}}},"titleTransform":{"type":"string"},"cardPaddingX":{"type":"number"},"cardPaddingY":{"type":"number"},"fieldBackground":{"type":"string"},"imageObjectFit":{"type":"string"},"imageRadius":{"type":"number"},"accentColor":{"type":"string"},"gap":{"type":"number"},"hideCustomFields":{"type":"boolean"},"hideImage":{"type":"boolean"},"showDate":{"type":"boolean"},"dateColor":{"type":"string"},"dateFontSize":{"type":"string"},"dateFontWeight":{"type":"string"},"dateFontFamily":{"type":"string"},"dateFontStyle":{"type":"string"},"hideLink":{"type":"boolean"},"linkLabel":{"type":"string"},"titleFontFamily":{"type":"string"},"columns":{"type":"number"},"columnsMobile":{"type":"number"},"skin":{"type":"string"},"mode":{"type":"string"},"hairlineWidth":{"type":"number"},"hairlineColor":{"type":"string"},"scrimGradient":{"type":"string"},"filtersSkin":{"type":"string"},"filtersAccentColor":{"type":"string"},"filtersHeadingFontFamily":{"type":"string"},"filtersHeadingTransform":{"type":"string"},"filtersBorderWidth":{"type":"number"},"filtersBorderColor":{"type":"string"},"filtersPanelBackground":{"type":"string"},"filtersBoxShadowColor":{"type":"string"},"filtersBoxShadowOffsetX":{"type":"number"},"filtersBoxShadowOffsetY":{"type":"number"},"filtersBoxShadowBlurRadius":{"type":"number"},"filtersBoxShadowSpreadRadius":{"type":"number"},"rowRuleWidth":{"type":"number"},"rowRuleColor":{"type":"string"},"maxWidth":{"type":"number"},"hideCategory":{"type":"boolean"},"showViews":{"type":"boolean"},"viewsColor":{"type":"string"}}},"videos":{"type":"object","properties":{"gridStyle":{"type":"string"},"align":{"type":"string"},"title":{"type":"string"},"video":{"type":"string"},"filters":{"type":"string"},"showTitle":{"type":"boolean"},"showFilters":{"type":"boolean"},"showBanner":{"type":"boolean"},"animation":{"type":"string"},"animationDuration":{"type":"number"},"animationDelay":{"type":"number"},"showBreadCrumbs":{"type":"boolean"}}},"program":{"type":"object","properties":{"cardDesign":{"type":"string"},"comments":{"type":"boolean"},"likes":{"type":"boolean"},"rating":{"type":"boolean"},"titleColor":{"type":"string"},"descriptionColor":{"type":"string"},"borderRadius":{"type":"string"},"titleFontSize":{"type":"string"},"descriptionFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"descriptionFontWeight":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"cardBackgroundColor":{"type":"string"},"imageAspectRatio":{"type":"string"},"ratingList":{"type":"boolean"},"customCss":{"type":"string"},"showBreadCrumbs":{"type":"boolean"}}},"professional_account":{"type":"object","properties":{"cardDesign":{"type":"string"},"likes":{"type":"boolean"},"titleColor":{"type":"string"},"priceColor":{"type":"string"},"descriptionColor":{"type":"string"},"borderRadius":{"type":"string"},"titleFontSize":{"type":"string"},"descriptionFontSize":{"type":"string"},"priceFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"descriptionFontWeight":{"type":"string"},"priceFontWeight":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"cardBackgroundColor":{"type":"string"},"imageAspectRatio":{"type":"string"},"ratingList":{"type":"boolean"},"customCss":{"type":"string"}}},"personal_account":{"type":"object","properties":{"cardDesign":{"type":"string"}}},"footer":{"type":"object","properties":{"columns":{"type":"string"},"about_page":{"type":"string"},"customCss":{"type":"string"}}},"header":{"type":"object","properties":{"twoRows":{"type":"boolean"},"sidenav":{"type":"boolean"},"sticky":{"type":"boolean"},"justifyLinks":{"type":"string"},"justifyLinksMobile":{"type":"string"},"linkFontSize":{"type":"string"},"linkFontWeight":{"type":"string"},"linkFontFamily":{"type":"string"},"linkTextTransform":{"type":"string"},"linkLetterSpacing":{"type":"string"},"barBorderWidth":{"type":"number"},"barBorderColor":{"type":"string"},"barFloating":{"type":"boolean"},"barBorderRadius":{"type":"number"},"barShadow":{"type":"string"},"logoSize":{"type":"string"},"logoSizeMobile":{"type":"string"},"row1Height":{"type":"string"},"row2Height":{"type":"string"},"bannerHeight":{"type":"string"},"contentMaxWidth":{"type":"string"},"justifyLogo":{"type":"string"},"userAndCartPosition":{"type":"string"},"linkMargin":{"type":"string"},"about_page":{"type":"string"},"about_page_position":{"type":"string"},"showSearch":{"type":"boolean"},"smartSearch":{"type":"object","properties":{"enabled":{"type":"boolean"},"placeholder":{"type":"string"},"kinds":{"type":"string"},"collections":{"type":"string"},"items":{"type":"string"},"showKindFilter":{"type":"boolean"},"showPriceFilter":{"type":"boolean"},"showDateFilter":{"type":"boolean"},"showSort":{"type":"boolean"},"dateMode":{"type":"string"},"layout":{"type":"string"},"columns":{"type":"number"},"perPage":{"type":"number"},"instant":{"type":"boolean"},"showImages":{"type":"boolean"},"showPrices":{"type":"boolean"},"showInitial":{"type":"boolean"},"showAnswer":{"type":"boolean"}}},"showLogIn":{"type":"boolean"},"showActionButton":{"type":"boolean"},"actionButton":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string"},"fill":{"type":"string"},"color":{"type":"string"},"class":{"type":"string"},"customColor":{"type":"string"},"textColor":{"type":"string"},"fontSize":{"type":"number"},"borderRadius":{"type":"string"},"position":{"type":"string"}}},"showCart":{"type":"boolean"},"cart_position":{"type":"string"},"login_position":{"type":"string"},"search_position":{"type":"string"},"login_icon":{"type":"boolean"},"login_icon_only":{"type":"boolean"},"login_icon_class":{"type":"string"},"login_in_app":{"type":"boolean"},"cart_row":{"type":"string"},"login_row":{"type":"string"},"search_row":{"type":"string"},"pinned_links":{"type":"string"},"customCss":{"type":"string"},"logoPosition":{"type":"string"},"firstrow_links":{"type":"string"},"firstrow_links_justify":{"type":"string"},"firstrow_links_spread":{"type":"string"},"showBanner":{"type":"boolean"},"banner":{"type":"object","properties":{"items":{"type":"string"},"fontSize":{"type":"string"},"fontWeight":{"type":"string"},"textColor":{"type":"string"},"backgroundColor":{"type":"string"},"justifyContent":{"type":"string"},"motion":{"type":"string"},"speed":{"type":"string"},"speedLevel":{"type":"number"},"animation":{"type":"string"},"direction":{"type":"string"},"repeat":{"type":"boolean"},"iconGap":{"type":"number"},"itemGap":{"type":"number"}}},"isFullWidth":{"type":"boolean"},"app_user_position":{"type":"string"},"logoMediaMobile":{"type":"string"},"sidenavIconBorderRadius":{"type":"string"},"sidenavIconBorderWidth":{"type":"string"},"sidenavIconColor":{"type":"string"},"sidenavIcon":{"type":"string"},"sidenavIconSize":{"type":"string"},"sidenavIconMedia":{"type":"string"},"menuIconPosition":{"type":"string"},"logoPositionMobile":{"type":"string"},"search_position_mobile":{"type":"string"},"login_position_mobile":{"type":"string"},"cart_position_mobile":{"type":"string"},"button_position_mobile":{"type":"string"},"sidenavIconAnimation":{"type":"string"},"sidenavIconClose":{"type":"string"},"sidenavIconMediaClose":{"type":"string"},"elements_order":{"type":"object","properties":{"logo":{"type":"object","properties":{"value":{"type":"number"},"mobile_value":{"type":"number"}}},"nav":{"type":"object","properties":{"value":{"type":"number"},"mobile_value":{"type":"number"}}},"firstrow":{"type":"object","properties":{"value":{"type":"number"},"mobile_value":{"type":"number"}}},"search":{"type":"object","properties":{"value":{"type":"number"},"mobile_value":{"type":"number"}}},"login":{"type":"object","properties":{"value":{"type":"number"},"mobile_value":{"type":"number"}}},"cart":{"type":"object","properties":{"value":{"type":"number"},"mobile_value":{"type":"number"}}},"button":{"type":"object","properties":{"value":{"type":"number"},"mobile_value":{"type":"number"}}},"menuicon":{"type":"object","properties":{"value":{"type":"number"},"mobile_value":{"type":"number"}}}}},"elements_style":{"type":"object","properties":{"nav":{"type":"object","properties":{"background":{"type":"string"},"color":{"type":"string"},"border_color":{"type":"string"},"border_width":{"type":"number"},"border_radius":{"type":"number"},"font_size":{"type":"number"},"border_top_width":{"type":"number"},"border_right_width":{"type":"number"},"border_bottom_width":{"type":"number"},"border_left_width":{"type":"number"}}},"nav_active":{"type":"object","properties":{"background":{"type":"string"},"color":{"type":"string"},"border_color":{"type":"string"},"border_width":{"type":"number"},"border_radius":{"type":"number"},"font_size":{"type":"number"},"border_top_width":{"type":"number"},"border_right_width":{"type":"number"},"border_bottom_width":{"type":"number"},"border_left_width":{"type":"number"}}},"firstrow":{"type":"object","properties":{"background":{"type":"string"},"color":{"type":"string"},"border_color":{"type":"string"},"border_width":{"type":"number"},"border_radius":{"type":"number"},"font_size":{"type":"number"},"border_top_width":{"type":"number"},"border_right_width":{"type":"number"},"border_bottom_width":{"type":"number"},"border_left_width":{"type":"number"}}},"search":{"type":"object","properties":{"background":{"type":"string"},"color":{"type":"string"},"border_color":{"type":"string"},"border_width":{"type":"number"},"border_radius":{"type":"number"},"font_size":{"type":"number"},"border_top_width":{"type":"number"},"border_right_width":{"type":"number"},"border_bottom_width":{"type":"number"},"border_left_width":{"type":"number"}}},"login":{"type":"object","properties":{"background":{"type":"string"},"color":{"type":"string"},"border_color":{"type":"string"},"border_width":{"type":"number"},"border_radius":{"type":"number"},"font_size":{"type":"number"},"border_top_width":{"type":"number"},"border_right_width":{"type":"number"},"border_bottom_width":{"type":"number"},"border_left_width":{"type":"number"}}},"cart":{"type":"object","properties":{"background":{"type":"string"},"color":{"type":"string"},"border_color":{"type":"string"},"border_width":{"type":"number"},"border_radius":{"type":"number"},"font_size":{"type":"number"},"border_top_width":{"type":"number"},"border_right_width":{"type":"number"},"border_bottom_width":{"type":"number"},"border_left_width":{"type":"number"}}}}},"elements_spacing":{"type":"object","properties":{"logo":{"type":"object","properties":{"margin_top":{"type":"number"},"margin_top_unit":{"type":"string"},"mobile_margin_top":{"type":"number"},"mobile_margin_top_unit":{"type":"string"},"margin_right":{"type":"number"},"margin_right_unit":{"type":"string"},"mobile_margin_right":{"type":"number"},"mobile_margin_right_unit":{"type":"string"},"margin_bottom":{"type":"number"},"margin_bottom_unit":{"type":"string"},"mobile_margin_bottom":{"type":"number"},"mobile_margin_bottom_unit":{"type":"string"},"margin_left":{"type":"number"},"margin_left_unit":{"type":"string"},"mobile_margin_left":{"type":"number"},"mobile_margin_left_unit":{"type":"string"}}},"nav":{"type":"object","properties":{"margin_top":{"type":"number"},"margin_top_unit":{"type":"string"},"mobile_margin_top":{"type":"number"},"mobile_margin_top_unit":{"type":"string"},"padding_top":{"type":"number"},"padding_top_unit":{"type":"string"},"mobile_padding_top":{"type":"number"},"mobile_padding_top_unit":{"type":"string"},"margin_right":{"type":"number"},"margin_right_unit":{"type":"string"},"mobile_margin_right":{"type":"number"},"mobile_margin_right_unit":{"type":"string"},"padding_right":{"type":"number"},"padding_right_unit":{"type":"string"},"mobile_padding_right":{"type":"number"},"mobile_padding_right_unit":{"type":"string"},"margin_bottom":{"type":"number"},"margin_bottom_unit":{"type":"string"},"mobile_margin_bottom":{"type":"number"},"mobile_margin_bottom_unit":{"type":"string"},"padding_bottom":{"type":"number"},"padding_bottom_unit":{"type":"string"},"mobile_padding_bottom":{"type":"number"},"mobile_padding_bottom_unit":{"type":"string"},"margin_left":{"type":"number"},"margin_left_unit":{"type":"string"},"mobile_margin_left":{"type":"number"},"mobile_margin_left_unit":{"type":"string"},"padding_left":{"type":"number"},"padding_left_unit":{"type":"string"},"mobile_padding_left":{"type":"number"},"mobile_padding_left_unit":{"type":"string"}}},"firstrow":{"type":"object","properties":{"margin_top":{"type":"number"},"margin_top_unit":{"type":"string"},"mobile_margin_top":{"type":"number"},"mobile_margin_top_unit":{"type":"string"},"padding_top":{"type":"number"},"padding_top_unit":{"type":"string"},"mobile_padding_top":{"type":"number"},"mobile_padding_top_unit":{"type":"string"},"margin_right":{"type":"number"},"margin_right_unit":{"type":"string"},"mobile_margin_right":{"type":"number"},"mobile_margin_right_unit":{"type":"string"},"padding_right":{"type":"number"},"padding_right_unit":{"type":"string"},"mobile_padding_right":{"type":"number"},"mobile_padding_right_unit":{"type":"string"},"margin_bottom":{"type":"number"},"margin_bottom_unit":{"type":"string"},"mobile_margin_bottom":{"type":"number"},"mobile_margin_bottom_unit":{"type":"string"},"padding_bottom":{"type":"number"},"padding_bottom_unit":{"type":"string"},"mobile_padding_bottom":{"type":"number"},"mobile_padding_bottom_unit":{"type":"string"},"margin_left":{"type":"number"},"margin_left_unit":{"type":"string"},"mobile_margin_left":{"type":"number"},"mobile_margin_left_unit":{"type":"string"},"padding_left":{"type":"number"},"padding_left_unit":{"type":"string"},"mobile_padding_left":{"type":"number"},"mobile_padding_left_unit":{"type":"string"}}},"search":{"type":"object","properties":{"margin_top":{"type":"number"},"margin_top_unit":{"type":"string"},"mobile_margin_top":{"type":"number"},"mobile_margin_top_unit":{"type":"string"},"padding_top":{"type":"number"},"padding_top_unit":{"type":"string"},"mobile_padding_top":{"type":"number"},"mobile_padding_top_unit":{"type":"string"},"margin_right":{"type":"number"},"margin_right_unit":{"type":"string"},"mobile_margin_right":{"type":"number"},"mobile_margin_right_unit":{"type":"string"},"padding_right":{"type":"number"},"padding_right_unit":{"type":"string"},"mobile_padding_right":{"type":"number"},"mobile_padding_right_unit":{"type":"string"},"margin_bottom":{"type":"number"},"margin_bottom_unit":{"type":"string"},"mobile_margin_bottom":{"type":"number"},"mobile_margin_bottom_unit":{"type":"string"},"padding_bottom":{"type":"number"},"padding_bottom_unit":{"type":"string"},"mobile_padding_bottom":{"type":"number"},"mobile_padding_bottom_unit":{"type":"string"},"margin_left":{"type":"number"},"margin_left_unit":{"type":"string"},"mobile_margin_left":{"type":"number"},"mobile_margin_left_unit":{"type":"string"},"padding_left":{"type":"number"},"padding_left_unit":{"type":"string"},"mobile_padding_left":{"type":"number"},"mobile_padding_left_unit":{"type":"string"}}},"login":{"type":"object","properties":{"margin_top":{"type":"number"},"margin_top_unit":{"type":"string"},"mobile_margin_top":{"type":"number"},"mobile_margin_top_unit":{"type":"string"},"padding_top":{"type":"number"},"padding_top_unit":{"type":"string"},"mobile_padding_top":{"type":"number"},"mobile_padding_top_unit":{"type":"string"},"margin_right":{"type":"number"},"margin_right_unit":{"type":"string"},"mobile_margin_right":{"type":"number"},"mobile_margin_right_unit":{"type":"string"},"padding_right":{"type":"number"},"padding_right_unit":{"type":"string"},"mobile_padding_right":{"type":"number"},"mobile_padding_right_unit":{"type":"string"},"margin_bottom":{"type":"number"},"margin_bottom_unit":{"type":"string"},"mobile_margin_bottom":{"type":"number"},"mobile_margin_bottom_unit":{"type":"string"},"padding_bottom":{"type":"number"},"padding_bottom_unit":{"type":"string"},"mobile_padding_bottom":{"type":"number"},"mobile_padding_bottom_unit":{"type":"string"},"margin_left":{"type":"number"},"margin_left_unit":{"type":"string"},"mobile_margin_left":{"type":"number"},"mobile_margin_left_unit":{"type":"string"},"padding_left":{"type":"number"},"padding_left_unit":{"type":"string"},"mobile_padding_left":{"type":"number"},"mobile_padding_left_unit":{"type":"string"}}},"cart":{"type":"object","properties":{"margin_top":{"type":"number"},"margin_top_unit":{"type":"string"},"mobile_margin_top":{"type":"number"},"mobile_margin_top_unit":{"type":"string"},"padding_top":{"type":"number"},"padding_top_unit":{"type":"string"},"mobile_padding_top":{"type":"number"},"mobile_padding_top_unit":{"type":"string"},"margin_right":{"type":"number"},"margin_right_unit":{"type":"string"},"mobile_margin_right":{"type":"number"},"mobile_margin_right_unit":{"type":"string"},"padding_right":{"type":"number"},"padding_right_unit":{"type":"string"},"mobile_padding_right":{"type":"number"},"mobile_padding_right_unit":{"type":"string"},"margin_bottom":{"type":"number"},"margin_bottom_unit":{"type":"string"},"mobile_margin_bottom":{"type":"number"},"mobile_margin_bottom_unit":{"type":"string"},"padding_bottom":{"type":"number"},"padding_bottom_unit":{"type":"string"},"mobile_padding_bottom":{"type":"number"},"mobile_padding_bottom_unit":{"type":"string"},"margin_left":{"type":"number"},"margin_left_unit":{"type":"string"},"mobile_margin_left":{"type":"number"},"mobile_margin_left_unit":{"type":"string"},"padding_left":{"type":"number"},"padding_left_unit":{"type":"string"},"mobile_padding_left":{"type":"number"},"mobile_padding_left_unit":{"type":"string"}}},"button":{"type":"object","properties":{"margin_top":{"type":"number"},"margin_top_unit":{"type":"string"},"mobile_margin_top":{"type":"number"},"mobile_margin_top_unit":{"type":"string"},"padding_top":{"type":"number"},"padding_top_unit":{"type":"string"},"mobile_padding_top":{"type":"number"},"mobile_padding_top_unit":{"type":"string"},"margin_right":{"type":"number"},"margin_right_unit":{"type":"string"},"mobile_margin_right":{"type":"number"},"mobile_margin_right_unit":{"type":"string"},"padding_right":{"type":"number"},"padding_right_unit":{"type":"string"},"mobile_padding_right":{"type":"number"},"mobile_padding_right_unit":{"type":"string"},"margin_bottom":{"type":"number"},"margin_bottom_unit":{"type":"string"},"mobile_margin_bottom":{"type":"number"},"mobile_margin_bottom_unit":{"type":"string"},"padding_bottom":{"type":"number"},"padding_bottom_unit":{"type":"string"},"mobile_padding_bottom":{"type":"number"},"mobile_padding_bottom_unit":{"type":"string"},"margin_left":{"type":"number"},"margin_left_unit":{"type":"string"},"mobile_margin_left":{"type":"number"},"mobile_margin_left_unit":{"type":"string"},"padding_left":{"type":"number"},"padding_left_unit":{"type":"string"},"mobile_padding_left":{"type":"number"},"mobile_padding_left_unit":{"type":"string"}}},"menuicon":{"type":"object","properties":{"margin_top":{"type":"number"},"margin_top_unit":{"type":"string"},"mobile_margin_top":{"type":"number"},"mobile_margin_top_unit":{"type":"string"},"padding_top":{"type":"number"},"padding_top_unit":{"type":"string"},"mobile_padding_top":{"type":"number"},"mobile_padding_top_unit":{"type":"string"},"margin_right":{"type":"number"},"margin_right_unit":{"type":"string"},"mobile_margin_right":{"type":"number"},"mobile_margin_right_unit":{"type":"string"},"padding_right":{"type":"number"},"padding_right_unit":{"type":"string"},"mobile_padding_right":{"type":"number"},"mobile_padding_right_unit":{"type":"string"},"margin_bottom":{"type":"number"},"margin_bottom_unit":{"type":"string"},"mobile_margin_bottom":{"type":"number"},"mobile_margin_bottom_unit":{"type":"string"},"padding_bottom":{"type":"number"},"padding_bottom_unit":{"type":"string"},"mobile_padding_bottom":{"type":"number"},"mobile_padding_bottom_unit":{"type":"string"},"margin_left":{"type":"number"},"margin_left_unit":{"type":"string"},"mobile_margin_left":{"type":"number"},"mobile_margin_left_unit":{"type":"string"},"padding_left":{"type":"number"},"padding_left_unit":{"type":"string"},"mobile_padding_left":{"type":"number"},"mobile_padding_left_unit":{"type":"string"}}},"row1":{"type":"object","properties":{"margin_top":{"type":"number"},"margin_top_unit":{"type":"string"},"mobile_margin_top":{"type":"number"},"mobile_margin_top_unit":{"type":"string"},"padding_top":{"type":"number"},"padding_top_unit":{"type":"string"},"mobile_padding_top":{"type":"number"},"mobile_padding_top_unit":{"type":"string"},"margin_right":{"type":"number"},"margin_right_unit":{"type":"string"},"mobile_margin_right":{"type":"number"},"mobile_margin_right_unit":{"type":"string"},"padding_right":{"type":"number"},"padding_right_unit":{"type":"string"},"mobile_padding_right":{"type":"number"},"mobile_padding_right_unit":{"type":"string"},"margin_bottom":{"type":"number"},"margin_bottom_unit":{"type":"string"},"mobile_margin_bottom":{"type":"number"},"mobile_margin_bottom_unit":{"type":"string"},"padding_bottom":{"type":"number"},"padding_bottom_unit":{"type":"string"},"mobile_padding_bottom":{"type":"number"},"mobile_padding_bottom_unit":{"type":"string"},"margin_left":{"type":"number"},"margin_left_unit":{"type":"string"},"mobile_margin_left":{"type":"number"},"mobile_margin_left_unit":{"type":"string"},"padding_left":{"type":"number"},"padding_left_unit":{"type":"string"},"mobile_padding_left":{"type":"number"},"mobile_padding_left_unit":{"type":"string"}}},"row2":{"type":"object","properties":{"margin_top":{"type":"number"},"margin_top_unit":{"type":"string"},"mobile_margin_top":{"type":"number"},"mobile_margin_top_unit":{"type":"string"},"padding_top":{"type":"number"},"padding_top_unit":{"type":"string"},"mobile_padding_top":{"type":"number"},"mobile_padding_top_unit":{"type":"string"},"margin_right":{"type":"number"},"margin_right_unit":{"type":"string"},"mobile_margin_right":{"type":"number"},"mobile_margin_right_unit":{"type":"string"},"padding_right":{"type":"number"},"padding_right_unit":{"type":"string"},"mobile_padding_right":{"type":"number"},"mobile_padding_right_unit":{"type":"string"},"margin_bottom":{"type":"number"},"margin_bottom_unit":{"type":"string"},"mobile_margin_bottom":{"type":"number"},"mobile_margin_bottom_unit":{"type":"string"},"padding_bottom":{"type":"number"},"padding_bottom_unit":{"type":"string"},"mobile_padding_bottom":{"type":"number"},"mobile_padding_bottom_unit":{"type":"string"},"margin_left":{"type":"number"},"margin_left_unit":{"type":"string"},"mobile_margin_left":{"type":"number"},"mobile_margin_left_unit":{"type":"string"},"padding_left":{"type":"number"},"padding_left_unit":{"type":"string"},"mobile_padding_left":{"type":"number"},"mobile_padding_left_unit":{"type":"string"}}},"banner":{"type":"object","properties":{"margin_top":{"type":"number"},"margin_top_unit":{"type":"string"},"mobile_margin_top":{"type":"number"},"mobile_margin_top_unit":{"type":"string"},"padding_top":{"type":"number"},"padding_top_unit":{"type":"string"},"mobile_padding_top":{"type":"number"},"mobile_padding_top_unit":{"type":"string"},"margin_right":{"type":"number"},"margin_right_unit":{"type":"string"},"mobile_margin_right":{"type":"number"},"mobile_margin_right_unit":{"type":"string"},"padding_right":{"type":"number"},"padding_right_unit":{"type":"string"},"mobile_padding_right":{"type":"number"},"mobile_padding_right_unit":{"type":"string"},"margin_bottom":{"type":"number"},"margin_bottom_unit":{"type":"string"},"mobile_margin_bottom":{"type":"number"},"mobile_margin_bottom_unit":{"type":"string"},"padding_bottom":{"type":"number"},"padding_bottom_unit":{"type":"string"},"mobile_padding_bottom":{"type":"number"},"mobile_padding_bottom_unit":{"type":"string"},"margin_left":{"type":"number"},"margin_left_unit":{"type":"string"},"mobile_margin_left":{"type":"number"},"mobile_margin_left_unit":{"type":"string"},"padding_left":{"type":"number"},"padding_left_unit":{"type":"string"},"mobile_padding_left":{"type":"number"},"mobile_padding_left_unit":{"type":"string"}}}}},"nav_links_spacing":{"type":"string"},"searchInputColor":{"type":"string"},"searchInputBackground":{"type":"string"},"searchInputPosition":{"type":"string"},"searchExpanded":{"type":"boolean"},"showCartTotal":{"type":"boolean"},"cartTotalPosition":{"type":"string"},"cartTotalGap":{"type":"number"},"sidemenuBackground":{"type":"string"},"sidemenuText":{"type":"string"},"sidemenuPanelBackground":{"type":"string"},"sidemenuPanelText":{"type":"string"},"sidemenuFontSize":{"type":"number"},"sidemenuFontWeight":{"type":"string"},"sidemenuRowGap":{"type":"number"},"sidemenuIconGap":{"type":"number"},"sidemenuGroupGap":{"type":"number"},"sidemenuGroupFontFamily":{"type":"string"},"sidemenuGroupFontSize":{"type":"number"},"sidemenuGroupTextTransform":{"type":"string"},"sidemenuGroupColor":{"type":"string"},"sidemenuGroupFontWeight":{"type":"string"},"dropdownRadius":{"type":"number"},"dropdownFontFamily":{"type":"string"},"dropdownFontSize":{"type":"number"},"dropdownItemGap":{"type":"number"},"dropdownPaddingX":{"type":"number"},"dropdownPaddingY":{"type":"number"},"searchInputMaxWidth":{"type":"number"},"searchInputBorderRadius":{"type":"string"},"bar_menus":{"type":"string"}}},"partners":{"type":"object","properties":{"gridStyle":{"type":"string"},"align":{"type":"string"},"name":{"type":"string"},"image":{"type":"string"},"description":{"type":"string"},"title":{"type":"string"},"showSearch":{"type":"boolean"},"showCategories":{"type":"boolean"},"showMap":{"type":"boolean"},"perPage":{"type":"number"},"sort":{"type":"string"}}},"contacts":{"type":"object","properties":{"map":{"type":"boolean"},"partners":{"type":"boolean"}}},"price_plan":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"plan_features_style":{"type":"string"},"rating":{"type":"boolean"},"ratingList":{"type":"boolean"},"image":{"type":"boolean"},"about_page":{"type":"string"},"header":{"type":"string"}}},"backgroundGradient":{"type":"object","properties":{"enabled":{"type":"boolean"},"degrees":{"type":"number"},"colors":{"type":"string"},"css":{"type":"string"}}},"programs":{"type":"object","properties":{"rating":{"type":"boolean"},"titleColor":{"type":"string"},"descriptionColor":{"type":"string"},"borderRadius":{"type":"string"},"titleFontSize":{"type":"string"},"descriptionFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"descriptionFontWeight":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"cardBackgroundColor":{"type":"string"},"imageAspectRatio":{"type":"string"},"customCss":{"type":"string"},"sort":{"type":"number"},"showBreadCrumbs":{"type":"boolean"},"filtersBackgroundColor":{"type":"string"},"filtersTextColor":{"type":"string"},"filtersBorderRadius":{"type":"string"},"boxShadowColor":{"type":"string"},"boxShadowOffsetX":{"type":"number"},"boxShadowOffsetY":{"type":"number"},"boxShadowBlurRadius":{"type":"string"},"boxShadowSpreadRadius":{"type":"string"},"imagePadding":{"type":"number"},"categories":{"type":"object","properties":{"layout":{"type":"string"},"showHeading":{"type":"boolean"},"showSubtitle":{"type":"boolean"},"showImage":{"type":"boolean"},"imageSize":{"type":"string"},"imageRadius":{"type":"string"},"imageAspectRatio":{"type":"string"},"imageFit":{"type":"string"},"imagePadding":{"type":"number"},"fallback":{"type":"string"},"showChevron":{"type":"boolean"},"titleColor":{"type":"string"},"titleFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"cardBackgroundColor":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"customCss":{"type":"string"},"site":{"type":"object","properties":{"showImage":{"type":"boolean"},"imageSize":{"type":"string"},"imageAspectRatio":{"type":"string"},"titleColor":{"type":"string"},"titleFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"cardBackgroundColor":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"cardPadding":{"type":"string"},"gap":{"type":"string"},"align":{"type":"string"},"titleTransform":{"type":"string"}}}}},"showViews":{"type":"boolean"},"viewsColor":{"type":"string"}}},"tabs":{"type":"object","properties":{"allow_custom_tabs_color":{"type":"boolean"},"background":{"type":"string"},"background_checked":{"type":"string"},"color":{"type":"string"},"color_checked":{"type":"string"},"indicator_color":{"type":"string"},"hide_text":{"type":"boolean"},"hide_home":{"type":"boolean"},"button_spacing_vertical":{"type":"number"},"button_spacing_horizontal":{"type":"number"},"button_border_radius":{"type":"number"},"navigations":{"type":"object","properties":{"home":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"explore":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"bites":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"videos":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"groups":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"vouchers":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"store":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"programs":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"services":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"blogposts":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"subscriptions":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"events":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"playlists":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"user":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"partners":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"contacts":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"tracker":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"mini_apps":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"more":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"claims":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"professional_pages":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}},"bookings":{"type":"object","properties":{"icon":{"type":"string"},"img":{"type":"string"}}}}}}},"products_partial":{"type":"object","properties":{"showCart":{"type":"boolean"},"swiper":{"type":"object","properties":{"enabled":{"type":"boolean"},"loop":{"type":"boolean"},"showControls":{"type":"boolean"}}},"brand":{"type":"boolean"}}},"groups":{"type":"object","properties":{"participants":{"type":"boolean"},"description":{"type":"boolean"}}},"service_categories":{"type":"object","properties":{"gridStyle":{"type":"string"},"titleFontSize":{"type":"string"},"titleFontWeight":{"type":"string"},"cardBorderRadius":{"type":"string"},"cardBorderWidth":{"type":"string"},"cardBorderColor":{"type":"string"},"cardBackgroundColor":{"type":"string"},"imageAspectRatio":{"type":"string"},"customCss":{"type":"string"},"cardPadding":{"type":"number"}}}}},"Ticket":{"type":"object","properties":{"event":{"type":"string","description":"Event.id. Id of a Event."},"date":{"type":"number","description":"Index of the event date."},"section":{"type":"number","description":"Index of the section."},"subsection":{"type":"number","description":"Index of the subsection."},"row":{"type":"number","description":"Index of the row."},"seat":{"type":"number","description":"Index of the seat."},"row_index_formated":{"type":"number","description":"Row number as shown to the buyer."},"seat_index_formated":{"type":"number","description":"Seat number as shown to the buyer."},"lead_id":{"type":"string","description":"Lead.id. Id of a Lead."},"socket_id":{"type":"string","description":"The buyer's live connection, while the seat is held."},"status":{"type":"string","enum":["frozen","waiting-for-payment","paid","frozen-by-admin","bought-by-admin"],"default":"frozen","description":"One of: frozen, waiting-for-payment, paid, frozen-by-admin, bought-by-admin."},"expiration_time":{"type":"string","format":"date-time","description":"When a held seat is released if not paid."},"qr_code":{"type":"string","description":"QrCode.id. Id of a QrCode."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"tier":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}}}},"Tracker":{"type":"object","properties":{"title":{"type":"string","description":"Name of the tracker."},"unit":{"type":"string","description":"Unit the progress is measured in (kg, km, pages)."},"score_direction":{"type":"string","enum":["up","down"],"default":"down","description":"One of: up, down."},"additional_fields":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"type":{"type":"string"},"options":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"value":{"type":"string"},"_id":{"type":"string"}}}},"_id":{"type":"string"}}},"description":"Extra fields users fill in with each entry."},"body":{"type":"string","description":"Explanation shown to users."},"video":{"type":"string","description":"Video.id. Id of a Video."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"goal_definition":{"type":"object","properties":{"label":{"type":"string"},"type":{"type":"string"},"options":{"type":"string"}}}}},"TrackerProgress":{"type":"object","properties":{"score":{"type":"string","description":"The value entered."},"user_id":{"type":"string","description":"User.id. Id of a User."},"media":{"type":"string","description":"Picture added to the entry."},"additional_fields":{"type":"object","description":"Values of the tracker's extra fields."},"goal":{"type":"object","description":"The goal the entry counts towards."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Tracking":{"type":"object","properties":{"title":{"type":"string","description":"Name of the script (\"Google Tag Manager\")."},"script":{"type":"string","description":"The script added to the site."},"prefix":{"type":"string","description":"Id or prefix the script uses."},"place_in_body":{"type":"boolean","default":false,"description":"Added to the page body instead of the head."},"external_tracker_id":{"type":"string","description":"E.g. pixel id."},"external_tracker_integration":{"type":"string","description":"E.g. Meta Conversion API."},"event_map":{"type":"object","description":"Maps our canonical event names onto platform-specific identifiers. Only needed by platforms that will not accept a free-form event name: LI -> { \"Purchase\": \"12345678\" } (LinkedIn Campaign Manager conversion ids) CG -> { \"SecondaryCTA\": \"custom\" } (overrides for the built-in ChatGPT map)."},"_id":{"type":"string"}}},"Traffic":{"type":"object","properties":{"session_id":{"type":"string","description":"The visitor's session."},"page_views":{"type":"number","description":"Pages viewed in the session."},"site_session":{"type":"number","default":0,"description":"Website sessions."},"app_session":{"type":"number","default":0,"description":"App sessions."},"last_url":{"type":"string","description":"Last page viewed."},"path":{"type":"array","items":{"type":"string"},"description":"Pages viewed, in order."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Unsubscribed":{"type":"object","properties":{"email":{"type":"string","description":"Email that opted out of emails."},"_id":{"type":"string"}}},"User":{"type":"object","properties":{"name":{"type":"string","description":"Display name."},"email":{"type":"string","description":"Email, used to sign in."},"avatar":{"type":"string","description":"Media.id of the profile picture."},"social_avatar":{"type":"string","description":"Profile picture from a social sign-in."},"isAdmin":{"type":"boolean","default":false,"description":"Can use the admin."},"isStaff":{"type":"boolean","default":false,"description":"A staff member who can be booked."},"owner_id":{"type":"string","description":"User.id of the admin who added this user."},"organization_name":{"type":"string","description":"Company name."},"firstname":{"type":"string","description":"First name."},"lastname":{"type":"string","description":"Last name."},"phone_number":{"type":"string","description":"Phone number."},"address":{"type":"string","description":"Address."},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"State or region."},"country":{"type":"string","description":"Country."},"zip_code":{"type":"string","description":"Postal code."},"tax_identification_number":{"type":"string","description":"Tax number."},"notes":{"type":"string","description":"Notes kept on the user."},"isConfirmed":{"type":"boolean","default":false,"description":"The email was confirmed."},"number_of_sales":{"type":"number","default":0,"description":"How many sales the user made (marketplace)."},"stripe_id":{"type":"string","description":"The user's id in Stripe."},"paypal_id":{"type":"string","description":"The user's PayPal id."},"access_level":{"type":"number","description":"Admin permission level; 0 is full access."},"validation_code":{"type":"string","description":"Code sent to confirm the email."},"price_plans":{"type":"array","items":{"type":"string"},"description":"PricePlan ids. Id of a PricePlan."},"emotion":{"type":"string","description":"Positive, neutral, negative."},"political_spectrum":{"type":"string","description":"Far left, left, far right, right, middle."},"language":{"type":"object","description":"Multiple objects inside - key: value - example - \"EN\": 5 (5 being the weight);."},"interests":{"type":"object","description":"Multiple objects inside - key: value - example - \"hobby\": 5 (5 being the weight);."},"app_category":{"type":"object","description":"Multiple objects inside - key: value - example - \"hobby\": 5 (5 being the weight);."},"user_profile":{"type":"object","description":"Multiple objects inside - key: value - example - \"intelligent\": 5 (5 being the weight);."},"user_economics":{"type":"string","description":"Low, middle, high."},"user_education":{"type":"string","description":"Low, middle, high."},"marital_status":{"type":"string","description":"Single, married."},"age":{"type":"string","description":"0-18, 18-25, 25-30, 30-35, 35-45, 45-60."},"sex":{"type":"string","description":"Male - female."},"attractiveness":{"type":"string","description":"Low, medium, high."},"following":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"followers":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"handle":{"type":"string","description":"Unique @handle."},"saved_posts":{"type":"array","items":{"type":"string"},"description":"Post ids. Id of a Post."},"blocked_users":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"blocked_by":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"bio":{"type":"string","description":"About the user."},"wallet":{"type":"number","default":0,"description":"Balance in the user's wallet."},"location":{"type":"object","properties":{"type":{"type":"string","enum":["Point"]},"coordinates":{"type":"array","items":{"type":"number"}},"_id":{"type":"string"}},"description":"The user's chosen location."},"checkout_recovery_at":{"type":"string","format":"date-time","description":"When we last emailed them about a Premium checkout they left (utils/checkout-recovery)."},"search_history":{"type":"array","items":{"type":"string"},"description":"What the user searched for."},"isRestricted":{"type":"boolean","default":false,"description":"Restricted by a moderator."},"isMonetized":{"type":"boolean","default":false,"description":"Earns from their content."},"sentFollowersEmail":{"type":"string","format":"date-time","description":"When the followers summary email was last sent."},"isShadowbanned":{"type":"boolean","default":false,"description":"Their content is hidden from others without telling them."},"custom_url":{"type":"array","items":{"type":"object","properties":{"heading":{"type":"string"},"url":{"type":"string"},"_id":{"type":"string"}}},"description":"Custom addresses for their profile."},"isWhitelisted":{"type":"boolean","default":false,"description":"Skips moderation."},"isReviewedWhitelist":{"type":"boolean","default":false,"description":"The whitelist request was reviewed."},"advertiser_id":{"type":"string","description":"Id as an advertiser."},"selected_events":{"type":"array","items":{"type":"string"},"description":"Events the user follows."},"profile_feed_style":{"type":"string","default":"list","description":"How their profile feed looks (grid, list)."},"hidden_users":{"type":"array","items":{"type":"string"},"description":"User ids whose posts are hidden from this user's feed. Id of a User."},"isVerified":{"type":"boolean","default":false,"description":"Shows the verified badge."},"saved_products":{"type":"array","items":{"type":"string"},"description":"Product ids the user saved. Id of a Product."},"saved_programs":{"type":"array","items":{"type":"string"},"description":"Program ids the user saved. Id of a Program."},"saved_blogposts":{"type":"array","items":{"type":"string"},"description":"BlogPost ids the user saved. Id of a Blogpots."},"saved_services":{"type":"array","items":{"type":"string"},"description":"Service ids the user saved. Id of a Service."},"last_used_miniapps":{"type":"array","items":{"type":"string"},"description":"MiniApp ids. Id of a MiniApp."},"has_disabled_seen":{"type":"boolean","default":false,"description":"Read receipts are off."},"other_address":{"type":"array","items":{"type":"object","properties":{"firstname":{"type":"string"},"lastname":{"type":"string"},"email":{"type":"string"},"phone_number":{"type":"string"},"address":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"zip_code":{"type":"string"},"_id":{"type":"string"}}},"description":"Other saved addresses."},"is_disabled":{"type":"boolean","default":false,"description":"The account is disabled."},"delete_date":{"type":"string","format":"date-time","description":"When the account will be deleted."},"trial_price_plans":{"type":"array","items":{"type":"object","properties":{"end_date":{"type":"string","format":"date-time"},"start_date":{"type":"string","format":"date-time"},"price_plan":{"type":"string","description":"Id of a PricePlan."},"_id":{"type":"string"}}},"description":"Price plans the user is trying, and until when."},"lastActivity":{"type":"string","format":"date-time","description":"When the user was last active."},"attached_dynamic_models":{"type":"array","items":{"type":"object","properties":{"model":{"type":"string","description":"Id of a DynamicModel."},"document":{"type":"string"},"_id":{"type":"string"}}},"description":"Records of custom models attached to the user."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"can_edit":{"type":"object","properties":{"site":{"type":"boolean"},"crm":{"type":"boolean"},"store":{"type":"boolean"},"payments":{"type":"boolean"},"staff":{"type":"boolean"}}},"ip_location":{"type":"object","properties":{"city":{"type":"string"},"continent_name":{"type":"string"},"country_name":{"type":"string"},"country_subdivision":{"type":"string"},"location_latitude":{"type":"number"},"location_longitude":{"type":"number"},"last_updated":{"type":"string"},"ip_address":{"type":"string"},"zip_code":{"type":"string"},"dialing_code":{"type":"string"}}},"monetization_request":{"type":"object","properties":{"isRequested":{"type":"boolean"},"requested_on":{"type":"string"}}}}},"UserEngagementNotification":{"type":"object","properties":{"type":{"type":"string","description":"Liked_post, commented, liked_comment, replied_to, mentioned, sent_message, search, followed, profile_visit, system, group_request_received, group_request_accepted, activity_boost."},"title":{"type":"string","description":"The notification's heading."},"body":{"type":"string","description":"The notification's text."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"from":{"type":"string","description":"User.id. Id of a User."},"post":{"type":"string","description":"Post.id. Id of a Post."},"group":{"type":"string","description":"Group.id. Id of a Group."},"sendToAll":{"type":"boolean","default":false,"description":"Goes to every user."},"comment":{"type":"string","description":"Comment.id. Id of a Comment."},"is_received":{"type":"boolean","default":false,"description":"Delivered to the user."},"is_seen":{"type":"boolean","default":false,"description":"The user saw it."},"url":{"type":"string","description":"Where tapping it leads."},"image":{"type":"string","description":"Picture shown with it."},"service":{"type":"string","description":"Service.id. Id of a Service."},"product":{"type":"string","description":"Product.id. Id of a Product."},"blogpost":{"type":"string","description":"BlogPost.id. Id of a BlogPost."},"program":{"type":"string","description":"Program.id. Id of a Program."},"booking":{"type":"string","description":"Booking.id. Id of a Booking."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"UserInvoice":{"type":"object","properties":{"stripeNumber":{"type":"string","description":"Invoice number we get from Stripe (foreign key)."},"is_credit_note":{"type":"boolean","default":false,"description":"This document is a credit note for an earlier invoice."},"credit_note_invoice_number":{"type":"string","description":"Number of the invoice the credit note corrects."},"credit_note_invoice_date":{"type":"string","description":"Date of that invoice."},"is_debit_note":{"type":"boolean","default":false,"description":"This document is a debit note for an earlier invoice."},"debit_note_invoice_number":{"type":"string","description":"Number of the invoice the debit note adds to."},"debit_note_invoice_date":{"type":"string","description":"Date of that invoice."},"number":{"type":"number","description":"Our invoice number."},"stripeInvoiceId":{"type":"string","description":"Id of invoice stripe gives us."},"has_price_quote":{"type":"boolean","default":false,"description":"Flag which shows if we created invoice from price quote."},"customer_name":{"type":"string","description":"Name of customer."},"customer_address":{"type":"string","description":"Address of customer."},"customer_postal_code":{"type":"string","description":"Postal code of customer."},"customer_city":{"type":"string","description":"City of customer."},"customer_country":{"type":"string","description":"Country of customer."},"customer_phone":{"type":"string","description":"Phone of customer."},"customer_email":{"type":"string","description":"Email of customer."},"customer_tax_id":{"type":"string","description":"Tax id of customer."},"customer_vat_id":{"type":"string","description":"Customer's VAT number."},"customer_responsible_official":{"type":"string","description":"Person responsible on the customer's side."},"customer_organization_name":{"type":"string","description":"Customer's company name."},"billing_customer_address":{"type":"string","description":"Address of billed customer."},"billing_customer_postal_code":{"type":"string","description":"Postal code billed of customer."},"billing_customer_city":{"type":"string","description":"City of billed customer."},"billing_customer_country":{"type":"string","description":"Country of billed customer."},"billing_customer_phone":{"type":"string","description":"Phone of billed customer."},"subtotal":{"type":"number","description":"Invoice subtotal."},"amount":{"type":"number","description":"Invoice amount."},"day_of_issue":{"type":"string","description":"Day of issue of invoice."},"foreign":{"type":"boolean","description":"Flag which shows if invoice is from foreign to company country."},"home_tax":{"type":"number","default":0,"description":"Home country tax amount."},"foreign_tax":{"type":"number","default":0,"description":"Foreign country tax amount."},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"qty":{"type":"number"},"unit_price":{"type":"number"},"discount":{"type":"number"},"amount":{"type":"number"},"_id":{"type":"string"}}},"description":"Array of sold products which contains their name, cost, quantity and discount."},"grounds_for_transaction":{"type":"string","description":"Legal grounds for the transaction."},"description_of_transaction":{"type":"string","description":"What it is for."},"place_of_transaction":{"type":"string","description":"Where it took place."},"payment":{"type":"string","description":"How it is paid."},"dateDue":{"type":"string","description":"Date it must be paid by."},"owner_id":{"type":"string","description":"User.id of the user who issued it."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"UserLockedHours":{"type":"object","properties":{"user":{"type":"string","description":"User.id of the staff member."},"locked_ranges":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"_id":{"type":"string"}}},"description":"Date and time ranges the staff member cannot be booked."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"UserPaymentSettings":{"type":"object","properties":{"has_card":{"type":"boolean","default":false,"description":"Card payment is offered."},"card_locale":{"type":"string","default":"Pay with credit card","description":"Label of the card option."},"email":{"type":"string","description":"Email for payments."},"country":{"type":"string","description":"Country for payments."},"agreedToTerms":{"type":"boolean","default":false,"description":"The user accepted the payment terms."},"agreedToTermsAt":{"type":"string","description":"When they accepted them."},"merchant_id":{"type":"string","description":"Merchant id at the card processor."},"has_paypal":{"type":"boolean","default":false,"description":"PayPal is offered."},"paypal_increase":{"type":"number","default":0,"description":"Extra charged for PayPal."},"paypal_id":{"type":"string","description":"PayPal id."},"owner_id":{"type":"string","description":"User.id the settings belong to."},"number":{"type":"number","description":"Next invoice number."},"price_quote_number":{"type":"string","description":"Next quote number."},"bic":{"type":"string","description":"BIC printed on invoices."},"swift":{"type":"string","description":"SWIFT printed on invoices."},"tax_id":{"type":"string","description":"Tax number."},"vat_id":{"type":"string","description":"VAT number."},"logo":{"type":"string","description":"Logo printed on invoices."},"business_name":{"type":"string","description":"Business name on invoices."},"business_name_translated":{"type":"string","description":"Business name in the second language."},"responsible_official":{"type":"string","description":"Responsible person on invoices."},"responsible_official_translated":{"type":"string","description":"The same in the second language."},"business_email":{"type":"string","description":"Business email on invoices."},"company_id":{"type":"string","description":"Company registration number."},"business_address":{"type":"string","description":"Business address on invoices."},"business_address_translated":{"type":"string","description":"The same in the second language."},"business_phone_number":{"type":"string","description":"Business phone on invoices."},"business_country":{"type":"string","description":"Business country on invoices."},"business_country_translated":{"type":"string","description":"The same in the second language."},"footer":{"type":"string","description":"Footer text of invoices."},"footer_translated":{"type":"string","description":"The same in the second language."},"foreign_tax":{"type":"number","default":0,"description":"Tax rate for customers abroad, in percent."},"home_tax":{"type":"number","default":0,"description":"Tax rate for home customers, in percent."},"_id":{"type":"string"}}},"UserReport":{"type":"object","properties":{"user":{"type":"string","description":"User.id. Id of a User."},"post":{"type":"string","description":"Post.id. Id of a Post."},"reason":{"type":"string","description":"Spam, scam, illegal-activity, sexually-explicit, violence, impersonation, not-like."},"reported_user":{"type":"string","description":"User.id. Id of a User."},"comment":{"type":"string","description":"Comment.id. Id of a Comment."},"reply":{"type":"string","description":"The moderator's answer."},"seen":{"type":"boolean","default":false,"description":"A moderator has seen it."},"miniApp":{"type":"string","description":"MiniApp.id. Id of a MiniApp."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Venue":{"type":"object","properties":{"name":{"type":"string","description":"Name of the venue."},"origin_address":{"type":"string","description":"OriginAddress.id. Id of a OriginAddress."},"address":{"type":"string","description":"The venue's address."},"medias":{"type":"array","items":{"type":"object","properties":{"media":{"type":"string","description":"Id of a Media."},"gcs_url":{"type":"string"},"gcs_480_30_url":{"type":"string"},"gcs_720_30_url":{"type":"string"},"gcs_1080_30_url":{"type":"string"},"duration":{"type":"number"},"vimeo_uri":{"type":"string"},"vimeo_picture":{"type":"string"},"vimeo_url":{"type":"string"},"youtube_url":{"type":"string"},"youtube_picture":{"type":"string"},"thumbnail":{"type":"string"},"_id":{"type":"string"}}},"description":"Pictures of the venue."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Video":{"type":"object","properties":{"name":{"type":"string","description":"The video's title."},"link":{"type":"string","description":"Link to the video."},"collection_id":{"type":"string","description":"Collection.id. Id of a Collection."},"media_id":{"type":"string","description":"Media.id. Id of a Media."},"selected":{"type":"boolean","default":false,"description":"Featured: the home page's highlighted videos block shows these first."},"custom_1":{"type":"string","description":"Custom defined field 1."},"custom_2":{"type":"string","description":"Custom defined field 2."},"custom_3":{"type":"string","description":"Custom defined field 3."},"suitability_price_plans":{"type":"array","items":{"type":"string"},"description":"PricePlan ids. Id of a PricePlan."},"isSuitable":{"type":"boolean","description":"Set per request, not stored: whether the signed-in user's price plans match the video's suitability plans."},"views":{"type":"array","items":{"type":"string"},"description":"User ids. Id of a User."},"total_views":{"type":"number","default":0,"description":"How many times it was opened."},"times_showed":{"type":"number","default":0,"description":"How many times it was shown in a list."},"owner_id":{"type":"string","description":"User.id. Id of a User."},"requiresLogin":{"type":"boolean","default":false,"description":"Only signed-in users can watch it."},"requiresSubscription":{"type":"boolean","default":false,"description":"Only subscribers of price_plan_ids can watch it."},"price_plan_ids":{"type":"array","items":{"type":"string"},"description":"Price plans whose subscribers can watch it."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"VideoInteraction":{"type":"object","properties":{"start":{"type":"number","description":"Second the viewer started watching from."},"end":{"type":"number","description":"Second they stopped at."},"watch_time":{"type":"number","description":"Seconds watched."},"video_viewer":{"type":"string","description":"User.id. Id of a User."},"video_id":{"type":"string","description":"Post.id. Id of a Post."},"video_owner":{"type":"string","description":"User.id. Id of a User."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Voucher":{"type":"object","properties":{"title":{"type":"string","description":"Title of voucher."},"body":{"type":"string","description":"Body of voucher."},"media":{"type":"string","description":"Attached media object with id."},"show_to":{"type":"string","default":"0","description":"Attached media object with id."},"coupon":{"type":"string","description":"Attached Coupon id. Id of a Coupon."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Wildcard":{"type":"object","properties":{"url":{"type":"string","description":"Custom url of wildcard."},"points_to":{"type":"string","description":"Url to override."},"_id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}}},"paths":{"/about-pages":{"get":{"operationId":"get-about-pages","tags":["Pages"],"x-section":"About Page","summary":"List all pages","description":"Every page's title, url and settings (no content); ?no_cache skips the cache. Answers an array of every record.","x-access":[],"x-models":["AboutPage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-about-pages","tags":["Pages"],"x-section":"About Page","summary":"Create a page","description":"Creates a page, with its meta tags; a homepage replaces the home page's blocks. Answers 201 with { _id, url } only, not the whole page. addToIndex: true also shows the new page on the home page, as its last block (for a page that already exists, use POST /index-components/append). A homepage takes the home page's place: its blocks are replaced by this page.","x-access":["admin"],"x-models":["SiteMenu","IndexComponent","MyContact","AboutPage"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"The page's title, shown in the browser tab and in the admin."},"containers":{"description":"The page's content: sections, each with columns of components."},"createNavlink":{"type":"string","description":"The page's create navlink."},"addToIndex":{"type":"string","description":"The page's add to index."},"apply_startup_prompt":{"type":"string","description":"The page's apply startup prompt."}}}}}}}},"/about-pages-by-id/{id}":{"get":{"operationId":"get-about-pages-by-id-id","tags":["Pages"],"x-section":"About Page","summary":"Retrieve a page","description":"A page by its id: the rendered page, or JSON with ?ionic. 404 when there is no such page; a page with redirectUrl answers 301 to it.","x-access":["user-priv","optional-user"],"x-models":["AboutPage"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the page."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"301":{"description":"The address changed; follow the Location header."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/about-pages/{id}":{"patch":{"operationId":"patch-about-pages-id","tags":["Pages"],"x-section":"About Page","summary":"Update a page","description":"Updates a page. Fields outside the allowed list are ignored. Writes the live page directly; the editor saves through POST /about-pages/:id/draft instead. Answers the page, or 404.","x-access":["admin"],"x-models":["AboutPage"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the page."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"containers":{"description":"The page's content: sections, each with columns of components."}}}}}}},"delete":{"operationId":"delete-about-pages-id","tags":["Pages"],"x-section":"About Page","summary":"Delete a page","description":"Deletes a page. Clears every cached copy of the site's pages, since menus and links may have pointed to it. Answers the deleted page.","x-access":["admin"],"x-models":["AboutPage","Product","Service","BlogPost","SiteMenu","Meta"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the page."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/about-pages/{id}/draft":{"post":{"operationId":"post-about-pages-id-draft","tags":["Pages"],"x-section":"About Page","summary":"Create a page","description":"The editor's save: content goes to the draft, access settings to the live page. Answers the page's versioning state (draft, live and rollout).","x-access":["admin"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the page."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}}},"delete":{"operationId":"delete-about-pages-id-draft","tags":["Pages"],"x-section":"About Page","summary":"Delete a page","description":"Throw the draft away. Answers the page's versioning state.","x-access":["admin"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the page."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/about-pages/{id}/preview-token":{"post":{"operationId":"post-about-pages-id-preview-token","tags":["Pages"],"x-section":"About Page","summary":"Create a page","description":"A short-lived link query that shows one version on the public page. Answers { token, query }: add query to the page's address to see that version. 404 when there is no such version.","x-access":["admin"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the page."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"version_id":{"type":"string","description":"The page's version id."}}}}}}}},"/about-pages/{id}/publish":{"post":{"operationId":"post-about-pages-id-publish","tags":["Pages"],"x-section":"About Page","summary":"Publish the page","description":"Make the draft the live page. Answers { version_id, versioning }. The old live version is kept as archived.","x-access":["admin"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the page."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/about-pages/{id}/revert":{"post":{"operationId":"post-about-pages-id-revert","tags":["Pages"],"x-section":"About Page","summary":"Revert the page","description":"Publish a copy of an earlier version. The copy becomes a new version; the history is not rewritten. Answers { version_id, versioning }.","x-access":["admin"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the page."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"version_id":{"type":"string","description":"The page's version id."}}}}}}}},"/about-pages/{id}/rollout":{"post":{"operationId":"post-about-pages-id-rollout","tags":["Pages"],"x-section":"About Page","summary":"Create a page","description":"Show a version (the draft or an older one) to a share of the visitors, or. change the share. Ends a rollout of any other version of the page.","x-access":["admin"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the page."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"version_id":{"type":"string","description":"The page's version id."},"percent":{"type":"string","description":"The page's percent."}}}}}}},"delete":{"operationId":"delete-about-pages-id-rollout","tags":["Pages"],"x-section":"About Page","summary":"Delete a page","description":"Stop the rollout: everyone sees the live page again; the version stays. Answers the page's versioning state.","x-access":["admin"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the page."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/about-pages/{id}/versions":{"get":{"operationId":"get-about-pages-id-versions","tags":["Pages"],"x-section":"About Page","summary":"Retrieve a page","description":"The page's versions, newest first, without their content. For the version history panel.","x-access":["admin"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the page."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/about-pages/{id}/versions/{versionId}":{"patch":{"operationId":"patch-about-pages-id-versions-versionid","tags":["Pages"],"x-section":"About Page","summary":"Update a page","description":"Name a version; named versions are never pruned. Answers { _id, label }.","x-access":["admin"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the page."},{"name":"versionId","in":"path","required":true,"schema":{"type":"string"},"description":"The page's version id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string","description":"The page's label."}}}}}}}},"/about-pages/{url}":{"get":{"operationId":"get-about-pages-url","tags":["Pages"],"x-section":"About Page","summary":"Retrieve a page","description":"A page by its url: the rendered page, or JSON with ?ionic; serves a rollout version to its share of visitors and a version preview to the admin. Sends a page that asks for sign-in or a plan to visitors who lack it. Cached for an hour, apart from version previews.","x-access":["page-priv","optional-user"],"x-models":["AboutPage"],"parameters":[{"name":"url","in":"path","required":true,"schema":{"type":"string"},"description":"The page's URL slug, as in its address on the site."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"301":{"description":"The address changed; follow the Location header."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/about-section-imports":{"get":{"operationId":"get-about-section-imports","tags":["Pages"],"x-section":"About Page Import","summary":"List all section imports","description":"Imported page files. Answers an array of every record.","x-access":[],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-about-section-imports","tags":["Pages"],"x-section":"About Page Import","summary":"Create a section import","description":"Uploads an imported page file with up to 5 pictures (medias). Multipart upload. Answers 201 with no body.","x-access":["admin"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string","description":"The section import's body."}}}}}}}},"/about-section-imports/{id}":{"get":{"operationId":"get-about-section-imports-id","tags":["Pages"],"x-section":"About Page Import","summary":"Retrieve a section import","description":"One imported page file. 404 when there is no such record.","x-access":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the section import."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/custom_pages":{"get":{"operationId":"get-custom-pages","tags":["Pages"],"x-section":"Custom Page","summary":"List all custom pages","description":"The custom code pages. Answers an array of every record.","x-access":[],"x-models":["CustomPage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/custom_pages/{id}":{"get":{"operationId":"get-custom-pages-id","tags":["Pages"],"x-section":"Custom Page","summary":"Retrieve a custom page","description":"One custom code page. 404 when there is no such record.","x-access":[],"x-models":["CustomPage"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the custom page."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-custom-pages-id","tags":["Pages"],"x-section":"Custom Page","summary":"Update a custom page","description":"Updates a custom code page. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["CustomPage"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the custom page."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomPage"}}}}},"delete":{"operationId":"delete-custom-pages-id","tags":["Pages"],"x-section":"Custom Page","summary":"Delete a custom page","description":"Deletes a custom code page. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["CustomPage"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the custom page."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/publish":{"get":{"operationId":"get-publish","tags":["Pages"],"x-section":"Publish","summary":"Retrieve the publish","description":"Get publish settings. Reads no token: the app reads it at start.","x-access":[],"x-models":["Publish"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-publish","tags":["Pages"],"x-section":"Publish","summary":"Create a publish","description":"Set new publish settings. A site has one; update it with PATCH instead. Answers 201.","x-access":["admin"],"x-models":["Publish"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Publish"}}}}}},"/publish/{id}":{"get":{"operationId":"get-publish-id","tags":["Pages"],"x-section":"Publish","summary":"Retrieve a publish","description":"The publishing settings (web, iOS, Android, install prompt). 404 when there is no such record.","deprecated":true,"x-access":[],"x-models":["Publish"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the publish."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-publish-id","tags":["Pages"],"x-section":"Publish","summary":"Update a publish","description":"Updates a publishing settings record. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["Publish"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the publish."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Publish"}}}}}},"/add-section":{"post":{"operationId":"post-add-section","tags":["Pages"],"x-section":"AI builder","summary":"Add an add section","description":"AI: adds a section to a page where the owner asked, from the section catalogue or a prompt. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the add section, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"item_data":{"type":"string","description":"The current add section, as JSON - the AI changes it and returns the result."},"current_page_url":{"type":"string","description":"The add section's current page url."},"section_blueprint":{"type":"string","description":"The add section's section blueprint."},"section_style_blueprint":{"type":"string","description":"The add section's section style blueprint."},"explicit_target":{"type":"string","description":"The add section's explicit target."},"parsed_intent":{"type":"string","description":"The add section's parsed intent."}}}}}}}},"/commit-about-page-preview":{"post":{"operationId":"post-commit-about-page-preview","tags":["Pages"],"x-section":"AI builder","summary":"Create a commit page","description":"AI: keeps a previewed page change, charges its credits and marks the preview applied. Charges the preview's pending credit cost and clears it; other pending previews of the same redesign are marked superseded. 404 when the preview message is gone.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"messageId":{"type":"string","description":"The commit page's message id."}}}}}}}},"/confirm-ai-action":{"post":{"operationId":"post-confirm-ai-action","tags":["Pages"],"x-section":"AI builder","summary":"Confirm an AI action","description":"AI: the owner accepted or declined a proposed action in the chat (a plan, a replacement); runs or drops it. Send messageId and confirmed; skip_steps lists the plan steps the owner unticked. confirmed false answers { cancelled: true } and drops the pending plan. Otherwise 400 when every step is unticked, 403 \"Insufficient credits\", 409 when the plan is gone. Pressing twice runs it once.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"409":{"description":"It clashes with the current state: the item is already being processed, a version is already applied, or an AI plan or preview is no longer available."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"messageId":{"type":"string","description":"The AI action's message id."},"confirmed":{"type":"string","description":"The AI action's confirmed."},"skip_steps":{"type":"string","description":"The AI action's skip steps."},"choice":{"type":"string","description":"The AI action's choice."},"item_data":{"type":"string","description":"The current AI action, as JSON - the AI changes it and returns the result."}}}}}}}},"/confirm-page-plan":{"post":{"operationId":"post-confirm-page-plan","tags":["Pages"],"x-section":"AI builder","summary":"Confirm a page plan","description":"AI: the owner accepted a proposed page layout; starts building it, once, if the account has credits. Send messageId (the proposal's chat message). 403 \"Insufficient credits\". Pressing twice starts it once: the second call answers { started: true, duplicate: true }.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"messageId":{"type":"string","description":"The page plan's message id."}}}}}}}},"/create-new-page":{"post":{"operationId":"post-create-new-page","tags":["Pages"],"x-section":"AI builder","summary":"Create a page with AI","description":"AI: builds a new page from a planned layout as a recoverable background job. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the page, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"socketId":{"type":"string","description":"The page's socket id."}}}}}}}},"/generate-page":{"post":{"operationId":"post-generate-page","tags":["Pages"],"x-section":"AI builder","summary":"Generate a page with AI","description":"AI: builds a new page from the owner's prompt as a background job; answers the job to poll. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the page, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"socketId":{"type":"string","description":"The page's socket id."}}}}}}}},"/modify-footer":{"post":{"operationId":"post-modify-footer","tags":["Pages"],"x-section":"AI builder","summary":"Modify a footer with AI","description":"AI: routes a footer request to update-footer. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the footer, in plain words - any language."},"item_data":{"type":"string","description":"The current footer, as JSON - the AI changes it and returns the result."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/modify-header":{"post":{"operationId":"post-modify-header","tags":["Pages"],"x-section":"AI builder","summary":"Modify a header with AI","description":"AI: routes a header request to update-header. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the header, in plain words - any language."},"item_data":{"type":"string","description":"The current header, as JSON - the AI changes it and returns the result."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/modify-page":{"post":{"operationId":"post-modify-page","tags":["Pages"],"x-section":"AI builder","summary":"Modify a page with AI","description":"AI: routes a request to change a page to update-page, carrying the page it is about. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the page, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"item_id":{"type":"string","description":"The ID of the page to change."},"item_ids":{"type":"string","description":"The page's item ids."}}}}}}}},"/modify-page-permissions":{"post":{"operationId":"post-modify-page-permissions","tags":["Pages"],"x-section":"AI builder","summary":"Modify a page permission with AI","description":"Use it to require login to access content sections, or set up a paywall when social mode is off. Makes products, services, blogposts, videos, programs, or custom pages require login or subscription.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the page permission, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"item_id":{"type":"string","description":"The ID of the page permission to change."}}}}}}}},"/modify-theme":{"post":{"operationId":"post-modify-theme","tags":["Pages"],"x-section":"AI builder","summary":"Modify a theme with AI","description":"AI: routes a theme request to update-theme with the current theme values. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the theme, in plain words - any language."},"item_data":{"type":"string","description":"The current theme, as JSON - the AI changes it and returns the result."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/regenerate-component":{"post":{"operationId":"post-regenerate-component","tags":["Pages"],"x-section":"AI builder","summary":"Create a regenerate component","description":"AI: rewrites one component of a page, or its picture. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the regenerate component, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"item_data":{"type":"string","description":"The current regenerate component, as JSON - the AI changes it and returns the result."},"current_page_url":{"type":"string","description":"The regenerate component's current page url."},"explicit_target":{"type":"string","description":"The regenerate component's explicit target."},"save_user_message":{"type":"string","description":"The regenerate component's save user message."},"preview_only":{"type":"string","description":"The regenerate component's preview only."}}}}}}}},"/regenerate-section":{"post":{"operationId":"post-regenerate-section","tags":["Pages"],"x-section":"AI builder","summary":"Create a regenerate section","description":"AI: rewrites one section of a page. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the regenerate section, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"item_data":{"type":"string","description":"The current regenerate section, as JSON - the AI changes it and returns the result."},"current_page_url":{"type":"string","description":"The regenerate section's current page url."},"explicit_target":{"type":"string","description":"The regenerate section's explicit target."},"save_user_message":{"type":"string","description":"The regenerate section's save user message."},"section_blueprint":{"type":"string","description":"The regenerate section's section blueprint."},"section_style_blueprint":{"type":"string","description":"The regenerate section's section style blueprint."},"preview_only":{"type":"string","description":"The regenerate section's preview only."},"regeneration_mode":{"type":"string","description":"The regenerate section's regeneration mode."},"replacement_strategy":{"type":"string","description":"The regenerate section's replacement strategy."},"source_small_target":{"type":"string","description":"The regenerate section's source small target."}}}}}}}},"/reopen-about-page-preview":{"post":{"operationId":"post-reopen-about-page-preview","tags":["Pages"],"x-section":"AI builder","summary":"Create a reopen page","description":"AI: reopens an applied page preview so it can be applied again. 404 when that version is no longer in the chat; 409 when it is already applied.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"409":{"description":"It clashes with the current state: the item is already being processed, a version is already applied, or an AI plan or preview is no longer available."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"messageId":{"type":"string","description":"The reopen page's message id."}}}}}}}},"/update-footer":{"post":{"operationId":"post-update-footer","tags":["Pages"],"x-section":"AI builder","summary":"Update a footer with AI","description":"AI: changes the site's footer as the owner asked, as a background job. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the footer, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/update-header":{"post":{"operationId":"post-update-header","tags":["Pages"],"x-section":"AI builder","summary":"Update a header with AI","description":"AI: changes the site's header as the owner asked, as a background job. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the header, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/update-page":{"post":{"operationId":"post-update-page","tags":["Pages"],"x-section":"AI builder","summary":"Update a page with AI","description":"AI: changes a page as the owner asked (copy, layout or a redesign) and answers the preview. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the page, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"item_data":{"type":"string","description":"The current page, as JSON - the AI changes it and returns the result."},"current_page_url":{"type":"string","description":"The page's current page url."},"explicit_target":{"type":"string","description":"The page's explicit target."},"item_id":{"type":"string","description":"The ID of the page to change."},"pending_selection_intent":{"type":"string","description":"The page's pending selection intent."},"save_user_message":{"type":"string","description":"The page's save user message."},"preview_only":{"type":"string","description":"The page's preview only."},"regeneration_mode":{"type":"string","description":"The page's regeneration mode."},"force_targeted_modifier":{"type":"string","description":"The page's force targeted modifier."},"redesign_another":{"type":"string","description":"The page's redesign another."}}}}}}}},"/update-theme":{"post":{"operationId":"post-update-theme","tags":["Pages"],"x-section":"AI builder","summary":"Update a theme with AI","description":"AI: changes the site's or app's theme as the owner asked, as a background job. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the theme, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/blogpost-likes/{id}":{"patch":{"operationId":"patch-blogpost-likes-id","tags":["Blog posts"],"x-section":"Blogpost","summary":"Like or unlike a blog post","description":"Likes or unlikes a post and notifies its author. Calling it again takes the like back. Answers { like }.","x-access":["user"],"x-models":["BlogPost","UserEngagementNotification"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the blog post."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/blogpost-redirect/{url}":{"get":{"operationId":"get-blogpost-redirect-url","tags":["Blog posts"],"x-section":"Blogpost","summary":"Find a blog post by its address","description":"Opens a post in the app (redirects to its app page). For links shared from the app: the website sends the visitor to the post in the app.","x-access":["optional-user"],"x-models":["MyContact","SocialModeSettings"],"parameters":[{"name":"url","in":"path","required":true,"schema":{"type":"string"},"description":"The blog post's URL slug, as in its address on the site."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/blogpost-saves/{id}":{"patch":{"operationId":"patch-blogpost-saves-id","tags":["Blog posts"],"x-section":"Blogpost","summary":"Save or unsave a blog post","description":"Saves or unsaves a post for the signed-in user. Calling it again unsaves.","x-access":["user"],"x-models":["BlogPost"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the blog post."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/blogposts":{"get":{"operationId":"get-blogposts","tags":["Blog posts"],"x-section":"Blogpost","summary":"List all blog posts","description":"The blog page, or the posts as JSON with ?ionic: filtered by category and published state, and sorted. Paged with ?skip, filtered by ?collection and ?published, newest first by default. Cached for an hour.","x-access":["user-priv","optional-user"],"x-models":["Theme","SocialModeSettings","Collection","BlogPost","AboutPage"],"parameters":[{"name":"published","in":"query","required":false,"schema":{"type":"string"},"description":"true: only blog posts that are published; false: only those that are not."},{"name":"sortBy","in":"query","required":false,"schema":{"type":"string"},"description":"The order of the results."},{"name":"collection","in":"query","required":false,"schema":{"type":"string"},"description":"Only results in this collection."},{"name":"skip","in":"query","required":false,"schema":{"type":"string"},"description":"How many results to skip - for paging."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-blogposts","tags":["Blog posts"],"x-section":"Blogpost","summary":"Create a blog post","description":"Creates a blog post. url is made from title, so do not send one. Answers 201 with the post and re-renders the home page. To create it for an account you manage, send on_behalf_of (403 without rights).","x-access":["user"],"x-models":["ConnectedAccount","SocialModeSettings","BlogPost","ProfessionalAccount","MyContact"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Title of blogpost."},"on_behalf_of":{"type":"string","description":"The blog post's on behalf of."}}}}}}}},"/blogposts-multiple/{delete_ids}":{"delete":{"operationId":"delete-blogposts-multiple-delete-ids","tags":["Blog posts"],"x-section":"Blogpost","summary":"Delete multiple blog posts","description":"Deletes several posts, ids comma-separated. Answers the ids that were deleted.","x-access":["user"],"x-models":["BlogPost"],"parameters":[{"name":"delete_ids","in":"path","required":true,"schema":{"type":"string"},"description":"The blog post's delete ids."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/blogposts-multiple/{patch_ids}":{"patch":{"operationId":"patch-blogposts-multiple-patch-ids","tags":["Blog posts"],"x-section":"Blogpost","summary":"Update multiple blog posts","description":"Applies the same changes (updates) to several posts, ids comma-separated. Answers the ids that were changed.","x-access":["user"],"x-models":["BlogPost"],"parameters":[{"name":"patch_ids","in":"path","required":true,"schema":{"type":"string"},"description":"The blog post's patch ids."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"collection_id":{"type":"string","description":"Collection, to which the blog post belongs."},"grouping":{"type":"string","description":"The blog post's grouping."},"updates":{"type":"string","description":"The blog post's updates."}}}}}}}},"/blogposts/{id}":{"patch":{"operationId":"patch-blogposts-id","tags":["Blog posts"],"x-section":"Blogpost","summary":"Update a blog post","description":"Updates a blog post. Fields outside the allowed list are silently ignored. Answers the post. 403 unless the author, an admin or a manager with rights.","x-access":["user"],"x-models":["BlogPost","ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the blog post."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogPost"}}}}},"delete":{"operationId":"delete-blogposts-id","tags":["Blog posts"],"x-section":"Blogpost","summary":"Delete a blog post","description":"Deletes a blog post. Answers the deleted post. 403 unless the author or an admin.","x-access":["user"],"x-models":["BlogPost","ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the blog post."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/blogposts/{id}/media":{"get":{"operationId":"get-blogposts-id-media","tags":["Blog posts"],"x-section":"Blogpost","summary":"Retrieve a blog post","description":"A post's first picture. Answers the image bytes. Cached for an hour.","x-access":[],"x-models":["BlogPost","Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the blog post."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-blogposts-id-media","tags":["Blog posts"],"x-section":"Blogpost","summary":"Create a blog post","description":"Uploads a picture to a post (media, form field). Multipart upload; the picture is resized and added to the post's medias. 404 when there is no such post.","x-access":["user"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the blog post."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/blogposts/{id}/media/delete_last":{"delete":{"operationId":"delete-blogposts-id-media-delete-last","tags":["Blog posts"],"x-section":"Blogpost","summary":"Delete a blog post","description":"Removes a post's last picture. Deletes the media record too.","x-access":["user"],"x-models":["BlogPost","Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the blog post."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/blogposts/{url}":{"get":{"operationId":"get-blogposts-url","tags":["Blog posts"],"x-section":"Blogpost","summary":"Retrieve a blog post","description":"A blog post's page by its url, or the post as JSON with ?ionic. By url, not id. 404 when there is no such post. Comes with its likes and three related posts.","x-access":["page-priv","optional-user"],"x-models":["BlogPost","Collection","SocialModeSettings","User","AboutPage","Comment"],"parameters":[{"name":"url","in":"path","required":true,"schema":{"type":"string"},"description":"The blog post's URL slug, as in its address on the site."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/digital-product/{url}":{"get":{"operationId":"get-digital-product-url","tags":["Products"],"x-section":"Product","summary":"Retrieve a digital product","description":"The download page of a digital product the user bought. Lists the product's files for download; JSON with ?ionic.","x-access":["user","optional-user"],"x-models":["PaymentMethod","Product"],"parameters":[{"name":"url","in":"path","required":true,"schema":{"type":"string"},"description":"The digital product's URL slug, as in its address on the site."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/export-products":{"get":{"operationId":"get-export-products","tags":["Products"],"x-section":"Product","summary":"Export products","description":"Every product as a CSV, with its categories. The same columns as the import template, so it can be edited and imported back.","x-access":["admin"],"x-models":["Product","Collection","MyContact"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/get-import-template":{"get":{"operationId":"get-get-import-template","tags":["Products"],"x-section":"Product","summary":"Import templates","description":"The CSV template for importing products. Answers a CSV file with the columns POST /import-products-custom reads.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/import-products-custom":{"post":{"operationId":"post-import-products-custom","tags":["Products"],"x-section":"Product","summary":"Import products custom","description":"Imports products from a CSV made from the platform's import template. Multipart CSV upload in the format of GET /get-import-template. Answers { corrupted_products }.","x-access":["admin"],"x-models":["Collection","Media","Product"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/import-products-shopify":{"post":{"operationId":"post-import-products-shopify","tags":["Products"],"x-section":"Product","summary":"Import products shopify","description":"Imports products from a Shopify CSV export. Multipart CSV upload. Answers { corrupted_products }: the rows that could not be imported.","x-access":["admin"],"x-models":["Collection","Product","Media"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/import-products-squarespace":{"post":{"operationId":"post-import-products-squarespace","tags":["Products"],"x-section":"Product","summary":"Import products squarespace","description":"Imports products from a Squarespace CSV export. Multipart CSV upload. Answers { corrupted_products }: the rows that could not be imported.","x-access":["admin"],"x-models":["Collection","Product","Media"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/import-products-wix":{"post":{"operationId":"post-import-products-wix","tags":["Products"],"x-section":"Product","summary":"Import products wix","description":"Imports products from a Wix CSV export, with their categories and pictures. Multipart CSV upload. Categories are created as needed and pictures downloaded from their URLs. Answers { corrupted_products }: the rows that could not be imported.","x-access":["admin"],"x-models":["Collection","Product","Media"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/product-likes/{id}":{"patch":{"operationId":"patch-product-likes-id","tags":["Products"],"x-section":"Product","summary":"Like or unlike a product","description":"Likes or unlikes a product and notifies its owner. Calling it again takes the like back. Answers { like }: whether it is liked now.","x-access":["user"],"x-models":["Product","UserEngagementNotification"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the product."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/product-redirect/{url}":{"get":{"operationId":"get-product-redirect-url","tags":["Products"],"x-section":"Product","summary":"Find a product by its address","description":"Opens a product in the app (redirects to its app page). For links shared from the app: the website sends the visitor to the product in the app.","x-access":["optional-user"],"x-models":["MyContact","SocialModeSettings"],"parameters":[{"name":"url","in":"path","required":true,"schema":{"type":"string"},"description":"The product's URL slug, as in its address on the site."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/product-saves/{id}":{"patch":{"operationId":"patch-product-saves-id","tags":["Products"],"x-section":"Product","summary":"Save or unsave a product","description":"Saves or unsaves a product for the signed-in user. Calling it again unsaves.","x-access":["user"],"x-models":["Product"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the product."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/products":{"get":{"operationId":"get-products","tags":["Products"],"x-section":"Product","summary":"List all products","description":"The store's products page, or the products as JSON with ?ionic: filtered by category, price, search and published state, and sorted (?sortBy). Paged with ?skip. Filters: ?collection (a category name), ?minPrice and ?maxPrice, ?origin_address, ?rating, ?published; ?sortBy sets the order. Hidden from visitors whose sign-in or plan does not open the store. Cached for an hour.","x-access":["user-priv","optional-user"],"x-models":["MyContact","SocialModeSettings","Collection","Product","AboutPage","OriginAddress","RatingSettings","Inventory","Theme"],"parameters":[{"name":"published","in":"query","required":false,"schema":{"type":"string"},"description":"true: only products that are published; false: only those that are not."},{"name":"completed","in":"query","required":false,"schema":{"type":"string"},"description":"Only products with this completed."},{"name":"sortBy","in":"query","required":false,"schema":{"type":"string"},"description":"The order of the results."},{"name":"minPrice","in":"query","required":false,"schema":{"type":"string"},"description":"Only products with a price of at least this."},{"name":"maxPrice","in":"query","required":false,"schema":{"type":"string"},"description":"Only products with a price of at most this."},{"name":"collection","in":"query","required":false,"schema":{"type":"string"},"description":"Only results in this collection."},{"name":"origin_address","in":"query","required":false,"schema":{"type":"string"},"description":"Only products with this origin address."},{"name":"skip","in":"query","required":false,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"where","in":"query","required":false,"schema":{"type":"string"},"description":"Only products with this where."},{"name":"rating","in":"query","required":false,"schema":{"type":"string"},"description":"Only products with this rating."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-products","tags":["Products"],"x-section":"Product","summary":"Create a product","description":"Creates a product. url is made from name, so do not send one. Option prices go in the option's text as \"Large (+5)\": the amount is added to price. Answers 201 with the product. Also creates its stock lines and re-renders the home page. To create it for an account you manage, send on_behalf_of (403 without catalogue rights). In social mode the url gets a number appended and a non-admin's product waits for review.","x-access":["user"],"x-models":["ConnectedAccount","SocialModeSettings","Product","ProfessionalAccount","MyContact","Collection"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Name of product."},"on_behalf_of":{"type":"string","description":"The product's on behalf of."}}}}}}}},"/products-multiple/{delete_ids}":{"delete":{"operationId":"delete-products-multiple-delete-ids","tags":["Products"],"x-section":"Product","summary":"Delete multiple products","description":"Deletes several products, ids comma-separated, with their stock lines. Answers the ids that were deleted.","x-access":["user"],"x-models":["Product","Inventory"],"parameters":[{"name":"delete_ids","in":"path","required":true,"schema":{"type":"string"},"description":"The product's delete ids."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/products-multiple/{patch_ids}":{"patch":{"operationId":"patch-products-multiple-patch-ids","tags":["Products"],"x-section":"Product","summary":"Update multiple products","description":"Applies the same changes (updates) to several products, ids comma-separated. Answers the ids that were changed.","x-access":["user"],"x-models":["Product","Inventory"],"parameters":[{"name":"patch_ids","in":"path","required":true,"schema":{"type":"string"},"description":"The product's patch ids."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"collection_id":{"type":"string","description":"Collection.id."},"grouping":{"description":"The grouping/ filters it appears under inside its category: each { collection_id }."},"updates":{"type":"string","description":"The product's updates."}}}}}}}},"/products-multiple/{product_ids}":{"get":{"operationId":"get-products-multiple-product-ids","tags":["Products"],"x-section":"Product","summary":"List multiple products","description":"Several products by id, comma-separated. Only each product's name, id and options.","x-access":["user"],"x-models":["Product"],"parameters":[{"name":"product_ids","in":"path","required":true,"schema":{"type":"string"},"description":"The product's product ids."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/products/{id}":{"patch":{"operationId":"patch-products-id","tags":["Products"],"x-section":"Product","summary":"Update a product","description":"Updates a product. Stock is not set here: it lives in stock lines (PATCH /inventory/:id). Fields outside the allowed list are silently ignored. Changing product_options rebuilds the product's stock lines and removes it from other products' linked_products. Answers the product, with medias as picture URLs rather than ids. 403 unless the owner, an admin or a manager with catalogue rights. In social mode most changes send it back to review.","x-access":["user"],"x-models":["Product","ConnectedAccount","SocialModeSettings","Inventory","MyContact","Collection"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the product."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"convertedPrice":{"type":"string","description":"The product's converted price."},"product_options":{"description":"The choices a buyer makes (Size, Colour): each { name, options: [{ option }] }. An option's text may carry a price change in brackets, \"Large (+5)\", added to price. Changing the options rebuilds the product's stock lines."}}}}}}},"delete":{"operationId":"delete-products-id","tags":["Products"],"x-section":"Product","summary":"Delete a product","description":"Deletes a product. Also deletes its stock lines and removes it from other products' linked_products. Answers the deleted product. 403 unless the owner or an admin.","x-access":["user"],"x-models":["Product","ConnectedAccount","Inventory"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the product."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/products/{id}/media":{"get":{"operationId":"get-products-id-media","tags":["Products"],"x-section":"Product","summary":"Retrieve a product","description":"A product's first picture. 404 when the product has no picture.","x-access":[],"x-models":["Product","Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the product."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-products-id-media","tags":["Products"],"x-section":"Product","summary":"Create a product","description":"Uploads a picture to a product (media, form field). Multipart upload; the picture is resized and added to the product's medias.","x-access":["user"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the product."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/products/{id}/media/{media_id}":{"delete":{"operationId":"delete-products-id-media-media-id","tags":["Products"],"x-section":"Product","summary":"Delete a product","description":"Removes a picture from a product. The media record itself stays in the library.","x-access":["user"],"x-models":["Product"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the product."},{"name":"media_id","in":"path","required":true,"schema":{"type":"string"},"description":"The product's media id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/products/{url}":{"get":{"operationId":"get-products-url","tags":["Products"],"x-section":"Product","summary":"Retrieve a product","description":"A product's page by its url, or the product as JSON with ?ionic. By url, not id. 404 when there is no such product. Comes with its categories, likes and attached plans. Cached for an hour, except for signed-in visitors.","x-access":["optional-user","page-priv"],"x-models":["Product","AboutPage","SocialModeSettings","OriginAddress","Collection","User","Comment","PaymentMethod","UserPaymentSettings","RatingSettings","Rating","Cart","Shipping","Theme"],"parameters":[{"name":"url","in":"path","required":true,"schema":{"type":"string"},"description":"The product's URL slug, as in its address on the site."},{"name":"sessionId","in":"query","required":false,"schema":{"type":"string"},"description":"Only products with this session id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/digital-content":{"get":{"operationId":"get-digital-content","tags":["Products"],"x-section":"Digital Content","summary":"Retrieve the digital content","description":"The digital content files. Answers an array of every record.","x-access":["admin"],"x-models":["DigitalContent"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-digital-content","tags":["Products"],"x-section":"Digital Content","summary":"Create a digital content","description":"Creates a digital content file. Multipart upload of one file (files). Answers 201 with no body.","x-access":["admin"],"x-models":["DigitalContent"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string","description":"The digital content's body."}}}}}}}},"/digital-content-file/{id}":{"get":{"operationId":"get-digital-content-file-id","tags":["Products"],"x-section":"Digital Content","summary":"Retrieve a digital content file","description":"Downloads a digital file, for a user who bought it or when it is free. Answers the file. 401 when the user has not bought a product that includes it.","x-access":["user"],"x-models":["DigitalContent","Product","Order"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the digital content file."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/digital-content/{id}":{"get":{"operationId":"get-digital-content-id","tags":["Products"],"x-section":"Digital Content","summary":"Retrieve a digital content","description":"One digital content file. 404 when there is no such record.","x-access":["admin"],"x-models":["DigitalContent"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the digital content."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-digital-content-id","tags":["Products"],"x-section":"Digital Content","summary":"Update a digital content","description":"Updates a digital content file. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["DigitalContent"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the digital content."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DigitalContent"}}}}},"delete":{"operationId":"delete-digital-content-id","tags":["Products"],"x-section":"Digital Content","summary":"Delete a digital content","description":"Deletes a digital content file. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["DigitalContent"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the digital content."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/inventory":{"get":{"operationId":"get-inventory","tags":["Products"],"x-section":"Inventory","summary":"Retrieve the inventory","description":"The store's stock: one line per product option, with how many are in stock. Each line with its product's name, picture, category and price.","x-access":["admin"],"x-models":["Inventory"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-inventory","tags":["Products"],"x-section":"Inventory","summary":"Create an inventory","description":"Creates a stock line. Stock lines are normally made by product create and update; this adds one by hand. Answers 201.","x-access":["admin"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/inventory/{id}":{"get":{"operationId":"get-inventory-id","tags":["Products"],"x-section":"Inventory","summary":"Retrieve an inventory","description":"The first stock line of a product, by the product's id. The id is a PRODUCT's id, not a stock line's: a product with options has one line per option - read GET /inventory or GET /inventory/:product_id/:option for those. 404 when the product has no stock line. Reads no token.","x-access":[],"x-models":["Inventory"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the inventory."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-inventory-id","tags":["Products"],"x-section":"Inventory","summary":"Update an inventory","description":"Sets the stock of one product option: quantity in stock, SKU, and whether it is tracked. The id is the stock line's (_id from GET /inventory). Send only what changes; a quantity turns tracking on unless track is sent too. To add to the stock, read the line's quantity first and send the new total. Fields outside quantity, track, sku and trackSku are ignored. Answers the updated line, or 404.","x-access":["admin"],"x-models":["Inventory"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the inventory."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Inventory"}}}}},"delete":{"operationId":"delete-inventory-id","tags":["Products"],"x-section":"Inventory","summary":"Delete an inventory","description":"Deletes a stock line. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["Inventory"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the inventory."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/inventory/{product_id}/{option}":{"get":{"operationId":"get-inventory-product-id-option","tags":["Products"],"x-section":"Inventory","summary":"Retrieve an inventory","description":"The stock line of one option of a product: how many are in stock, its id to change it. Answers { track: false } when the product's stock is not tracked; 404 when there is no line for that option.","x-access":[],"x-models":["SocialModeSettings","Product","Inventory"],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string"},"description":"The inventory's product id."},{"name":"option","in":"path","required":true,"schema":{"type":"string"},"description":"The product option this stock line is for (\"Red / L\")."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/locations-map":{"get":{"operationId":"get-locations-map","tags":["Services"],"x-section":"Service","summary":"Retrieve the locations map","description":"The map of service locations. The map page itself; it loads its points from /locations-search.","x-access":["user-priv"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/locations-search":{"get":{"operationId":"get-locations-search","tags":["Services"],"x-section":"Service","summary":"Search locations","description":"Services near a place, for the map: filtered by category, distance and price. Renders the map with the services found, with prices also in the second currency when one is set.","x-access":["user-priv"],"x-models":["SocialModeSettings","Collection","PaymentMethod","Service","GeoLocation","Rating","OriginAddress"],"parameters":[{"name":"collection","in":"query","required":false,"schema":{"type":"string"},"description":"Only results in this collection."},{"name":"origin_address","in":"query","required":false,"schema":{"type":"string"},"description":"Only locations with this origin address."},{"name":"where","in":"query","required":false,"schema":{"type":"string"},"description":"Only locations with this where."},{"name":"sortBy","in":"query","required":false,"schema":{"type":"string"},"description":"The order of the results."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/service-allowed-ranges":{"patch":{"operationId":"patch-service-allowed-ranges","tags":["Services"],"x-section":"Service","summary":"Update the service allowed range","description":"Locks the hours outside each service's allowed ranges (services). services is a list of services with their allowed ranges.","x-access":["user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"services":{"type":"string","description":"The service allowed range's services."}}}}}}}},"/service-likes/{id}":{"patch":{"operationId":"patch-service-likes-id","tags":["Services"],"x-section":"Service","summary":"Like or unlike a service","description":"Likes or unlikes a service and notifies its owner. Calling it again takes the like back. Answers { like }.","x-access":["user"],"x-models":["Service","UserEngagementNotification"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the service."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/service-redirect/{url}":{"get":{"operationId":"get-service-redirect-url","tags":["Services"],"x-section":"Service","summary":"Find a service by its address","description":"Opens a service in the app (redirects to its app page). For links shared from the app: the website sends the visitor to the service in the app.","x-access":["optional-user"],"x-models":["MyContact","SocialModeSettings"],"parameters":[{"name":"url","in":"path","required":true,"schema":{"type":"string"},"description":"The service's URL slug, as in its address on the site."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/service-saves/{id}":{"patch":{"operationId":"patch-service-saves-id","tags":["Services"],"x-section":"Service","summary":"Save or unsave a service","description":"Saves or unsaves a service for the signed-in user. Calling it again unsaves.","x-access":["user"],"x-models":["Service"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the service."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/services":{"get":{"operationId":"get-services","tags":["Services"],"x-section":"Service","summary":"List all services","description":"The services page, or the services as JSON with ?ionic: filtered by category and published state, and sorted. Paged with ?skip. Filters: ?collection, ?origin_address, ?published, ?selectedDate (services free that day); ?sortBy sets the order. Cached for an hour.","x-access":["user-priv","optional-user"],"x-models":["SocialModeSettings","Collection","Service","AboutPage","OriginAddress"],"parameters":[{"name":"published","in":"query","required":false,"schema":{"type":"string"},"description":"Only services with this published."},{"name":"completed","in":"query","required":false,"schema":{"type":"string"},"description":"Only services with this completed."},{"name":"sortBy","in":"query","required":false,"schema":{"type":"string"},"description":"The order of the results."},{"name":"collection","in":"query","required":false,"schema":{"type":"string"},"description":"Only results in this collection."},{"name":"origin_address","in":"query","required":false,"schema":{"type":"string"},"description":"Only services with this origin address."},{"name":"skip","in":"query","required":false,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"where","in":"query","required":false,"schema":{"type":"string"},"description":"Only services with this where."},{"name":"selectedDate","in":"query","required":false,"schema":{"type":"string"},"description":"Only services with this selected date."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-services","tags":["Services"],"x-section":"Service","summary":"Create a service","description":"Creates a service. url is made from title, so do not send one. Answers 201 with the service. To create it for an account you manage, send on_behalf_of (403 without catalogue rights). In social mode the url gets a number appended and a non-admin's service waits for review.","x-access":["optional-user","user"],"x-models":["ConnectedAccount","SocialModeSettings","Service","ProfessionalAccount"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Title of service."},"on_behalf_of":{"type":"string","description":"The service's on behalf of."},"address":{"type":"string","description":"Where is the service performed."}}}}}}}},"/services-multiple/{delete_ids}":{"delete":{"operationId":"delete-services-multiple-delete-ids","tags":["Services"],"x-section":"Service","summary":"Delete multiple services","description":"Deletes several services, ids comma-separated. Answers the ids that were deleted.","x-access":["user"],"x-models":["Service"],"parameters":[{"name":"delete_ids","in":"path","required":true,"schema":{"type":"string"},"description":"The service's delete ids."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/services-multiple/{patch_ids}":{"patch":{"operationId":"patch-services-multiple-patch-ids","tags":["Services"],"x-section":"Service","summary":"Update multiple services","description":"Applies the same changes (updates) to several services, ids comma-separated. Answers the ids that were changed.","x-access":["user"],"x-models":["Service"],"parameters":[{"name":"patch_ids","in":"path","required":true,"schema":{"type":"string"},"description":"The service's patch ids."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"collection_id":{"type":"string","description":"Collection, to which the blog post belongs."},"updates":{"type":"string","description":"The service's updates."}}}}}}}},"/services/{id}":{"patch":{"operationId":"patch-services-id","tags":["Services"],"x-section":"Service","summary":"Update a service","description":"Updates a service. Fields outside the allowed list are silently ignored. locked_hours and locked_ranges are turned into the hours the service cannot be booked. Answers the service. 403 unless the owner, an admin or a manager with catalogue rights.","x-access":["user"],"x-models":["Service","ConnectedAccount","SocialModeSettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the service."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"_id":{"type":"string","description":"The ID of the service."},"convertedPrice":{"type":"string","description":"The service's converted price."},"locked_hours":{"type":"array","items":{"type":"string"},"description":"Hours that cannot be booked."},"locked_ranges":{"description":"Date and time ranges that cannot be booked."},"attached_dynamic_models":{"type":"string","description":"The service's attached dynamic models."},"medias":{"description":"Attached media objects with ids."},"address":{"type":"string","description":"Where is the service performed."}}}}}}},"delete":{"operationId":"delete-services-id","tags":["Services"],"x-section":"Service","summary":"Delete a service","description":"Deletes a service. Answers the deleted service. Its bookings stay. 403 unless the owner or an admin.","x-access":["user"],"x-models":["Service","ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the service."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/services/{id}/media":{"get":{"operationId":"get-services-id-media","tags":["Services"],"x-section":"Service","summary":"Retrieve a service","description":"A service's first picture. Answers the image bytes. Cached for an hour.","x-access":[],"x-models":["Service","Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the service."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-services-id-media","tags":["Services"],"x-section":"Service","summary":"Create a service","description":"Uploads a picture to a service (media, form field). Multipart upload; the picture is resized and added to the service's medias.","x-access":["user"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the service."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/services/{id}/media/delete_last":{"delete":{"operationId":"delete-services-id-media-delete-last","tags":["Services"],"x-section":"Service","summary":"Delete a service","description":"Removes a service's last picture. Deletes the media record too.","x-access":["user"],"x-models":["Service","Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the service."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/services/{url}":{"get":{"operationId":"get-services-url","tags":["Services"],"x-section":"Service","summary":"Retrieve a service","description":"A service's page by its url, or the service as JSON with ?ionic. By url, not id. 404 when there is no such service. Comes with its staff members, category and connected services.","x-access":["page-priv","optional-user"],"x-models":["Service","SocialModeSettings","Collection","AboutPage","User","Comment","RatingSettings","Rating"],"parameters":[{"name":"url","in":"path","required":true,"schema":{"type":"string"},"description":"The service's URL slug, as in its address on the site."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/user-has-services":{"get":{"operationId":"get-user-has-services","tags":["Services"],"x-section":"Service","summary":"List all user has services","description":"Whether the signed-in user has a professional account and services. Answers { has_account }.","x-access":["user"],"x-models":["ProfessionalAccount","Service"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/single-user-locked-hour":{"patch":{"operationId":"patch-single-user-locked-hour","tags":["Services"],"x-section":"User Locked Hours","summary":"Update the single user locked hour","description":"Adds or removes one locked range (locked_range). 403 for an account the user may not manage.","x-access":["user"],"x-models":["UserLockedHours","ConnectedAccount"],"parameters":[{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only single user locked hours with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"locked_range":{"type":"string","description":"The single user locked hour's locked range."}}}}}}}},"/user-locked-hours":{"get":{"operationId":"get-user-locked-hours","tags":["Services"],"x-section":"User Locked Hours","summary":"List all user locked hours","description":"The hours the signed-in staff member cannot be booked. Null when none are set.","x-access":["user"],"x-models":["UserLockedHours"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-user-locked-hours","tags":["Services"],"x-section":"User Locked Hours","summary":"Create a user locked hour","description":"Sets the hours the signed-in staff member cannot be booked (locked_ranges). Answers with no body.","x-access":["user"],"x-models":["UserLockedHours"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"locked_ranges":{"description":"Date and time ranges the staff member cannot be booked."}}}}}}},"patch":{"operationId":"patch-user-locked-hours","tags":["Services"],"x-section":"User Locked Hours","summary":"Update the user locked hour","description":"Replaces those hours, for them or an account they manage (?on_behalf_of). Replaces the whole list. 403 for an account the user may not manage; 404 when no hours were set yet.","x-access":["user"],"x-models":["UserLockedHours","ConnectedAccount"],"parameters":[{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only user locked hours with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"locked_ranges":{"description":"Date and time ranges the staff member cannot be booked."}}}}}}}},"/booking-event/{id}":{"get":{"operationId":"get-booking-event-id","tags":["Bookings"],"x-section":"Booking","summary":"Retrieve a booking event","description":"A booking as an iCalendar event to add to a calendar. Answers an .ics file.","x-access":[],"x-models":["Booking"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the booking event."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/booking-receipt":{"get":{"operationId":"get-booking-receipt","tags":["Bookings"],"x-section":"Booking","summary":"Retrieve the booking receipt","description":"A booking's receipt page (?id). With the service, staff member and the service's receipt page, when it has one. JSON with ?ionic.","x-access":["optional-user"],"x-models":["Booking","Service","User","AboutPage"],"parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string"},"description":"The ID of the booking receipt."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/bookings":{"get":{"operationId":"get-bookings","tags":["Bookings"],"x-section":"Booking","summary":"List all bookings","description":"Every booking (admin). Newest first.","x-access":["admin"],"x-models":["Booking"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-bookings","tags":["Bookings"],"x-section":"Booking","summary":"Create a booking","description":"Creates a booking. The older booking route, without online payment: 400 when the phone number is under 6 characters. Emails the business, can sign the customer up to the newsletter and syncs the booking to Beds24.","x-access":[],"x-models":["MyContact","Service","User","Lead","NewsletterContact","PaymentMethod","Booking"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"newsletter":{"type":"string","description":"The booking's newsletter."},"email":{"type":"string","description":"An email address."},"name":{"type":"string","description":"Customer's full name."},"age":{"type":"string","description":"The booking's age."},"city":{"type":"string","description":"Customer's city."},"event_id":{"type":"string","description":"The booking's event id."}}}}}}}},"/bookings-checkout":{"post":{"operationId":"post-bookings-checkout","tags":["Bookings"],"x-section":"Booking","summary":"Create a bookings checkout","description":"Books a service: checks the slot is free, creates the booking and customer, and answers what payment needs (card form or none). 400 when the phone number is under 6 characters. Answers 201 { clientSecret, booking_id }: the Stripe payment the card form completes, after which PATCH /finalize-booking confirms it. The booking stays unfinalized until then.","x-access":[],"x-models":["PaymentMethod","SocialModeSettings","NewsletterContact","Service","UserPaymentSettings","User","Lead","Booking"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"newsletter":{"type":"string","description":"The bookings checkout's newsletter."},"email":{"type":"string","description":"An email address."},"name":{"type":"string","description":"The bookings checkout's name."},"age":{"type":"string","description":"The bookings checkout's age."},"city":{"type":"string","description":"The bookings checkout's city."}}}}}}}},"/bookings-date/{id}":{"patch":{"operationId":"patch-bookings-date-id","tags":["Bookings"],"x-section":"Booking","summary":"Update a bookings date","description":"Moves a booking to another date and time. Answers { booking, service }. The old slot is freed and the new one taken. 403 when the booking is not for one of the user's services.","x-access":["user"],"x-models":["Booking","Service"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the bookings date."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}}}},"/bookings-status/{id}":{"patch":{"operationId":"patch-bookings-status-id","tags":["Bookings"],"x-section":"Booking","summary":"Change the status of a booking","description":"Changes a booking's status and records conversions for paid ones. 403 when the booking is not for one of the user's services. A booking marked paid is sent as a conversion to the tracking platforms with the customer's ids.","x-access":["user"],"x-models":["Booking","Service","Lead","PaymentMethod","Order"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the booking."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"Follow-up outcome with the customer: other, churnet, not_upsell or upsell."},"order":{"type":"string","description":"The booking's order."}}}}}}}},"/bookings/{id}":{"patch":{"operationId":"patch-bookings-id","tags":["Bookings"],"x-section":"Booking","summary":"Update a booking","description":"Updates a booking. Answers the updated booking, or 404. Fields outside the allowed list are ignored.","x-access":["user"],"x-models":["Booking"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the booking."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}}},"delete":{"operationId":"delete-bookings-id","tags":["Bookings"],"x-section":"Booking","summary":"Delete a booking","description":"Deletes a booking. Answers the deleted booking. 403 when it is not for one of the user's services.","x-access":["user"],"x-models":["Booking","Service","ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the booking."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/bookings/flow":{"post":{"operationId":"post-bookings-flow","tags":["Bookings"],"x-section":"Booking","summary":"Create a booking","description":"Adds (+) or removes a product with its options in the visitor's pending booking. The pending booking is kept per session. Answers it.","x-access":[],"x-models":["Booking"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"action":{"type":"string","description":"The booking's action."},"product":{"type":"string","description":"The booking's product."},"options":{"type":"string","description":"The booking's options."}}}}}}}},"/confirm-booking/{booking_id}&{service_id}&{validation_code}":{"get":{"operationId":"get-confirm-booking-booking-id-service-id-validation-code","tags":["Bookings"],"x-section":"Booking","summary":"Confirm a booking","description":"The page where the business confirms a booking from its email. A wrong code goes to the not-found page.","x-access":[],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string"},"description":"The booking's booking id."},{"name":"service_id","in":"path","required":true,"schema":{"type":"string"},"description":"The booking's service id."},{"name":"validation_code","in":"path","required":true,"schema":{"type":"string"},"description":"The booking's validation code."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/finalize-booking":{"patch":{"operationId":"patch-finalize-booking","tags":["Bookings"],"x-section":"Booking","summary":"Update the finalize booking","description":"Completes a booking after payment (booking_id, payment_intent): marks it paid, emails both sides and syncs Beds24. Checks with Stripe that the payment succeeded and belongs to this booking (401 otherwise). Answers { id }.","x-access":[],"x-models":["Booking","Service","Lead","User","PaymentMethod"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"booking_id":{"type":"string","description":"The finalize booking's booking id."},"payment_intent":{"type":"string","description":"The finalize booking's payment intent."},"email":{"type":"string","description":"An email address."},"event_id":{"type":"string","description":"The finalize booking's event id."}}}}}}}},"/get-hours/{service_id}/{date}/{staff_id}":{"get":{"operationId":"get-get-hours-service-id-date-staff-id","tags":["Bookings"],"x-section":"Booking","summary":"Retrieve a hour","description":"The free hours of a service on a date, with a staff member. Answers the hours still free, after the bookings already made and the staff member's locked hours.","x-access":["optional-user"],"x-models":["Booking","UserLockedHours"],"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"string"},"description":"The hour's service id."},{"name":"date","in":"path","required":true,"schema":{"type":"string"},"description":"A date (YYYY-MM-DD)."},{"name":"staff_id","in":"path","required":true,"schema":{"type":"string"},"description":"The hour's staff id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/get-services/{id}":{"get":{"operationId":"get-get-services-id","tags":["Bookings"],"x-section":"Booking","summary":"Retrieve a service","description":"A service for its booking page, with its staff members' names. 404 when there is no such service.","x-access":["optional-user"],"x-models":["Service"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the service."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/my_bookings/{id}":{"get":{"operationId":"get-my-bookings-id","tags":["Bookings"],"x-section":"Booking","summary":"Retrieve a booking","description":"A customer's booking page. Opened from the booking email.","x-access":["optional-user"],"x-models":["Booking"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the booking."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/user-booking-change/{booking_id}":{"delete":{"operationId":"delete-user-booking-change-booking-id","tags":["Bookings"],"x-section":"Booking","summary":"Delete a user booking change","description":"Cancels one of the signed-in customer's bookings, freeing its slot. 403 when the booking is not the signed-in user's. Also cancels it in Beds24 when synced.","x-access":["user"],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string"},"description":"The user booking change's booking id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/beds24-settings":{"get":{"operationId":"get-beds24-settings","tags":["Bookings"],"x-section":"Beds24 Settings","summary":"List all beds24 settings","description":"The Beds24 connection. Answers { connected: false } when not connected; never includes the tokens.","x-access":["admin"],"x-models":["Beds24Settings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-beds24-settings","tags":["Bookings"],"x-section":"Beds24 Settings","summary":"Create a beds24 setting","description":"Connects Beds24 with an invite code and answers its rooms. Answers { settings, rooms } without the credentials. 400 without inviteCode or when Beds24 refuses it. Reconnecting to a different Beds24 account clears the old room mappings.","x-access":["admin"],"x-models":["MyContact","Beds24Settings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"inviteCode":{"type":"string","description":"The beds24 setting's invite code."}}}}}}}},"/beds24-settings/{id}":{"patch":{"operationId":"patch-beds24-settings-id","tags":["Bookings"],"x-section":"Beds24 Settings","summary":"Update a beds24 setting","description":"Maps Beds24 rooms to services (room_mappings) and syncs. Each mapping needs beds24_room_id and service (400 otherwise). Syncs right after.","x-access":["admin"],"x-models":["Beds24Settings","Service"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the beds24 setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"room_mappings":{"description":"Which Beds24 room each service is: the service and the room id."}}}}}}},"delete":{"operationId":"delete-beds24-settings-id","tags":["Bookings"],"x-section":"Beds24 Settings","summary":"Delete a beds24 setting","description":"Disconnects Beds24. Bookings already synced stay. 403 when the connection is another user's.","x-access":["admin"],"x-models":["Beds24Settings","ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the beds24 setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/beds24-settings/{id}/sync":{"post":{"operationId":"post-beds24-settings-id-sync","tags":["Bookings"],"x-section":"Beds24 Settings","summary":"Sync the beds24 setting","description":"Syncs bookings and availability with Beds24 now. Answers what moved each way, and the error fields. 404 when Beds24 is not connected.","x-access":["admin"],"x-models":["Beds24Settings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the beds24 setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/beds24-settings/rooms":{"get":{"operationId":"get-beds24-settings-rooms","tags":["Bookings"],"x-section":"Beds24 Settings","summary":"List all beds24 settings","description":"The Beds24 account's rooms, live, for mapping them to services. 404 when Beds24 is not connected.","x-access":["admin"],"x-models":["Beds24Settings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/program-likes/{id}":{"patch":{"operationId":"patch-program-likes-id","tags":["Programs"],"x-section":"Program","summary":"Like or unlike a program","description":"Likes or unlikes a program and notifies its owner. Calling it again takes the like back. Answers { like }.","x-access":["user"],"x-models":["Program","UserEngagementNotification"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the program."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/program-redirect/{url}":{"get":{"operationId":"get-program-redirect-url","tags":["Programs"],"x-section":"Program","summary":"Find a program by its address","description":"Opens a program in the app (redirects to its app page). For links shared from the app: the website sends the visitor to the program in the app.","x-access":["optional-user"],"x-models":["MyContact","SocialModeSettings"],"parameters":[{"name":"url","in":"path","required":true,"schema":{"type":"string"},"description":"The program's URL slug, as in its address on the site."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/program-saves/{id}":{"patch":{"operationId":"patch-program-saves-id","tags":["Programs"],"x-section":"Program","summary":"Save or unsave a program","description":"Saves or unsaves a program for the signed-in user. Calling it again unsaves.","x-access":["user"],"x-models":["Program"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the program."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/programs":{"get":{"operationId":"get-programs","tags":["Programs"],"x-section":"Program","summary":"List all programs","description":"The programs page, or the programs as JSON with ?ionic. Paged with ?skip, filtered by ?collection and ?published; ?sortBy sets the order. Cached for an hour.","x-access":["user-priv","optional-user"],"x-models":["Theme","MyContact","SocialModeSettings","Collection","Program","AboutPage"],"parameters":[{"name":"published","in":"query","required":false,"schema":{"type":"string"},"description":"Only programs with this published."},{"name":"completed","in":"query","required":false,"schema":{"type":"string"},"description":"Only programs with this completed."},{"name":"sortBy","in":"query","required":false,"schema":{"type":"string"},"description":"The order of the results."},{"name":"collection","in":"query","required":false,"schema":{"type":"string"},"description":"Only results in this collection."},{"name":"skip","in":"query","required":false,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"where","in":"query","required":false,"schema":{"type":"string"},"description":"Only programs with this where."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-programs","tags":["Programs"],"x-section":"Program","summary":"Create a program","description":"Creates a program. url is made from title. Answers 201 with the program. 403 without a professional account where social mode requires one.","x-access":["user"],"x-models":["ConnectedAccount","SocialModeSettings","Program","ProfessionalAccount"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Name of the program, required."},"on_behalf_of":{"type":"string","description":"The program's on behalf of."}}}}}}}},"/programs/{id}":{"patch":{"operationId":"patch-programs-id","tags":["Programs"],"x-section":"Program","summary":"Update a program","description":"Updates a program. Fields outside the allowed list are silently ignored. Answers the program. 403 unless the owner or an admin.","x-access":["user"],"x-models":["Program","ConnectedAccount","SocialModeSettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the program."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"convertedPrice":{"type":"string","description":"The program's converted price."}}}}}}},"delete":{"operationId":"delete-programs-id","tags":["Programs"],"x-section":"Program","summary":"Delete a program","description":"Deletes a program. Answers the deleted program. Users' progress in it stays. 403 unless the owner or an admin.","x-access":["user"],"x-models":["Program","ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the program."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/programs/{url}":{"get":{"operationId":"get-programs-url","tags":["Programs"],"x-section":"Program","summary":"Retrieve a program","description":"A program's page, or JSON with ?ionic. By url, not id. 404 when there is no such program.","x-access":["page-priv","optional-user"],"x-models":["Program","MyContact","SocialModeSettings","Collection","Video","PaymentMethod","Order","Comment","RatingSettings","Rating"],"parameters":[{"name":"url","in":"path","required":true,"schema":{"type":"string"},"description":"The program's URL slug, as in its address on the site."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/program-progress":{"get":{"operationId":"get-program-progress","tags":["Programs"],"x-section":"Program Progress","summary":"Retrieve the program progress","description":"Users' progress in programs. Answers an array of every record.","x-access":[],"x-models":["ProgramProgress"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-program-progress","tags":["Programs"],"x-section":"Program Progress","summary":"Create a program progress","description":"Creates a program progress record. Enrols the user in a program: 403 \"You need to buy course before proceeding.\" for a paid one they have not bought. Answers 201 { program_progress_id }, or 200 with the existing one when already enrolled.","x-access":["user"],"x-models":["ProgramProgress","Program","Order"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"program":{"type":"string","description":"Program.id."}}}}}}}},"/program-progress/{id}":{"get":{"operationId":"get-program-progress-id","tags":["Programs"],"x-section":"Program Progress","summary":"Retrieve a program progress","description":"One user's progress in a program. With the program; the week and day come from ?week and ?day (both 0 by default) for a weekly program. 404 when there is no such progress.","x-access":["optional-user","user"],"x-models":["ProgramProgress","Video","AboutPage","MyContact"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the program progress."},{"name":"week","in":"query","required":false,"schema":{"type":"string"},"description":"Only program progresses with this week."},{"name":"day","in":"query","required":false,"schema":{"type":"string"},"description":"Only program progresses with this day."},{"name":"step","in":"query","required":false,"schema":{"type":"string"},"description":"Only program progresses with this step."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-program-progress-id","tags":["Programs"],"x-section":"Program Progress","summary":"Update a program progress","description":"Updates a program progress record. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["user"],"x-models":["ProgramProgress","Program"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the program progress."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"concatinated_progress":{"type":"string","description":"The program progress's concatinated progress."},"isCompleted":{"type":"string","description":"The program progress's is completed."},"split":{"type":"string","description":"The program progress's split."},"progress":{"type":"string","description":"The program progress's progress."}}}}}}},"delete":{"operationId":"delete-program-progress-id","tags":["Programs"],"x-section":"Program Progress","summary":"Delete a program progress","description":"Deletes a program progress record. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["user"],"x-models":["ProgramProgress"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the program progress."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/tracker":{"get":{"operationId":"get-tracker","tags":["Programs"],"x-section":"Tracker","summary":"Retrieve the tracker","description":"The progress trackers. With the signed-in user's entries, newest first, and its video.","x-access":["optional-user","user"],"x-models":["Tracker","MyContact","TrackerProgress","Theme"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-tracker","tags":["Programs"],"x-section":"Tracker","summary":"Create a tracker","description":"Creates a progress tracker. Answers 201 with the tracker.","x-access":["admin"],"x-models":["Tracker"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tracker"}}}}}},"/tracker/{id}":{"get":{"operationId":"get-tracker-id","tags":["Programs"],"x-section":"Tracker","summary":"Retrieve a tracker","description":"One progress tracker. 404 when there is no such tracker.","x-access":["user"],"x-models":["Tracker"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the tracker."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-tracker-id","tags":["Programs"],"x-section":"Tracker","summary":"Update a tracker","description":"Updates a progress tracker. Answers the tracker, or 404.","x-access":["admin"],"x-models":["Tracker"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the tracker."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tracker"}}}}},"delete":{"operationId":"delete-tracker-id","tags":["Programs"],"x-section":"Tracker","summary":"Delete a tracker","description":"Deletes a progress tracker. Answers the deleted tracker. Users' entries stay.","x-access":["admin"],"x-models":["Tracker"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the tracker."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/tracker-progress":{"get":{"operationId":"get-tracker-progress","tags":["Programs"],"x-section":"Tracker Progress","summary":"Retrieve the tracker progress","description":"Users' progress entries. The signed-in user's own entries.","x-access":["optional-user","user"],"x-models":["TrackerProgress","Tracker","MyContact"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-tracker-progress","tags":["Programs"],"x-section":"Tracker Progress","summary":"Create a tracker progress","description":"Creates a progress entry. Answers 201 for the app; a website form is sent back to /tracker.","x-access":["user"],"x-models":["TrackerProgress"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string","description":"The tracker progress's body."}}}}}}}},"/tracker-progress/{id}":{"get":{"operationId":"get-tracker-progress-id","tags":["Programs"],"x-section":"Tracker Progress","summary":"Retrieve a tracker progress","description":"One progress entry. 404 when there is no such record.","x-access":["user"],"x-models":["TrackerProgress"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the tracker progress."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-tracker-progress-id","tags":["Programs"],"x-section":"Tracker Progress","summary":"Update a tracker progress","description":"Updates a progress entry. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["user"],"x-models":["TrackerProgress"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the tracker progress."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackerProgress"}}}}},"delete":{"operationId":"delete-tracker-progress-id","tags":["Programs"],"x-section":"Tracker Progress","summary":"Delete a tracker progress","description":"Deletes a progress entry. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["user"],"x-models":["TrackerProgress"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the tracker progress."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/donations":{"get":{"operationId":"get-donations","tags":["Donations"],"x-section":"Donation","summary":"List all donations","description":"The donations page, or the campaigns as JSON with ?ionic. Paged with ?skip. Cached for an hour.","x-access":["user-priv","optional-user"],"x-models":["Theme","MyContact","SocialModeSettings","Collection","Donation","AboutPage","Order"],"parameters":[{"name":"published","in":"query","required":false,"schema":{"type":"string"},"description":"Only donations with this published."},{"name":"completed","in":"query","required":false,"schema":{"type":"string"},"description":"Only donations with this completed."},{"name":"sortBy","in":"query","required":false,"schema":{"type":"string"},"description":"The order of the results."},{"name":"collection","in":"query","required":false,"schema":{"type":"string"},"description":"Only results in this collection."},{"name":"skip","in":"query","required":false,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"where","in":"query","required":false,"schema":{"type":"string"},"description":"Only donations with this where."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-donations","tags":["Donations"],"x-section":"Donation","summary":"Create a donation","description":"Creates a donation campaign. Answers 201 with the campaign.","x-access":["admin"],"x-models":["Donation"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Name of the campaign, required."}}}}}}}},"/donations/{id}":{"patch":{"operationId":"patch-donations-id","tags":["Donations"],"x-section":"Donation","summary":"Update a donation","description":"Updates a donation campaign. Answers the campaign, or 404.","x-access":["admin"],"x-models":["Donation"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the donation."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Donation"}}}}},"delete":{"operationId":"delete-donations-id","tags":["Donations"],"x-section":"Donation","summary":"Delete a donation","description":"Deletes a donation campaign. Answers the deleted campaign, or 404.","x-access":["admin"],"x-models":["Donation"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the donation."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/donations/{url}":{"get":{"operationId":"get-donations-url","tags":["Donations"],"x-section":"Donation","summary":"Retrieve a donation","description":"A campaign's page, or JSON with ?ionic. By url, not id. 404 when there is no such campaign.","x-access":["page-priv","optional-user"],"x-models":["Donation","MyContact","SocialModeSettings","PaymentMethod","Order","Comment","RatingSettings","Rating","Cart"],"parameters":[{"name":"url","in":"path","required":true,"schema":{"type":"string"},"description":"The donation's URL slug, as in its address on the site."},{"name":"sessionId","in":"query","required":false,"schema":{"type":"string"},"description":"Only donations with this session id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/events":{"get":{"operationId":"get-events","tags":["Events"],"x-section":"Event","summary":"List all events","description":"The events page, or the events as JSON with ?ionic. Each event with its venue, dates and pictures only.","x-access":["optional-user"],"x-models":["Event"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-events","tags":["Events"],"x-section":"Event","summary":"Create an event","description":"Creates an event. Answers 201 with the event.","x-access":["user"],"x-models":["Event"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}}}},"/events/{id}":{"get":{"operationId":"get-events-id","tags":["Events"],"x-section":"Event","summary":"Retrieve an event","description":"An event's page, or JSON with ?ionic. With its venue. 404 when there is no such event.","x-access":["optional-user"],"x-models":["Event"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the event."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-events-id","tags":["Events"],"x-section":"Event","summary":"Update an event","description":"Updates an event. Answers the event, or 404.","x-access":["user"],"x-models":["Event"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the event."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}}},"delete":{"operationId":"delete-events-id","tags":["Events"],"x-section":"Event","summary":"Delete an event","description":"Deletes an event. Answers the deleted event. Its tickets stay.","x-access":["user"],"x-models":["Event"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the event."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/seating-plans":{"get":{"operationId":"get-seating-plans","tags":["Events"],"x-section":"Seating Plan","summary":"List all seating plans","description":"The seating plans. Answers an array of every record.","x-access":[],"x-models":["SeatingPlan"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-seating-plans","tags":["Events"],"x-section":"Seating Plan","summary":"Create a seating plan","description":"Creates a seating plan. Answers 201 with the created record; 400 with the reason when a field is invalid.","x-access":["user"],"x-models":["SeatingPlan"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeatingPlan"}}}}}},"/seating-plans/{id}":{"get":{"operationId":"get-seating-plans-id","tags":["Events"],"x-section":"Seating Plan","summary":"Retrieve a seating plan","description":"One seating plan. 404 when there is no such record.","x-access":[],"x-models":["SeatingPlan"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the seating plan."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-seating-plans-id","tags":["Events"],"x-section":"Seating Plan","summary":"Update a seating plan","description":"Updates a seating plan. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["user"],"x-models":["SeatingPlan"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the seating plan."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeatingPlan"}}}}},"delete":{"operationId":"delete-seating-plans-id","tags":["Events"],"x-section":"Seating Plan","summary":"Delete a seating plan","description":"Deletes a seating plan. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["user"],"x-models":["SeatingPlan"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the seating plan."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/events-date/{id}/{date_index}":{"get":{"operationId":"get-events-date-id-date-index","tags":["Events"],"x-section":"Ticket","summary":"Retrieve an events date","description":"An event date's page with its seating plan and ticket tiers. date_index is the date's position in the event's dates. 404 when there is no such event or date.","x-access":["optional-user"],"x-models":["Event"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the events date."},{"name":"date_index","in":"path","required":true,"schema":{"type":"string"},"description":"The events date's date index."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/ticket/{id}":{"get":{"operationId":"get-ticket-id","tags":["Events"],"x-section":"Ticket","summary":"Retrieve a ticket","description":"A ticket's page with its QR code. 404 when there is no such ticket. JSON with ?ionic.","x-access":["optional-user"],"x-models":["Ticket","Event","Order","QrCode"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the ticket."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/tickets":{"post":{"operationId":"post-tickets","tags":["Events"],"x-section":"Ticket","summary":"Create a ticket","description":"Holds, releases or sells seats for the visitor (tickets, freeze). Seats are held for the visitor until expiration_time, then released if not paid. 400 for an invalid section, date or seat, a seat already taken or a full section.","x-access":["optional-user"],"x-models":["Event","Ticket"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"findIndex":{"type":"string","description":"The ticket's find index."},"splice":{"type":"string","description":"The ticket's splice."},"push":{"type":"string","description":"The ticket's push."},"tickets":{"type":"string","description":"The ticket's tickets."},"freeze_action":{"type":"string","description":"The ticket's freeze action."},"bought_by_admin":{"type":"string","description":"The ticket's bought by admin."},"freeze":{"type":"string","description":"The ticket's freeze."}}}}}}}},"/venues":{"get":{"operationId":"get-venues","tags":["Events"],"x-section":"Venue","summary":"List all venues","description":"The venues. Answers an array of every venue. Reads no token.","x-access":[],"x-models":["Venue"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-venues","tags":["Events"],"x-section":"Venue","summary":"Create a venue","description":"Creates a venue. Answers 201 with the venue.","x-access":["user"],"x-models":["Venue"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Venue"}}}}}},"/venues/{id}":{"get":{"operationId":"get-venues-id","tags":["Events"],"x-section":"Venue","summary":"Retrieve a venue","description":"One venue. 404 when there is no such venue.","x-access":[],"x-models":["Venue"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the venue."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-venues-id","tags":["Events"],"x-section":"Venue","summary":"Update a venue","description":"Updates a venue. Answers the venue, or 404.","x-access":["user"],"x-models":["Venue"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the venue."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Venue"}}}}},"delete":{"operationId":"delete-venues-id","tags":["Events"],"x-section":"Venue","summary":"Delete a venue","description":"Deletes a venue. Answers the deleted venue. Its seating plans and events keep pointing at it.","x-access":["user"],"x-models":["Venue"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the venue."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/create-new-seating-plan":{"post":{"operationId":"post-create-new-seating-plan","tags":["Events"],"x-section":"AI builder","summary":"Create a seating plan with AI","description":"AI: designs a seating plan for one of the venues. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the seating plan, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"item_id":{"type":"string","description":"The ID of the seating plan to change."}}}}}}}},"/generate-seating-plan":{"post":{"operationId":"post-generate-seating-plan","tags":["Events"],"x-section":"AI builder","summary":"Generate a seating plan with AI","description":"AI: routes a request for a seating plan to create-new-seating-plan. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the seating plan, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/modify-seating-plan":{"post":{"operationId":"post-modify-seating-plan","tags":["Events"],"x-section":"AI builder","summary":"Modify a seating plan with AI","description":"AI: routes a change to a seating plan. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the seating plan, in plain words - any language."},"item_data":{"type":"string","description":"The current seating plan, as JSON - the AI changes it and returns the result."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/collections":{"get":{"operationId":"get-collections","tags":["Collections"],"x-section":"Collection","summary":"List all collections","description":"Categories and filters; ?type for one kind (product, service, blogpost...). Ordered by position, then name.","x-access":[],"x-models":["Collection"],"parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"Only collections with this type."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-collections","tags":["Collections"],"x-section":"Collection","summary":"Create a collection","description":"Creates a category or filter, placed last in its kind's order; createNav also adds it to the navigation. The name's prefix says where it shows (product/, service/, blogpost/...; see the Collection model). Answers 201 with the category.","x-access":["admin"],"x-models":["Collection","SiteMenu"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"createNav":{"type":"string","description":"The collection's create nav."}}}}}}}},"/collections-reorder":{"patch":{"operationId":"patch-collections-reorder","tags":["Collections"],"x-section":"Collection","summary":"Reorder collections","description":"Persist a new display order for a set of collections. Send items: [{ _id, position }]. 400 \"No items\" for an empty list. Answers 200.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"string","description":"The collection's items."}}}}}}}},"/collections/{id}":{"get":{"operationId":"get-collections-id","tags":["Collections"],"x-section":"Collection","summary":"Retrieve a collection","description":"One category, with the grouping filters inside it. With the grouping filters that sit in it or in no category. 404 when there is no such category.","x-access":[],"x-models":["Collection"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the collection."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-collections-id","tags":["Collections"],"x-section":"Collection","summary":"Update a collection","description":"Updates a category. Fields outside the allowed list are ignored. A rename also renames the navigation entry that links to it. Answers the category, or 404.","x-access":["admin"],"x-models":["Collection","SiteMenu"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the collection."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}}}},"delete":{"operationId":"delete-collections-id","tags":["Collections"],"x-section":"Collection","summary":"Delete a collection","description":"Deletes a category. Answers the deleted category. Items in it keep its id as collection_id, and a navigation entry linking to it stays: remove those separately.","x-access":["admin"],"x-models":["Collection"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the collection."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/collections/{id}/media":{"get":{"operationId":"get-collections-id-media","tags":["Collections"],"x-section":"Collection","summary":"Retrieve a collection","description":"A category's picture. Answers the picture's media id, or 404.","x-access":[],"x-models":["Collection"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the collection."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-collections-id-media","tags":["Collections"],"x-section":"Collection","summary":"Create a collection","description":"Uploads a category's picture (media, form field). Multipart upload; becomes the category's picture.","x-access":["admin"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the collection."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]},"delete":{"operationId":"delete-collections-id-media","tags":["Collections"],"x-section":"Collection","summary":"Delete a collection","description":"Removes a category's picture. Deletes the media record too.","x-access":["admin"],"x-models":["Collection","Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the collection."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/boxnow-offices":{"get":{"operationId":"get-boxnow-offices","tags":["Orders & checkout"],"x-section":"Boxnow Settings","summary":"List all boxnow offices","description":"BoxNow lockers. Reads no token.","x-access":[],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/boxnow-settings":{"post":{"operationId":"post-boxnow-settings","tags":["Orders & checkout"],"x-section":"Boxnow Settings","summary":"Create a boxnow setting","description":"Connects BoxNow delivery, for the user or an account they manage (on_behalf_of). 403 for an account the user may not manage. Answers the settings.","x-access":["user"],"x-models":["ConnectedAccount","BoxNowSettings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"on_behalf_of":{"type":"string","description":"The boxnow setting's on behalf of."}}}}}}}},"/boxnow-settings/{delivery}":{"get":{"operationId":"get-boxnow-settings-delivery","tags":["Orders & checkout"],"x-section":"Boxnow Settings","summary":"List all boxnow settings","description":"The BoxNow settings of a delivery setting. delivery is the Shipping.id the settings belong to.","x-access":["user"],"x-models":["BoxNowSettings"],"parameters":[{"name":"delivery","in":"path","required":true,"schema":{"type":"string"},"description":"The boxnow setting's delivery."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/boxnow-settings/{id}":{"patch":{"operationId":"patch-boxnow-settings-id","tags":["Orders & checkout"],"x-section":"Boxnow Settings","summary":"Update a boxnow setting","description":"Updates the BoxNow settings. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["user"],"x-models":["BoxNowSettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the boxnow setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoxNowSettings"}}}}},"delete":{"operationId":"delete-boxnow-settings-id","tags":["Orders & checkout"],"x-section":"Boxnow Settings","summary":"Delete a boxnow setting","description":"Disconnects BoxNow delivery. 403 when they are another user's.","x-access":["user"],"x-models":["BoxNowSettings","ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the boxnow setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/boxnow-shipping-id/{id}":{"patch":{"operationId":"patch-boxnow-shipping-id-id","tags":["Orders & checkout"],"x-section":"Boxnow Settings","summary":"Update a boxnow shipping","description":"Links the BoxNow settings to a delivery setting (shipping). 404 when there are no such settings.","x-access":["user"],"x-models":["BoxNowSettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the boxnow shipping."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"shipping":{"type":"string","description":"The boxnow shipping's shipping."}}}}}}}},"/carts":{"get":{"operationId":"get-carts","tags":["Orders & checkout"],"x-section":"Cart","summary":"List all carts","description":"Every cart. Every visitor's cart.","x-access":["user"],"x-models":["Cart"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-carts","tags":["Orders & checkout"],"x-section":"Cart","summary":"Create a cart","description":"Creates a cart. Visitors' carts are made by POST /carts/flow; this is for admin tools. Answers 201.","x-access":["user"],"x-models":["Cart"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Cart"}}}}}},"/carts/{id}":{"patch":{"operationId":"patch-carts-id","tags":["Orders & checkout"],"x-section":"Cart","summary":"Update a cart","description":"Updates a cart. Answers the updated cart, or 404.","x-access":["user"],"x-models":["Cart"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the cart."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Cart"}}}}},"delete":{"operationId":"delete-carts-id","tags":["Orders & checkout"],"x-section":"Cart","summary":"Delete a cart","description":"Deletes a cart. Answers the deleted cart, or 404.","x-access":["user"],"x-models":["Cart"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the cart."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/carts/count":{"get":{"operationId":"get-carts-count","tags":["Orders & checkout"],"x-section":"Cart","summary":"Count carts","description":"How many items are in the visitor's cart, for the header badge; ?total for the total too. Answers { qty } or { qty, total } with the total to 2 decimals. Not cached, so it stays right on cached pages.","x-access":[],"x-models":["Cart","Product"],"parameters":[{"name":"total","in":"query","required":false,"schema":{"type":"string"},"description":"Only carts with this total."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/my_carts":{"get":{"operationId":"get-my-carts","tags":["Orders & checkout"],"x-section":"Cart","summary":"List all carts","description":"The visitor's cart page, or the cart as JSON with ?ionic (?sessionId). Each item with its product, category and stock. The cart is found by the visitor's session, or ?sessionId in the app.","x-access":["optional-user"],"x-models":["Cart","Product","Collection","Inventory","Coupon","MyContact","SocialModeSettings","Shipping","EcontSettings","SpeedySettings","BoxNowSettings","RatingSettings","Rating"],"parameters":[{"name":"sessionId","in":"query","required":false,"schema":{"type":"string"},"description":"Only carts with this session id."},{"name":"pending_coupon","in":"query","required":false,"schema":{"type":"string"},"description":"Only carts with this pending coupon."},{"name":"region","in":"query","required":false,"schema":{"type":"string"},"description":"Only carts with this region."},{"name":"cart_only","in":"query","required":false,"schema":{"type":"string"},"description":"Only carts with this cart only."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/econt-settings":{"post":{"operationId":"post-econt-settings","tags":["Orders & checkout"],"x-section":"Econt Settings","summary":"Create an econt setting","description":"Connects Econt delivery, for the user or an account they manage (on_behalf_of). 403 for an account the user may not manage. Answers the settings.","x-access":["user"],"x-models":["ConnectedAccount","EcontSettings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"on_behalf_of":{"type":"string","description":"The econt setting's on behalf of."}}}}}}}},"/econt-settings/{delivery}":{"get":{"operationId":"get-econt-settings-delivery","tags":["Orders & checkout"],"x-section":"Econt Settings","summary":"List all econt settings","description":"The Econt settings of a delivery setting. delivery is the Shipping.id the settings belong to.","x-access":["user"],"x-models":["EcontSettings"],"parameters":[{"name":"delivery","in":"path","required":true,"schema":{"type":"string"},"description":"The econt setting's delivery."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/econt-settings/{id}":{"patch":{"operationId":"patch-econt-settings-id","tags":["Orders & checkout"],"x-section":"Econt Settings","summary":"Update an econt setting","description":"Updates the Econt settings. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["user"],"x-models":["EcontSettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the econt setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EcontSettings"}}}}}},"/econt-shipping-id/{id}":{"patch":{"operationId":"patch-econt-shipping-id-id","tags":["Orders & checkout"],"x-section":"Econt Settings","summary":"Update an econt shipping","description":"Links the Econt settings to a delivery setting (shipping). 404 when there are no such settings.","x-access":["user"],"x-models":["EcontSettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the econt shipping."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"shipping":{"type":"string","description":"The econt shipping's shipping."}}}}}}}},"/abandoned-orders":{"get":{"operationId":"get-abandoned-orders","tags":["Orders & checkout"],"x-section":"Order","summary":"List all abandoned orders","description":"Orders left at checkout. Orders that were started but not finalized.","x-access":["user"],"x-models":["Order"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/orders":{"get":{"operationId":"get-orders","tags":["Orders & checkout"],"x-section":"Order","summary":"List all orders","description":"The orders. Newest first.","x-access":["user"],"x-models":["Order"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-orders","tags":["Orders & checkout"],"x-section":"Order","summary":"Create an order","description":"Creates an order from the cart's products. Reads no token. The order is not finalized until payment: see POST /checkout and PATCH /finalize-order.","x-access":[],"x-models":["Order"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"products":{"type":"array","items":{"type":"string"},"description":"Product ids ordered."}}}}}}}},"/orders/{id}":{"get":{"operationId":"get-orders-id","tags":["Orders & checkout"],"x-section":"Order","summary":"Retrieve an order","description":"One order. Reads no token: anyone who knows the id can read it.","x-access":[],"x-models":["Order"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the order."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/origin-address":{"get":{"operationId":"get-origin-address","tags":["Orders & checkout"],"x-section":"Origin Address","summary":"Retrieve the origin address","description":"The origin addresses. Answers an array of every record.","x-access":[],"x-models":["OriginAddress"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-origin-address","tags":["Orders & checkout"],"x-section":"Origin Address","summary":"Create an origin address","description":"Creates an origin address (warehouse, office). Answers 201 with no body.","x-access":["admin"],"x-models":["OriginAddress"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OriginAddress"}}}}}},"/origin-address/{id}":{"get":{"operationId":"get-origin-address-id","tags":["Orders & checkout"],"x-section":"Origin Address","summary":"Retrieve an origin address","description":"One origin address. Answers null when there is no such address.","x-access":[],"x-models":["OriginAddress"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the origin address."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-origin-address-id","tags":["Orders & checkout"],"x-section":"Origin Address","summary":"Update an origin address","description":"Updates an origin address. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["OriginAddress"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the origin address."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OriginAddress"}}}}},"delete":{"operationId":"delete-origin-address-id","tags":["Orders & checkout"],"x-section":"Origin Address","summary":"Delete an origin address","description":"Deletes an origin address. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["OriginAddress"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the origin address."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/checkout":{"post":{"operationId":"post-checkout","tags":["Orders & checkout"],"x-section":"Payment","summary":"Create a checkout","description":"Starts the card payment for an order (order_id): answers the Stripe payment intent. Answers 201 { clientSecret } for the card form. The money goes to the site's Stripe account, or the seller's in a marketplace, minus the platform commission. For tickets, each seat is checked first: 404 when a ticket or seat is gone, 400 \"Seat already taken\".","x-access":[],"x-models":["PaymentMethod","SocialModeSettings","Order","Ticket","Event","Product","Program","Donation","UserPaymentSettings","Lead","Cart","Tax"],"parameters":[{"name":"sessionId","in":"query","required":false,"schema":{"type":"string"},"description":"Only checkouts with this session id."}],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"order_id":{"type":"string","description":"The checkout's order id."},"use_admin_pm":{"type":"string","description":"The checkout's use admin pm."}}}}}}}},"/client_token":{"get":{"operationId":"get-client-token","tags":["Orders & checkout"],"x-section":"Payment","summary":"Retrieve the client token","description":"A payment client token for the checkout form. Answers { publishableKey }: the Stripe key the card form needs.","x-access":[],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/finalize-order":{"patch":{"operationId":"patch-finalize-order","tags":["Orders & checkout"],"x-section":"Payment","summary":"Update the finalize order","description":"Completes an order after payment (order_id, payment_intent): marks it paid, takes stock, issues tickets and emails both sides. For card orders, checks with Stripe that the payment succeeded and belongs to this order (401 otherwise). Takes the items from stock and marks held tickets paid.","x-access":[],"x-models":["Order","User","Inventory","Ticket","Event","Product","Program","Donation","Post","Lead","PaymentMethod","QrCode"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"order_id":{"type":"string","description":"The finalize order's order id."},"payment_intent":{"type":"string","description":"The finalize order's payment intent."},"ads_credits":{"type":"string","description":"The finalize order's ads credits."},"user_id":{"type":"string","description":"The finalize order's user id."},"post_id":{"type":"string","description":"The finalize order's post id."}}}}}}}},"/payment":{"get":{"operationId":"get-payment","tags":["Orders & checkout"],"x-section":"Payment","summary":"Retrieve the payment","description":"The checkout page for an order (?order_id). An order already finalized redirects to its receipt (or answers { finalized: true } in the app).","x-access":["optional-user"],"x-models":["Order","MyContact","SocialModeSettings","Cart","Ticket","Coupon","PaymentMethod","Lead","User","Product","Collection","Inventory","Post","Program","Event","Donation","Shipping","UserPaymentSettings","EcontSettings","SpeedySettings","BoxNowSettings","Tax","InvoiceSettings","PriceQuote"],"parameters":[{"name":"order_id","in":"query","required":false,"schema":{"type":"string"},"description":"Only payments with this order id."},{"name":"skip_check","in":"query","required":false,"schema":{"type":"string"},"description":"Only payments with this skip check."},{"name":"sessionId","in":"query","required":false,"schema":{"type":"string"},"description":"Only payments with this session id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/payment-receipt":{"get":{"operationId":"get-payment-receipt","tags":["Orders & checkout"],"x-section":"Payment","summary":"Retrieve the payment receipt","description":"An order's receipt page. With the order's items, tickets and the receipt page settings. JSON with ?ionic.","x-access":["optional-user"],"x-models":["Order","PaymentMethod","SocialModeSettings","AboutPage","Product","Program","Ticket","Event","QrCode","Donation","Shipping","Tax"],"parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string"},"description":"The ID of the payment receipt."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/ticket-pdf/{id}":{"get":{"operationId":"get-ticket-pdf-id","tags":["Orders & checkout"],"x-section":"Payment","summary":"Retrieve a ticket pdf","description":"An order's tickets as a PDF with their QR codes. Also emails the tickets to the customer.","x-access":["optional-user"],"x-models":["Order","Ticket","Event","QrCode","PaymentMethod","Theme","MyContact"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the ticket pdf."},{"name":"download_only","in":"query","required":false,"schema":{"type":"string"},"description":"Only ticket pdfs with this download only."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/merchant_account_link/{status}/{id}":{"get":{"operationId":"get-merchant-account-link-status-id","tags":["Orders & checkout"],"x-section":"Payment Metod","summary":"Retrieve a merchant account link","description":"A link to finish or manage the Stripe account. status says which: a link to finish onboarding, or to the Stripe dashboard once the account is active. Answers the link.","x-access":["admin"],"parameters":[{"name":"status","in":"path","required":true,"schema":{"type":"string"},"description":"The merchant account link's status."},{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the merchant account link."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/payment_methods":{"get":{"operationId":"get-payment-methods","tags":["Orders & checkout"],"x-section":"Payment Metod","summary":"List all payment methods","description":"The payment settings. Answers the settings with the Stripe account's state.","x-access":["admin"],"x-models":["PaymentMethod"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-payment-methods","tags":["Orders & checkout"],"x-section":"Payment Metod","summary":"Create a payment method","description":"Creates the payment settings. A site has one; update it with PATCH instead. Answers 201.","x-access":["admin"],"x-models":["PaymentMethod"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethod"}}}}}},"/payment_methods/{id}":{"get":{"operationId":"get-payment-methods-id","tags":["Orders & checkout"],"x-section":"Payment Metod","summary":"Retrieve a payment method","description":"The payment settings by id. 404 when there is no such record.","x-access":["admin"],"x-models":["PaymentMethod"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the payment method."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-payment-methods-id","tags":["Orders & checkout"],"x-section":"Payment Metod","summary":"Update a payment method","description":"Updates the payment settings, creating the Stripe account when card payment is turned on. Turning card payment on the first time creates the site's Stripe account; finish it with GET /merchant_account_link. Changing the second currency fetches its rate. Answers the settings, or 404.","x-access":["admin"],"x-models":["PaymentMethod"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the payment method."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"has_card":{"type":"boolean","description":"Card payment is offered."},"email":{"type":"string","description":"An email address."},"country":{"type":"string","description":"The business's country for payments."}}}}}}},"delete":{"operationId":"delete-payment-methods-id","tags":["Orders & checkout"],"x-section":"Payment Metod","summary":"Delete a payment method","description":"Deletes the payment settings. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["PaymentMethod"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the payment method."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/receipt-adjustments":{"get":{"operationId":"get-receipt-adjustments","tags":["Orders & checkout"],"x-section":"Receipt Adjustment","summary":"List all receipt adjustments","description":"The receipt page settings. Answers an array of every record.","x-access":["admin"],"x-models":["ReceiptAdjustment"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-receipt-adjustments","tags":["Orders & checkout"],"x-section":"Receipt Adjustment","summary":"Create a receipt adjustment","description":"Creates a receipt page setting. Answers 201 with no body.","x-access":["admin"],"x-models":["ReceiptAdjustment"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReceiptAdjustment"}}}}}},"/receipt-adjustments/{id}":{"get":{"operationId":"get-receipt-adjustments-id","tags":["Orders & checkout"],"x-section":"Receipt Adjustment","summary":"Retrieve a receipt adjustment","description":"The receipt page settings by id. 404 when there is no such record.","x-access":["admin"],"x-models":["ReceiptAdjustment"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the receipt adjustment."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/shippings":{"get":{"operationId":"get-shippings","tags":["Orders & checkout"],"x-section":"Shipping","summary":"List all shippings","description":"The delivery settings of every region. Answers an array of every record.","x-access":[],"x-models":["Shipping"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-shippings","tags":["Orders & checkout"],"x-section":"Shipping","summary":"Create a shipping","description":"Creates a delivery setting. Answers 201 { shipping }. 403 when creating for an account the user may not manage.","x-access":["user"],"x-models":["ConnectedAccount","Shipping"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"on_behalf_of":{"type":"string","description":"The shipping's on behalf of."}}}}}}}},"/shippings-by-id/{id}":{"get":{"operationId":"get-shippings-by-id-id","tags":["Orders & checkout"],"x-section":"Shipping","summary":"Retrieve a shipping","description":"One region's delivery settings. 404 when there is no such record.","x-access":[],"x-models":["Shipping"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the shipping."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/shippings/{id}":{"patch":{"operationId":"patch-shippings-id","tags":["Orders & checkout"],"x-section":"Shipping","summary":"Update a shipping","description":"Updates a delivery setting. Answers the settings. 403 when they are another user's.","x-access":["user"],"x-models":["Shipping","ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the shipping."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Shipping"}}}}},"delete":{"operationId":"delete-shippings-id","tags":["Orders & checkout"],"x-section":"Shipping","summary":"Delete a shipping","description":"Deletes a delivery setting. Answers the deleted settings. 403 when they are another user's.","x-access":["user"],"x-models":["Shipping","ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the shipping."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/shippings/{region}":{"get":{"operationId":"get-shippings-region","tags":["Orders & checkout"],"x-section":"Shipping","summary":"List all shippings","description":"The delivery settings of a region. 404 when the region has no delivery settings.","x-access":[],"x-models":["Shipping"],"parameters":[{"name":"region","in":"path","required":true,"schema":{"type":"string"},"description":"The region this delivery setting is for."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/speedy-integration/{order}":{"get":{"operationId":"get-speedy-integration-order","tags":["Orders & checkout"],"x-section":"Speedy Settings","summary":"List all speedy integrations","description":"The Speedy delivery price and options for an order. Answers { hasIntegration } and, when there is one, the price and options.","x-access":[],"x-models":["Order","SocialModeSettings","Product","Shipping","SpeedySettings"],"parameters":[{"name":"order","in":"path","required":true,"schema":{"type":"string"},"description":"The speedy integration's order."},{"name":"productId","in":"query","required":false,"schema":{"type":"string"},"description":"Only speedy integrations with this product id."},{"name":"region","in":"query","required":false,"schema":{"type":"string"},"description":"Only speedy integrations with this region."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/speedy-login/{delivery}/{username}/{password}":{"get":{"operationId":"get-speedy-login-delivery-username-password","tags":["Orders & checkout"],"x-section":"Speedy Settings","summary":"Sign in","description":"Checks Speedy credentials and saves the client contract. The username and password travel in the path, so they land in access logs.","x-access":["user"],"x-models":["SpeedySettings"],"parameters":[{"name":"delivery","in":"path","required":true,"schema":{"type":"string"},"description":"The speedy login's delivery."},{"name":"username","in":"path","required":true,"schema":{"type":"string"},"description":"The speedy login's username."},{"name":"password","in":"path","required":true,"schema":{"type":"string"},"description":"The account password."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/speedy-offices-by-product/{product}/{country}/{city}":{"get":{"operationId":"get-speedy-offices-by-product-product-country-city","tags":["Orders & checkout"],"x-section":"Speedy Settings","summary":"List all speedy offices products","description":"Speedy offices in a city that a product can be delivered to. An empty list when the seller has no Speedy delivery. Reads no token.","x-access":[],"x-models":["Product","SocialModeSettings","Shipping"],"parameters":[{"name":"product","in":"path","required":true,"schema":{"type":"string"},"description":"The speedy offices product's product."},{"name":"country","in":"path","required":true,"schema":{"type":"string"},"description":"The speedy offices product's country."},{"name":"city","in":"path","required":true,"schema":{"type":"string"},"description":"The speedy offices product's city."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/speedy-offices/{delivery}/{country}/{city}":{"get":{"operationId":"get-speedy-offices-delivery-country-city","tags":["Orders & checkout"],"x-section":"Speedy Settings","summary":"List all speedy offices","description":"Speedy offices in a city. Reads no token: the checkout calls it.","x-access":[],"parameters":[{"name":"delivery","in":"path","required":true,"schema":{"type":"string"},"description":"The speedy office's delivery."},{"name":"country","in":"path","required":true,"schema":{"type":"string"},"description":"The speedy office's country."},{"name":"city","in":"path","required":true,"schema":{"type":"string"},"description":"The speedy office's city."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/speedy-offices/{order}":{"get":{"operationId":"get-speedy-offices-order","tags":["Orders & checkout"],"x-section":"Speedy Settings","summary":"List all speedy offices","description":"Speedy offices an order can be delivered to. An empty list when the seller has no Speedy delivery. Reads no token.","x-access":[],"x-models":["Order","SocialModeSettings","Product","Shipping"],"parameters":[{"name":"order","in":"path","required":true,"schema":{"type":"string"},"description":"The speedy office's order."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/speedy-services/{delivery}":{"get":{"operationId":"get-speedy-services-delivery","tags":["Orders & checkout"],"x-section":"Speedy Settings","summary":"List all speedy services","description":"The Speedy services the contract offers. Answers { services: [] } when Speedy is not connected.","x-access":["user"],"x-models":["SpeedySettings"],"parameters":[{"name":"delivery","in":"path","required":true,"schema":{"type":"string"},"description":"The speedy service's delivery."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/speedy-settings":{"post":{"operationId":"post-speedy-settings","tags":["Orders & checkout"],"x-section":"Speedy Settings","summary":"Create a speedy setting","description":"Connects Speedy courier delivery, for the user or an account they manage (on_behalf_of). 403 for an account the user may not manage. Answers { speedySettings }.","x-access":["user"],"x-models":["ConnectedAccount","SpeedySettings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"on_behalf_of":{"type":"string","description":"The speedy setting's on behalf of."}}}}}}}},"/speedy-settings/{delivery}":{"get":{"operationId":"get-speedy-settings-delivery","tags":["Orders & checkout"],"x-section":"Speedy Settings","summary":"List all speedy settings","description":"The Speedy settings of a delivery setting. delivery is the Shipping.id the settings belong to.","x-access":["user"],"x-models":["SpeedySettings"],"parameters":[{"name":"delivery","in":"path","required":true,"schema":{"type":"string"},"description":"The speedy setting's delivery."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/speedy-settings/{id}":{"patch":{"operationId":"patch-speedy-settings-id","tags":["Orders & checkout"],"x-section":"Speedy Settings","summary":"Update a speedy setting","description":"Updates the Speedy settings, checking the sender address with Speedy. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["user"],"x-models":["SpeedySettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the speedy setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"countryId":{"type":"string","description":"The speedy setting's country id."},"siteId":{"type":"string","description":"The speedy setting's site id."},"address":{"type":"string","description":"The speedy setting's address."}}}}}}},"delete":{"operationId":"delete-speedy-settings-id","tags":["Orders & checkout"],"x-section":"Speedy Settings","summary":"Delete a speedy setting","description":"Disconnects Speedy delivery. 403 when they are another user's.","x-access":["user"],"x-models":["SpeedySettings","ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the speedy setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/speedy-shipping-id/{id}":{"patch":{"operationId":"patch-speedy-shipping-id-id","tags":["Orders & checkout"],"x-section":"Speedy Settings","summary":"Update a speedy shipping","description":"Links the Speedy settings to a delivery setting (shipping). 404 when there are no such settings.","x-access":["user"],"x-models":["SpeedySettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the speedy shipping."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"shipping":{"type":"string","description":"The speedy shipping's shipping."}}}}}}}},"/validate-speedy-address/{order}":{"post":{"operationId":"post-validate-speedy-address-order","tags":["Orders & checkout"],"x-section":"Speedy Settings","summary":"Validate a speedy address","description":"Checks an order's delivery address with Speedy. Answers Speedy's result, or { valid: false }.","x-access":["user"],"x-models":["Order","SocialModeSettings","Product","Shipping","SpeedySettings"],"parameters":[{"name":"order","in":"path","required":true,"schema":{"type":"string"},"description":"The speedy address's order."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}}}},"/tax":{"get":{"operationId":"get-tax","tags":["Orders & checkout"],"x-section":"Tax","summary":"Retrieve the tax","description":"The tax rates. Answers an array of every tax rate.","x-access":["admin"],"x-models":["Tax"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-tax","tags":["Orders & checkout"],"x-section":"Tax","summary":"Create a tax","description":"Creates a tax rate. Answers 201 with no body.","x-access":["admin"],"x-models":["Tax"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tax"}}}}}},"/tax/{id}":{"get":{"operationId":"get-tax-id","tags":["Orders & checkout"],"x-section":"Tax","summary":"Retrieve a tax","description":"One tax rate. 404 when there is no such record.","x-access":["admin"],"x-models":["Tax"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the tax."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/currency":{"get":{"operationId":"get-currency","tags":["Orders & checkout"],"x-section":"User Payment Settings","summary":"Retrieve the currency","description":"Never reached: GET /currency in payment_metod.js answers first. Answers { currency }.","x-access":[],"x-models":["UserPaymentSettings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/user_merchant_account_link/{status}/{id}":{"get":{"operationId":"get-user-merchant-account-link-status-id","tags":["Orders & checkout"],"x-section":"User Payment Settings","summary":"Retrieve a user merchant account link","description":"A link for the user to finish or manage their Stripe account. Answers the link.","x-access":["user"],"x-models":["MyContact"],"parameters":[{"name":"status","in":"path","required":true,"schema":{"type":"string"},"description":"The user merchant account link's status."},{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user merchant account link."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-payment-settings":{"get":{"operationId":"get-user-payment-settings","tags":["Orders & checkout"],"x-section":"User Payment Settings","summary":"List all user payment settings","description":"The signed-in user's payment settings. With the Stripe account's state.","x-access":["user"],"x-models":["UserPaymentSettings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-user-payment-settings","tags":["Orders & checkout"],"x-section":"User Payment Settings","summary":"Create a user payment setting","description":"Creates the signed-in user's payment settings. Answers 201 with no body.","x-access":["user"],"x-models":["UserPaymentSettings"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPaymentSettings"}}}}}},"/user-payment-settings/{id}":{"get":{"operationId":"get-user-payment-settings-id","tags":["Orders & checkout"],"x-section":"User Payment Settings","summary":"Retrieve a user payment setting","description":"Payment settings by id. 404 when there is no such record.","x-access":["user"],"x-models":["UserPaymentSettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user payment setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-user-payment-settings-id","tags":["Orders & checkout"],"x-section":"User Payment Settings","summary":"Update a user payment setting","description":"Updates the user's payment settings, creating their Stripe account when card payment is turned on. Turning card payment on creates the user's Stripe account; finish it with GET /user_merchant_account_link. Answers the settings, or 404.","x-access":["user"],"x-models":["UserInvoice","UserPaymentSettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user payment setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"has_card":{"type":"boolean","description":"Card payment is offered."},"email":{"type":"string","description":"An email address."},"country":{"type":"string","description":"Country for payments."}}}}}}},"delete":{"operationId":"delete-user-payment-settings-id","tags":["Orders & checkout"],"x-section":"User Payment Settings","summary":"Delete a user payment setting","description":"Deletes the user's payment settings. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["user"],"x-models":["UserPaymentSettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user payment setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/generate-origin-addresses":{"post":{"operationId":"post-generate-origin-addresses","tags":["Orders & checkout"],"x-section":"AI builder","summary":"Generate an origin address with AI","description":"AI: creates the business's origin addresses from the chat. Answers { action: 'JOB', async_job }. It can add, rename and remove addresses as the owner asked. Charged to the account's credits.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the origin address, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/can_alter_invoice_sequence":{"get":{"operationId":"get-can-alter-invoice-sequence","tags":["Invoices"],"x-section":"Invoice","summary":"Retrieve the can alter invoice sequence","description":"Return boolean if invoice sequence can be alteerd. Answers { can_alter_invoice, can_alter_price_quote }: the starting numbers can only change before the first invoice or quote is issued.","x-access":["admin"],"x-models":["Invoice","PriceQuote"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/download-invoice/{id}/{translate}/{filename}":{"get":{"operationId":"get-download-invoice-id-translate-filename","tags":["Invoices"],"x-section":"Invoice","summary":"Retrieve a download invoice","description":"Download invoice. Answers the PDF; translate picks the second language. Reads no token.","x-access":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the download invoice."},{"name":"translate","in":"path","required":true,"schema":{"type":"string"},"description":"The download invoice's translate."},{"name":"filename","in":"path","required":true,"schema":{"type":"string"},"description":"The download invoice's filename."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/invoices/{id}":{"delete":{"operationId":"delete-invoices-id","tags":["Invoices"],"x-section":"Invoice","summary":"Delete an invoice","description":"Deletes an invoice; only the last one can be deleted, so numbering stays continuous. 400 when it is not the last one. Answers the deleted invoice.","x-access":["admin"],"x-models":["Invoice","PriceQuote"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the invoice."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/invoice-settings":{"get":{"operationId":"get-invoice-settings","tags":["Invoices"],"x-section":"Invoice Settings","summary":"List all invoice settings","description":"The invoice settings. The site's one record.","x-access":["admin"],"x-models":["InvoiceSettings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-invoice-settings","tags":["Invoices"],"x-section":"Invoice Settings","summary":"Create an invoice setting","description":"Creates an invoice settings record. A site has one; update it with PATCH instead.","x-access":["admin"],"x-models":["InvoiceSettings"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettings"}}}}}},"/invoice-settings/{id}":{"get":{"operationId":"get-invoice-settings-id","tags":["Invoices"],"x-section":"Invoice Settings","summary":"Retrieve an invoice setting","description":"The invoice settings by id. 404 when there is no such record.","x-access":["admin"],"x-models":["InvoiceSettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the invoice setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-invoice-settings-id","tags":["Invoices"],"x-section":"Invoice Settings","summary":"Update an invoice setting","description":"Updates an invoice settings record. Applies to invoices issued from now on; issued ones keep the details they were made with. Answers the settings, or 404.","x-access":["admin"],"x-models":["Invoice","InvoiceSettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the invoice setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}}}},"/nra-audit-file":{"get":{"operationId":"get-nra-audit-file","tags":["Invoices"],"x-section":"Nra Audit","summary":"Retrieve the NRA audit file","description":"The audit file itself, as a windows-1251 XML attachment. For the Bulgarian revenue agency (НАП). 400 with the reasons when the period is invalid, settings are missing or a sale cannot be reported.","x-access":["admin"],"parameters":[{"name":"month","in":"query","required":false,"schema":{"type":"string"},"description":"Only NRA audit files with this month."},{"name":"year","in":"query","required":false,"schema":{"type":"string"},"description":"Only NRA audit files with this year."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/nra-audit-summary":{"get":{"operationId":"get-nra-audit-summary","tags":["Invoices"],"x-section":"Nra Audit","summary":"Retrieve the NRA audit summary","description":"Dry run - what the file would contain, without producing it. Takes the same period as the file. Answers its totals and the errors that would stop it. 400 for an invalid period.","x-access":["admin"],"parameters":[{"name":"month","in":"query","required":false,"schema":{"type":"string"},"description":"Only NRA audit summaries with this month."},{"name":"year","in":"query","required":false,"schema":{"type":"string"},"description":"Only NRA audit summaries with this year."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/nra-settings":{"get":{"operationId":"get-nra-settings","tags":["Invoices"],"x-section":"Nra Audit","summary":"List all NRA settings","description":"Current NRA audit-file settings, with the default payment map. With the default payment code map, for fields not yet set.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-nra-settings","tags":["Invoices"],"x-section":"Nra Audit","summary":"Create a NRA setting","description":"Create or update the tenant's NRA audit-file settings. Answers the saved settings.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}}}},"/recurring-invoices":{"get":{"operationId":"get-recurring-invoices","tags":["Invoices"],"x-section":"Recurring Invoice","summary":"List all recurring invoices","description":"All recurring invoices, the next due first. Answers an array of every record.","x-access":["admin"],"x-models":["RecurringInvoice"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-recurring-invoices","tags":["Invoices"],"x-section":"Recurring Invoice","summary":"Create a recurring invoice","description":"Creates a recurring invoice; its first run is the start date, or the next one after now. 400 \"start_date is required\". Answers 201 with it.","x-access":["admin"],"x-models":["RecurringInvoice"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice"}}}}}},"/recurring-invoices/{id}":{"get":{"operationId":"get-recurring-invoices-id","tags":["Invoices"],"x-section":"Recurring Invoice","summary":"Retrieve a recurring invoice","description":"One recurring invoice. 404 when there is no such record.","x-access":["admin"],"x-models":["RecurringInvoice"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the recurring invoice."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-recurring-invoices-id","tags":["Invoices"],"x-section":"Recurring Invoice","summary":"Update a recurring invoice","description":"Updates a recurring invoice; a schedule change, or switching it on, reschedules it. Answers it, or 404.","x-access":["admin"],"x-models":["RecurringInvoice"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the recurring invoice."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice"}}}}},"delete":{"operationId":"delete-recurring-invoices-id","tags":["Invoices"],"x-section":"Recurring Invoice","summary":"Delete a recurring invoice","description":"Deletes a recurring invoice; the quotes and invoices it already made stay. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["RecurringInvoice"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the recurring invoice."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/recurring-invoices/{id}/run":{"post":{"operationId":"post-recurring-invoices-id-run","tags":["Invoices"],"x-section":"Recurring Invoice","summary":"Create a recurring invoice","description":"Creates a recurring invoice from the fields sent. auto_send), outside the schedule, which it leaves as it is.","x-access":["admin"],"x-models":["RecurringInvoice"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the recurring invoice."}],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/owner-price-plan":{"get":{"operationId":"get-owner-price-plan","tags":["Price plans & subscriptions"],"x-section":"Price Plan","summary":"Retrieve the owner price plan","description":"One of the signed-in user's price plans (?id). 404 when there is no such plan.","x-access":["user"],"x-models":["PricePlan"],"parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string"},"description":"The ID of the owner price plan."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/price-plan":{"get":{"operationId":"get-price-plan","tags":["Price plans & subscriptions"],"x-section":"Price Plan","summary":"Retrieve the price plan","description":"The price plans page, or the plans as JSON with ?ionic. Paged with ?skip. Cached for an hour.","x-access":[],"x-models":["SocialModeSettings","PricePlan","AboutPage"],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"string"},"description":"How many results to skip - for paging."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-price-plan","tags":["Price plans & subscriptions"],"x-section":"Price Plan","summary":"Create a price plan","description":"Creates a price plan. Also creates its Stripe product, recurring price (recurring_options: interval, interval_count) and payment link. Answers 201 with the payment link. 403 without a professional account where social mode requires one.","x-access":["user"],"x-models":["PaymentMethod","MyContact","SocialModeSettings","ProfessionalAccount","ConnectedAccount","PricePlan"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"on_behalf_of":{"type":"string","description":"The price plan's on behalf of."},"name":{"type":"string","description":"The plan's name."},"description":{"type":"string","description":"What the plan gives."},"image":{"type":"string","description":"Media.id."},"price":{"type":"number","description":"Price per period."},"recurring_options":{"type":"string","description":"The price plan's recurring options."},"days":{"type":"string","description":"The price plan's days."},"free_trial_days":{"type":"number","description":"Days free before the first payment."},"billing_address_collection":{"type":"string","description":"Wheter to collect billing information."}}}}}}}},"/price-plan/{id}":{"get":{"operationId":"get-price-plan-id","tags":["Price plans & subscriptions"],"x-section":"Price Plan","summary":"Retrieve a price plan","description":"A price plan's page, with the user's saved cards. Answers { price_plan, payment_methods } in the app.","x-access":["optional-user","user"],"x-models":["PricePlan"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the price plan."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-price-plan-id","tags":["Price plans & subscriptions"],"x-section":"Price Plan","summary":"Update a price plan","description":"Updates a price plan and its Stripe product. The Stripe product's name, description and picture follow. Answers the plan, or 404.","x-access":["user"],"x-models":["PricePlan"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the price plan."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"image":{"type":"string","description":"Media.id."}}}}}}},"delete":{"operationId":"delete-price-plan-id","tags":["Price plans & subscriptions"],"x-section":"Price Plan","summary":"Delete a price plan","description":"Deletes a price plan. Deactivates its Stripe price, product and payment link; existing subscribers are not cancelled. Answers the deleted plan.","x-access":["user"],"x-models":["PricePlan","ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the price plan."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/billings":{"get":{"operationId":"get-billings","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"List all billings","description":"The signed-in user's Stripe invoices. Answers { billings } from Stripe.","x-access":["user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/billings-pdf":{"get":{"operationId":"get-billings-pdf","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"Retrieve the billings pdf","description":"The site's invoices between ?startDate and ?endDate as one PDF (?translate for the second language). Invoices are read from Stripe and put into one PDF.","x-access":["user"],"x-models":["Invoice"],"parameters":[{"name":"startDate","in":"query","required":false,"schema":{"type":"string"},"description":"Only billings pdfs with this start date."},{"name":"endDate","in":"query","required":false,"schema":{"type":"string"},"description":"Only billings pdfs with this end date."},{"name":"translate","in":"query","required":false,"schema":{"type":"string"},"description":"Only billings pdfs with this translate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/billings/{id}/{name}":{"get":{"operationId":"get-billings-id-name","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"Retrieve a billing","description":"One invoice as a PDF. A missing invoice renders the missing-invoice page with 404.","x-access":[],"x-models":["Invoice"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the billing."},{"name":"name","in":"path","required":true,"schema":{"type":"string"},"description":"The billing's name."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/cancel_all_subscriptions/{user_id}":{"post":{"operationId":"post-cancel-all-subscriptions-user-id","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"Create a subscription","description":"Cancels every subscription of a user. Cancels each one in Stripe at once and deletes the records.","x-access":["user"],"x-models":["User","Subscription"],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string"},"description":"Id of user who subscribet to price plan."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/cancel_subscription/{subscription_id}":{"post":{"operationId":"post-cancel-subscription-subscription-id","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"Create a subscription","description":"Cancels one of the signed-in user's subscriptions. Cancels it in Stripe at once. Answers true, or 404 false when it is not found.","x-access":["user"],"x-models":["Subscription","PricePlan"],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string"},"description":"The subscription's subscription id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/create_subscription":{"post":{"operationId":"post-create-subscription","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"Create a create subscription","description":"Subscribes the signed-in user to a price plan with a saved card, replacing their subscription to another plan of the same owner. Answers 201 true. A current subscription to another plan of the same owner is cancelled in Stripe first, so the user moves between plans rather than paying twice.","x-access":["user","optional-user"],"x-models":["Subscription","PricePlan","PaymentMethod"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"subscription_id":{"type":"string","description":"The create subscription's subscription id."},"payment_intent":{"type":"string","description":"The create subscription's payment intent."}}}}}}}},"/create_subscription_dpm":{"post":{"operationId":"post-create-subscription-dpm","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"Create a create subscription dpm","description":"Subscribes the signed-in user to a price plan, creating the Stripe customer and payment, and answers what the card form needs. 403 when the plan is disabled or the user already has it. The Stripe subscription waits on the first payment, which the card form completes.","x-access":["user","optional-user"],"x-models":["NewsletterContact","MyContact","PaymentMethod","PricePlan","User","SocialModeSettings","UserPaymentSettings","Subscription"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"newsletter":{"type":"string","description":"The create subscription dpm's newsletter."},"age":{"type":"string","description":"The create subscription dpm's age."},"city":{"type":"string","description":"The create subscription dpm's city."},"price_plan":{"type":"string","description":"The create subscription dpm's price plan."},"payment_method":{"type":"string","description":"The create subscription dpm's payment method."}}}}}}}},"/invoices":{"get":{"operationId":"get-invoices","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"List all invoices","description":"Stripe invoices between ?startDate and ?endDate, for ?customer, as PDFs. Read from Stripe.","x-access":["user"],"parameters":[{"name":"endDate","in":"query","required":false,"schema":{"type":"string"},"description":"Only invoices with this end date."},{"name":"startDate","in":"query","required":false,"schema":{"type":"string"},"description":"Only invoices with this start date."},{"name":"customer","in":"query","required":false,"schema":{"type":"string"},"description":"Only invoices with this customer."},{"name":"language","in":"query","required":false,"schema":{"type":"string"},"description":"Only invoices with this language."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/new_payment_method":{"post":{"operationId":"post-new-payment-method","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"Create a payment method","description":"Starts saving a new card: answers a Stripe setup intent. Answers 201 { clientSecret }; then call PATCH /payment_method/:setup_intent/:old_payment_method.","x-access":["optional-user","user"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/payment_method":{"post":{"operationId":"post-payment-method","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"Create a payment method","description":"Saves the signed-in user's card and subscribes them, signing them up to the newsletter when asked. Answers 201 { clientSecret } of the first invoice's payment. 403 when the plan is disabled.","x-access":["optional-user","user"],"x-models":["MyContact","NewsletterContact","PricePlan","PaymentMethod","SocialModeSettings","User","UserPaymentSettings","Subscription"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"newsletter":{"type":"string","description":"The payment method's newsletter."},"age":{"type":"string","description":"The payment method's age."},"city":{"type":"string","description":"The payment method's city."},"price_plan":{"type":"string","description":"The payment method's price plan."}}}}}}}},"/payment_method/{id}":{"get":{"operationId":"get-payment-method-id","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"Retrieve a payment method","description":"One saved card. Read from Stripe.","x-access":["user"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the payment method."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"delete":{"operationId":"delete-payment-method-id","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"Delete a payment method","description":"Removes a saved card. Answers true.","x-access":["user"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the payment method."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/payment_method/{setup_intent}/{old_payment_method}":{"patch":{"operationId":"patch-payment-method-setup-intent-old-payment-method","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"Update the payment method","description":"Replaces a saved card with the one a setup intent saved, and makes it the default. The old card is detached from the Stripe customer.","x-access":["user"],"parameters":[{"name":"setup_intent","in":"path","required":true,"schema":{"type":"string"},"description":"The payment method's setup intent."},{"name":"old_payment_method","in":"path","required":true,"schema":{"type":"string"},"description":"The payment method's old payment method."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/subscription_reciept/{id}":{"get":{"operationId":"get-subscription-reciept-id","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"Retrieve a subscription reciept","description":"A subscription's receipt page. With the plan and the Stripe customer's details.","x-access":[],"x-models":["Subscription","PricePlan"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the subscription reciept."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/subscriptions":{"get":{"operationId":"get-subscriptions","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"List all subscriptions","description":"The signed-in user's subscriptions.","x-access":["user"],"x-models":["Subscription"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-subscriptions","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"Create a subscription","description":"Creates a subscription. Subscriptions are normally made through checkout; this writes a record directly. Answers 201.","x-access":["user"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/subscriptions/{id}":{"get":{"operationId":"get-subscriptions-id","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"Retrieve a subscription","description":"One subscription. 404 when there is no such subscription.","x-access":["user"],"x-models":["Subscription"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the subscription."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/transactions":{"get":{"operationId":"get-transactions","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"List all transactions","description":"The signed-in user's Stripe subscriptions. Answers { subscriptions } from Stripe.","x-access":["user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-billings-pdf":{"get":{"operationId":"get-user-billings-pdf","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"Retrieve the user billings pdf","description":"The signed-in user's invoices to their customers between ?startDate and ?endDate as one PDF. Invoices are read from Stripe and put into one PDF.","x-access":["user"],"x-models":["UserInvoice"],"parameters":[{"name":"startDate","in":"query","required":false,"schema":{"type":"string"},"description":"Only user billings pdfs with this start date."},{"name":"endDate","in":"query","required":false,"schema":{"type":"string"},"description":"Only user billings pdfs with this end date."},{"name":"translate","in":"query","required":false,"schema":{"type":"string"},"description":"Only user billings pdfs with this translate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-billings/{id}/{name}":{"get":{"operationId":"get-user-billings-id-name","tags":["Price plans & subscriptions"],"x-section":"Subscription","summary":"Retrieve a user billing","description":"One of the signed-in user's invoices as a PDF. A missing invoice renders the missing-invoice page with 404.","x-access":["user"],"x-models":["UserInvoice"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user billing."},{"name":"name","in":"path","required":true,"schema":{"type":"string"},"description":"The user billing's name."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/coupon_capture":{"get":{"operationId":"get-coupon-capture","tags":["Coupons & vouchers"],"x-section":"Coupon","summary":"Retrieve the coupon capture","description":"Lightweight endpoint for the ionic app to trigger the couponCapture middleware. The middleware runs before this handler, validates ?coupon= and sets the pending_coupon cookie.","x-access":[],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."}}}},"/coupon_code":{"get":{"operationId":"get-coupon-code","tags":["Coupons & vouchers"],"x-section":"Coupon","summary":"Retrieve the coupon code","description":"The coupon with a code (coupon_code). Reads the code from the request body even though it is a GET. A valid coupon counts one use; 404 when the code is unknown, outside its dates or used up.","x-access":["optional-user"],"x-models":["Coupon"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"coupon_code":{"type":"string","description":"The coupon code's coupon code."}}}}}}}},"/coupon_code/{code}":{"get":{"operationId":"get-coupon-code-code","tags":["Coupons & vouchers"],"x-section":"Coupon","summary":"List all coupon codes","description":"Returns if a coupon is valid. 404 when the code is unknown, outside its dates or used up. A valid one counts a use.","x-access":["optional-user"],"x-models":["Coupon"],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"},"description":"The coupon code's code."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Coupon"}}}}}},"/coupon_info/{code}":{"get":{"operationId":"get-coupon-info-code","tags":["Coupons & vouchers"],"x-section":"Coupon","summary":"List all coupon infos","description":"Returns public coupon details by code without incrementing uses. 404 when the code is unknown. Does not count a use.","x-access":[],"x-models":["Coupon"],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"},"description":"The coupon info's code."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/coupons":{"get":{"operationId":"get-coupons","tags":["Coupons & vouchers"],"x-section":"Coupon","summary":"List all coupons","description":"The coupons. Reads no token, so every coupon code can be listed by anyone.","x-access":[],"x-models":["Coupon"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-coupons","tags":["Coupons & vouchers"],"x-section":"Coupon","summary":"Create a coupon","description":"Creates a coupon. Answers 201 with the coupon.","x-access":["admin"],"x-models":["Coupon"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Coupon"}}}}}},"/coupons/{id}":{"get":{"operationId":"get-coupons-id","tags":["Coupons & vouchers"],"x-section":"Coupon","summary":"Retrieve a coupon","description":"One coupon. 404 when there is no such coupon.","x-access":[],"x-models":["Coupon"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the coupon."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-coupons-id","tags":["Coupons & vouchers"],"x-section":"Coupon","summary":"Update a coupon","description":"Updates a coupon. Fields outside the allowed list are ignored. Answers the coupon, or 404.","x-access":["admin"],"x-models":["Coupon"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the coupon."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Coupon"}}}}},"delete":{"operationId":"delete-coupons-id","tags":["Coupons & vouchers"],"x-section":"Coupon","summary":"Delete a coupon","description":"Deletes a coupon. Answers the deleted coupon, or 404.","x-access":["admin"],"x-models":["Coupon"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the coupon."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/vouchers":{"get":{"operationId":"get-vouchers","tags":["Coupons & vouchers"],"x-section":"Voucher","summary":"List all vouchers","description":"The vouchers. Answers an array of every record.","x-access":[],"x-models":["Voucher"],"parameters":[{"name":"authenticated","in":"query","required":false,"schema":{"type":"string"},"description":"Only vouchers with this authenticated."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/vouchers/{id}":{"get":{"operationId":"get-vouchers-id","tags":["Coupons & vouchers"],"x-section":"Voucher","summary":"Retrieve a voucher","description":"One voucher. 404 when there is no such record.","x-access":["admin"],"x-models":["Voucher"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the voucher."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/custom_forms":{"get":{"operationId":"get-custom-forms","tags":["Leads & forms"],"x-section":"Custom Form","summary":"List all custom forms","description":"The custom forms. Answers an array of every record.","x-access":["admin"],"x-models":["CustomForm"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/custom_forms/{id}":{"get":{"operationId":"get-custom-forms-id","tags":["Leads & forms"],"x-section":"Custom Form","summary":"Retrieve a custom form","description":"One custom form. 404 when there is no such record.","x-access":["admin"],"x-models":["CustomForm"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the custom form."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-custom-forms-id","tags":["Leads & forms"],"x-section":"Custom Form","summary":"Update a custom form","description":"Updates a custom form. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["CustomForm"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the custom form."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomForm"}}}}},"delete":{"operationId":"delete-custom-forms-id","tags":["Leads & forms"],"x-section":"Custom Form","summary":"Delete a custom form","description":"Deletes a custom form. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["CustomForm"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the custom form."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/forms":{"get":{"operationId":"get-forms","tags":["Leads & forms"],"x-section":"Form","summary":"List all forms","description":"Form submissions. Answers an array of every record.","x-access":["admin"],"x-models":["Form"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-forms","tags":["Leads & forms"],"x-section":"Form","summary":"Create a form","description":"Creates a form submission. Multipart with up to 5 files (medias), behind reCAPTCHA. Emails the business; a sender who ticks newsletter (with name and email) is signed up. A website form is sent back to the page it came from.","x-access":["recaptcha"],"x-models":["NewsletterContact","Form"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string","description":"Body of text."},"email":{"type":"string","description":"An email address."}}}}}}}},"/forms/{id}":{"get":{"operationId":"get-forms-id","tags":["Leads & forms"],"x-section":"Form","summary":"Retrieve a form","description":"One form submission. 404 when there is no such record.","x-access":["admin"],"x-models":["Form"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the form."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-forms-id","tags":["Leads & forms"],"x-section":"Form","summary":"Update a form","description":"Updates a form submission. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["Form"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the form."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Form"}}}}},"delete":{"operationId":"delete-forms-id","tags":["Leads & forms"],"x-section":"Form","summary":"Delete a form","description":"Deletes a form submission. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["Form"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the form."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/leads":{"get":{"operationId":"get-leads","tags":["Leads & forms"],"x-section":"Lead","summary":"List all leads","description":"The customers. Answers an array of every record.","x-access":["admin"],"x-models":["Lead"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-leads","tags":["Leads & forms"],"x-section":"Lead","summary":"Create a lead","description":"Creates or updates a customer from a checkout or form, signing them up to the newsletter when asked. Matched by email, then by phone number, so a returning customer is updated rather than duplicated. Reads no token.","x-access":[],"x-models":["Lead","NewsletterContact","Product","Shipping","SocialModeSettings","Ticket","PaymentMethod","Order"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."},"503":{"description":"Used by the lead form when an order is below its minimum value, not only for outages: read the message."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"owner_id":{"type":"string","description":"The lead's owner id."},"split":{"type":"string","description":"The lead's split."},"email":{"type":"string","description":"An email address."},"phone_number":{"type":"string","description":"Customer's phone number."},"organization_name":{"type":"string","description":"Customer's company name."},"firstname":{"type":"string","description":"Customer's first name."},"lastname":{"type":"string","description":"Customer's last name."},"address":{"type":"string","description":"Customer's address."},"city":{"type":"string","description":"Customer's city."},"state":{"type":"string","description":"Customer's state or region."},"country":{"type":"string","description":"Customer's country."},"zip_code":{"type":"string","description":"Customer's postal code."},"tax_identification_number":{"type":"string","description":"Customer's tax number."},"notes":{"type":"string","description":"Notes kept on the customer."},"tickets":{"type":"array","items":{"type":"string"},"description":"Ticket ids."},"products":{"type":"array","items":{"type":"string"},"description":"Product ids the customer bought."},"programs":{"type":"array","items":{"type":"string"},"description":"Program ids the customer bought."},"donations":{"type":"array","items":{"type":"string"},"description":"Donation ids."},"newsletter":{"type":"string","description":"The lead's newsletter."},"name":{"type":"string","description":"The lead's name."},"age":{"type":"string","description":"The lead's age."},"products_obj":{"description":"The products bought, as they were when ordered."},"programs_obj":{"description":"The programs bought, as they were when ordered."},"value":{"type":"string","description":"The lead's value."},"donations_str":{"type":"string","description":"The lead's donations str."}}}}}}}},"/leads/{id}":{"get":{"operationId":"get-leads-id","tags":["Leads & forms"],"x-section":"Lead","summary":"Retrieve a lead","description":"One customer. 404 when there is no such record.","x-access":[],"x-models":["Lead"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the lead."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-leads-id","tags":["Leads & forms"],"x-section":"Lead","summary":"Update a lead","description":"Updates a customer. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["Lead"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the lead."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lead"}}}}},"delete":{"operationId":"delete-leads-id","tags":["Leads & forms"],"x-section":"Lead","summary":"Delete a lead","description":"Deletes a customer. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["Lead"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the lead."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/newsletter_contacts":{"get":{"operationId":"get-newsletter-contacts","tags":["Leads & forms"],"x-section":"Newsletter Contact","summary":"List all newsletter contacts","description":"Newsletter subscribers. Answers an array of every record.","x-access":["user"],"x-models":["NewsletterContact"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-newsletter-contacts","tags":["Leads & forms"],"x-section":"Newsletter Contact","summary":"Create a newsletter contact","description":"Creates a newsletter subscriber. Behind reCAPTCHA. Answers 200, or 200 { already_subscribed: true }; a new subscriber gets the welcome email.","x-access":["recaptcha"],"x-models":["Unsubscribed","NewsletterContact"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Subscriber's name."},"email":{"type":"string","description":"An email address."},"age":{"type":"number","description":"Subscriber's age."},"city":{"type":"string","description":"Subscriber's city."}}}}}}}},"/newsletter_contacts/{id}":{"get":{"operationId":"get-newsletter-contacts-id","tags":["Leads & forms"],"x-section":"Newsletter Contact","summary":"Retrieve a newsletter contact","description":"One newsletter subscriber. 404 when there is no such record.","x-access":["user"],"x-models":["NewsletterContact"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the newsletter contact."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-newsletter-contacts-id","tags":["Leads & forms"],"x-section":"Newsletter Contact","summary":"Update a newsletter contact","description":"Updates a newsletter subscriber. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["user"],"x-models":["NewsletterContact"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the newsletter contact."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterContact"}}}}},"delete":{"operationId":"delete-newsletter-contacts-id","tags":["Leads & forms"],"x-section":"Newsletter Contact","summary":"Delete a newsletter contact","description":"Deletes a newsletter subscriber. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["user"],"x-models":["NewsletterContact"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the newsletter contact."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/download-price-quote/{id}/{translate}/{filename}":{"get":{"operationId":"get-download-price-quote-id-translate-filename","tags":["Leads & forms"],"x-section":"Price Quote","summary":"Retrieve a download price quote","description":"Download price quote pdf. Answers the PDF; translate picks the second language. Reads no token.","x-access":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the download price quote."},{"name":"translate","in":"path","required":true,"schema":{"type":"string"},"description":"The download price quote's translate."},{"name":"filename","in":"path","required":true,"schema":{"type":"string"},"description":"The download price quote's filename."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/price-quote":{"get":{"operationId":"get-price-quote","tags":["Leads & forms"],"x-section":"Price Quote","summary":"Retrieve the price quote","description":"The price quotes. Answers an array.","x-access":["admin"],"x-models":["PriceQuote"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-price-quote","tags":["Leads & forms"],"x-section":"Price Quote","summary":"Create a price quote","description":"Creates a price quote. Numbered from the invoice settings and emailed to the customer when asked. Answers 201 { id }.","x-access":["admin"],"x-models":["MyContact","Lead","PaymentMethod","User","PriceQuote"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"send":{"type":"string","description":"The price quote's send."}}}}}}}},"/price-quote/{id}":{"get":{"operationId":"get-price-quote-id","tags":["Leads & forms"],"x-section":"Price Quote","summary":"Retrieve a price quote","description":"One price quote. 404 when there is no such record.","x-access":["admin"],"x-models":["PriceQuote"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the price quote."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"delete":{"operationId":"delete-price-quote-id","tags":["Leads & forms"],"x-section":"Price Quote","summary":"Delete a price quote","description":"Deletes a price quote. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["PriceQuote"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the price quote."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/unsubscribe":{"get":{"operationId":"get-unsubscribe","tags":["Leads & forms"],"x-section":"Unsubscribed","summary":"Retrieve the unsubscribe","description":"The unsubscribe page. Opened from the link in emails.","x-access":["optional-user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."}}}},"/unsubscribed-list":{"get":{"operationId":"get-unsubscribed-list","tags":["Leads & forms"],"x-section":"Unsubscribed","summary":"Retrieve the unsubscribed","description":"Emails that opted out. Answers an array of every record.","x-access":["admin"],"x-models":["Unsubscribed"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-unsubscribed-list","tags":["Leads & forms"],"x-section":"Unsubscribed","summary":"Create an unsubscribed","description":"Creates an opted-out email. Reads no token: the unsubscribe page calls it. 409 when the email has already opted out.","x-access":[],"x-models":["Unsubscribed"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"409":{"description":"It clashes with the current state: the item is already being processed, a version is already applied, or an AI plan or preview is no longer available."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"An email address."}}}}}}}},"/unsubscribed-list/{id}":{"get":{"operationId":"get-unsubscribed-list-id","tags":["Leads & forms"],"x-section":"Unsubscribed","summary":"Retrieve an unsubscribed","description":"One opted-out email. 404 when there is no such record.","x-access":["admin"],"x-models":["Unsubscribed"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the unsubscribed."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-unsubscribed-list-id","tags":["Leads & forms"],"x-section":"Unsubscribed","summary":"Update an unsubscribed","description":"Updates an opted-out email. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["Unsubscribed"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the unsubscribed."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Unsubscribed"}}}}},"delete":{"operationId":"delete-unsubscribed-list-id","tags":["Leads & forms"],"x-section":"Unsubscribed","summary":"Delete an unsubscribed","description":"Deletes an opted-out email. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["Unsubscribed"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the unsubscribed."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/professional-account":{"post":{"operationId":"post-professional-account","tags":["Users & staff"],"x-section":"Professional Account","summary":"Create a professional account","description":"Asks for a professional account for the signed-in user. Answers 201; it waits for review. 403 when the site puts professional pages behind a plan the user lacks; 402 when the user already has one.","x-access":["user"],"x-models":["SocialModeSettings","ProfessionalAccount"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/professional-account-pages/{model}":{"get":{"operationId":"get-professional-account-pages-model","tags":["Users & staff"],"x-section":"Professional Account","summary":"List all professional account pages","description":"Professional accounts that offer a kind of item, with their ratings. Answers { users, filters, advanced_filters, originAddresses }.","x-access":["optional-user"],"x-models":["PaymentMethod","Collection","ProfessionalAccount","OriginAddress"],"parameters":[{"name":"model","in":"path","required":true,"schema":{"type":"string"},"description":"The professional account page's model."},{"name":"collection","in":"query","required":false,"schema":{"type":"string"},"description":"Only results in this collection."},{"name":"origin_address","in":"query","required":false,"schema":{"type":"string"},"description":"Only professional account pages with this origin address."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/professional-account-preview/{user}":{"get":{"operationId":"get-professional-account-preview-user","tags":["Users & staff"],"x-section":"Professional Account","summary":"List all professional accounts","description":"A professional account's shareable page. Server-rendered with meta tags, for link previews. Cached for an hour.","x-access":[],"x-models":["ProfessionalAccount"],"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string"},"description":"Id of user, who has created the account."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/professional-account/{id}":{"patch":{"operationId":"patch-professional-account-id","tags":["Users & staff"],"x-section":"Professional Account","summary":"Update a professional account","description":"Updates a professional account. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["user"],"x-models":["ProfessionalAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the professional account."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfessionalAccount"}}}}},"delete":{"operationId":"delete-professional-account-id","tags":["Users & staff"],"x-section":"Professional Account","summary":"Delete a professional account","description":"Deletes a professional account. 403 when it is another user's. Answers 201.","x-access":["user"],"x-models":["ProfessionalAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the professional account."}],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/professional-account/{user}":{"get":{"operationId":"get-professional-account-user","tags":["Users & staff"],"x-section":"Professional Account","summary":"List all professional accounts","description":"A user's professional account with its services, staff and ratings. 404 when there is none; 403 when it is not approved or the user is disabled.","x-access":["optional-user"],"x-models":["ProfessionalAccount"],"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string"},"description":"Id of user, who has created the account."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/account-confirmation":{"get":{"operationId":"get-account-confirmation","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the account confirmation","description":"The page that asks the user to confirm their email. Shown after signing up on the website.","x-access":["optional-user"],"x-models":["MyContact"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."}}}},"/block-user/{id}":{"patch":{"operationId":"patch-block-user-id","tags":["Users & staff"],"x-section":"User","summary":"Block a block user","description":"Blocks or unblocks a user for the signed-in user. Calling it again unblocks. Blocking also removes the follows between the two users, both ways. Answers 201.","x-access":["user"],"x-models":["User"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the block user."}],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/blocked-users":{"get":{"operationId":"get-blocked-users","tags":["Users & staff"],"x-section":"User","summary":"List all blocked users","description":"Users the signed-in user blocked. Each with name, handle, avatar and whether verified.","x-access":["user"],"x-models":["User"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/booking-schedule-full-month/{date}":{"get":{"operationId":"get-booking-schedule-full-month-date","tags":["Users & staff"],"x-section":"User","summary":"List all booking schedule full months","description":"Every booking of the user's services in the month of a date. Bookings are matched by the date format they are stored in (e.g. 2026-8-4).","x-access":["optional-user","user"],"x-models":["Service","Booking","UserLockedHours"],"parameters":[{"name":"date","in":"path","required":true,"schema":{"type":"string"},"description":"A date (YYYY-MM-DD)."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/booking-schedule-month/{date}":{"get":{"operationId":"get-booking-schedule-month-date","tags":["Users & staff"],"x-section":"User","summary":"List all booking schedule months","description":"The user's booking schedule for the month of a date: bookings and locked hours per day. One entry per day of the month, with that day's bookings and the hours that cannot be booked, for the calendar view.","x-access":["optional-user","user"],"x-models":["Service","Booking","UserLockedHours"],"parameters":[{"name":"date","in":"path","required":true,"schema":{"type":"string"},"description":"A date (YYYY-MM-DD)."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/booking-schedule-week/{date}&{direction}":{"get":{"operationId":"get-booking-schedule-week-date-direction","tags":["Users & staff"],"x-section":"User","summary":"List all booking schedule weeks","description":"The user's booking schedule for the week of a date, or the week before or after (direction). Weeks run Sunday to Saturday.","x-access":["optional-user","user"],"x-models":["Service","Booking","UserLockedHours"],"parameters":[{"name":"date","in":"path","required":true,"schema":{"type":"string"},"description":"A date (YYYY-MM-DD)."},{"name":"direction","in":"path","required":true,"schema":{"type":"string"},"description":"The booking schedule week's direction."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/disable-user":{"patch":{"operationId":"patch-disable-user","tags":["Users & staff"],"x-section":"User","summary":"Update the disable user","description":"Disables the signed-in user's account; it is deleted after 90 days. Signs the user out everywhere, hides the account and sets it to be deleted 90 days later (delete_date).","x-access":["user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/followers-email":{"get":{"operationId":"get-followers-email","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the followers email","description":"Emails of the signed-in user's followers. Only the emails.","x-access":["user"],"x-models":["User"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/generate-2auth-token":{"get":{"operationId":"get-generate-2auth-token","tags":["Users & staff"],"x-section":"User","summary":"Generate a 2auth token with AI","description":"Makes a two-factor secret for the signed-in user and answers its QR code. Answers 201 { dataUrl, outpauth_url }: the QR code to scan into an authenticator app. Two-factor stays off until PATCH /verify-token accepts a code.","x-access":["user"],"x-models":["MyContact","User"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/new-user-bookings":{"get":{"operationId":"get-new-user-bookings","tags":["Users & staff"],"x-section":"User","summary":"List all user bookings","description":"Bookings of the user's services made after ?newer_than. Polled by the admin to show new bookings as they come in.","x-access":["optional-user","user"],"x-models":["Service","Booking"],"parameters":[{"name":"newer_than","in":"query","required":false,"schema":{"type":"string"},"description":"Only user bookings with this newer than."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/password-reset":{"get":{"operationId":"get-password-reset","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the password reset","description":"The page to ask for a password reset. Renders the form; it calls GET /users/send-password-reset/:email.","x-access":["optional-user"],"x-models":["MyContact"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."}}}},"/reset-password/{email}&{validation_code}":{"get":{"operationId":"get-reset-password-email-validation-code","tags":["Users & staff"],"x-section":"User","summary":"Reset a reset password","description":"The page that sets a new password from a reset link. Redirects to the not-found page when the code does not match the email.","x-access":["optional-user"],"x-models":["MyContact"],"parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string"},"description":"An email address."},{"name":"validation_code","in":"path","required":true,"schema":{"type":"string"},"description":"The reset password's validation code."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/signup":{"get":{"operationId":"get-signup","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the signup","description":"The sign-up page. Renders the form; it posts to POST /users.","x-access":["optional-user"],"x-models":["MyContact"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."}}}},"/staff/{id}":{"patch":{"operationId":"patch-staff-id","tags":["Users & staff"],"x-section":"User","summary":"Update a staff","description":"Updates a staff member. Answers the updated staff member, or 404. Fields outside the allowed list are ignored.","x-access":["admin"],"x-models":["User"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the staff."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}}}},"/u/{handle}":{"get":{"operationId":"get-u-handle","tags":["Users & staff"],"x-section":"User","summary":"Retrieve an u","description":"A user's public profile page; with /:id, a conversation with them. Redirects to the profile in the app; the website has no profile page of its own.","x-access":["optional-user"],"x-models":["MyContact"],"parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string"},"description":"The u's handle."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/user-address/{index}":{"delete":{"operationId":"delete-user-address-index","tags":["Users & staff"],"x-section":"User","summary":"Delete user addresses","description":"Removes one of the signed-in user's saved addresses. index is the address's position in other_address, from 0.","x-access":["user"],"parameters":[{"name":"index","in":"path","required":true,"schema":{"type":"string"},"description":"The user address's index."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-ads":{"get":{"operationId":"get-user-ads","tags":["Users & staff"],"x-section":"User","summary":"List all user ads","description":"Ads to show a user (?handle or ?user): products and services of other users, in social mode. Products and services of other users who boosted them, skipping users the viewer blocked. Each ad shown is counted and its owner may be notified.","x-access":["optional-user"],"x-models":["User","ProfessionalAccount","SocialModeSettings","Product","Service","BlogPost","PricePlan","Program","Subscription","Media","UserEngagementNotification"],"parameters":[{"name":"handle","in":"query","required":false,"schema":{"type":"string"},"description":"Only user ads with this handle."},{"name":"user","in":"query","required":false,"schema":{"type":"string"},"description":"Only user ads with this user."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/user-attributions":{"get":{"operationId":"get-user-attributions","tags":["Users & staff"],"x-section":"User","summary":"List all user attributions","description":"Revenue attributed to the signed-in user, in total and by month. Answers { total_revenue } rounded to 2 decimals.","x-access":["user"],"x-models":["AttributedRevenue"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-attributions/{days}":{"get":{"operationId":"get-user-attributions-days","tags":["Users & staff"],"x-section":"User","summary":"List all user attributions","description":"Revenue attributed to the signed-in user over the last days. Answers { current_period_revenue } rounded to 2 decimals.","x-access":["user"],"x-models":["AttributedRevenue"],"parameters":[{"name":"days","in":"path","required":true,"schema":{"type":"string"},"description":"The user attribution's days."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-blogpost":{"get":{"operationId":"get-user-blogpost","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the user blog post","description":"One of the user's own blog posts for its editor (?id), in social mode. Answers the post with the categories its editor needs.","x-access":["optional-user","user"],"x-models":["BlogPost","Collection"],"parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string"},"description":"The ID of the user blog post."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/user-booking":{"get":{"operationId":"get-user-booking","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the user booking","description":"One booking of the user's services (?id) with its customer and attached records. 403 when the booking is not for one of the user's services.","x-access":["optional-user","user"],"x-models":["Booking","Service","ConnectedAccount","User"],"parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string"},"description":"The ID of the user booking."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-bookings-search/{args}":{"get":{"operationId":"get-user-bookings-search-args","tags":["Users & staff"],"x-section":"User","summary":"Search user bookings","description":"Bookings of the user's services matching a search. Matches the customer's name, phone number or email (any case), newest first, with each booking's service.","x-access":["user"],"x-models":["Service","Booking"],"parameters":[{"name":"args","in":"path","required":true,"schema":{"type":"string"},"description":"The user booking's args."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-bookings/{skip}":{"get":{"operationId":"get-user-bookings-skip","tags":["Users & staff"],"x-section":"User","summary":"List all user bookings","description":"Bookings of the user's services, a page at a time, sorted by ?sortBy and ?sortOrder. Ten at a time. Each booking comes with its service.","x-access":["optional-user","user"],"x-models":["Service","Booking"],"parameters":[{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"sortBy","in":"query","required":false,"schema":{"type":"string"},"description":"The order of the results."},{"name":"sortOrder","in":"query","required":false,"schema":{"type":"string"},"description":"Only user bookings with this sort order."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-churned-booking":{"patch":{"operationId":"patch-user-churned-booking","tags":["Users & staff"],"x-section":"User","summary":"Update the user churned booking","description":"Marks a booking's customer as churned (?booking_id). Used by the follow-up flow after a booking. 403 when the booking is not for one of the user's services.","x-access":["optional-user","user"],"x-models":["Booking"],"parameters":[{"name":"booking_id","in":"query","required":false,"schema":{"type":"string"},"description":"Only user churned bookings with this booking id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-confirm-booking":{"patch":{"operationId":"patch-user-confirm-booking","tags":["Users & staff"],"x-section":"User","summary":"Confirm a user booking","description":"Confirms a booking (?booking_id). Answers the booking with its service and staff member. 403 when the booking is not for one of the user's services.","x-access":["optional-user","user"],"x-models":["Booking"],"parameters":[{"name":"booking_id","in":"query","required":false,"schema":{"type":"string"},"description":"Only user bookings with this booking id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-confirmation-mail":{"get":{"operationId":"get-user-confirmation-mail","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the user confirmation mail","description":"Sends the signed-in user the email confirmation again. Answers with no body.","x-access":["user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-confirmed-bookings-search/{args}":{"get":{"operationId":"get-user-confirmed-bookings-search-args","tags":["Users & staff"],"x-section":"User","summary":"Search user confirmed bookings","description":"Confirmed bookings matching a search. Matches the customer's name, phone number or email, newest first.","x-access":["user"],"x-models":["Service","Booking"],"parameters":[{"name":"args","in":"path","required":true,"schema":{"type":"string"},"description":"The user confirmed booking's args."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-confirmed-bookings/{skip}":{"get":{"operationId":"get-user-confirmed-bookings-skip","tags":["Users & staff"],"x-section":"User","summary":"List all user confirmed bookings","description":"Confirmed bookings of the user's services, a page at a time. Ten at a time, sorted by ?sortBy and ?sortOrder.","x-access":["optional-user","user"],"x-models":["Service","Booking"],"parameters":[{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"sortBy","in":"query","required":false,"schema":{"type":"string"},"description":"The order of the results."},{"name":"sortOrder","in":"query","required":false,"schema":{"type":"string"},"description":"Only user confirmed bookings with this sort order."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-current-bookings":{"get":{"operationId":"get-user-current-bookings","tags":["Users & staff"],"x-section":"User","summary":"List all user current bookings","description":"Today's and upcoming bookings of the user's services. At most 100.","x-access":["optional-user","user"],"x-models":["Service","Booking"],"parameters":[{"name":"sortBy","in":"query","required":false,"schema":{"type":"string"},"description":"The order of the results."},{"name":"sortOrder","in":"query","required":false,"schema":{"type":"string"},"description":"Only user current bookings with this sort order."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-did-not-answer-booking":{"patch":{"operationId":"patch-user-did-not-answer-booking","tags":["Users & staff"],"x-section":"User","summary":"Update the user did not answer booking","description":"Records that the booking's customer did not answer the call (?booking_id). Counts the attempt on the booking (call_attempts, last_call_attempt). 403 when the booking is not for one of the user's services.","x-access":["optional-user","user"],"x-models":["Booking"],"parameters":[{"name":"booking_id","in":"query","required":false,"schema":{"type":"string"},"description":"Only user did not answer bookings with this booking id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-dynamic-models":{"get":{"operationId":"get-user-dynamic-models","tags":["Users & staff"],"x-section":"User","summary":"List all user dynamic models","description":"Custom models the signed-in user can use, with their records. Answers { dynamic_models, user_input_models }.","x-access":["user"],"x-models":["DynamicModel","Model"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-dynamic-models/{id}":{"get":{"operationId":"get-user-dynamic-models-id","tags":["Users & staff"],"x-section":"User","summary":"Retrieve a user dynamic model","description":"One custom model. Only its name and fields. 404 when there is no such model.","x-access":["user"],"x-models":["DynamicModel"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user dynamic model."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-followers/{id}&{skip}":{"get":{"operationId":"get-user-followers-id-skip","tags":["Users & staff"],"x-section":"User","summary":"Retrieve a user follower","description":"A user's followers, a page at a time. Answers { users, count }.","x-access":[],"x-models":["User"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user follower."},{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/user-following/{id}&{skip}":{"get":{"operationId":"get-user-following-id-skip","tags":["Users & staff"],"x-section":"User","summary":"Retrieve a user following","description":"Who a user follows, a page at a time. Answers { users, count }.","x-access":[],"x-models":["User"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user following."},{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/user-handle/{handle}":{"get":{"operationId":"get-user-handle-handle","tags":["Users & staff"],"x-section":"User","summary":"Retrieve a user handle","description":"The user with a handle, or 404 when it is free. Answers { _id } of the user who has the handle, or null when it is free: used to check a handle before saving it.","x-access":[],"x-models":["User"],"parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string"},"description":"The user handle's handle."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/user-inbox":{"get":{"operationId":"get-user-inbox","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the user inbox","description":"The signed-in user's conversations, newest first, or those of an account they manage (?on_behalf_of). Each conversation with its other members and the record it is about. 403 for an account the user may not message for.","x-access":["user"],"x-models":["ConnectedAccount","Message","User","Product","Service","BlogPost"],"parameters":[{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only user inboxes with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-invoices":{"get":{"operationId":"get-user-invoices","tags":["Users & staff"],"x-section":"User","summary":"List all user invoices","description":"The signed-in user's Stripe invoices. Read from Stripe and formatted for display.","x-access":["user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-lead-from-booking":{"get":{"operationId":"get-user-lead-from-booking","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the user lead from booking","description":"The customer of a booking (?id) with their orders and other bookings. With the customer's orders, newest first, and their bookings with each service.","x-access":["optional-user","user"],"x-models":["Booking","Order","Lead","Service"],"parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string"},"description":"The ID of the user lead from booking."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-mention/{handle}":{"get":{"operationId":"get-user-mention-handle","tags":["Users & staff"],"x-section":"User","summary":"Retrieve a user mention","description":"Users whose handle starts with the text, for @mentions. An empty list for an empty search.","x-access":["user"],"x-models":["User"],"parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string"},"description":"The user mention's handle."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-order":{"get":{"operationId":"get-user-order","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the user order","description":"One order of the user's own store (?id), in social mode. Only orders of the signed-in user's own store. Answers the order with its customer and their earlier orders.","x-access":["optional-user","user"],"x-models":["Order","Lead","Product","Program"],"parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string"},"description":"The ID of the user order."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-payment-method/{payment_method}":{"get":{"operationId":"get-user-payment-method-payment-method","tags":["Users & staff"],"x-section":"User","summary":"List all user payment methods","description":"One of the user's saved Stripe payment methods. Read from Stripe. 404 when Stripe has no such method.","x-access":["optional-user","user"],"parameters":[{"name":"payment_method","in":"path","required":true,"schema":{"type":"string"},"description":"The user payment method's payment method."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-payments":{"get":{"operationId":"get-user-payments","tags":["Users & staff"],"x-section":"User","summary":"List all user payments","description":"The signed-in user's payment settings and the site's payment terms, with the Stripe account's capabilities. With the Stripe account's status when card payment is set up, and the merchant agreement page when there is none yet.","x-access":["user"],"x-models":["UserPaymentSettings","PaymentMethod","SocialModeSettings","AboutPage","MyContact"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-price-plan/":{"get":{"operationId":"get-user-price-plan","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the user price plan","description":"The signed-in user's price plans. The plans the user subscribes to.","x-access":["user"],"x-models":["User","PricePlan"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-product":{"get":{"operationId":"get-user-product","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the user product","description":"One of the user's own products for its editor (?id), in social mode. Answers the product with the categories and origin addresses its editor needs, for the app with ?ionic.","x-access":["optional-user","user"],"x-models":["Product","Media","Collection","OriginAddress"],"parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string"},"description":"The ID of the user product."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-products":{"get":{"operationId":"get-user-products","tags":["Users & staff"],"x-section":"User","summary":"List all user products","description":"A user's products page (?user), in social mode. Rendered with the seller's products.","x-access":["optional-user"],"x-models":["Product","User","Media"],"parameters":[{"name":"user","in":"query","required":false,"schema":{"type":"string"},"description":"Only user products with this user."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/user-program":{"get":{"operationId":"get-user-program","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the user program","description":"One of the user's own programs for its editor (?id), in social mode. Answers { program, categories, topics }.","x-access":["optional-user","user"],"x-models":["Program","Collection"],"parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string"},"description":"The ID of the user program."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-service":{"get":{"operationId":"get-user-service","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the user service","description":"One of the user's own services for its editor (?id), in social mode. Answers the service with the staff, categories and origin addresses its editor needs. 403 when it is not the user's, or an account they manage.","x-access":["optional-user","user"],"x-models":["Service","ConnectedAccount","User","Collection","OriginAddress"],"parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string"},"description":"The ID of the user service."},{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only user services with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."}},"security":[{"bearer":[]}]}},"/user-services":{"get":{"operationId":"get-user-services","tags":["Users & staff"],"x-section":"User","summary":"List all user services","description":"The signed-in user's services. Services the user is a staff member of.","x-access":["user"],"x-models":["Service"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-shipping":{"get":{"operationId":"get-user-shipping","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the user shipping","description":"One of the user's own delivery settings (?id), in social mode. 404 when it is not the user's.","x-access":["optional-user","user"],"x-models":["Shipping"],"parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string"},"description":"The ID of the user shipping."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-staff":{"get":{"operationId":"get-user-staff","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the user staff","description":"The page of the user's own staff, in social mode. The page; it loads the staff itself.","x-access":["optional-user","user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/user-tokens/{id}":{"patch":{"operationId":"patch-user-tokens-id","tags":["Users & staff"],"x-section":"User","summary":"Update a user token","description":"Signs a restricted user out everywhere (clears their tokens). Does nothing unless the user is restricted.","x-access":["user"],"x-models":["User"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user token."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user/add_staff/{owner_id}&{validation_code}":{"get":{"operationId":"get-user-add-staff-owner-id-validation-code","tags":["Users & staff"],"x-section":"User","summary":"Retrieve a user","description":"Accepts a staff invitation and adds the signed-in user to the owner's staff. Opened from the invitation email; a wrong code goes to the not-found page.","x-access":["user"],"x-models":["User","MyContact","Publish"],"parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string"},"description":"User.id of the admin who added this user."},{"name":"validation_code","in":"path","required":true,"schema":{"type":"string"},"description":"Code sent to confirm the email."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user/me/password":{"patch":{"operationId":"patch-user-me-password","tags":["Users & staff"],"x-section":"User","summary":"Update your user","description":"Changes the signed-in user's password, checking the current one. Send password (the current one) and new_password. 401 \"Password not valid\" when the current one is wrong.","x-access":["user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user/remove_admin/{id}":{"delete":{"operationId":"delete-user-remove-admin-id","tags":["Users & staff"],"x-section":"User","summary":"Delete a user","description":"Removes an administrator; ?deleteQuery=0 also deletes everything they made. Without deleteQuery=0 the admin's products, services, media and bookings stay. 403 for removing yourself. Answers 204.","x-access":["admin"],"x-models":["User","Product","Service","Media","Booking","Order","Shipping"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user."},{"name":"deleteQuery","in":"query","required":false,"schema":{"type":"string"},"description":"Only users with this delete query."}],"responses":{"204":{"description":"It worked, and there is nothing to send back - for example after removing a staff member."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user/remove_staff/{id}":{"delete":{"operationId":"delete-user-remove-staff-id","tags":["Users & staff"],"x-section":"User","summary":"Delete a user","description":"Removes a staff member of the user's account; ?deleteQuery=0 also deletes everything they made. Without deleteQuery=0 the staff member's products, services, media and bookings stay with the account. 403 for removing yourself or an admin. Answers 204.","x-access":["user"],"x-models":["User","Product","Service","Media","Booking","Order","Shipping"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user."},{"name":"deleteQuery","in":"query","required":false,"schema":{"type":"string"},"description":"Only users with this delete query."}],"responses":{"204":{"description":"It worked, and there is nothing to send back - for example after removing a staff member."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user/send_staff_email":{"post":{"operationId":"post-user-send-staff-email","tags":["Users & staff"],"x-section":"User","summary":"Create a user","description":"Invites someone (email) to be staff of the user's account, or of one they manage (on_behalf_of). The invitation email carries a link to GET /user/add_staff. 403 when the user may not manage that account's staff.","x-access":["optional-user","user"],"x-models":["ConnectedAccount"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"on_behalf_of":{"type":"string","description":"The user's on behalf of."},"email":{"type":"string","description":"An email address."}}}}}}}},"/users":{"post":{"operationId":"post-users","tags":["Users & staff"],"x-section":"User","summary":"Create a user","description":"Signs a visitor up: creates the user, emails the confirmation and answers the user with a token. Answers 201 with { token } for the app; a website sign-up is redirected to /account-confirmation instead. The confirmation email carries the code GET /users/confirm checks. 400 when the email is taken or a field is invalid.","x-access":[],"x-models":["User"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}}}},"/users-admin":{"post":{"operationId":"post-users-admin","tags":["Users & staff"],"x-section":"User","summary":"Create a users admin","description":"Signs an administrator in to another site's account by email, creating that user when missing (can_edit), and answers a token. Used by the platform admin to open a customer's site: the user is found by email, or created with the given can_edit rights, and a fresh token is answered with 201.","x-access":["admin"],"x-models":["User"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"An email address."},"name":{"type":"string","description":"The users admin's name."},"can_edit":{"type":"string","description":"The users admin's can edit."}}}}}}}},"/users/{id}":{"patch":{"operationId":"patch-users-id","tags":["Users & staff"],"x-section":"User","summary":"Update a user","description":"Updates any user (admin). For administrators. Answers the updated user, or 404. Fields outside the allowed list are ignored.","x-access":["admin"],"x-models":["User"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}}}},"/users/confirm/{email}&{validation_code}":{"get":{"operationId":"get-users-confirm-email-validation-code","tags":["Users & staff"],"x-section":"User","summary":"Confirm the user","description":"Confirms a user's email with the code they were sent and signs them in. Opened from the confirmation email: marks the email confirmed and redirects to the account page signed in. A wrong code answers 400.","x-access":[],"x-models":["User"],"parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string"},"description":"An email address."},{"name":"validation_code","in":"path","required":true,"schema":{"type":"string"},"description":"Code sent to confirm the email."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"418":{"description":"An account confirmation or password reset link was used with an email that does not match it."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/users/is-logged":{"get":{"operationId":"get-users-is-logged","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the user","description":"Whether the visitor is signed in; refreshes their location from their IP when it is older than a week. Answers { user }, or 401 when the token is missing or no longer valid. The location lookup uses the visitor's IP and runs at most once a week.","x-access":["optional-user","user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/users/login":{"post":{"operationId":"post-users-login","tags":["Users & staff"],"x-section":"User","summary":"Sign in","description":"Signs a user in with email and password (or an existing token) and answers the user, a token and their active subscriptions. Answers { user, token }. With two-factor sign-in on, the first call answers 401 { needs_token: true } and the call is repeated with the code in token; a wrong code answers 401 \"Invalid verification code.\". 400 for a wrong email or password.","x-access":[],"x-models":["User","PricePlan"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"An email address."}}}}}}}},"/users/logout":{"post":{"operationId":"post-users-logout","tags":["Users & staff"],"x-section":"User","summary":"Sign out","description":"Signs out: removes the token used for the call. Only the token in the Authorization header is removed; the user's other devices stay signed in.","x-access":["user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/users/me":{"get":{"operationId":"get-users-me","tags":["Users & staff"],"x-section":"User","summary":"Retrieve your user","description":"The signed-in user with the site's settings, their orders and the programs they bought. Renders the account page on the website, or JSON for the app with ?ionic. In social mode the website sends the user to the app instead, signed in with their latest token.","x-access":["optional-user","user"],"x-models":["MyContact","SocialModeSettings","Publish","Order","Program","Ticket","Event","QrCode","Donation","Product","BlogPost","PricePlan","Subscription","User","Service","Shipping","Booking","PaymentMethod","ProfessionalAccount"],"parameters":[{"name":"skip_transactions_check","in":"query","required":false,"schema":{"type":"string"},"description":"Only users with this skip transactions check."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-users-me","tags":["Users & staff"],"x-section":"User","summary":"Update your user","description":"Updates the signed-in user's own profile (name, address, saved items, two-factor and other allowed fields). Fields outside the allowed list are silently ignored, and the two-factor fields can never be set here (use GET /generate-2auth-token and PATCH /verify-token). Answers the updated user without its two-factor secret.","x-access":["user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"saved_products":{"type":"string","description":"The user's saved products."},"saved_programs":{"type":"string","description":"The user's saved programs."},"saved_blogposts":{"type":"string","description":"The user's saved blog posts."},"saved_services":{"type":"string","description":"The user's saved services."}}}}}}},"delete":{"operationId":"delete-users-me","tags":["Users & staff"],"x-section":"User","summary":"Delete your user","description":"Deletes the signed-in user's account and everything they own. Deletes the account at once and emails the user a cancellation. Answers the deleted user. Use PATCH /disable-user for the 90-day grace period instead.","x-access":["user"],"x-models":["ProfessionalAccount"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/users/me/avatar":{"get":{"operationId":"get-users-me-avatar","tags":["Users & staff"],"x-section":"User","summary":"Retrieve your user","description":"The signed-in user's profile picture. Answers the image bytes, or 404 when the user has no picture.","x-access":["user"],"x-models":["Media"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-users-me-avatar","tags":["Users & staff"],"x-section":"User","summary":"Create a user","description":"Uploads the signed-in user's profile picture (avatar, form field). Multipart upload; the picture is resized and stored as a media record. Redirects to the account page when done.","x-access":["user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]},"delete":{"operationId":"delete-users-me-avatar","tags":["Users & staff"],"x-section":"User","summary":"Delete your user","description":"Removes the signed-in user's profile picture. Deletes the media record too.","x-access":["user"],"x-models":["Media"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/users/me/delete":{"get":{"operationId":"get-users-me-delete","tags":["Users & staff"],"x-section":"User","summary":"Retrieve your user","description":"The account deletion page. Asks to confirm before DELETE /users/me.","x-access":["user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/users/me/transactions":{"get":{"operationId":"get-users-me-transactions","tags":["Users & staff"],"x-section":"User","summary":"Retrieve your user","description":"The signed-in user's payments: Stripe invoices, payment intents and subscriptions. Read live from Stripe, so it is as current as Stripe is and takes a moment. 404 when the user has no Stripe customer yet.","x-access":["optional-user","user"],"x-models":["PaymentMethod","PricePlan"],"parameters":[{"name":"skip_transactions_check","in":"query","required":false,"schema":{"type":"string"},"description":"Only users with this skip transactions check."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/users/on-behalf-of":{"get":{"operationId":"get-users-on-behalf-of","tags":["Users & staff"],"x-section":"User","summary":"Retrieve the user","description":"The account the signed-in user manages for someone else (?on_behalf_of), with its orders. The same as /users/me, for an account the signed-in user has been given access to. 404 when there is no such connection.","x-access":["optional-user","user"],"x-models":["MyContact","ConnectedAccount","Order","Product","Program","User","BlogPost","PricePlan","Subscription","Service","Shipping","Booking","PaymentMethod","Post","UserPaymentSettings","SocialModeSettings"],"parameters":[{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only users with this on behalf of."},{"name":"skip_transactions_check","in":"query","required":false,"schema":{"type":"string"},"description":"Only users with this skip transactions check."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/users/send-password-reset/{email}":{"get":{"operationId":"get-users-send-password-reset-email","tags":["Users & staff"],"x-section":"User","summary":"List all users","description":"Emails a password reset link to the user. Answers 201 when the email was sent, 400 when no user has that email.","x-access":[],"x-models":["User"],"parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string"},"description":"An email address."}],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/verify-token":{"patch":{"operationId":"patch-verify-token","tags":["Users & staff"],"x-section":"User","summary":"Verify a token","description":"Checks a two-factor code (token) and turns two-factor sign-in on when it is right. Answers { verified }.","x-access":["user"],"x-models":["User"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/latest-user-engagement-notifications/{users}":{"get":{"operationId":"get-latest-user-engagement-notifications-users","tags":["Users & staff"],"x-section":"User Engagement Notification","summary":"List all user engagement notifications","description":"The signed-in user's latest notifications. The newest 5.","x-access":["user"],"x-models":["UserEngagementNotification","Post","Group"],"parameters":[{"name":"users","in":"path","required":true,"schema":{"type":"string"},"description":"The user engagement notification's users."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/new-user-engagement-notifications":{"get":{"operationId":"get-new-user-engagement-notifications","tags":["Users & staff"],"x-section":"User Engagement Notification","summary":"List all user engagement notifications","description":"The signed-in user's unseen notifications. Answers { notifications_count, messages_count }, for the badges.","x-access":["user"],"x-models":["UserEngagementNotification"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/seen-my-message-notification":{"patch":{"operationId":"patch-seen-my-message-notification","tags":["Users & staff"],"x-section":"User Engagement Notification","summary":"Update the seen message notification","description":"Marks the signed-in user's message notifications seen. Answers the notifications marked.","x-access":["user"],"x-models":["UserEngagementNotification"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/seen-my-notifications":{"patch":{"operationId":"patch-seen-my-notifications","tags":["Users & staff"],"x-section":"User Engagement Notification","summary":"Update the seen notification","description":"Marks the signed-in user's notifications seen. Answers the notifications marked.","x-access":["user"],"x-models":["UserEngagementNotification"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/system-user-engagement-notifications":{"get":{"operationId":"get-system-user-engagement-notifications","tags":["Users & staff"],"x-section":"User Engagement Notification","summary":"List all system user engagement notifications","description":"System notifications for the signed-in user. Newest first.","x-access":["user"],"x-models":["UserEngagementNotification"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-engagement-notifications":{"get":{"operationId":"get-user-engagement-notifications","tags":["Users & staff"],"x-section":"User Engagement Notification","summary":"List all user engagement notifications","description":"The signed-in user's notifications. The newest 50, with the post, comment or item each is about, skipping blocked users.","x-access":["user"],"x-models":["UserEngagementNotification","Post","Group"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-engagement-notifications/{skip}&{users}":{"get":{"operationId":"get-user-engagement-notifications-skip-users","tags":["Users & staff"],"x-section":"User Engagement Notification","summary":"List all user engagement notifications","description":"The signed-in user's notifications, a page at a time. Skips users the viewer blocked.","x-access":["user"],"x-models":["UserEngagementNotification"],"parameters":[{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"users","in":"path","required":true,"schema":{"type":"string"},"description":"The user engagement notification's users."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-privileges":{"get":{"operationId":"get-user-privileges","tags":["Users & staff"],"x-section":"User Privilege","summary":"List all user privileges","description":"Who can see each kind of content (sign-in, subscription). Answers an array of every record.","x-access":[],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-user-privileges","tags":["Users & staff"],"x-section":"User Privilege","summary":"Create a user privilege","description":"Creates a content access setting. A site has one; update it with PATCH instead. Answers 201.","x-access":["admin"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}}}},"/user-privileges/{id}":{"get":{"operationId":"get-user-privileges-id","tags":["Users & staff"],"x-section":"User Privilege","summary":"Retrieve a user privilege","description":"The content access settings by id. 404 when there is no such record.","x-access":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user privilege."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-user-privileges-id","tags":["Users & staff"],"x-section":"User Privilege","summary":"Update a user privilege","description":"Updates a content access setting. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user privilege."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}}},"delete":{"operationId":"delete-user-privileges-id","tags":["Users & staff"],"x-section":"User Privilege","summary":"Delete a user privilege","description":"Deletes a content access setting. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user privilege."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/mini-app-reports/{skip}":{"get":{"operationId":"get-mini-app-reports-skip","tags":["Users & staff"],"x-section":"User Report","summary":"List all mini app reports","description":"Reports of mini apps, a page at a time. Answers { userReports, count }.","x-access":["user"],"x-models":["UserReport"],"parameters":[{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-report":{"post":{"operationId":"post-user-report","tags":["Users & staff"],"x-section":"User Report","summary":"Create a user report","description":"Creates an user report. Answers 201 with no body.","x-access":["user"],"x-models":["UserReport"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserReport"}}}}}},"/user-report/{id}":{"patch":{"operationId":"patch-user-report-id","tags":["Users & staff"],"x-section":"User Report","summary":"Update a user report","description":"Updates an user report. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["user"],"x-models":["UserReport"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user report."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserReport"}}}}}},"/user-reports/{skip}&{limit}":{"get":{"operationId":"get-user-reports-skip-limit","tags":["Users & staff"],"x-section":"User Report","summary":"List all user reports","description":"Reports of posts, users and comments, a page at a time. Answers reported posts, comments and users, and content flagged by the blacklist, with counts.","x-access":["user"],"x-models":["UserReport","KeywordBlacklist","Post"],"parameters":[{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"limit","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to return."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/create-staff-member":{"post":{"operationId":"post-create-staff-member","tags":["Users & staff"],"x-section":"AI builder","summary":"Create a staff member with AI","description":"Create a staff member from a prompt, written by the AI builder.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the staff member, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"item_id":{"type":"string","description":"The ID of the staff member to change."}}}}}}}},"/create-staff-schedule":{"post":{"operationId":"post-create-staff-schedule","tags":["Users & staff"],"x-section":"AI builder","summary":"Create a staff schedule with AI","description":"Create a staff schedule from a prompt, written by the AI builder.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the staff schedule, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"item_id":{"type":"string","description":"The ID of the staff schedule to change."}}}}}}}},"/generate-staff":{"post":{"operationId":"post-generate-staff","tags":["Users & staff"],"x-section":"AI builder","summary":"Generate a staff with AI","description":"Use it to create a new staff member or team member account.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the staff, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/generate-staff-schedule":{"post":{"operationId":"post-generate-staff-schedule","tags":["Users & staff"],"x-section":"AI builder","summary":"Generate a staff schedule with AI","description":"Use it to lock or block time slots in a staff member's schedule.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the staff schedule, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/companion-app-settings":{"get":{"operationId":"get-companion-app-settings","tags":["Site settings"],"x-section":"Companion App Settings","summary":"List all companion app settings","description":"The companion app settings. Answers an array of every record.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-companion-app-settings","tags":["Site settings"],"x-section":"Companion App Settings","summary":"Create a companion app setting","description":"Creates a companion app settings record. Answers 201 with no body.","x-access":["admin"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}}}},"/companion-app-settings/{id}":{"get":{"operationId":"get-companion-app-settings-id","tags":["Site settings"],"x-section":"Companion App Settings","summary":"Retrieve a companion app setting","description":"The companion app settings by id. 404 when there is no such record.","x-access":["admin"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the companion app setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-companion-app-settings-id","tags":["Site settings"],"x-section":"Companion App Settings","summary":"Update a companion app setting","description":"Updates a companion app settings record. Answers the settings, or 404.","x-access":["admin"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the companion app setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}}},"delete":{"operationId":"delete-companion-app-settings-id","tags":["Site settings"],"x-section":"Companion App Settings","summary":"Delete a companion app setting","description":"Deletes a companion app settings record. Answers the deleted settings, or 404.","x-access":["admin"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the companion app setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/accept-consent":{"post":{"operationId":"post-accept-consent","tags":["Site settings"],"x-section":"Consent","summary":"Accept an accept consent","description":"Log agreement. Logs the click (the consent type and the visitor's IP) for the consent report. Reads no token. Answers 201.","x-access":[],"x-models":["Click"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","description":"The accept consent's type."}}}}}}}},"/consent":{"get":{"operationId":"get-consent","tags":["Site settings"],"x-section":"Consent","summary":"Retrieve the consent","description":"The cookie consent settings. Reads no token.","deprecated":true,"x-access":[],"x-models":["Consent"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-consent","tags":["Site settings"],"x-section":"Consent","summary":"Create a consent","description":"Creates a terms of use record. Answers 201 with no body.","x-access":["admin"],"x-models":["Consent"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Consent"}}}}}},"/consent-text":{"get":{"operationId":"get-consent-text","tags":["Site settings"],"x-section":"Consent","summary":"Retrieve the consent text","description":"Get the terms of use text. Answers the text only.","x-access":[],"x-models":["Consent"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/consent/{id}":{"get":{"operationId":"get-consent-id","tags":["Site settings"],"x-section":"Consent","summary":"Retrieve a consent","description":"The cookie consent settings by id; visitors read /consent-text. 404 when there is no such record.","deprecated":true,"x-access":[],"x-models":["Consent"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the consent."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-consent-id","tags":["Site settings"],"x-section":"Consent","summary":"Update a consent","description":"Updates a terms of use record. Answers the settings, or 404.","x-access":["admin"],"x-models":["Consent"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the consent."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Consent"}}}}}},"/gdpr-text":{"get":{"operationId":"get-gdpr-text","tags":["Site settings"],"x-section":"Gdpr","summary":"Retrieve the GDPR text","description":"Get the terms of use text. Answers the text only. Reads no token.","x-access":[],"x-models":["Gdpr"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/gdprs":{"get":{"operationId":"get-gdprs","tags":["Site settings"],"x-section":"Gdpr","summary":"List all gdprs","description":"The privacy (GDPR) settings. The site's one record.","deprecated":true,"x-access":["admin"],"x-models":["Gdpr"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-gdprs","tags":["Site settings"],"x-section":"Gdpr","summary":"Create a gdpr","description":"Creates a terms of use record. Answers 201 with no body.","x-access":["admin"],"x-models":["Gdpr"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Gdpr"}}}}}},"/gdprs/{id}":{"get":{"operationId":"get-gdprs-id","tags":["Site settings"],"x-section":"Gdpr","summary":"Retrieve a gdpr","description":"The privacy settings by id; visitors read /gdpr-text. 404 when there is no such record.","deprecated":true,"x-access":[],"x-models":["Gdpr"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the gdpr."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-gdprs-id","tags":["Site settings"],"x-section":"Gdpr","summary":"Update a gdpr","description":"Updates a terms of use record. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["Gdpr"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the gdpr."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Gdpr"}}}}}},"/home-page-settings":{"get":{"operationId":"get-home-page-settings","tags":["Site settings"],"x-section":"Home Page Settings","summary":"List all home page settings","description":"The home page settings. The site's one record.","x-access":["admin"],"x-models":["HomePageSettings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/home-page-settings/{id}":{"patch":{"operationId":"patch-home-page-settings-id","tags":["Site settings"],"x-section":"Home Page Settings","summary":"Update a home page setting","description":"Updates the home page settings (useDifferentLayoutForApp). The home page is rendered again on its next visit. Answers the settings.","x-access":["admin"],"x-models":["HomePageSettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the home page setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"useDifferentLayoutForApp":{"type":"boolean","description":"The mobile app shows its own home layout instead of the website's."}}}}}}}},"/mycontacts":{"get":{"operationId":"get-mycontacts","tags":["Site settings"],"x-section":"Mycontact","summary":"List all site contacts","description":"The site's contact details. Reads no token. The SendGrid key is never included.","x-access":[],"x-models":["MyContact"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-mycontacts","tags":["Site settings"],"x-section":"Mycontact","summary":"Create a site contact","description":"Creates a contact details record. A site has one; the AI and admin update it with PATCH instead.","x-access":["admin"],"x-models":["MyContact"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyContact"}}}}}},"/mycontacts/{id}":{"get":{"operationId":"get-mycontacts-id","tags":["Site settings"],"x-section":"Mycontact","summary":"Retrieve a site contact","description":"The site's contact details by id. 404 when there is no such record.","x-access":[],"x-models":["MyContact"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the site contact."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-mycontacts-id","tags":["Site settings"],"x-section":"Mycontact","summary":"Update a site contact","description":"Updates a contact details record. Fields outside the allowed list are ignored; the linked Google accounts can only change through their own routes. Saving a SendGrid key switches the site's email to SendGrid, and the key is never sent back. Answers the contact details. The app re-reads its startup data afterwards.","x-access":["admin"],"x-models":["MyContact"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the site contact."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"gmb_location":{"type":"string","description":"The site contact's Google Business Profile location."},"ga_property":{"type":"string","description":"The site contact's Google Analytics property."},"google_app":{"type":"string","description":"The site contact's google app."}}}}}}},"delete":{"operationId":"delete-mycontacts-id","tags":["Site settings"],"x-section":"Mycontact","summary":"Delete a site contact","description":"Deletes a contact details record. The site needs this record: deleting it breaks pages until a new one is made.","x-access":["admin"],"x-models":["MyContact"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the site contact."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/pwa-settings":{"get":{"operationId":"get-pwa-settings","tags":["Site settings"],"x-section":"Pwa Settings","summary":"List all app settings","description":"The installable app (PWA) settings. Answers an array of every record.","x-access":["admin"],"x-models":["PwaSettings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-pwa-settings","tags":["Site settings"],"x-section":"Pwa Settings","summary":"Create an app setting","description":"Creates an installable app settings record. A site has one; update it with PATCH instead. Answers 201.","x-access":["admin"],"x-models":["PwaSettings"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PwaSettings"}}}}}},"/pwa-settings/{id}":{"get":{"operationId":"get-pwa-settings-id","tags":["Site settings"],"x-section":"Pwa Settings","summary":"Retrieve an app setting","description":"The installable app settings by id. 404 when there is no such record.","x-access":["admin"],"x-models":["PwaSettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the app setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/rating-settings":{"get":{"operationId":"get-rating-settings","tags":["Site settings"],"x-section":"Rating Settings","summary":"List all rating settings","description":"Every rating email setting. Reads no token.","x-access":[],"x-models":["RatingSettings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/rating-settings/":{"post":{"operationId":"post-rating-settings","tags":["Site settings"],"x-section":"Rating Settings","summary":"Create a rating setting","description":"Creates the rating email settings of a kind of item. One per kind of item (type). Answers 201 with it.","x-access":["user"],"x-models":["RatingSettings"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RatingSettings"}}}}}},"/rating-settings/{id}":{"patch":{"operationId":"patch-rating-settings-id","tags":["Site settings"],"x-section":"Rating Settings","summary":"Update a rating setting","description":"Updates rating email settings. Answers 200 with no body.","x-access":["user"],"x-models":["RatingSettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the rating setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"send":{"type":"boolean","description":"Rating emails are sent after orders and bookings."}}}}}}}},"/rating-settings/{type}":{"get":{"operationId":"get-rating-settings-type","tags":["Site settings"],"x-section":"Rating Settings","summary":"List all rating settings","description":"The rating email settings of a kind of item (product, service...). Null when the kind has none.","x-access":["user"],"x-models":["RatingSettings"],"parameters":[{"name":"type","in":"path","required":true,"schema":{"type":"string"},"description":"Product,service, program, priceplan."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/all_possible_site_menus":{"get":{"operationId":"get-all-possible-site-menus","tags":["Site settings"],"x-section":"Site Menu","summary":"List all possible site menus","description":"Everything a navigation entry can link to: categories, pages, price plans and the current entries. Cached for 6 minutes.","x-access":[],"x-models":["Collection","AboutPage","PricePlan","SiteMenu"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/site_menus":{"get":{"operationId":"get-site-menus","tags":["Site settings"],"x-section":"Site Menu","summary":"List all site menus","description":"The site's navigation entries. Not sorted: order them by position.","x-access":[],"x-models":["SiteMenu"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-site-menus","tags":["Site settings"],"x-section":"Site Menu","summary":"Create a site menu","description":"Creates a navigation entry. Links to the site's own pages are stored as \"../<path>\" whatever form is sent. Answers 201 with the entry.","x-access":["admin"],"x-models":["SiteMenu"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteMenu"}}}}}},"/site_menus/{id}":{"get":{"operationId":"get-site-menus-id","tags":["Site settings"],"x-section":"Site Menu","summary":"Retrieve a site menu","description":"One navigation entry. 404 when there is no such entry.","x-access":[],"x-models":["SiteMenu"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the site menu."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-site-menus-id","tags":["Site settings"],"x-section":"Site Menu","summary":"Update a site menu","description":"Updates a navigation entry. Fields outside the allowed list are ignored. Answers the entry, or 404.","x-access":["admin"],"x-models":["SiteMenu"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the site menu."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteMenu"}}}}},"delete":{"operationId":"delete-site-menus-id","tags":["Site settings"],"x-section":"Site Menu","summary":"Delete a site menu","description":"Deletes a navigation entry. Answers the deleted entry, or 404.","x-access":["admin"],"x-models":["SiteMenu"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the site menu."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/site_menus/ionic":{"get":{"operationId":"get-site-menus-ionic","tags":["Site settings"],"x-section":"Site Menu","summary":"Retrieve the site menu","description":"What the app's menu can show: categories, pages, locations and the tracker. Cached for 6 minutes.","x-access":[],"x-models":["Collection","AboutPage","Partner","MyContact","Tracker","PricePlan","Voucher","Theme","SocialModeSettings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/social-mode-settings":{"get":{"operationId":"get-social-mode-settings","tags":["Site settings"],"x-section":"Social Mode Settings","summary":"List all social mode settings","description":"The social mode settings. Reads no token: the app reads it at start. With the paywall's price plans.","x-access":[],"x-models":["SocialModeSettings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-social-mode-settings","tags":["Site settings"],"x-section":"Social Mode Settings","summary":"Create a social mode setting","description":"Creates a social mode settings record. A site has one; update it with PATCH instead. Answers 201.","x-access":["admin"],"x-models":["SocialModeSettings"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialModeSettings"}}}}}},"/social-mode-settings/{id}":{"patch":{"operationId":"patch-social-mode-settings-id","tags":["Site settings"],"x-section":"Social Mode Settings","summary":"Update a social mode setting","description":"Updates a social mode settings record. Fields outside the allowed list are ignored. Answers the settings, or 404.","x-access":["admin"],"x-models":["SocialModeSettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the social mode setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialModeSettings"}}}}},"delete":{"operationId":"delete-social-mode-settings-id","tags":["Site settings"],"x-section":"Social Mode Settings","summary":"Delete a social mode setting","description":"Deletes a social mode settings record. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["SocialModeSettings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the social mode setting."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/unlocked-content":{"get":{"operationId":"get-unlocked-content","tags":["Site settings"],"x-section":"Social Mode Settings","summary":"Retrieve the unlocked content","description":"Which sections the signed-in user may use, by their professional account. Answers which sections are open, by section.","x-access":["optional-user"],"x-models":["SocialModeSettings","ProfessionalAccount"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/social/connect":{"post":{"operationId":"post-social-connect","tags":["Site settings"],"x-section":"Social Moderation Settings","summary":"Connect the social","description":"Connects a Facebook page or Instagram account for comment moderation (accessToken, pageId). 400 when the token has no Facebook pages, or not that page. Connecting a different page clears the old page's queue. Answers the settings without the page token.","x-access":["user"],"x-models":["SocialModerationSettings","SocialComment"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"pageId":{"type":"string","description":"The social's page id."},"grantedScopes":{"type":"string","description":"The social's granted scopes."},"deleteComments":{"type":"string","description":"The social's delete comments."}}}}}}}},"/social/disconnect":{"post":{"operationId":"post-social-disconnect","tags":["Site settings"],"x-section":"Social Moderation Settings","summary":"Disconnect the social","description":"Disconnects moderation; deleteComments also removes the stored queue. Answers { connected: false }.","x-access":["user"],"x-models":["SocialModerationSettings","SocialComment"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"deleteComments":{"type":"string","description":"The social's delete comments."}}}}}}}},"/social/messages-probe":{"get":{"operationId":"get-social-messages-probe","tags":["Site settings"],"x-section":"Social Moderation Settings","summary":"Retrieve the social","description":"Returns the social. TEMPORARY. Delete once Instagram messages are settled. Asks Graph the conversations question directly, with the stored Page token and none of our own filtering, across both platforms and both folders. The sync reports zero Instagram conversations while Messenger returns thirteen from the same call and the same token; this shows what Meta actually answers, including the raw error when it refuses rather than returning empty.","x-access":["user"],"x-models":["SocialModerationSettings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/social/queue":{"get":{"operationId":"get-social-queue","tags":["Site settings"],"x-section":"Social Moderation Settings","summary":"Retrieve the social","description":"The moderation queue: every tab's comments and messages in one answer. Answers { byStatus, counts }. ?limit caps each tab.","x-access":["user"],"x-models":["SocialModerationSettings","SocialComment"],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"string"},"description":"How many results to return."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/social/queue/{id}/approve":{"post":{"operationId":"post-social-queue-id-approve","tags":["Site settings"],"x-section":"Social Moderation Settings","summary":"Approve the social","description":"Applies the action on a queued comment (reply, hide, delete), with an edited reply_message. Acts on Facebook or Instagram at once. 404 when the comment is gone; 400 when it is not waiting for a decision.","x-access":["user"],"x-models":["SocialModerationSettings","SocialComment"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the social."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"410":{"description":"It existed but is no longer there - for example a comment already deleted on the social network."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"reply_message":{"type":"string","description":"The social's reply message."},"action":{"type":"string","description":"The social's action."}}}}}}}},"/social/queue/{id}/regenerate-reply":{"post":{"operationId":"post-social-queue-id-regenerate-reply","tags":["Site settings"],"x-section":"Social Moderation Settings","summary":"Create a social","description":"Writes a new suggested reply for a queued comment. Answers { reply_message }.","x-access":["user"],"x-models":["SocialModerationSettings","SocialComment"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the social."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/social/queue/{id}/reject":{"post":{"operationId":"post-social-queue-id-reject","tags":["Site settings"],"x-section":"Social Moderation Settings","summary":"Reject the social","description":"Dismisses a queued comment's suggested action. Answers the comment.","x-access":["user"],"x-models":["SocialComment"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the social."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/social/queue/{id}/undo":{"post":{"operationId":"post-social-queue-id-undo","tags":["Site settings"],"x-section":"Social Moderation Settings","summary":"Undo the social","description":"Reverses an action taken on a comment, by the AI or a person. 400 \"Already undone\"; a deleted comment cannot be brought back.","x-access":["user"],"x-models":["SocialModerationSettings","SocialComment"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the social."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/social/settings":{"get":{"operationId":"get-social-settings","tags":["Site settings"],"x-section":"Social Moderation Settings","summary":"List all socials","description":"The moderation settings. 404 \"No Facebook page connected\". Never includes the page token.","x-access":["user"],"x-models":["SocialModerationSettings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-social-settings","tags":["Site settings"],"x-section":"Social Moderation Settings","summary":"Update the social","description":"Updates the moderation settings; clear_replies_disabled re-arms replying. 404 \"No Facebook page connected\". Answers the settings.","x-access":["user"],"x-models":["SocialModerationSettings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"clear_replies_disabled":{"type":"string","description":"The social's clear replies disabled."}}}}}}}},"/social/status":{"get":{"operationId":"get-social-status","tags":["Site settings"],"x-section":"Social Moderation Settings","summary":"Change the status of a social","description":"Whether moderation is connected, its plan and how many comments wait. Answers { connected: false, plan } when nothing is connected; never includes the page token.","x-access":["user"],"x-models":["SocialModerationSettings","SocialComment"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/social/sync":{"post":{"operationId":"post-social-sync","tags":["Site settings"],"x-section":"Social Moderation Settings","summary":"Sync the social","description":"Pull the page's recent comments now, instead of waiting for the. scheduled run. Same function the cron calls, so a manual sync and an automatic one cannot drift apart.","x-access":["user"],"x-models":["SocialModerationSettings"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/generate-privacy-policy":{"post":{"operationId":"post-generate-privacy-policy","tags":["Site settings"],"x-section":"AI builder","summary":"Generate a privacy policy with AI","description":"AI: writes the site's privacy policy page. Answers { action: 'JOB', async_job }; the page is written from the site's contact details and what it sells.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the privacy policy, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"socketId":{"type":"string","description":"The privacy policy's socket id."},"include_consent":{"type":"string","description":"Whether to also create the cookie consent banner and link it to this privacy policy."}}}}}}}},"/custom-components":{"get":{"operationId":"get-custom-components","tags":["Design & components"],"x-section":"Custom Component","summary":"List all custom components","description":"The custom code components. Answers an array of every record.","x-access":[],"x-models":["CustomComponent"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-custom-components","tags":["Design & components"],"x-section":"Custom Component","summary":"Create a custom component","description":"Creates a custom code component. Answers 201 with no body.","x-access":["admin"],"x-models":["CustomComponent"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomComponent"}}}}}},"/custom-components/{id}":{"get":{"operationId":"get-custom-components-id","tags":["Design & components"],"x-section":"Custom Component","summary":"Retrieve a custom component","description":"One custom code component. 404 when there is no such record.","x-access":[],"x-models":["CustomComponent"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the custom component."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-custom-components-id","tags":["Design & components"],"x-section":"Custom Component","summary":"Update a custom component","description":"Updates a custom code component. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["CustomComponent"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the custom component."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomComponent"}}}}},"delete":{"operationId":"delete-custom-components-id","tags":["Design & components"],"x-section":"Custom Component","summary":"Delete a custom component","description":"Deletes a custom code component. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["CustomComponent"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the custom component."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/custom-font":{"get":{"operationId":"get-custom-font","tags":["Design & components"],"x-section":"Custom Font","summary":"Retrieve the custom font","description":"The uploaded fonts. Answers an array of every record.","x-access":["admin"],"x-models":["CustomFont"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-custom-font","tags":["Design & components"],"x-section":"Custom Font","summary":"Create a custom font","description":"Import a Google font. Takes `{ query }` — a family name, a Google. Fonts URL, a <link> tag or a `font-family:` declaration — and          resolves its real weights against Google's font metadata. The older          `{ family, link }` body still works unchanged.","x-access":["admin"],"x-models":["CustomFont"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","description":"The custom font's query."}}}}}}}},"/custom-font/{id}":{"get":{"operationId":"get-custom-font-id","tags":["Design & components"],"x-section":"Custom Font","summary":"Retrieve a custom font","description":"One uploaded font. 404 when there is no such record.","x-access":["admin"],"x-models":["CustomFont"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the custom font."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-custom-font-id","tags":["Design & components"],"x-section":"Custom Font","summary":"Update a custom font","description":"Updates an uploaded font. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["CustomFont"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the custom font."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFont"}}}}},"delete":{"operationId":"delete-custom-font-id","tags":["Design & components"],"x-section":"Custom Font","summary":"Delete a custom font","description":"Deletes an uploaded font. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["CustomFont"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the custom font."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/font-catalogue":{"get":{"operationId":"get-font-catalogue","tags":["Design & components"],"x-section":"Custom Font","summary":"Retrieve the font catalogue","description":"Every font the theme picker may offer — the built-in library plus. this tenant's own imports, in one shape.","x-access":["admin"],"x-models":["CustomFont"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/google-fonts/search":{"get":{"operationId":"get-google-fonts-search","tags":["Design & components"],"x-section":"Custom Font","summary":"Search google fonts","description":"Typeahead over the whole Google Fonts library, for the admin's font. picker. `q` is whatever the user has typed so far.","x-access":["admin"],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"The words to search for."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/add-locale":{"post":{"operationId":"post-add-locale","tags":["Design & components"],"x-section":"Editor","summary":"Add an add locale","description":"Adds a word key to the site's locales (locale), for every language. locale is the wording to add; it becomes both the key and the text until translated. Answers 201 when added, 200 when the key already exists. Reads no token.","x-access":[],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"locale":{"type":"string","description":"The add locale's locale."}}}}}}}},"/get-404":{"get":{"operationId":"get-get-404","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the 404","description":"The legacy site file templates/views/404.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-app-scss":{"get":{"operationId":"get-get-app-scss","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the app scss","description":"The legacy site file public/css/app-stylesheet.css, as text. Answers the file's text as it is on the server now.","x-access":[],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."}}}},"/get-blog":{"get":{"operationId":"get-get-blog","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the blog","description":"The legacy site file templates/views/blogpost.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-blogs":{"get":{"operationId":"get-get-blogs","tags":["Design & components"],"x-section":"Editor","summary":"List all blogs","description":"The legacy site file templates/views/blogposts.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-bs-css":{"get":{"operationId":"get-get-bs-css","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the bs css","description":"The legacy site file public/css/bs-theme.css, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-cart":{"get":{"operationId":"get-get-cart","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the cart","description":"The legacy site file templates/views/my_cart.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-contacts":{"get":{"operationId":"get-get-contacts","tags":["Design & components"],"x-section":"Editor","summary":"List all contacts","description":"The legacy site file templates/views/contacts.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-css":{"get":{"operationId":"get-get-css","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the css","description":"The legacy site file public/css/stylesheet.css, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-footer":{"get":{"operationId":"get-get-footer","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the footer","description":"The legacy site file templates/partials/footer.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-footer-css":{"get":{"operationId":"get-get-footer-css","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the footer css","description":"The legacy site file public/css/footer.css, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-header":{"get":{"operationId":"get-get-header","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the header","description":"The legacy site file templates/partials/header.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-header-css":{"get":{"operationId":"get-get-header-css","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the header css","description":"The legacy site file public/css/header.css, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-index":{"get":{"operationId":"get-get-index","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the index","description":"The legacy site file templates/views/index.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-locales":{"get":{"operationId":"get-get-locales","tags":["Design & components"],"x-section":"Editor","summary":"List all locales","description":"The site's words by language, as JSON. Answers the site's words as { <key>: <text shown> }, from the newest locales record.","x-access":[],"x-models":["Locales"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/get-main-css":{"get":{"operationId":"get-get-main-css","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the main css","description":"The legacy site file public/css/main.css, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-partners":{"get":{"operationId":"get-get-partners","tags":["Design & components"],"x-section":"Editor","summary":"List all partners","description":"The legacy site file templates/views/partners.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-payment":{"get":{"operationId":"get-get-payment","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the payment","description":"The legacy site file templates/views/payment.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-product":{"get":{"operationId":"get-get-product","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the product","description":"The legacy site file templates/views/product.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-products":{"get":{"operationId":"get-get-products","tags":["Design & components"],"x-section":"Editor","summary":"List all products","description":"The legacy site file templates/views/products.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-service":{"get":{"operationId":"get-get-service","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the service","description":"The legacy site file templates/views/service.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-services":{"get":{"operationId":"get-get-services","tags":["Design & components"],"x-section":"Editor","summary":"List all services","description":"The legacy site file templates/views/services.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-store":{"get":{"operationId":"get-get-store","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the store","description":"The legacy site file templates/views/store.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-theme":{"get":{"operationId":"get-get-theme","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the theme","description":"The site's theme file (colours, fonts) from cloud storage. Answers the theme JSON straight from cloud storage, or 404 when the site has none yet.","x-access":[],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/get-vlog":{"get":{"operationId":"get-get-vlog","tags":["Design & components"],"x-section":"Editor","summary":"Retrieve the vlog","description":"The legacy site file templates/views/video.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/get-vlogs":{"get":{"operationId":"get-get-vlogs","tags":["Design & components"],"x-section":"Editor","summary":"List all vlogs","description":"The legacy site file templates/views/videos.hbs, as text. Answers the file's text as it is on the server now.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/set-404":{"post":{"operationId":"post-set-404","tags":["Design & components"],"x-section":"Editor","summary":"Set a 404","description":"Overwrites the legacy site file templates/views/404.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The 404's content."}}}}}}}},"/set-blog":{"post":{"operationId":"post-set-blog","tags":["Design & components"],"x-section":"Editor","summary":"Set a blog","description":"Overwrites the legacy site file templates/views/blogpost.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The blog's content."}}}}}}}},"/set-blogs":{"post":{"operationId":"post-set-blogs","tags":["Design & components"],"x-section":"Editor","summary":"Set blogs","description":"Overwrites the legacy site file templates/views/blogposts.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The blog's content."}}}}}}}},"/set-bs-css":{"post":{"operationId":"post-set-bs-css","tags":["Design & components"],"x-section":"Editor","summary":"Set bs css","description":"Overwrites the legacy site file public/css/bs-theme.css with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The bs css's content."}}}}}}}},"/set-cart":{"post":{"operationId":"post-set-cart","tags":["Design & components"],"x-section":"Editor","summary":"Set a cart","description":"Overwrites the legacy site file templates/views/my_cart.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The cart's content."}}}}}}}},"/set-contacts":{"post":{"operationId":"post-set-contacts","tags":["Design & components"],"x-section":"Editor","summary":"Set contacts","description":"Overwrites the legacy site file templates/views/contacts.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The contact's content."}}}}}}}},"/set-css":{"post":{"operationId":"post-set-css","tags":["Design & components"],"x-section":"Editor","summary":"Set a css","description":"Overwrites the legacy site file public/css/stylesheet.css with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The css's content."}}}}}}}},"/set-footer":{"post":{"operationId":"post-set-footer","tags":["Design & components"],"x-section":"Editor","summary":"Set a footer","description":"Overwrites the legacy site file templates/partials/footer.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The footer's content."}}}}}}}},"/set-footer-css":{"post":{"operationId":"post-set-footer-css","tags":["Design & components"],"x-section":"Editor","summary":"Set a footer css","description":"Overwrites the legacy site file public/css/footer.css with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The footer css's content."}}}}}}}},"/set-header":{"post":{"operationId":"post-set-header","tags":["Design & components"],"x-section":"Editor","summary":"Set a header","description":"Overwrites the legacy site file templates/partials/header.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The header's content."}}}}}}}},"/set-header-css":{"post":{"operationId":"post-set-header-css","tags":["Design & components"],"x-section":"Editor","summary":"Set a header css","description":"Overwrites the legacy site file public/css/header.css with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The header css's content."}}}}}}}},"/set-index":{"post":{"operationId":"post-set-index","tags":["Design & components"],"x-section":"Editor","summary":"Set an index","description":"Overwrites the legacy site file templates/views/index.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The index's content."}}}}}}}},"/set-locales":{"post":{"operationId":"post-set-locales","tags":["Design & components"],"x-section":"Editor","summary":"Set locales","description":"Replaces the site's words by language (content). Send the whole map as content (JSON text): keys left out are removed. Older locales records are deleted and the app re-reads its startup data.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The locale's content."}}}}}}}},"/set-main-css":{"post":{"operationId":"post-set-main-css","tags":["Design & components"],"x-section":"Editor","summary":"Set a main css","description":"Overwrites the legacy site file public/css/main.css with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The main css's content."}}}}}}}},"/set-partners":{"post":{"operationId":"post-set-partners","tags":["Design & components"],"x-section":"Editor","summary":"Set partners","description":"Overwrites the legacy site file templates/views/partners.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The partner's content."}}}}}}}},"/set-payment":{"post":{"operationId":"post-set-payment","tags":["Design & components"],"x-section":"Editor","summary":"Set a payment","description":"Overwrites the legacy site file templates/views/payment.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The payment's content."}}}}}}}},"/set-product":{"post":{"operationId":"post-set-product","tags":["Design & components"],"x-section":"Editor","summary":"Set a product","description":"Overwrites the legacy site file templates/views/product.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The product's content."}}}}}}}},"/set-products":{"post":{"operationId":"post-set-products","tags":["Design & components"],"x-section":"Editor","summary":"Set products","description":"Overwrites the legacy site file templates/views/products.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The product's content."}}}}}}}},"/set-service":{"post":{"operationId":"post-set-service","tags":["Design & components"],"x-section":"Editor","summary":"Set a service","description":"Overwrites the legacy site file templates/views/service.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The service's content."}}}}}}}},"/set-services":{"post":{"operationId":"post-set-services","tags":["Design & components"],"x-section":"Editor","summary":"Set services","description":"Overwrites the legacy site file templates/views/services.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The service's content."}}}}}}}},"/set-store":{"post":{"operationId":"post-set-store","tags":["Design & components"],"x-section":"Editor","summary":"Set a store","description":"Overwrites the legacy site file templates/views/store.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The store's content."}}}}}}}},"/set-theme":{"post":{"operationId":"post-set-theme","tags":["Design & components"],"x-section":"Editor","summary":"Set a theme","description":"Saves the site's theme file (content), marks the theme step done and re-renders every page. Send the whole theme as content. Every page is rendered again with it on its next visit.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The theme's content."}}}}}}}},"/set-vlog":{"post":{"operationId":"post-set-vlog","tags":["Design & components"],"x-section":"Editor","summary":"Set a vlog","description":"Overwrites the legacy site file templates/views/video.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The vlog's content."}}}}}}}},"/set-vlogs":{"post":{"operationId":"post-set-vlogs","tags":["Design & components"],"x-section":"Editor","summary":"Set vlogs","description":"Overwrites the legacy site file templates/views/videos.hbs with content and restarts the site. Send the whole file as content; it replaces the old one and the site restarts to pick it up. A broken template or stylesheet breaks the site's pages until it is fixed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The vlog's content."}}}}}}}},"/index-components":{"get":{"operationId":"get-index-components","tags":["Design & components"],"x-section":"Index Component","summary":"List all index components","description":"The home page's blocks. Answers an array of every record.","x-access":["admin"],"x-models":["IndexComponent"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-index-components","tags":["Design & components"],"x-section":"Index Component","summary":"Create an index component","description":"Replaces every home page block with the list sent, in order. The body is the WHOLE list (an array of blocks): every block not in it is removed. To add one block and keep the rest, use POST /index-components/append. The list is checked before anything is removed - an empty or invalid one answers 400 and changes nothing. A page block names its page by url in about_page, not by id. The home page is rendered again on its next visit. Answers 201.","x-access":["admin"],"x-models":["IndexComponent"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"map":{"type":"string","description":"The index component's map."}}}}}}}},"/index-components/{id}":{"get":{"operationId":"get-index-components-id","tags":["Design & components"],"x-section":"Index Component","summary":"Retrieve an index component","description":"One home page block. 404 when there is no such record.","x-access":["admin"],"x-models":["IndexComponent"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the index component."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-index-components-id","tags":["Design & components"],"x-section":"Index Component","summary":"Update an index component","description":"Updates a home page block. The home page is rendered again on its next visit. Answers the block, or 404.","x-access":["admin"],"x-models":["IndexComponent"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the index component."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexComponent"}}}}},"delete":{"operationId":"delete-index-components-id","tags":["Design & components"],"x-section":"Index Component","summary":"Delete an index component","description":"Deletes a home page block. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["IndexComponent"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the index component."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/index-components/append":{"post":{"operationId":"post-index-components-append","tags":["Design & components"],"x-section":"Index Component","summary":"Create an index component","description":"Adds one block to the home page, keeping the others - e.g. a page shown on the home page. For a page: { about_page: its id or its url } (type defaults to \"about_page\"). Other types show a list instead (products_latest, services, blogposts...). position puts it there and moves the blocks from there on down; without it, it goes last. isAppComponent: true adds it to the mobile app's home instead of the website's. 404 when the page does not exist. Answers 201 with the new block.","x-access":["admin"],"x-models":["AboutPage","IndexComponent"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","description":"What the block shows: about_page (a page), or a list - products, products_latest, products_top, services, services_all, services_latest, services_top, blogposts, blogposts_latest, blogposts_top, videos, videos_latest, price_plans."},"isFluid":{"type":"boolean","description":"Spans the full width of the screen."},"isAppComponent":{"type":"boolean","description":"Shown in the mobile app's home instead of the website's."},"about_page":{"type":"string","description":"For an about_page block: the URL of the page it shows (AboutPage.url, e.g. \"our-story\"), not its id. POST /index-components/append takes either and stores the url."},"position":{"type":"number","description":"Order on the home page; lower first."}}}}}}}},"/popup":{"get":{"operationId":"get-popup","tags":["Design & components"],"x-section":"Popup","summary":"Retrieve the popup","description":"The site's popups. Answers an array.","x-access":["admin"],"x-models":["Popup"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-popup","tags":["Design & components"],"x-section":"Popup","summary":"Create a popup","description":"Creates a popup. Answers 201 with no body.","x-access":["admin"],"x-models":["Popup"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Popup"}}}}}},"/popup/{id}":{"get":{"operationId":"get-popup-id","tags":["Design & components"],"x-section":"Popup","summary":"Retrieve a popup","description":"One popup. 404 when there is no such record.","x-access":["admin"],"x-models":["Popup"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the popup."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/g/{url}(*)":{"get":{"operationId":"get-g-url","tags":["Design & components"],"x-section":"Wildcard","summary":"Retrieve a g","description":"Serves what a wildcard route points to (a product, service, post or program) at /g/<url>. 404 when no wildcard route has that url; 502 when the page it points to cannot be loaded. Cached for an hour.","x-access":[],"x-models":["Wildcard"],"parameters":[{"name":"url","in":"path","required":true,"schema":{"type":"string"},"description":"The g's URL slug, as in its address on the site."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."},"502":{"description":"A service the request depends on failed - for example the address a redirect forwards to."}}}},"/wildcards":{"get":{"operationId":"get-wildcards","tags":["Design & components"],"x-section":"Wildcard","summary":"List all wildcards","description":"The wildcard routes. Answers an array of every record.","x-access":["admin"],"x-models":["Wildcard"],"parameters":[{"name":"authenticated","in":"query","required":false,"schema":{"type":"string"},"description":"Only wildcards with this authenticated."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-wildcards","tags":["Design & components"],"x-section":"Wildcard","summary":"Create a wildcard","description":"Creates a wildcard route. Answers 201 { id }.","x-access":["admin"],"x-models":["Wildcard"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Wildcard"}}}}}},"/wildcards/{id}":{"get":{"operationId":"get-wildcards-id","tags":["Design & components"],"x-section":"Wildcard","summary":"Retrieve a wildcard","description":"One wildcard route. 404 when there is no such record.","x-access":["admin"],"x-models":["Wildcard"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the wildcard."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-wildcards-id","tags":["Design & components"],"x-section":"Wildcard","summary":"Update a wildcard","description":"Updates a wildcard route. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["Wildcard"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the wildcard."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Wildcard"}}}}},"delete":{"operationId":"delete-wildcards-id","tags":["Design & components"],"x-section":"Wildcard","summary":"Delete a wildcard","description":"Deletes a wildcard route. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["Wildcard"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the wildcard."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/create-new-popup":{"post":{"operationId":"post-create-new-popup","tags":["Design & components"],"x-section":"AI builder","summary":"Create a popup with AI","description":"Create a popup from a prompt, written by the AI builder.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the popup, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"item_id":{"type":"string","description":"The ID of the popup to change."}}}}}}}},"/generate-popup":{"post":{"operationId":"post-generate-popup","tags":["Design & components"],"x-section":"AI builder","summary":"Generate a popup with AI","description":"Use it to create or set up a site popup or modal.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the popup, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/modify-locales":{"post":{"operationId":"post-modify-locales","tags":["Translations"],"x-section":"AI builder","summary":"Modify a locale with AI","description":"Use it to translate the site UI strings (buttons, labels, menus, system text) to a different language, or update the site's translations/locales.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the locale, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/update-locales":{"post":{"operationId":"post-update-locales","tags":["Translations"],"x-section":"AI builder","summary":"Update a locale with AI","description":"Update a locale from a prompt, written by the AI builder.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the locale, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"item_id":{"type":"string","description":"The ID of the locale to change."}}}}}}}},"/email":{"get":{"operationId":"get-email","tags":["Emails"],"x-section":"Email","summary":"Retrieve the email","description":"The site's email texts, one per email type. Answers an array of every record.","x-access":["admin"],"x-models":["Email"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/email/{type}":{"get":{"operationId":"get-email-type","tags":["Emails"],"x-section":"Email","summary":"List all emails","description":"The texts of one email (welcome, confirmation...). 404 when the site has no texts for that email yet: the built-in wording is used.","x-access":["admin"],"x-models":["Email"],"parameters":[{"name":"type","in":"path","required":true,"schema":{"type":"string"},"description":"Which email this is (welcome, confirmation, resetPassword, newsletter...)."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/email-template":{"get":{"operationId":"get-email-template","tags":["Emails"],"x-section":"Email Template","summary":"Retrieve the email template","description":"The email templates. Answers an array of every record.","x-access":["admin"],"x-models":["EmailTemplate"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-email-template","tags":["Emails"],"x-section":"Email Template","summary":"Create an email template","description":"Creates an email template. Answers 201 with no body.","x-access":["admin"],"x-models":["EmailTemplate"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"owner_id":{"type":"string","description":"User.id of who made it."}}}}}}}},"/email-template/{id}":{"get":{"operationId":"get-email-template-id","tags":["Emails"],"x-section":"Email Template","summary":"Retrieve an email template","description":"One email template. 404 when there is no such record.","x-access":["admin"],"x-models":["EmailTemplate"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the email template."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-email-template-id","tags":["Emails"],"x-section":"Email Template","summary":"Update an email template","description":"Updates an email template. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["EmailTemplate"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the email template."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTemplate"}}}}}},"/email-templates/{id}":{"delete":{"operationId":"delete-email-templates-id","tags":["Emails"],"x-section":"Email Template","summary":"Delete an email template","description":"Deletes an email template. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["EmailTemplate"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the email template."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/modify-email-settings":{"post":{"operationId":"post-modify-email-settings","tags":["Emails"],"x-section":"AI builder","summary":"Modify an email setting with AI","description":"AI: works out which emails the owner wants changed and routes to update-email-settings-ai. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the email setting, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/modify-email-template":{"post":{"operationId":"post-modify-email-template","tags":["Emails"],"x-section":"AI builder","summary":"Modify an email template with AI","description":"Use it to design or create the visual look of your emails.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the email template, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/modify-store-email-text":{"post":{"operationId":"post-modify-store-email-text","tags":["Emails"],"x-section":"AI builder","summary":"Modify a store email text with AI","description":"Use it to write or customize the body message that appears inside order or subscription emails.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the store email text, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/update-email-settings-ai":{"post":{"operationId":"post-update-email-settings-ai","tags":["Emails"],"x-section":"AI builder","summary":"Update an email setting with AI","description":"AI: rewrites the site's emails as the owner asked. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the email setting, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"email_type":{"type":"string","description":"The email setting's email type."}}}}}}}},"/update-email-template-ai":{"post":{"operationId":"post-update-email-template-ai","tags":["Emails"],"x-section":"AI builder","summary":"Update an email template with AI","description":"Update an email template from a prompt, written by the AI builder.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the email template, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"item_id":{"type":"string","description":"The ID of the email template to change."}}}}}}}},"/update-store-email-text-ai":{"post":{"operationId":"post-update-store-email-text-ai","tags":["Emails"],"x-section":"AI builder","summary":"Update a store email text with AI","description":"Update a store email text from a prompt, written by the AI builder.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the store email text, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"item_id":{"type":"string","description":"The ID of the store email text to change."}}}}}}}},"/add-media-quality":{"post":{"operationId":"post-add-media-quality","tags":["Media"],"x-section":"Media","summary":"Add an add media quality","description":"Starts transcoding a video (media_id) to another quality (transcode). 404 \"Not found.\", 401 \"Unauthorized.\" for a video the user does not own. Answers { url, media }.","x-access":["user"],"x-models":["Media"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"media_id":{"type":"string","description":"The add media quality's media id."},"transcode":{"type":"string","description":"The add media quality's transcode."},"type":{"type":"string","description":"The add media quality's type."}}}}}}}},"/check-video/{id}":{"get":{"operationId":"get-check-video-id","tags":["Media"],"x-section":"Media","summary":"Check a video","description":"Whether a Vimeo video has finished processing. Answers { duration } once Vimeo has processed the video.","x-access":["user"],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the video."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/create-storage-folder":{"post":{"operationId":"post-create-storage-folder","tags":["Media"],"x-section":"Media","summary":"Create a storage folder with AI","description":"Creates a folder (name) in the site's cloud storage. Answers {}.","x-access":["user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"The storage folder's name."}}}}}}}},"/download-media/{id}":{"get":{"operationId":"get-download-media-id","tags":["Media"],"x-section":"Media","summary":"Retrieve a download media","description":"Downloads a media file as an attachment. A file in cloud storage answers { url } to download from; an older file stored in the database is sent directly.","x-access":[],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the download media."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/get-media-cdn":{"get":{"operationId":"get-get-media-cdn","tags":["Media"],"x-section":"Media","summary":"Retrieve the media cdn","description":"The CDN address media is served from; ?without_path for the bare host. Answers { media_cdn }.","x-access":["user"],"parameters":[{"name":"without_path","in":"query","required":false,"schema":{"type":"string"},"description":"Only media cdns with this without path."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/get-media-upload-signed-url":{"post":{"operationId":"post-get-media-upload-signed-url","tags":["Media"],"x-section":"Media","summary":"Upload a media signed url","description":"A signed cloud storage URL to upload a file to directly (name, type), and the media record it will be. Answers { url, media }: PUT the file to url, and the media record is ready to use. For large files, which skip the server.","x-access":["user"],"x-models":["Media"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"The media signed url's name."},"type":{"type":"string","description":"The media signed url's type."},"duration":{"type":"string","description":"The media signed url's duration."},"saveOwner":{"type":"string","description":"The media signed url's save owner."}}}}}}}},"/get-storage-upload-signed-url":{"post":{"operationId":"post-get-storage-upload-signed-url","tags":["Media"],"x-section":"Media","summary":"Upload a storage signed url","description":"A signed URL to upload a file (name, type) to the site's cloud storage. Answers { url, generated_name }.","x-access":["user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"The storage signed url's name."},"type":{"type":"string","description":"The storage signed url's type."}}}}}}}},"/get-vimeo-form":{"post":{"operationId":"post-get-vimeo-form","tags":["Media"],"x-section":"Media","summary":"Create a vimeo form","description":"Starts a Vimeo upload and answers its upload form. Answers { form, uri }: the browser uploads straight to Vimeo with it.","x-access":["user"],"x-models":["Media"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/import-medias":{"post":{"operationId":"post-import-medias","tags":["Media"],"x-section":"Media","summary":"Import medias","description":"Imports pictures from URLs into the media library. Answers 201 with the new media ids, in the order the URLs were sent.","x-access":["user"],"x-models":["Media"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}}}}},"/import-medias-from-site":{"post":{"operationId":"post-import-medias-from-site","tags":["Media"],"x-section":"Media","summary":"Import medias from site","description":"Imports a picture from another site (media, url) into the media library. Answers 201 { id }.","x-access":["user"],"x-models":["Media"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"media":{"type":"string","description":"The medias from site's media."},"_id":{"type":"string","description":"The ID of the medias from site."},"url":{"type":"string","description":"The medias from site's URL slug, as in its address on the site."}}}}}}}},"/logo":{"get":{"operationId":"get-logo","tags":["Media"],"x-section":"Media","summary":"Retrieve the logo","description":"The site's logo, 400px wide. At full quality. Cached for 6 minutes.","x-access":[],"x-models":["MyContact","Media"],"parameters":[{"name":"size","in":"query","required":false,"schema":{"type":"string"},"description":"Only logos with this size."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/media-about-section-import/{id}":{"get":{"operationId":"get-media-about-section-import-id","tags":["Media"],"x-section":"Media","summary":"Import media sections","description":"The preview picture of an imported page file. Answers the image bytes, or 404.","x-access":[],"x-models":["AboutPageImport"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the media section."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/media-instagram":{"get":{"operationId":"get-media-instagram","tags":["Media"],"x-section":"Media","summary":"Retrieve the media instagram","description":"Downloads the file at the URL given in the query and answers it, with open CORS. Reads no token and fetches any address it is given.","x-access":[],"parameters":[{"name":"url","in":"query","required":false,"schema":{"type":"string"},"description":"The media instagram's URL slug, as in its address on the site."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/media-sequence-generate":{"post":{"operationId":"post-media-sequence-generate","tags":["Media"],"x-section":"Media","summary":"Create a media sequence generate","description":"Make a scroll animation's video with AI, from an idea and up to 3 of the user's pictures. The idea is rewritten into a scroll-friendly, safe video prompt first (utils/ai-builder/scroll-sequence-ai). Answers at once with an AsyncJob to poll (GET /async-jobs/:id); when it completes, its jobContext holds { media, summary, prompt } - the video, already cut into frames - or { error, refused }.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"idea":{"type":"string","description":"The media sequence generate's idea."},"mediaIds":{"type":"string","description":"The media sequence generate's media ids."},"quality":{"type":"string","description":"The media sequence generate's quality."}}}}}}}},"/media-sequence-generate/cost":{"get":{"operationId":"get-media-sequence-generate-cost","tags":["Media"],"x-section":"Media","summary":"Retrieve the media sequence generate","description":"What an AI scroll-animation video costs, in credits, by quality - and the user's. balance (null when the wallet cannot be read).","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/media-sequence/{id}":{"get":{"operationId":"get-media-sequence-id","tags":["Media"],"x-section":"Media","summary":"Retrieve a media sequence","description":"The frames of a scroll animation - status, count, size and CDN. URLs. Public: the live site's player reads it.","x-access":[],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the media sequence."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-media-sequence-id","tags":["Media"],"x-section":"Media","summary":"Create a media sequence","description":"Cut a stored video into the still frames a scroll animation plays. Starts the build and answers 202 { status: 'processing' } at once; follow it with while a build runs, it answers the same (no second build) unless ?force.","x-access":["admin"],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the media sequence."},{"name":"force","in":"query","required":false,"schema":{"type":"string"},"description":"Only media sequences with this force."}],"responses":{"202":{"description":"The work was started and finishes in the background - for example a video being processed ({ \"status\": \"processing\" }). Check back on the object."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"trim_start":{"type":"string","description":"The media sequence's trim start."}}}}}}}},"/media-sequence/{id}/client-fail":{"post":{"operationId":"post-media-sequence-id-client-fail","tags":["Media"],"x-section":"Media","summary":"Create a media sequence","description":"The browser could not finish (and says why) - so the build is not left \"processing\". Answers { ok: true }.","x-access":["admin"],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the media sequence."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"The media sequence's error."}}}}}}}},"/media-sequence/{id}/client-finish":{"post":{"operationId":"post-media-sequence-id-client-finish","tags":["Media"],"x-section":"Media","summary":"Create a media sequence","description":"The frames are up: check them and mark the animation ready. Answers the frame manifest the page uses.","x-access":["admin"],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the media sequence."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}}}}},"/media-sequence/{id}/client-progress":{"post":{"operationId":"post-media-sequence-id-client-progress","tags":["Media"],"x-section":"Media","summary":"Create a media sequence","description":"The admin's heartbeat while it builds: frames done so far. Answers { ok: true }.","x-access":["admin"],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the media sequence."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}}}}},"/media-sequence/{id}/client-start":{"post":{"operationId":"post-media-sequence-id-client-start","tags":["Media"],"x-section":"Media","summary":"Create a media sequence","description":"Signed upload links for every frame the admin is about to make. For the scroll animation: the admin cuts the video into frames in the browser. 404 \"Video not found\", 409 when it is already being processed.","x-access":["admin"],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the media sequence."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"409":{"description":"It clashes with the current state: the item is already being processed, a version is already applied, or an AI plan or preview is no longer available."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"force":{"type":"string","description":"The media sequence's force."}}}}}}}},"/media-tracker/{id}":{"get":{"operationId":"get-media-tracker-id","tags":["Media"],"x-section":"Media","summary":"Retrieve a media tracker","description":"The picture of a progress entry. Answers the image bytes, or 404.","x-access":[],"x-models":["TrackerProgress"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the media tracker."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/medias":{"post":{"operationId":"post-medias","tags":["Media"],"x-section":"Media","summary":"Create a media","description":"Creates a media record. Multipart upload of one or more files (medias). Pictures are resized and stored; answers the media record, or redirects back for a website form.","x-access":["user"],"x-models":["MyContact","Media"],"parameters":[{"name":"skip_owner_id","in":"query","required":false,"schema":{"type":"string"},"description":"Only medias with this skip owner id."}],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string","description":"The media's body."},"alt":{"type":"string","description":"Img alt (same as filename if not specified)."},"youtube_url":{"type":"string","description":"Link to the video on YouTube."},"vimeo_url":{"type":"string","description":"Link to the video on Vimeo."},"picture_gcs_url":{"type":"string","description":"The picture's address in cloud storage."}}}}}}}},"/medias-avatar/{id}":{"get":{"operationId":"get-medias-avatar-id","tags":["Media"],"x-section":"Media","summary":"Retrieve a medias avatar","description":"A picture 160px wide, as an avatar. Resized on the fly and cached for an hour; 404 when there is no such media.","x-access":[],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the medias avatar."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/medias-count":{"get":{"operationId":"get-medias-count","tags":["Media"],"x-section":"Media","summary":"Count medias","description":"How many media records the site has. Answers { videos_count, pictures_count }.","x-access":["user"],"x-models":["Media"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/medias-form/{form_id}&{img_index}":{"get":{"operationId":"get-medias-form-form-id-img-index","tags":["Media"],"x-section":"Media","summary":"Retrieve a medias form","description":"A file sent with a form, by its position. Answers the file bytes, or 404.","x-access":[],"x-models":["Form"],"parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string"},"description":"The medias form's form id."},{"name":"img_index","in":"path","required":true,"schema":{"type":"string"},"description":"The medias form's img index."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/medias-large/{id}":{"get":{"operationId":"get-medias-large-id","tags":["Media"],"x-section":"Media","summary":"Retrieve a medias large","description":"A picture 1920px wide. Resized on the fly and cached for an hour; 404 when there is no such media.","x-access":[],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the medias large."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/medias-marker/{id}":{"get":{"operationId":"get-medias-marker-id","tags":["Media"],"x-section":"Media","summary":"Retrieve a medias marker","description":"A picture for a map marker, resized (?size). Cached for an hour.","x-access":[],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the medias marker."},{"name":"size","in":"query","required":false,"schema":{"type":"string"},"description":"Only medias markers with this size."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/medias-medium/{id}":{"get":{"operationId":"get-medias-medium-id","tags":["Media"],"x-section":"Media","summary":"Retrieve a medias medium","description":"A picture 1280px wide. Resized on the fly and cached for an hour; 404 when there is no such media.","x-access":[],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the medias medium."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/medias-object/{id}":{"get":{"operationId":"get-medias-object-id","tags":["Media"],"x-section":"Media","summary":"Retrieve a medias object","description":"Get a Media object. The media record without its file. 404 \"not found\".","x-access":["user"],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the medias object."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/medias-og/{id}":{"get":{"operationId":"get-medias-og-id","tags":["Media"],"x-section":"Media","summary":"Retrieve a medias og","description":"A picture as a JPEG sized for link previews (Open Graph). 1200×630; a GIF is sent as its first frame, since link previews do not play GIFs.","x-access":[],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the medias og."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/medias-responsive/{id}":{"get":{"operationId":"get-medias-responsive-id","tags":["Media"],"x-section":"Media","summary":"Retrieve a medias responsive","description":"A picture sized for its column. 1280px wide by default; ?size scales it to the column's width (up to 2560px). Resized on the fly and cached for an hour; 404 when there is no such media.","x-access":[],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the medias responsive."},{"name":"size","in":"query","required":false,"schema":{"type":"string"},"description":"Only medias responsives with this size."},{"name":"isFluid","in":"query","required":false,"schema":{"type":"string"},"description":"Only medias responsives with this is fluid."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/medias-storage":{"get":{"operationId":"get-medias-storage","tags":["Media"],"x-section":"Media","summary":"Retrieve the medias storage","description":"How much storage the site's media uses. Answers the total size of the site's stored files.","x-access":["user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/medias-thumbnail/{id}":{"get":{"operationId":"get-medias-thumbnail-id","tags":["Media"],"x-section":"Media","summary":"Retrieve a medias thumbnail","description":"A picture 400px wide, as a thumbnail. Resized on the fly and cached for an hour; 404 when there is no such media.","x-access":[],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the medias thumbnail."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/medias-xlarge/{id}":{"get":{"operationId":"get-medias-xlarge-id","tags":["Media"],"x-section":"Media","summary":"Retrieve a medias xlarge","description":"A picture 2560px wide. At quality 85. Product answers link their pictures here. Resized on the fly and cached for an hour; 404 when there is no such media.","x-access":[],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the medias xlarge."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/medias/{id}":{"get":{"operationId":"get-medias-id","tags":["Media"],"x-section":"Media","summary":"Retrieve a media","description":"A picture 860px wide. The default size for pictures in pages. Resized on the fly and cached for an hour; 404 when there is no such media.","x-access":[],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the media."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-medias-id","tags":["Media"],"x-section":"Media","summary":"Update a media","description":"Updates a media record. 404 when there is no such media.","x-access":["user"],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the media."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"alt":{"type":"string","description":"Img alt (same as filename if not specified)."},"filename":{"type":"string","description":"Name of the stored file."},"thumbnail":{"type":"string","description":"Small preview of the file."}}}}}}},"delete":{"operationId":"delete-medias-id","tags":["Media"],"x-section":"Media","summary":"Delete a media","description":"Deletes a media record. Also deletes the stored file. 401 when the media belongs to another user. Records that still use it keep its id.","x-access":["user"],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the media."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/pwa-logo":{"get":{"operationId":"get-pwa-logo","tags":["Media"],"x-section":"Media","summary":"Retrieve the app logo","description":"The installable app's icon, resized (?size); ?media_id for another picture. Falls back to the site's logo when the app has no icon of its own. Cached for 6 minutes.","x-access":[],"x-models":["PwaSettings","MyContact","Media"],"parameters":[{"name":"media_id","in":"query","required":false,"schema":{"type":"string"},"description":"Only app logos with this media id."},{"name":"size","in":"query","required":false,"schema":{"type":"string"},"description":"Only app logos with this size."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/pwa-media/{id}":{"get":{"operationId":"get-pwa-media-id","tags":["Media"],"x-section":"Media","summary":"Retrieve an app media","description":"A picture resized for the installable app (?size_x, ?size_y). Answers the image bytes, or 404.","x-access":[],"x-models":["Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the app media."},{"name":"size_x","in":"query","required":false,"schema":{"type":"string"},"description":"Only app medias with this size x."},{"name":"size_y","in":"query","required":false,"schema":{"type":"string"},"description":"Only app medias with this size y."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/qr-code-medias/{id}":{"get":{"operationId":"get-qr-code-medias-id","tags":["Media"],"x-section":"Media","summary":"Retrieve a QR code code media","description":"A ticket's QR code as a PNG. 404 when there is no such ticket.","x-access":[],"x-models":["Ticket"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the QR code code media."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/remove-media-quality":{"patch":{"operationId":"patch-remove-media-quality","tags":["Media"],"x-section":"Media","summary":"Remove a remove media quality","description":"Deletes one transcoded quality of a video (media_id, transcode). Answers { media }.","x-access":["user"],"x-models":["Media"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"media_id":{"type":"string","description":"The remove media quality's media id."},"transcode":{"type":"string","description":"The remove media quality's transcode."}}}}}}}},"/storage-file":{"patch":{"operationId":"patch-storage-file","tags":["Media"],"x-section":"Media","summary":"Update the storage file","description":"Deletes a file (file) from the site's cloud storage. Only inside the site's own folder.","x-access":["user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"string","description":"The storage file's file."}}}}}}}},"/storage-files":{"get":{"operationId":"get-storage-files","tags":["Media"],"x-section":"Media","summary":"List all storage files","description":"Files and folders in the site's cloud storage under ?folder_path. Only the site's own folder: a path cannot reach another site's files.","x-access":["admin"],"parameters":[{"name":"folder_path","in":"query","required":false,"schema":{"type":"string"},"description":"Only storage files with this folder path."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/file-routes":{"get":{"operationId":"get-file-routes","tags":["Media"],"x-section":"File Route","summary":"List all file routes","description":"The files served at the site's root (verification files and the like). Answers an array, newest first.","x-access":["admin"],"x-models":["FileRoute"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-file-routes","tags":["Media"],"x-section":"File Route","summary":"Create a file route","description":"Creates a root file route. The file must already be in the site's cloud storage (gcs_key) and be at most 2MB; url is the root path it is served at. Answers 201 { id }.","x-access":["admin"],"x-models":["FileRoute"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The file route's URL slug, as in its address on the site."},"content_type":{"type":"string","description":"Optional content type override."}}}}}}}},"/file-routes/{id}":{"patch":{"operationId":"patch-file-routes-id","tags":["Media"],"x-section":"File Route","summary":"Update a file route","description":"Updates a root file route. The same checks as creating one. 404 when there is no such route.","x-access":["admin"],"x-models":["FileRoute"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the file route."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The file route's URL slug, as in its address on the site."},"content_type":{"type":"string","description":"Optional content type override."}}}}}}},"delete":{"operationId":"delete-file-routes-id","tags":["Media"],"x-section":"File Route","summary":"Delete a file route","description":"Deletes a root file route. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["FileRoute"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the file route."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/qr-code":{"get":{"operationId":"get-qr-code","tags":["Media"],"x-section":"Qr Code","summary":"Retrieve the QR code code","description":"Ticket QR codes. Answers an array of every record.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-qr-code","tags":["Media"],"x-section":"Qr Code","summary":"Create a QR code code","description":"Creates a ticket QR code. Answers 201 with no body.","x-access":["admin"],"x-models":["QrCode"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QrCode"}}}}}},"/qr-code/{id}":{"get":{"operationId":"get-qr-code-id","tags":["Media"],"x-section":"Qr Code","summary":"Retrieve a QR code code","description":"One ticket QR code. 404 when there is no such record.","x-access":["admin"],"x-models":["QrCode"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the QR code code."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-qr-code-id","tags":["Media"],"x-section":"Qr Code","summary":"Update a QR code code","description":"Updates an alert. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["QrCode"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the QR code code."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QrCode"}}}}}},"/single-video/{id}":{"get":{"operationId":"get-single-video-id","tags":["Media"],"x-section":"Video","summary":"Retrieve a single video","description":"One video's page with its comments and the rest of its playlist. 404 \"Not found.\". Answers { video, videos, collection } with ?ionic.","x-access":["optional-user","page-priv"],"x-models":["Video","Comment","Collection"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the single video."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/videos":{"get":{"operationId":"get-videos","tags":["Media"],"x-section":"Video","summary":"List all videos","description":"The videos page, or the videos as JSON with ?ionic: filtered by playlist and published state, and sorted. Paged with ?skip, filtered by ?collection and ?published; ?sortBy sets the order.","x-access":["user-priv","optional-user"],"x-models":["Collection","Video","AboutPage"],"parameters":[{"name":"published","in":"query","required":false,"schema":{"type":"string"},"description":"Only videos with this published."},{"name":"sortBy","in":"query","required":false,"schema":{"type":"string"},"description":"The order of the results."},{"name":"collection","in":"query","required":false,"schema":{"type":"string"},"description":"Only results in this collection."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-videos","tags":["Media"],"x-section":"Video","summary":"Create a video","description":"Creates a video. Answers 201 and re-renders the home page.","x-access":["user"],"x-models":["Video"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Video"}}}}}},"/videos-multiple/{delete_ids}":{"delete":{"operationId":"delete-videos-multiple-delete-ids","tags":["Media"],"x-section":"Video","summary":"Delete multiple videos","description":"Deletes several videos, ids comma-separated. Answers the ids that were deleted.","x-access":["user"],"x-models":["Video"],"parameters":[{"name":"delete_ids","in":"path","required":true,"schema":{"type":"string"},"description":"The video's delete ids."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/videos-multiple/{patch_ids}":{"patch":{"operationId":"patch-videos-multiple-patch-ids","tags":["Media"],"x-section":"Video","summary":"Update multiple videos","description":"Applies the same changes (updates) to several videos, ids comma-separated. Answers the ids that were changed.","x-access":["user"],"x-models":["Video"],"parameters":[{"name":"patch_ids","in":"path","required":true,"schema":{"type":"string"},"description":"The video's patch ids."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"collection_id":{"type":"string","description":"Collection.id."},"updates":{"type":"string","description":"The video's updates."}}}}}}}},"/videos/{id}":{"get":{"operationId":"get-videos-id","tags":["Media"],"x-section":"Video","summary":"Retrieve a video","description":"A playlist's page with its videos. 404 when there is no such playlist. JSON with ?ionic.","x-access":["optional-user"],"x-models":["Collection","Video"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the video."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-videos-id","tags":["Media"],"x-section":"Video","summary":"Update a video","description":"Updates a video. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["user"],"x-models":["Video"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the video."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Video"}}}}},"delete":{"operationId":"delete-videos-id","tags":["Media"],"x-section":"Video","summary":"Delete a video","description":"Deletes a video. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["user"],"x-models":["Video"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the video."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/videos/playlists":{"get":{"operationId":"get-videos-playlists","tags":["Media"],"x-section":"Video","summary":"List all videos","description":"The playlists page. 404 when there are no playlists.","x-access":["optional-user"],"x-models":["Collection","Media"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/video-interaction":{"post":{"operationId":"post-video-interaction","tags":["Media"],"x-section":"Video Interaction","summary":"Create a video interaction","description":"Creates a video watch record. Records a stretch of watching (start, end); it feeds the long-video insights. Answers 201.","x-access":["user"],"x-models":["VideoInteraction"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"video_viewer":{"type":"string","description":"User.id."}}}}}}}},"/create-new-image":{"post":{"operationId":"post-create-new-image","tags":["Media"],"x-section":"AI builder","summary":"Create an image with AI","description":"AI: generates a picture from the owner's prompt, stores it in the media library and charges its credits. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the image, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/create-new-video":{"post":{"operationId":"post-create-new-video","tags":["Media"],"x-section":"AI builder","summary":"Create a video with AI","description":"AI: generates a video from text, a picture or an earlier video, as a background job. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"x-models":["ChatMessage","Media"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"duration":{"type":"string","description":"The video's duration."},"prompt":{"type":"string","description":"What the AI should do with the video, in plain words - any language."},"mediaIds":{"type":"string","description":"The video's media ids."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aspect_ratio":{"type":"string","description":"The video's aspect ratio."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/generate-image":{"post":{"operationId":"post-generate-image","tags":["Media"],"x-section":"AI builder","summary":"Generate an image with AI","description":"AI: routes a request for a new picture to create-new-image. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the image, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/generate-image-to-video":{"post":{"operationId":"post-generate-image-to-video","tags":["Media"],"x-section":"AI builder","summary":"Generate an image to video with AI","description":"AI: routes a request for a video from a picture to create-new-video. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the image to video, in plain words - any language."},"aspect_ratio":{"type":"string","description":"The image to video's aspect ratio."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/generate-text-to-video":{"post":{"operationId":"post-generate-text-to-video","tags":["Media"],"x-section":"AI builder","summary":"Generate a text to video with AI","description":"AI: routes a request for a video from text to create-new-video, if the account has credits. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the text to video, in plain words - any language."},"aspect_ratio":{"type":"string","description":"The text to video's aspect ratio."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/generate-video-to-video":{"post":{"operationId":"post-generate-video-to-video","tags":["Media"],"x-section":"AI builder","summary":"Generate a video to video with AI","description":"AI: routes a change to a video to create-new-video. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the video to video, in plain words - any language."},"aspect_ratio":{"type":"string","description":"The video to video's aspect ratio."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/modify-ai-image":{"post":{"operationId":"post-modify-ai-image","tags":["Media"],"x-section":"AI builder","summary":"Modify an AI image with AI","description":"AI: routes a change to a picture the AI made to update-image. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the AI image, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/modify-ai-user-image":{"post":{"operationId":"post-modify-ai-user-image","tags":["Media"],"x-section":"AI builder","summary":"Modify an AI user image with AI","description":"AI: routes a change to a picture to update-image. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the AI user image, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/modify-user-image":{"post":{"operationId":"post-modify-user-image","tags":["Media"],"x-section":"AI builder","summary":"Modify a user image with AI","description":"AI: routes a change to one of the owner's pictures to update-image. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the user image, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/update-image":{"post":{"operationId":"post-update-image","tags":["Media"],"x-section":"AI builder","summary":"Update an image with AI","description":"AI: edits an existing picture as the owner asked and stores the result. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"x-models":["Media","ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the image, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"mediaIds":{"type":"string","description":"The image's media ids."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/smart-search":{"post":{"operationId":"post-smart-search","tags":["Search"],"x-section":"Smart Search","summary":"Create a smart search","description":"Meaning-based search over the site's content, for the search component. Reads no token. Answers the matching items for the search component.","x-access":[],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"kinds":{"type":"string","description":"The smart search's kinds."},"q":{"type":"string","description":"The words to search for."},"price":{"type":"string","description":"The smart search's price."},"dates":{"type":"string","description":"The smart search's dates."},"collections":{"type":"string","description":"The smart search's collections."},"items":{"type":"string","description":"The smart search's items."},"sort":{"type":"string","description":"The order of the results."},"skip":{"type":"string","description":"How many results to skip - for paging."},"limit":{"type":"string","description":"How many results to return."}}}}}}}},"/smart-search/answer":{"post":{"operationId":"post-smart-search-answer","tags":["Search"],"x-section":"Smart Search","summary":"Create a smart search","description":"An overview answer to the visitor's question, written only from the site's content the search finds. Reads no token. Answers { answer, sources }; empty when nothing relevant is found, and 429 past a visitor's hourly limit.","x-access":[],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"429":{"description":"Slow down: the site's request limit was reached, an AI chat already has a request running, or the hourly limit of AI search answers is used up. Wait and retry."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"q":{"type":"string","description":"The words to search for."},"kinds":{"type":"string","description":"The smart search's kinds."},"price":{"type":"string","description":"The smart search's price."},"dates":{"type":"string","description":"The smart search's dates."},"collections":{"type":"string","description":"The smart search's collections."},"items":{"type":"string","description":"The smart search's items."}}}}}}}},"/smart-search/items":{"get":{"operationId":"get-smart-search-items","tags":["Search"],"x-section":"Smart Search","summary":"List all smart searches","description":"The site's searchable items, for the editor's \"only these items\" picker. ?kinds and ?q narrow the list.","x-access":["admin"],"parameters":[{"name":"kinds","in":"query","required":false,"schema":{"type":"string"},"description":"Only smart searches with this kinds."},{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"The words to search for."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/smart-search/locales":{"post":{"operationId":"post-smart-search-locales","tags":["Search"],"x-section":"Smart Search","summary":"Create a smart search","description":"Fills the site's locales with the search component's words in the site's language - the editor calls it when the component is added. Answers { added }: the keys that were missing.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/smart-search/reindex":{"post":{"operationId":"post-smart-search-reindex","tags":["Search"],"x-section":"Smart Search","summary":"Reindex the smart search","description":"Teach the search: index the site's content now (the editor's button). Only content that changed is embedded again. Answers what was indexed.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"rebuild":{"type":"string","description":"The smart search's rebuild."}}}}}}}},"/activity-log-filters":{"get":{"operationId":"get-activity-log-filters","tags":["SEO & analytics"],"x-section":"Activity Log","summary":"List the activity log filters","description":"The action and entity values actually present, for the filter menus. Only values that occur, so no filter comes back empty.","x-access":["admin"],"x-models":["ActivityLog"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/activity-logs":{"get":{"operationId":"get-activity-logs","tags":["SEO & analytics"],"x-section":"Activity Log","summary":"List all activity logs","description":"List activity log entries, newest first. Answers { results, limit, skip, has_more }, paged with ?skip and ?limit (capped). Filters: ?action, ?entity, ?entity_id, ?user, ?email, ?kind, ?search, ?from and ?to.","x-access":["admin"],"x-models":["ActivityLog"],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"string"},"description":"How many results to return."},{"name":"skip","in":"query","required":false,"schema":{"type":"string"},"description":"How many results to skip - for paging."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/activity-logs-export":{"get":{"operationId":"get-activity-logs-export","tags":["SEO & analytics"],"x-section":"Activity Log","summary":"Export activity logs","description":"The current selection as CSV. The same filters as /activity-logs, capped at a limit.","x-access":["admin"],"x-models":["ActivityLog"],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"string"},"description":"How many results to return."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/activity-logs/{id}":{"get":{"operationId":"get-activity-logs-id","tags":["SEO & analytics"],"x-section":"Activity Log","summary":"Retrieve an activity log","description":"One entry, including the full recorded payload. 404 when there is no such record.","x-access":["admin"],"x-models":["ActivityLog"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the activity log."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/ga/connect":{"post":{"operationId":"post-ga-connect","tags":["SEO & analytics"],"x-section":"Ga","summary":"Connect the Google Analytic","description":"Lists the Google Analytics accounts and properties of a Google sign-in (accessToken). Answers { hasAccount, accounts }. The token is used once and not stored.","x-access":["user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/ga/create":{"post":{"operationId":"post-ga-create","tags":["SEO & analytics"],"x-section":"Ga","summary":"Create a Google Analytic","description":"Creates or picks a Google Analytics property and puts its tag on the site. Uses the site's domain and currency. Every page is rendered again with the tag.","x-access":["user"],"x-models":["MyContact","PaymentMethod"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"property":{"type":"string","description":"The Google Analytic's property."},"accountName":{"type":"string","description":"The Google Analytic's account name."},"currencyCode":{"type":"string","description":"The Google Analytic's currency code."},"propertyName":{"type":"string","description":"The Google Analytic's property name."},"timeZone":{"type":"string","description":"The Google Analytic's time zone."},"replaceTag":{"type":"string","description":"The Google Analytic's replace tag."}}}}}}}},"/ga/disconnect":{"post":{"operationId":"post-ga-disconnect","tags":["SEO & analytics"],"x-section":"Ga","summary":"Disconnect the Google Analytic","description":"Unlinks Google Analytics and removes its tag from the site. Every page is rendered again without the tag. The Analytics property itself is not touched. Answers { connected: false }.","x-access":["user"],"x-models":["MyContact","Tracking"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/ga/events":{"get":{"operationId":"get-ga-events","tags":["SEO & analytics"],"x-section":"Ga","summary":"List all Google Analytics","description":"Events by name over ?range, from Google Analytics. The same answers when not linked as /ga/report.","x-access":["user"],"x-models":["MyContact"],"parameters":[{"name":"range","in":"query","required":false,"schema":{"type":"string"},"description":"Only Google Analytics with this range."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/ga/pages":{"get":{"operationId":"get-ga-pages","tags":["SEO & analytics"],"x-section":"Ga","summary":"List all Google Analytics","description":"Most viewed pages over ?range, from Google Analytics. The same answers when not linked as /ga/report.","x-access":["user"],"x-models":["MyContact"],"parameters":[{"name":"range","in":"query","required":false,"schema":{"type":"string"},"description":"Only Google Analytics with this range."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/ga/realtime":{"get":{"operationId":"get-ga-realtime","tags":["SEO & analytics"],"x-section":"Ga","summary":"Retrieve the Google Analytic","description":"Visitors on the site right now, from Google Analytics. The last 30 minutes, by minute. Cached for a minute.","x-access":["user"],"x-models":["MyContact"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/ga/report":{"get":{"operationId":"get-ga-report","tags":["SEO & analytics"],"x-section":"Ga","summary":"Report the Google Analytic","description":"Visitors and events per day over ?range, from Google Analytics (cached). ?range picks the period. Answers { connected: false } when not linked, and noAccess when the platform lost access to the property. Answers are cached.","x-access":["user"],"x-models":["MyContact"],"parameters":[{"name":"range","in":"query","required":false,"schema":{"type":"string"},"description":"Only Google Analytics with this range."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/ga/status":{"get":{"operationId":"get-ga-status","tags":["SEO & analytics"],"x-section":"Ga","summary":"Change the status of a Google Analytic","description":"Whether Google Analytics is linked and its tag is on the site. Answers { connected } with the property when linked.","x-access":["user"],"x-models":["MyContact","Tracking"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/gmb/categories":{"get":{"operationId":"get-gmb-categories","tags":["SEO & analytics"],"x-section":"Gmb","summary":"List all Google Business Profiles","description":"Business Profile categories matching ?q, for a region and language. ?accessToken is the owner's Google token.","x-access":["user"],"parameters":[{"name":"accessToken","in":"query","required":false,"schema":{"type":"string"},"description":"Only Google Business Profiles with this access token."},{"name":"regionCode","in":"query","required":false,"schema":{"type":"string"},"description":"Only Google Business Profiles with this region code."},{"name":"languageCode","in":"query","required":false,"schema":{"type":"string"},"description":"Only Google Business Profiles with this language code."},{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"The words to search for."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/gmb/connect":{"post":{"operationId":"post-gmb-connect","tags":["SEO & analytics"],"x-section":"Gmb","summary":"Connect the Google Business Profile","description":"Lists the Google Business Profile locations of a Google sign-in (accessToken). Answers { hasBusiness, locations, accountEmail }. The token is used once and not stored.","x-access":["user"],"x-models":["MyContact"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/gmb/create":{"post":{"operationId":"post-gmb-create","tags":["SEO & analytics"],"x-section":"Gmb","summary":"Create a Google Business Profile","description":"Creates Business Profile locations (locations) for the business. 400 when the Google account has no Business Profile account. Answers 201 { locations }.","x-access":["user"],"x-models":["MyContact"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"locations":{"type":"string","description":"The Google Business Profile's locations."}}}}}}}},"/gmb/disconnect":{"post":{"operationId":"post-gmb-disconnect","tags":["SEO & analytics"],"x-section":"Gmb","summary":"Disconnect the Google Business Profile","description":"Unlinks the Business Profile from the site; the profile itself stays. Answers { connected: false }.","x-access":["user"],"x-models":["MyContact"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/gmb/import":{"post":{"operationId":"post-gmb-import","tags":["SEO & analytics"],"x-section":"Gmb","summary":"Import the Google Business Profile","description":"Imports a location's address, hours, services and pictures into the site. Only what is asked: importServices, importHours, importAddress, importEmail; services go into collectionId. Answers what was imported.","x-access":["user"],"x-models":["OriginAddress","Collection","MyContact","Service"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"serviceItems":{"type":"string","description":"The Google Business Profile's service items."},"storefrontAddress":{"type":"string","description":"The Google Business Profile's storefront address."},"regularHours":{"type":"string","description":"The Google Business Profile's regular hours."},"location":{"type":"string","description":"The Google Business Profile's location."},"importServices":{"type":"string","description":"The Google Business Profile's import services."},"collectionId":{"type":"string","description":"The Google Business Profile's collection id."},"importHours":{"type":"string","description":"The Google Business Profile's import hours."},"importAddress":{"type":"string","description":"The Google Business Profile's import address."},"email":{"type":"string","description":"An email address."},"importEmail":{"type":"string","description":"The Google Business Profile's import email."}}}}}}}},"/gmb/select":{"post":{"operationId":"post-gmb-select","tags":["SEO & analytics"],"x-section":"Gmb","summary":"Create a Google Business Profile","description":"Links one Business Profile location to the site (location). Answers { connected, gmb_location }.","x-access":["user"],"x-models":["MyContact"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"location":{"type":"string","description":"The Google Business Profile's location."}}}}}}}},"/gmb/status":{"get":{"operationId":"get-gmb-status","tags":["SEO & analytics"],"x-section":"Gmb","summary":"Change the status of a Google Business Profile","description":"Whether a Business Profile location is linked to the site. Answers { connected } with the location when linked.","x-access":["user"],"x-models":["MyContact"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/gsc/breakdown":{"get":{"operationId":"get-gsc-breakdown","tags":["SEO & analytics"],"x-section":"Gsc","summary":"Retrieve the Search Console","description":"Search Console results by query, page, country or device (?dimension). ?dimension: query, page, country or device.","x-access":["user"],"x-models":["MyContact","Tracking"],"parameters":[{"name":"range","in":"query","required":false,"schema":{"type":"string"},"description":"Only Search Consoles with this range."},{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"Only Search Consoles with this type."},{"name":"dimension","in":"query","required":false,"schema":{"type":"string"},"description":"Only Search Consoles with this dimension."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/gsc/connect":{"post":{"operationId":"post-gsc-connect","tags":["SEO & analytics"],"x-section":"Gsc","summary":"Connect the Search Console","description":"Verifies the site in Search Console and adds it (accessToken). Puts the verification meta tag on the site, verifies it and adds the sitemap. Answers { connected, siteUrl, reporting }.","x-access":["user"],"x-models":["MyContact","Tracking"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/gsc/disconnect":{"post":{"operationId":"post-gsc-disconnect","tags":["SEO & analytics"],"x-section":"Gsc","summary":"Disconnect the Search Console","description":"Unlinks Search Console and removes its verification tag. The site stays in the owner's Search Console. Answers { connected: false }.","x-access":["user"],"x-models":["Tracking"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/gsc/performance":{"get":{"operationId":"get-gsc-performance","tags":["SEO & analytics"],"x-section":"Gsc","summary":"Retrieve the Search Console","description":"Clicks, impressions and positions over ?range, from Search Console (cached). ?range picks the period, ?type the search type. Answers { connected: false } when not linked.","x-access":["user"],"x-models":["MyContact","Tracking"],"parameters":[{"name":"range","in":"query","required":false,"schema":{"type":"string"},"description":"Only Search Consoles with this range."},{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"Only Search Consoles with this type."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/gsc/sites":{"get":{"operationId":"get-gsc-sites","tags":["SEO & analytics"],"x-section":"Gsc","summary":"List all Search Consoles","description":"Whether Google Search Console is linked and verified for the site. Answers { connected } with the site's Search Console address when linked.","x-access":["user"],"x-models":["MyContact","Tracking"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/keywords":{"get":{"operationId":"get-keywords","tags":["SEO & analytics"],"x-section":"Keyword","summary":"List all keywords","description":"The SEO keywords. Answers an array of every keyword.","x-access":["admin"],"x-models":["Keyword"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/keywords/{id}":{"get":{"operationId":"get-keywords-id","tags":["SEO & analytics"],"x-section":"Keyword","summary":"Retrieve a keyword","description":"One SEO keyword. 404 when there is no such keyword.","x-access":["admin"],"x-models":["Keyword"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the keyword."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/keyword-blacklist":{"get":{"operationId":"get-keyword-blacklist","tags":["SEO & analytics"],"x-section":"Keyword Blacklist","summary":"Retrieve the keyword blacklist","description":"Words not allowed in posts and comments. Answers the record's id and words.","x-access":["user"],"x-models":["KeywordBlacklist"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-keyword-blacklist","tags":["SEO & analytics"],"x-section":"Keyword Blacklist","summary":"Create a keyword blacklist","description":"Creates a blacklist record. Answers 201 with no body.","x-access":["user"],"x-models":["KeywordBlacklist"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeywordBlacklist"}}}}}},"/keyword-blacklist/{id}":{"patch":{"operationId":"patch-keyword-blacklist-id","tags":["SEO & analytics"],"x-section":"Keyword Blacklist","summary":"Update a keyword blacklist","description":"Updates a blacklist record. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["user"],"x-models":["KeywordBlacklist"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the keyword blacklist."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeywordBlacklist"}}}}},"delete":{"operationId":"delete-keyword-blacklist-id","tags":["SEO & analytics"],"x-section":"Keyword Blacklist","summary":"Delete a keyword blacklist","description":"Deletes a blacklist record. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["user"],"x-models":["KeywordBlacklist"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the keyword blacklist."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/metas":{"get":{"operationId":"get-metas","tags":["SEO & analytics"],"x-section":"Meta","summary":"List all metas","description":"Every page's meta tags. Reads no token.","x-access":[],"x-models":["Meta"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-metas","tags":["SEO & analytics"],"x-section":"Meta","summary":"Create a meta","description":"Creates a page's meta tags. Answers 201 with the record. Pages get theirs automatically when created, so this is for pages without one.","x-access":["user"],"x-models":["Meta"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Meta"}}}}}},"/metas/{id}":{"get":{"operationId":"get-metas-id","tags":["SEO & analytics"],"x-section":"Meta","summary":"Retrieve a meta","description":"One page's meta tags. 404 when there is no such record.","x-access":[],"x-models":["Meta"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the meta."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/conversions-by-days/{days}":{"get":{"operationId":"get-conversions-by-days-days","tags":["SEO & analytics"],"x-section":"Pixel Data","summary":"List all conversions days","description":"Each conversion by date over the last days. From the site's own pixel. 403 \"Unauthorized\" for an account the user may not manage (?on_behalf_of).","x-access":["user"],"x-models":["ConnectedAccount","User","PixelData"],"parameters":[{"name":"days","in":"path","required":true,"schema":{"type":"string"},"description":"The conversions day's days."},{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only conversions days with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/conversions-graph-by-days/{days}":{"get":{"operationId":"get-conversions-graph-by-days-days","tags":["SEO & analytics"],"x-section":"Pixel Data","summary":"List all conversions graph days","description":"Conversions per day over the last days, for a chart. From the site's own pixel. 403 \"Unauthorized\" for an account the user may not manage (?on_behalf_of).","x-access":["user"],"x-models":["ConnectedAccount","User","PixelData"],"parameters":[{"name":"days","in":"path","required":true,"schema":{"type":"string"},"description":"The conversions graph day's days."},{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only conversions graph days with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/conversions-table-by-days/{days}":{"get":{"operationId":"get-conversions-table-by-days-days","tags":["SEO & analytics"],"x-section":"Pixel Data","summary":"List all conversions table days","description":"Conversions by event over the last days, as a table. From the site's own pixel. 403 \"Unauthorized\" for an account the user may not manage (?on_behalf_of).","x-access":["user"],"x-models":["ConnectedAccount","User","PixelData"],"parameters":[{"name":"days","in":"path","required":true,"schema":{"type":"string"},"description":"The conversions table day's days."},{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only conversions table days with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/event-count-by-days/{days}":{"get":{"operationId":"get-event-count-by-days-days","tags":["SEO & analytics"],"x-section":"Pixel Data","summary":"Count event days","description":"How many pixel events happened per day over the last days. From the site's own pixel. 403 \"Unauthorized\" for an account the user may not manage (?on_behalf_of). Answers { events, count }.","x-access":["user"],"x-models":["ConnectedAccount","User","PixelData"],"parameters":[{"name":"days","in":"path","required":true,"schema":{"type":"string"},"description":"The event day's days."},{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only event days with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/pages-and-screens-by-days/{days}":{"get":{"operationId":"get-pages-and-screens-by-days-days","tags":["SEO & analytics"],"x-section":"Pixel Data","summary":"List all pages and screens days","description":"The most viewed pages over the last days. From the site's own pixel. 403 \"Unauthorized\" for an account the user may not manage (?on_behalf_of).","x-access":["user"],"x-models":["ConnectedAccount","User","MyContact","PixelData"],"parameters":[{"name":"days","in":"path","required":true,"schema":{"type":"string"},"description":"The pages and screens day's days."},{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only pages and screens days with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/pages-and-screens-graph-by-days/{days}":{"get":{"operationId":"get-pages-and-screens-graph-by-days-days","tags":["SEO & analytics"],"x-section":"Pixel Data","summary":"List all pages and screens graph days","description":"Page views per day over the last days, for a chart. From the site's own pixel. 403 \"Unauthorized\" for an account the user may not manage (?on_behalf_of).","x-access":["user"],"x-models":["MyContact","ConnectedAccount","User","PixelData"],"parameters":[{"name":"days","in":"path","required":true,"schema":{"type":"string"},"description":"The pages and screens graph day's days."},{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only pages and screens graph days with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/sessions-count-by-days/{days}":{"get":{"operationId":"get-sessions-count-by-days-days","tags":["SEO & analytics"],"x-section":"Pixel Data","summary":"Count sessions days","description":"Sessions and their length per day over the last days. From the site's own pixel. 403 \"Unauthorized\" for an account the user may not manage (?on_behalf_of). Answers { sessions }.","x-access":["user"],"x-models":["ConnectedAccount","User","PixelData"],"parameters":[{"name":"days","in":"path","required":true,"schema":{"type":"string"},"description":"The sessions day's days."},{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only sessions days with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-count-by-days/{days}":{"get":{"operationId":"get-user-count-by-days-days","tags":["SEO & analytics"],"x-section":"Pixel Data","summary":"Count user days","description":"Visitors per day over the last days. From the site's own pixel. 403 \"Unauthorized\" for an account the user may not manage (?on_behalf_of). Answers { users, count }.","x-access":["user"],"x-models":["ConnectedAccount","User","PixelData"],"parameters":[{"name":"days","in":"path","required":true,"schema":{"type":"string"},"description":"The user day's days."},{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only user days with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/item-rating-over-time/{from}&{to}":{"get":{"operationId":"get-item-rating-over-time-from-to","tags":["SEO & analytics"],"x-section":"Report","summary":"List all item rating over times","description":"Ratings of chosen items over time. Answers { datasets, averageRating, totalRatings } for ?itemsString.","x-access":["admin"],"x-models":["Rating"],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"},"description":"The item rating over time's from."},{"name":"to","in":"path","required":true,"schema":{"type":"string"},"description":"The item rating over time's to."},{"name":"split","in":"query","required":false,"schema":{"type":"string"},"description":"Only item rating over times with this split."},{"name":"itemsString","in":"query","required":false,"schema":{"type":"string"},"description":"Only item rating over times with this items string."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/report-bookings-over-time/{from}&{to}":{"get":{"operationId":"get-report-bookings-over-time-from-to","tags":["SEO & analytics"],"x-section":"Report","summary":"Report bookings over time","description":"Bookings per service between two dates. Renders the report page; with ?ionic answers its data as JSON. Dates are yyyy-mm-dd.","x-access":["admin"],"x-models":["Service","Booking","Order"],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"},"description":"The bookings over time's from."},{"name":"to","in":"path","required":true,"schema":{"type":"string"},"description":"The bookings over time's to."},{"name":"split","in":"query","required":false,"schema":{"type":"string"},"description":"Only bookings over times with this split."},{"name":"services","in":"query","required":false,"schema":{"type":"string"},"description":"Only bookings over times with this services."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/report-clicks-over-time/{from}&{to}":{"get":{"operationId":"get-report-clicks-over-time-from-to","tags":["SEO & analytics"],"x-section":"Report","summary":"Report clicks over time","description":"Clicks per link between two dates. Renders the report page; with ?ionic answers its data as JSON. Dates are yyyy-mm-dd.","x-access":["admin"],"x-models":["Click"],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"},"description":"The clicks over time's from."},{"name":"to","in":"path","required":true,"schema":{"type":"string"},"description":"The clicks over time's to."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/report-coupon-over-time/{from}&{to}":{"get":{"operationId":"get-report-coupon-over-time-from-to","tags":["SEO & analytics"],"x-section":"Report","summary":"Report a coupon over time","description":"Use of chosen coupons (?coupons) between two dates. Renders the report page; with ?ionic answers its data as JSON. Dates are yyyy-mm-dd.","x-access":["admin"],"x-models":["Coupon","Order"],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"},"description":"The coupon over time's from."},{"name":"to","in":"path","required":true,"schema":{"type":"string"},"description":"The coupon over time's to."},{"name":"split","in":"query","required":false,"schema":{"type":"string"},"description":"Only coupon over times with this split."},{"name":"coupons","in":"query","required":false,"schema":{"type":"string"},"description":"Only coupon over times with this coupons."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/report-interaction-over-time/{from}&{to}":{"get":{"operationId":"get-report-interaction-over-time-from-to","tags":["SEO & analytics"],"x-section":"Report","summary":"Report an interaction over time","description":"Visitor interaction per day between two dates. Renders the report page; with ?ionic answers its data as JSON. Dates are yyyy-mm-dd. Reads no token.","x-access":[],"x-models":["Traffic"],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"},"description":"The interaction over time's from."},{"name":"to","in":"path","required":true,"schema":{"type":"string"},"description":"The interaction over time's to."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/report-item-over-time/{from}&{to}":{"get":{"operationId":"get-report-item-over-time-from-to","tags":["SEO & analytics"],"x-section":"Report","summary":"Report an item over time","description":"Sales of chosen products (?ids) per day between two dates. Renders the report page; with ?ionic answers its data as JSON. Dates are yyyy-mm-dd.","x-access":["admin"],"x-models":["Product","Order"],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"},"description":"The item over time's from."},{"name":"to","in":"path","required":true,"schema":{"type":"string"},"description":"The item over time's to."},{"name":"split","in":"query","required":false,"schema":{"type":"string"},"description":"Only item over times with this split."},{"name":"ids","in":"query","required":false,"schema":{"type":"string"},"description":"Only item over times with this ids."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/report-item-sales-over-time/{from}&{to}":{"get":{"operationId":"get-report-item-sales-over-time-from-to","tags":["SEO & analytics"],"x-section":"Report","summary":"Report an item sales over time","description":"Sales per product between two dates. Renders the report page; with ?ionic answers its data as JSON. Dates are yyyy-mm-dd.","x-access":["admin"],"x-models":["Order","Product"],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"},"description":"The item sales over time's from."},{"name":"to","in":"path","required":true,"schema":{"type":"string"},"description":"The item sales over time's to."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/report-newsletter-over-time/{from}&{to}":{"get":{"operationId":"get-report-newsletter-over-time-from-to","tags":["SEO & analytics"],"x-section":"Report","summary":"Report a newsletter over time","description":"New newsletter subscribers per day between two dates. Renders the report page; with ?ionic answers its data as JSON. Dates are yyyy-mm-dd.","x-access":["admin"],"x-models":["NewsletterContact"],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"},"description":"The newsletter over time's from."},{"name":"to","in":"path","required":true,"schema":{"type":"string"},"description":"The newsletter over time's to."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/report-payment-methods-revenue-over-time/{from}&{to}":{"get":{"operationId":"get-report-payment-methods-revenue-over-time-from-to","tags":["SEO & analytics"],"x-section":"Report","summary":"Report a payment methods revenue over time","description":"Revenue per payment method between two dates. Renders the report page; with ?ionic answers its data as JSON. Dates are yyyy-mm-dd.","x-access":["admin"],"x-models":["Order"],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"},"description":"The payment methods revenue over time's from."},{"name":"to","in":"path","required":true,"schema":{"type":"string"},"description":"The payment methods revenue over time's to."},{"name":"split","in":"query","required":false,"schema":{"type":"string"},"description":"Only payment methods revenue over times with this split."},{"name":"payments","in":"query","required":false,"schema":{"type":"string"},"description":"Only payment methods revenue over times with this payments."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/report-priceplan-over-time/{from}&{to}":{"get":{"operationId":"get-report-priceplan-over-time-from-to","tags":["SEO & analytics"],"x-section":"Report","summary":"Report a price plan over time","description":"New subscriptions per plan between two dates. Renders the report page; with ?ionic answers its data as JSON. Dates are yyyy-mm-dd.","x-access":["admin"],"x-models":["PricePlan","Subscription"],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"},"description":"The price plan over time's from."},{"name":"to","in":"path","required":true,"schema":{"type":"string"},"description":"The price plan over time's to."},{"name":"split","in":"query","required":false,"schema":{"type":"string"},"description":"Only price plan over times with this split."},{"name":"price_plans","in":"query","required":false,"schema":{"type":"string"},"description":"Only price plan over times with this price plans."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/report-push-over-time/{from}&{to}":{"get":{"operationId":"get-report-push-over-time-from-to","tags":["SEO & analytics"],"x-section":"Report","summary":"Report a push over time","description":"New push subscribers per day between two dates. Renders the report page; with ?ionic answers its data as JSON. Dates are yyyy-mm-dd.","x-access":["admin"],"x-models":["PushToken"],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"},"description":"The push over time's from."},{"name":"to","in":"path","required":true,"schema":{"type":"string"},"description":"The push over time's to."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/report-sales-over-time/{from}&{to}":{"get":{"operationId":"get-report-sales-over-time-from-to","tags":["SEO & analytics"],"x-section":"Report","summary":"Report sales over time","description":"Sales per day between two dates (yyyy-mm-dd). Renders the report page; with ?ionic answers its data as JSON. Dates are yyyy-mm-dd.","x-access":["admin"],"x-models":["Order"],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"},"description":"The sales over time's from."},{"name":"to","in":"path","required":true,"schema":{"type":"string"},"description":"The sales over time's to."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/report-shipping-over-time/{from}&{to}":{"get":{"operationId":"get-report-shipping-over-time-from-to","tags":["SEO & analytics"],"x-section":"Report","summary":"Report a shipping over time","description":"Orders per delivery method between two dates. Renders the report page; with ?ionic answers its data as JSON. Dates are yyyy-mm-dd.","x-access":["admin"],"x-models":["Order"],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"},"description":"The shipping over time's from."},{"name":"to","in":"path","required":true,"schema":{"type":"string"},"description":"The shipping over time's to."},{"name":"split","in":"query","required":false,"schema":{"type":"string"},"description":"Only shipping over times with this split."},{"name":"shippings","in":"query","required":false,"schema":{"type":"string"},"description":"Only shipping over times with this shippings."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/report-traffic-over-time/{from}&{to}":{"get":{"operationId":"get-report-traffic-over-time-from-to","tags":["SEO & analytics"],"x-section":"Report","summary":"Report a traffic over time","description":"Sessions and page views per day between two dates. Renders the report page; with ?ionic answers its data as JSON. Dates are yyyy-mm-dd.","x-access":["admin"],"x-models":["Traffic"],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"},"description":"The traffic over time's from."},{"name":"to","in":"path","required":true,"schema":{"type":"string"},"description":"The traffic over time's to."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/report-users-over-time/{from}&{to}":{"get":{"operationId":"get-report-users-over-time-from-to","tags":["SEO & analytics"],"x-section":"Report","summary":"Report users over time","description":"New users per day between two dates. Renders the report page; with ?ionic answers its data as JSON. Dates are yyyy-mm-dd.","x-access":["admin"],"x-models":["User"],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"},"description":"The users over time's from."},{"name":"to","in":"path","required":true,"schema":{"type":"string"},"description":"The users over time's to."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-item-rating-over-time/{from}&{to}":{"get":{"operationId":"get-user-item-rating-over-time-from-to","tags":["SEO & analytics"],"x-section":"Report","summary":"List all user item rating over times","description":"Ratings of the user's items of a kind (?type) over time. 404 \"No ratings found\". Answers the series with the average to 2 decimals.","x-access":["admin"],"x-models":["Model","Rating"],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"},"description":"The user item rating over time's from."},{"name":"to","in":"path","required":true,"schema":{"type":"string"},"description":"The user item rating over time's to."},{"name":"charAt","in":"query","required":false,"schema":{"type":"string"},"description":"Only user item rating over times with this char at."},{"name":"slice","in":"query","required":false,"schema":{"type":"string"},"description":"Only user item rating over times with this slice."},{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"Only user item rating over times with this type."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/trackings":{"get":{"operationId":"get-trackings","tags":["SEO & analytics"],"x-section":"Tracking","summary":"List all trackings","description":"The site's tracking scripts. Answers an array of every record.","x-access":[],"x-models":["Tracking"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-trackings","tags":["SEO & analytics"],"x-section":"Tracking","summary":"Create a tracking","description":"Creates a tracking script. Every page is rendered again with the script. Answers 201.","x-access":["admin"],"x-models":["Tracking"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tracking"}}}}}},"/trackings/{id}":{"get":{"operationId":"get-trackings-id","tags":["SEO & analytics"],"x-section":"Tracking","summary":"Retrieve a tracking","description":"One tracking script. 404 when there is no such record.","x-access":[],"x-models":["Tracking"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the tracking."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-trackings-id","tags":["SEO & analytics"],"x-section":"Tracking","summary":"Update a tracking","description":"Updates a tracking script. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["Tracking"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the tracking."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tracking"}}}}},"delete":{"operationId":"delete-trackings-id","tags":["SEO & analytics"],"x-section":"Tracking","summary":"Delete a tracking","description":"Deletes a tracking script. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["Tracking"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the tracking."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/ads":{"post":{"operationId":"post-ads","tags":["Marketing & notifications"],"x-section":"Advertisment","summary":"Create an ad","description":"Creates an ad. Answers 201 with no body.","x-access":["admin"],"x-models":["Advertisment"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Advertisment"}}}}}},"/ads/{id}":{"get":{"operationId":"get-ads-id","tags":["Marketing & notifications"],"x-section":"Advertisment","summary":"Retrieve an ad","description":"One ad. 404 when there is no such record.","x-access":["admin"],"x-models":["Advertisment"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the ad."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-ads-id","tags":["Marketing & notifications"],"x-section":"Advertisment","summary":"Update an ad","description":"Updates an ad. Answers the ad.","x-access":["admin"],"x-models":["Advertisment"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the ad."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Advertisment"}}}}},"delete":{"operationId":"delete-ads-id","tags":["Marketing & notifications"],"x-section":"Advertisment","summary":"Delete an ad","description":"Deletes an ad. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["Advertisment"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the ad."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/alerts":{"get":{"operationId":"get-alerts","tags":["Marketing & notifications"],"x-section":"Alert","summary":"List all alerts","description":"The alerts. Answers an array of every record.","x-access":["admin"],"x-models":["Alert"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-alerts","tags":["Marketing & notifications"],"x-section":"Alert","summary":"Create an alert","description":"Creates an alert. Answers 201 with no body.","x-access":["admin"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/alerts/{id}":{"get":{"operationId":"get-alerts-id","tags":["Marketing & notifications"],"x-section":"Alert","summary":"Retrieve an alert","description":"One alert. 404 when there is no such record.","x-access":["admin"],"x-models":["Alert"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the alert."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/automations":{"get":{"operationId":"get-automations","tags":["Marketing & notifications"],"x-section":"Automation","summary":"List all automations","description":"The automations. Answers an array of every record.","x-access":["admin"],"x-models":["Automation"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-automations","tags":["Marketing & notifications"],"x-section":"Automation","summary":"Create an automation","description":"Creates an automation (a webhook called on an event). Answers 201 with no body.","x-access":["admin"],"x-models":["Automation"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Automation"}}}}}},"/automations/{id}":{"get":{"operationId":"get-automations-id","tags":["Marketing & notifications"],"x-section":"Automation","summary":"Retrieve an automation","description":"One automation. 404 when there is no such record.","x-access":["admin"],"x-models":["Automation"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the automation."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-automations-id","tags":["Marketing & notifications"],"x-section":"Automation","summary":"Update an automation","description":"Updates an automation. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["Automation"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the automation."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Automation"}}}}},"delete":{"operationId":"delete-automations-id","tags":["Marketing & notifications"],"x-section":"Automation","summary":"Delete an automation","description":"Deletes an automation. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["Automation"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the automation."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/get-model/{model}":{"get":{"operationId":"get-get-model-model","tags":["Marketing & notifications"],"x-section":"Automation","summary":"List all models","description":"An example entry of a model and its schema, to map an automation's fields. The newest entry, with its references filled in, shows what an automation's payload looks like.","x-access":["admin"],"parameters":[{"name":"model","in":"path","required":true,"schema":{"type":"string"},"description":"The model's model."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/connected-accounts":{"get":{"operationId":"get-connected-accounts","tags":["Marketing & notifications"],"x-section":"Connected Account","summary":"List all connected accounts","description":"Accounts the signed-in user manages. Answers { connectedAccounts, accounts_that_authorized_me }.","x-access":["user"],"x-models":["ConnectedAccount"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/connected-accounts-by-on-behalf-of/{id}":{"get":{"operationId":"get-connected-accounts-by-on-behalf-of-id","tags":["Marketing & notifications"],"x-section":"Connected Account","summary":"Retrieve a connected accounts on behalf of","description":"The connection to an account the signed-in user manages, by that account. Answers the managed account. 404 when there is no connection.","x-access":["user"],"x-models":["ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the connected accounts on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/connected-accounts-on-behalf-of/{id}":{"get":{"operationId":"get-connected-accounts-on-behalf-of-id","tags":["Marketing & notifications"],"x-section":"Connected Account","summary":"Retrieve a connected accounts on behalf of","description":"The connection that lets a user manage the signed-in user's account. 404 when there is no connection.","x-access":["user"],"x-models":["ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the connected accounts on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/connected-accounts-status/{id}":{"patch":{"operationId":"patch-connected-accounts-status-id","tags":["Marketing & notifications"],"x-section":"Connected Account","summary":"Change the status of a connected account","description":"Accepts or refuses an account connection, and sets what it may do. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["user"],"x-models":["ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the connected account."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectedAccount"}}}}}},"/connected-accounts/{id}":{"get":{"operationId":"get-connected-accounts-id","tags":["Marketing & notifications"],"x-section":"Connected Account","summary":"Retrieve a connected account","description":"One account connection. 404 when there is no such connection.","x-access":["user"],"x-models":["ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the connected account."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-connected-accounts-id","tags":["Marketing & notifications"],"x-section":"Connected Account","summary":"Update a connected account","description":"Updates an account connection. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["user"],"x-models":["ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the connected account."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectedAccount"}}}}},"delete":{"operationId":"delete-connected-accounts-id","tags":["Marketing & notifications"],"x-section":"Connected Account","summary":"Delete a connected account","description":"Deletes an account connection. Either side can end it. 403 \"Unauthorized.\" for anyone else.","x-access":["user"],"x-models":["ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the connected account."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/my-connected-accounts":{"get":{"operationId":"get-my-connected-accounts","tags":["Marketing & notifications"],"x-section":"Connected Account","summary":"List all connected accounts","description":"Users who manage the signed-in user's account. Answers an array.","x-access":["user"],"x-models":["ConnectedAccount"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/send-account-connection-request":{"post":{"operationId":"post-send-account-connection-request","tags":["Marketing & notifications"],"x-section":"Connected Account","summary":"Send an account connection request","description":"Asks another user (email) for access to manage their account. Answers 201 with the pending connection; the other user accepts it with PATCH /connected-accounts-status/:id.","x-access":["user"],"x-models":["User","ConnectedAccount"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"An email address."}}}}}}}},"/get-instagram":{"get":{"operationId":"get-get-instagram","tags":["Marketing & notifications"],"x-section":"Instagram","summary":"Retrieve the instagram","description":"Pictures of a public Instagram profile (?profile). Answers { instaMedias, profilePic }. Reads no token.","x-access":[],"parameters":[{"name":"profile","in":"query","required":false,"schema":{"type":"string"},"description":"Only instagrams with this profile."},{"name":"first","in":"query","required":false,"schema":{"type":"string"},"description":"Only instagrams with this first."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/push-notification":{"post":{"operationId":"post-push-notification","tags":["Marketing & notifications"],"x-section":"Push Notification","summary":"Create a push notification","description":"Creates a push notification. 412 when one was sent to the same audience in the last 48 hours. Answers 201.","x-access":["admin"],"x-models":["PushNotification","MyContact","PushToken","UserEngagementNotification"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"412":{"description":"A rule the request must meet is not met - for example push notifications of the same type at least 48 hours apart."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"The notification's heading."},"body":{"type":"string","description":"The notification's text."},"image":{"type":"string","description":"Picture shown with it."},"sendTo":{"type":"string","description":"The push notification's send to."},"type":{"type":"string","description":"Push, system, both."},"url":{"type":"string","description":"The push notification's URL slug, as in its address on the site."}}}}}}}},"/push-notification-info":{"get":{"operationId":"get-push-notification-info","tags":["Marketing & notifications"],"x-section":"Push Notification","summary":"Retrieve the push notification info","description":"Get a summary info of push notifications. Answers an array of every record.","x-access":["admin"],"x-models":["PushToken"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/push-notification/timer":{"get":{"operationId":"get-push-notification-timer","tags":["Marketing & notifications"],"x-section":"Push Notification","summary":"Retrieve the push notification","description":"How long until another push notification may be sent to ?sendTo (one every 48 hours). Answers { text } for the admin to show.","x-access":["admin"],"x-models":["PushNotification"],"parameters":[{"name":"sendTo","in":"query","required":false,"schema":{"type":"string"},"description":"Only push notifications with this send to."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/push-token":{"get":{"operationId":"get-push-token","tags":["Marketing & notifications"],"x-section":"Push Token","summary":"Retrieve the push token","description":"Devices registered for push notifications. Answers an array of every record.","x-access":["admin"],"x-models":["PushToken"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/push-token/{id}":{"get":{"operationId":"get-push-token-id","tags":["Marketing & notifications"],"x-section":"Push Token","summary":"Retrieve a push token","description":"One registered device. 404 when there is no such record.","x-access":["admin"],"x-models":["PushToken"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the push token."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/comment-like/{id}":{"patch":{"operationId":"patch-comment-like-id","tags":["Community"],"x-section":"Comment","summary":"Like or unlike a comment","description":"Likes or unlikes a comment and notifies its author. Calling it again takes the like back. Answers the comment's likes.","x-access":["user"],"x-models":["Comment","ConnectedAccount","Post","Product","Service","BlogPost","Program","UserEngagementNotification"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the comment."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"liked_by_id":{"type":"string","description":"The comment's liked by id."},"action":{"type":"string","description":"The comment's action."},"liked_by":{"type":"string","description":"The comment's liked by."}}}}}}}},"/comments":{"get":{"operationId":"get-comments","tags":["Community"],"x-section":"Comment","summary":"List all comments","description":"Every comment. Every comment on the site.","x-access":["user"],"x-models":["Comment"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-comments","tags":["Community"],"x-section":"Comment","summary":"Create a comment","description":"Comments on a post, product, service or other record (commented_on) and notifies its owner and mentions. Answers 201 with no body. 403 \"Comment limit exeded.\" when the user comments too often; 401 when posting for an account they may not act for. Counts as an interaction on a post, which feeds its ranking.","x-access":["user"],"x-models":["ConnectedAccount","User","MyContact","Product","Service","BlogPost","Post","Program","Video","SocialModeSettings","UserEngagementNotification","Comment"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"string","description":"User.id."},"comment":{"type":"string","description":"Comment message."},"commented_on":{"type":"string","description":"Id of the record commented on (a post, product, service...)."},"mentions":{"type":"array","items":{"type":"string"},"description":"User ids."},"connected_account_user":{"type":"string","description":"User.id."}}}}}}},"patch":{"operationId":"patch-comments","tags":["Community"],"x-section":"Comment","summary":"Update the comment","description":"Edits a comment (comment_id, comment) and notifies new mentions. Only the comment's author (401 otherwise). Answers the updated comment; only users newly mentioned are notified.","x-access":["user"],"x-models":["Comment","UserEngagementNotification"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment_id":{"type":"string","description":"The comment's comment id."},"comment":{"type":"string","description":"Comment message."},"mentions":{"type":"array","items":{"type":"string"},"description":"User ids."}}}}}}}},"/comments-add-reply":{"patch":{"operationId":"patch-comments-add-reply","tags":["Community"],"x-section":"Comment","summary":"Update the comments add reply","description":"Replies to a comment and notifies its author and mentions. Answers { reply }: the new reply. 403 when replying for an account the user may not act for.","x-access":["user"],"x-models":["Comment","ConnectedAccount","User","Post","Product","Service","BlogPost","Program","UserEngagementNotification"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment_id":{"type":"string","description":"The comments add reply's comment id."},"comment":{"type":"string","description":"The comments add reply's comment."},"user_id":{"type":"string","description":"The comments add reply's user id."},"mentions":{"type":"string","description":"The comments add reply's mentions."}}}}}}}},"/comments-of/{id}":{"get":{"operationId":"get-comments-of-id","tags":["Community"],"x-section":"Comment","summary":"Retrieve a comments of","description":"Comments on a record. 404 when there are none.","x-access":["user"],"x-models":["Comment"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the comments of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/comments-on/{id}&{skip}":{"get":{"operationId":"get-comments-on-id-skip","tags":["Community"],"x-section":"Comment","summary":"Retrieve a comments on","description":"Comments on a record, a page at a time, without restricted users. Answers { comments, count }, newest first then most liked, skipping users the viewer blocked or who blocked them.","x-access":["user"],"x-models":["Comment"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the comments on."},{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/comments-reply":{"patch":{"operationId":"patch-comments-reply","tags":["Community"],"x-section":"Comment","summary":"Update the comments reply","description":"Edits a reply to a comment and notifies new mentions. Only the reply's author (401 otherwise). Answers { reply }.","x-access":["user"],"x-models":["Comment","UserEngagementNotification"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment_id":{"type":"string","description":"The comments reply's comment id."},"index":{"type":"string","description":"The comments reply's index."},"comment":{"type":"string","description":"The comments reply's comment."},"mentions":{"type":"string","description":"The comments reply's mentions."}}}}}}}},"/comments-reply/{id}/{index}":{"delete":{"operationId":"delete-comments-reply-id-index","tags":["Community"],"x-section":"Comment","summary":"Delete a comments reply","description":"Deletes a reply to a comment. index is the reply's position in the comment's replies. Only its author or the owner of what it is on (403 otherwise).","x-access":["user"],"x-models":["Comment","ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the comments reply."},{"name":"index","in":"path","required":true,"schema":{"type":"string"},"description":"The comments reply's index."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/comments/{id}":{"get":{"operationId":"get-comments-id","tags":["Community"],"x-section":"Comment","summary":"Retrieve a comment","description":"One comment. 404 when there is no such comment.","x-access":["user"],"x-models":["Comment"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the comment."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"delete":{"operationId":"delete-comments-id","tags":["Community"],"x-section":"Comment","summary":"Delete a comment","description":"Deletes a comment (its author, or the owner of what it is on). Answers the deleted comment; 403 for anyone else.","x-access":["user"],"x-models":["Comment","Post","ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the comment."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/hide-comment/{id}&{reply}":{"patch":{"operationId":"patch-hide-comment-id-reply","tags":["Community"],"x-section":"Comment","summary":"Update a hide comment","description":"Hides a comment on a post, or one of its replies (reply: its position), for the post's author. Only the post's author can hide; for anyone else nothing changes. A hidden comment stays stored but others no longer see it. There is no way to show it again here.","x-access":["user"],"x-models":["Comment","Post"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the hide comment."},{"name":"reply","in":"path","required":true,"schema":{"type":"string"},"description":"The hide comment's reply."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/reply-like/{id}&{replyId}":{"patch":{"operationId":"patch-reply-like-id-replyid","tags":["Community"],"x-section":"Comment","summary":"Like or unlike a reply","description":"Likes or unlikes a reply and notifies its author. Calling it again takes the like back. Answers the reply's likes.","x-access":["user"],"x-models":["Comment","ConnectedAccount","Post","Product","Service","BlogPost","Program","UserEngagementNotification"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the reply."},{"name":"replyId","in":"path","required":true,"schema":{"type":"string"},"description":"The reply's reply id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"liked_by_id":{"type":"string","description":"The reply's liked by id."},"action":{"type":"string","description":"The reply's action."},"liked_by":{"type":"string","description":"The reply's liked by."}}}}}}}},"/user-comments/{skip}":{"get":{"operationId":"get-user-comments-skip","tags":["Community"],"x-section":"Comment","summary":"List all user comments","description":"Comments the signed-in user wrote, with what they are on. Answers the comments grouped by what they are on: posts, products, services, blog posts. 403 for an account the user may not act for.","x-access":["user"],"x-models":["ConnectedAccount","User","Comment","Post","Product","Media","Service","BlogPost"],"parameters":[{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only user comments with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-liked-comments/{skip}":{"get":{"operationId":"get-user-liked-comments-skip","tags":["Community"],"x-section":"Comment","summary":"List all user liked comments","description":"Comments the signed-in user liked. Comments and replies together, with count.","x-access":["user"],"x-models":["ConnectedAccount","User","Comment","Post","Product","Service","BlogPost"],"parameters":[{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only user liked comments with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/group-remove-user":{"patch":{"operationId":"patch-group-remove-user","tags":["Community"],"x-section":"Group","summary":"Update the group remove user","description":"Removes a user from a group (group, user). Only the group's owner.","x-access":["user"],"x-models":["Group","GroupJoinRequest"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"group":{"type":"string","description":"The group remove user's group."},"user":{"type":"string","description":"The group remove user's user."}}}}}}}},"/group/{id}":{"get":{"operationId":"get-group-id","tags":["Community"],"x-section":"Group","summary":"Retrieve a group","description":"Opens a group in the app (redirects to its app page). For links shared from the app: the website sends the visitor to the group in the app.","x-access":["optional-user"],"x-models":["MyContact"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the group."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/groups":{"post":{"operationId":"post-groups","tags":["Community"],"x-section":"Group","summary":"Create a group","description":"Creates a group. 403 when the site does not let this user create groups. Answers 201 with the group.","x-access":["user"],"x-models":["SocialModeSettings","Group"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialModeSettings"}}}}}},"/groups/{id}":{"get":{"operationId":"get-groups-id","tags":["Community"],"x-section":"Group","summary":"Retrieve a group","description":"One group with the user's membership. 402 when the group needs a subscription the user lacks; 404 when there is no such group.","x-access":["user"],"x-models":["SocialModeSettings","Group","GroupJoinRequest"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the group."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"402":{"description":"The content needs a subscription: the user has no price plan that unlocks it."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-groups-id","tags":["Community"],"x-section":"Group","summary":"Update a group","description":"Updates a group. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["user"],"x-models":["Group"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the group."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}}}},"delete":{"operationId":"delete-groups-id","tags":["Community"],"x-section":"Group","summary":"Delete a group","description":"Deletes a group. Only its owner (403 otherwise). Its posts are deleted with it.","x-access":["user"],"x-models":["Group","Post","Comment","Media","User"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the group."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/groups/{skip}/{limit}":{"get":{"operationId":"get-groups-skip-limit","tags":["Community"],"x-section":"Group","summary":"List all groups","description":"Groups, the most active first, a page at a time. Answers { groups, count }.","x-access":[],"x-models":["Group"],"parameters":[{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"limit","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to return."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/join-group":{"post":{"operationId":"post-join-group","tags":["Community"],"x-section":"Group","summary":"Join a join group","description":"Joins a group, or asks to join a private one (group). Answers 201 { group_join_request }: 'accepted' for a public group, 'pending' for a private one until its owner answers. 403 when a request is already pending.","x-access":["user"],"x-models":["Group","GroupJoinRequest","UserEngagementNotification"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"group":{"type":"string","description":"The join group's group."}}}}}}}},"/my-groups":{"get":{"operationId":"get-my-groups","tags":["Community"],"x-section":"Group","summary":"List all groups","description":"Groups the signed-in user is in, with their join requests. Answers { my_groups, joined_groups, canCreateGroups }.","x-access":["user"],"x-models":["Group","GroupJoinRequest"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/search-groups/{args}/{skip}":{"get":{"operationId":"get-search-groups-args-skip","tags":["Community"],"x-section":"Group","summary":"List all groups","description":"Groups whose name matches the words. Nine at a time.","x-access":[],"x-models":["Group"],"parameters":[{"name":"args","in":"path","required":true,"schema":{"type":"string"},"description":"The group's args."},{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/update-join-request-status":{"patch":{"operationId":"patch-update-join-request-status","tags":["Community"],"x-section":"Group","summary":"Update a join request with AI","description":"Accepts or refuses a request to join a group. Only the group's owner. Answers 201.","x-access":["user"],"x-models":["Group","GroupJoinRequest","UserEngagementNotification"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"group":{"type":"string","description":"Group.id the user asks to join."},"user":{"type":"string","description":"User.id."}}}}}}}},"/add-user/{id}":{"patch":{"operationId":"patch-add-user-id","tags":["Community"],"x-section":"Message","summary":"Add an add user","description":"Adds users to a group conversation (users) and notifies them. Answers 201.","x-access":["user"],"x-models":["Message"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the add user."}],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"users":{"type":"string","description":"The add user's users."}}}}}}}},"/connect-to-room":{"post":{"operationId":"post-connect-to-room","tags":["Community"],"x-section":"Message","summary":"Connect a connect to room","description":"Opens or joins the conversation between the signed-in user and another user or group. Answers 201 with the conversation (its room for the live connection), creating it the first time. 403 when the ids sent do not match the signed-in user.","x-access":["user"],"x-models":["ConnectedAccount","User","Message"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"me":{"type":"string","description":"The connect to room's me."},"chatSupport":{"type":"string","description":"The connect to room's chat support."},"receiver_id":{"type":"string","description":"The connect to room's receiver id."},"user":{"type":"string","description":"The connect to room's user."},"room":{"type":"string","description":"The connect to room's room."}}}}}}}},"/delete-chat/{id}":{"patch":{"operationId":"patch-delete-chat-id","tags":["Community"],"x-section":"Message","summary":"Update a delete chat","description":"Deletes a conversation for the signed-in user only. The other members keep the conversation and its messages.","x-access":["user"],"x-models":["Message","ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the delete chat."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"user_id":{"type":"string","description":"The delete chat's user id."}}}}}}}},"/find-chat/{product_id}":{"get":{"operationId":"get-find-chat-product-id","tags":["Community"],"x-section":"Message","summary":"Find a chat","description":"The conversation with a product's seller, to ask about it. Answers { url } of the conversation in the app, or {} when there is none yet.","x-access":["user"],"x-models":["Message","MyContact"],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string"},"description":"The chat's product id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/leave-group/{id}":{"patch":{"operationId":"patch-leave-group-id","tags":["Community"],"x-section":"Message","summary":"Leave a leave group","description":"Leaves a group conversation. Earlier messages stay in the group. Answers 201.","x-access":["user"],"x-models":["Message"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the leave group."}],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/message-event/{id}":{"get":{"operationId":"get-message-event-id","tags":["Community"],"x-section":"Message","summary":"Retrieve a message event","description":"A conversation's live events stream. 403 when the user is not in the conversation.","x-access":["user"],"x-models":["Message","ConnectedAccount"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the message event."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/message-seen":{"patch":{"operationId":"patch-message-seen","tags":["Community"],"x-section":"Message","summary":"Update the message seen","description":"Marks a conversation as read by the signed-in user. Answers { room }.","x-access":["user"],"x-models":["Message"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the message seen."},"user":{"type":"string","description":"The message seen's user."}}}}}}}},"/messages":{"get":{"operationId":"get-messages","tags":["Community"],"x-section":"Message","summary":"List all messages","description":"The signed-in user's conversations. The most recently active first.","x-access":["user"],"x-models":["Message"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-messages","tags":["Community"],"x-section":"Message","summary":"Create a message","description":"Creates a conversation. 403 \"Message lenght limit exceeded!\" for a message over the length limit. Answers 201 with the message.","x-access":["user"],"x-models":["User","Service","Product","BlogPost","Program","Message"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"description":"Message."},"product_id":{"type":"string","description":"Product.id of product, that the message is about."},"receiver_id":{"type":"string","description":"User.id of receiver."},"service_id":{"type":"string","description":"Service.id."},"blogpost_id":{"type":"string","description":"BlogPost.id."},"program_id":{"type":"string","description":"Program.id."},"isDirectMessage":{"type":"boolean","description":"Between two users, not in a group."},"postId":{"type":"string","description":"The message's post id."},"group_users":{"type":"array","items":{"type":"string"},"description":"Keeps the messages after user leaves the group."},"isGroup":{"type":"boolean","description":"A group conversation."}}}}}}}},"/messages-medias/{id}&{skip}&{limit}":{"get":{"operationId":"get-messages-medias-id-skip-limit","tags":["Community"],"x-section":"Message","summary":"Retrieve a messages media","description":"Pictures and files shared in a conversation, a page at a time. Answers { limitedPosts, limitedMedia, count }: shared posts and files.","x-access":["user"],"x-models":["Message"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the messages media."},{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"limit","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to return."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/messages/{id}":{"patch":{"operationId":"patch-messages-id","tags":["Community"],"x-section":"Message","summary":"Update a message","description":"Updates a conversation. Answers the updated conversation, or 404. Fields outside the allowed list are ignored.","x-access":["user"],"x-models":["Message"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the message."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Message"}}}}},"delete":{"operationId":"delete-messages-id","tags":["Community"],"x-section":"Message","summary":"Delete a message","description":"Deletes a conversation. Deletes the whole conversation for everyone, with no check of who asks beyond being signed in. Answers it, or 404.","x-access":["user"],"x-models":["Message"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the message."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/messages/{id}&{skip}&{limit}":{"get":{"operationId":"get-messages-id-skip-limit","tags":["Community"],"x-section":"Message","summary":"Retrieve a message","description":"Messages of a conversation, a page at a time. Counted from the newest message. 404 when there is no such conversation.","x-access":["user"],"x-models":["Message"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the message."},{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"limit","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to return."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/received-in-app-message/{id}":{"get":{"operationId":"get-received-in-app-message-id","tags":["Community"],"x-section":"Message","summary":"Retrieve a received in app message","description":"One in-app notification, with its group. With who sent it and the post it is about.","x-access":[],"x-models":["UserEngagementNotification","Group"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the received in app message."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/send-in-app-message":{"post":{"operationId":"post-send-in-app-message","tags":["Community"],"x-section":"Message","summary":"Send an in app message","description":"Sends an in-app notification to users. Answers 201 { room, notification_id }. 500 \"Notification already send.\" when the same notification was already sent.","x-access":["user"],"x-models":["UserEngagementNotification"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","description":"The in app message's type."},"comment_owner":{"type":"string","description":"The in app message's comment owner."},"item_id":{"type":"string","description":"The ID of the in app message to change."},"action_doer":{"type":"string","description":"The in app message's action doer."},"group":{"type":"string","description":"The in app message's group."},"owner_id":{"type":"string","description":"The in app message's owner id."},"from":{"type":"string","description":"The in app message's from."},"message":{"type":"string","description":"The in app message's message."},"mentioned":{"type":"string","description":"The in app message's mentioned."},"post":{"type":"string","description":"The in app message's post."}}}}}}}},"/send-message":{"post":{"operationId":"post-send-message","tags":["Community"],"x-section":"Message","summary":"Send a message","description":"Sends a message in a conversation and notifies its members. Answers 201 with the sent message. Every other member gets a push notification. 403 when the sender may not write there.","x-access":["user"],"x-models":["ConnectedAccount","User","Message","BlogPost","Service","Product","UserEngagementNotification"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"string","description":"The message's from."},"text":{"type":"string","description":"The message's text."},"chatSupport":{"type":"string","description":"The message's chat support."},"receiver_id":{"type":"string","description":"User.id of receiver."},"to":{"type":"string","description":"The message's to."},"room":{"type":"string","description":"The message's room."},"isDirectMessage":{"type":"boolean","description":"Between two users, not in a group."},"postId":{"type":"string","description":"The message's post id."},"userId":{"type":"string","description":"The message's user id."},"groupId":{"type":"string","description":"The message's group id."},"medias":{"type":"string","description":"The message's medias."}}}}}}}},"/sent-message/{id}&{msg}":{"delete":{"operationId":"delete-sent-message-id-msg","tags":["Community"],"x-section":"Message","summary":"Delete a sent message","description":"Deletes one of the signed-in user's messages. msg is the message's id inside the conversation.","x-access":["user"],"x-models":["Message"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the sent message."},{"name":"msg","in":"path","required":true,"schema":{"type":"string"},"description":"The sent message's msg."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-added":{"patch":{"operationId":"patch-user-added","tags":["Community"],"x-section":"Message","summary":"Update the user added","description":"Adds the signed-in user to a group conversation. Answers { room }. 403 when the user was not invited.","x-access":["user"],"x-models":["Message","ConnectedAccount","User"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"room":{"type":"string","description":"The user added's room."},"users":{"type":"string","description":"The user added's users."}}}}}}}},"/partners":{"get":{"operationId":"get-partners","tags":["Community"],"x-section":"Partner","summary":"List all partners","description":"Get partners, optionally searched, filtered, sorted and paged. Renders the locations page; JSON with ?ionic. Search, category filters, sorting and paging come from the query.","x-access":["optional-user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-partners","tags":["Community"],"x-section":"Partner","summary":"Create a partner","description":"Creates a location or partner. Answers 201 with the location.","x-access":["admin"],"x-models":["Partner"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Partner"}}}}}},"/partners/{id}":{"get":{"operationId":"get-partners-id","tags":["Community"],"x-section":"Partner","summary":"Retrieve a partner","description":"One location or partner. With its venue types. 404 when there is no such location.","x-access":[],"x-models":["Partner"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the partner."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-partners-id","tags":["Community"],"x-section":"Partner","summary":"Update a partner","description":"Updates a location or partner. Answers the location, or 404.","x-access":["admin"],"x-models":["Partner"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the partner."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","description":"Street address."},"city":{"type":"string","description":"City."},"country":{"type":"string","description":"Not required - records created before the split still carry the country inside city, and forcing it would reject every update to them."}}}}}}},"delete":{"operationId":"delete-partners-id","tags":["Community"],"x-section":"Partner","summary":"Delete a partner","description":"Deletes a location or partner. Answers the deleted location, or 404.","x-access":["admin"],"x-models":["Partner"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the partner."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/avg-cost-per-action":{"get":{"operationId":"get-avg-cost-per-action","tags":["Community"],"x-section":"Post","summary":"Retrieve the avg cost per action","description":"The average cost per action of ads with a given targeting (?interests, ?languages, ?keywords...). Answers { cost_per_click, cost_per_mile } from earlier ads with a similar targeting, to estimate a boost.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"interests","in":"query","required":false,"schema":{"type":"string"},"description":"Only avg cost per actions with this interests."},{"name":"app_categories","in":"query","required":false,"schema":{"type":"string"},"description":"Only avg cost per actions with this app categories."},{"name":"languages","in":"query","required":false,"schema":{"type":"string"},"description":"Only avg cost per actions with this languages."},{"name":"keywords","in":"query","required":false,"schema":{"type":"string"},"description":"Only avg cost per actions with this keywords."},{"name":"user_economics","in":"query","required":false,"schema":{"type":"string"},"description":"Only avg cost per actions with this user economics."},{"name":"user_education","in":"query","required":false,"schema":{"type":"string"},"description":"Only avg cost per actions with this user education."},{"name":"marital_status","in":"query","required":false,"schema":{"type":"string"},"description":"Only avg cost per actions with this marital status."},{"name":"ages","in":"query","required":false,"schema":{"type":"string"},"description":"Only avg cost per actions with this ages."},{"name":"sexes","in":"query","required":false,"schema":{"type":"string"},"description":"Only avg cost per actions with this sexes."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/bites/{posts}&{popular}&{ads}&{location_ads}":{"get":{"operationId":"get-bites-posts-popular-ads-location-ads","tags":["Community"],"x-section":"Post","summary":"List all bites","description":"The short video feed by the user's interests, with ads. Answers { posts, length, location_ads_skip, ads_skip }. Cached per user for 5 minutes.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"posts","in":"path","required":true,"schema":{"type":"string"},"description":"The bite's posts."},{"name":"popular","in":"path","required":true,"schema":{"type":"string"},"description":"The bite's popular."},{"name":"ads","in":"path","required":true,"schema":{"type":"string"},"description":"The bite's ads."},{"name":"location_ads","in":"path","required":true,"schema":{"type":"string"},"description":"The bite's location ads."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/boost-user-post/{id}":{"patch":{"operationId":"patch-boost-user-post-id","tags":["Community"],"x-section":"Post","summary":"Update a boost user post","description":"Boosts a post as an ad with its targeting, or edits a boost (?edit). The boost is paid from the user's wallet: 400 \"Insufficient funds.\" when it does not cover the budget. Answers the post.","x-access":["user"],"x-models":["Post","ConnectedAccount","User"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the boost user post."},{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only boost user posts with this on behalf of."},{"name":"edit","in":"query","required":false,"schema":{"type":"string"},"description":"Only boost user posts with this edit."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"interests":{"type":"array","items":{"type":"string"},"description":"From Google Segments."},"app_categories":{"type":"string","description":"The boost user post's app categories."},"languages":{"type":"string","description":"The boost user post's languages."},"keywords":{"type":"array","items":{"type":"string"},"description":"Words it is found by."},"user_economics":{"type":"string","description":"Low, middle, high."},"user_education":{"type":"string","description":"Low, middle, high."},"marital_status":{"type":"string","description":"Single, married."},"ages":{"type":"string","description":"The boost user post's ages."},"sexes":{"type":"string","description":"The boost user post's sexes."},"cost_per_click":{"type":"string","description":"The boost user post's cost per click."},"cost_per_mile":{"type":"string","description":"The boost user post's cost per mile."},"created_on":{"type":"string","description":"The boost user post's created on."},"duration":{"type":"string","description":"The boost user post's duration."},"days_left":{"type":"string","description":"The boost user post's days left."},"daily_budget":{"type":"string","description":"The boost user post's daily budget."},"outer_link":{"type":"string","description":"The boost user post's outer link."},"targeting":{"type":"string","description":"The boost user post's targeting."},"isAdvertisment":{"type":"boolean","description":"A paid ad."}}}}}}}},"/boosted-posts":{"get":{"operationId":"get-boosted-posts","tags":["Community"],"x-section":"Post","summary":"List all boosted posts","description":"The user's boosted posts with their pixel results, or those of an account they manage (?on_behalf_of). Newest boost first. 403 for an account the user may not act for.","x-access":["user"],"x-models":["ConnectedAccount","User","Post","PixelData"],"parameters":[{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only boosted posts with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/cancel-boost-user-post/{id}":{"patch":{"operationId":"patch-cancel-boost-user-post-id","tags":["Community"],"x-section":"Post","summary":"Update a boost user post","description":"Stops a post's boost. Answers { returnCredits }: the unspent budget returned to the wallet.","x-access":["user"],"x-models":["Post","ConnectedAccount","User"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the boost user post."},{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only boost user posts with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/expirable-posts/{skip}&{feed}&{users}":{"get":{"operationId":"get-expirable-posts-skip-feed-users","tags":["Community"],"x-section":"Post","summary":"List all expirable posts","description":"Stories from who the user follows.","x-access":["user"],"parameters":[{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"feed","in":"path","required":true,"schema":{"type":"string"},"description":"The expirable post's feed."},{"name":"users","in":"path","required":true,"schema":{"type":"string"},"description":"The expirable post's users."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/explore/{posts}&{popular}&{ads}&{location_ads}":{"get":{"operationId":"get-explore-posts-popular-ads-location-ads","tags":["Community"],"x-section":"Post","summary":"List all explores","description":"The explore feed: popular posts by the user's interests, with ads. Answers { posts, length, location_ads_skip, ads_skip }; send the skips back on the next call. Cached per user for 5 minutes.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"posts","in":"path","required":true,"schema":{"type":"string"},"description":"The explore's posts."},{"name":"popular","in":"path","required":true,"schema":{"type":"string"},"description":"The explore's popular."},{"name":"ads","in":"path","required":true,"schema":{"type":"string"},"description":"The explore's ads."},{"name":"location_ads","in":"path","required":true,"schema":{"type":"string"},"description":"The explore's location ads."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/feed/{posts}&{popular}&{ads}&{location_ads}&{users}":{"get":{"operationId":"get-feed-posts-popular-ads-location-ads-users","tags":["Community"],"x-section":"Post","summary":"List all feeds","description":"The signed-in user's home feed: posts from who they follow and by their interests, popular posts and ads, skipping those already seen (counts in the path). The path carries how many posts, popular posts and ads of each kind the app already has, so each call answers the next ones. Cached per user for 5 minutes.","x-access":["user"],"x-models":["GroupJoinRequest","Post","Comment"],"parameters":[{"name":"posts","in":"path","required":true,"schema":{"type":"string"},"description":"The feed's posts."},{"name":"popular","in":"path","required":true,"schema":{"type":"string"},"description":"The feed's popular."},{"name":"ads","in":"path","required":true,"schema":{"type":"string"},"description":"The feed's ads."},{"name":"location_ads","in":"path","required":true,"schema":{"type":"string"},"description":"The feed's location ads."},{"name":"users","in":"path","required":true,"schema":{"type":"string"},"description":"The feed's users."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/following-suggestions":{"get":{"operationId":"get-following-suggestions","tags":["Community"],"x-section":"Post","summary":"List all following suggestions","description":"Users to follow, by the signed-in user's interests. Ten users, with the interests they were picked by.","x-access":["user"],"x-models":["User"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/group-feed/{group}/{skip}/{limit}":{"get":{"operationId":"get-group-feed-group-skip-limit","tags":["Community"],"x-section":"Post","summary":"List all group feeds","description":"A group's posts, when the user may see the group. Answers { posts, length }. A private group answers 401 until the user's join request is accepted, with group_join_request pending or rejected. Cached per user for 5 minutes.","x-access":["user"],"x-models":["Group","GroupJoinRequest","Post","Comment"],"parameters":[{"name":"group","in":"path","required":true,"schema":{"type":"string"},"description":"The group feed's group."},{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"limit","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to return."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/long-video-avg-percentage-viewed-insights/{id}":{"get":{"operationId":"get-long-video-avg-percentage-viewed-insights-id","tags":["Community"],"x-section":"Post","summary":"Retrieve a long video avg percentage viewed insight","description":"The average share of a long video that viewers watch. Answers { insights }.","x-access":["user"],"x-models":["Post","VideoInteraction"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the long video avg percentage viewed insight."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/long-video-engagement-insights/{id}":{"get":{"operationId":"get-long-video-engagement-insights-id","tags":["Community"],"x-section":"Post","summary":"Retrieve a long video engagement insight","description":"Engagement of a long video: watch time against views, likes and comments. Answers { insights }.","x-access":["user"],"x-models":["VideoInteraction","Post"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the long video engagement insight."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/long-video-total-watchtime-insights/{id}":{"get":{"operationId":"get-long-video-total-watchtime-insights-id","tags":["Community"],"x-section":"Post","summary":"Retrieve a long video total watchtime insight","description":"Total watch time of a long video. Answers { insights }.","x-access":["user"],"x-models":["VideoInteraction"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the long video total watchtime insight."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/long-video-views-by-days-insights/{id}&{days}":{"get":{"operationId":"get-long-video-views-by-days-insights-id-days","tags":["Community"],"x-section":"Post","summary":"Record a view of a long video days insight","description":"Views of a long video per day over the last days. Answers { insights }: one entry per day.","x-access":["user"],"x-models":["VideoInteraction"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the long video days insight."},{"name":"days","in":"path","required":true,"schema":{"type":"string"},"description":"The long video days insight's days."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/long-video-watchtime-by-days-insights/{id}&{days}":{"get":{"operationId":"get-long-video-watchtime-by-days-insights-id-days","tags":["Community"],"x-section":"Post","summary":"Retrieve a long video watchtime days insight","description":"Watch time of a long video per day over the last days. Answers { insights }: one entry per day.","x-access":["user"],"x-models":["VideoInteraction"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the long video watchtime days insight."},{"name":"days","in":"path","required":true,"schema":{"type":"string"},"description":"The long video watchtime days insight's days."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/long-videos/{posts}&{popular}&{ads}":{"get":{"operationId":"get-long-videos-posts-popular-ads","tags":["Community"],"x-section":"Post","summary":"List all long videos","description":"The long video feed by the user's interests, after ?current_video. Cached per user for 5 minutes.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"posts","in":"path","required":true,"schema":{"type":"string"},"description":"The long video's posts."},{"name":"popular","in":"path","required":true,"schema":{"type":"string"},"description":"The long video's popular."},{"name":"ads","in":"path","required":true,"schema":{"type":"string"},"description":"The long video's ads."},{"name":"current_video","in":"query","required":false,"schema":{"type":"string"},"description":"Only long videos with this current video."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/my-feed/{skip}/{limit}":{"get":{"operationId":"get-my-feed-skip-limit","tags":["Community"],"x-section":"Post","summary":"List all feeds","description":"The signed-in user's own posts, a page at a time. Answers { posts, length }, newest first, each with what it is attached to (a product, a group...).","x-access":["user"],"x-models":["Post","Comment"],"parameters":[{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"limit","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to return."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/my-videos":{"get":{"operationId":"get-my-videos","tags":["Community"],"x-section":"Post","summary":"List all videos","description":"The signed-in user's video posts. Video posts only.","x-access":["user"],"x-models":["Post"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/pin-group-post/{post}/{group}":{"patch":{"operationId":"patch-pin-group-post-post-group","tags":["Community"],"x-section":"Post","summary":"Update the pin group post","description":"Pins or unpins a post in a group (the group's admin) and notifies its author. Answers { isPinned }. 403 when the user is not the group's admin.","x-access":["user"],"x-models":["Group","Post","UserEngagementNotification"],"parameters":[{"name":"post","in":"path","required":true,"schema":{"type":"string"},"description":"The pin group post's post."},{"name":"group","in":"path","required":true,"schema":{"type":"string"},"description":"The pin group post's group."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/post-campaigns":{"get":{"operationId":"get-post-campaigns","tags":["Community"],"x-section":"Post","summary":"List all post campaigns","description":"The user's ad campaigns with their pixel results. Newest first. 403 for an account the user may not act for.","x-access":["user"],"x-models":["ConnectedAccount","User","Post","PixelData"],"parameters":[{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only post campaigns with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/post-comments/{post}&{comment}":{"patch":{"operationId":"patch-post-comments-post-comment","tags":["Community"],"x-section":"Post","summary":"Update the post comment","description":"Adds or removes a comment's reference on a post. Answers with no body.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"post","in":"path","required":true,"schema":{"type":"string"},"description":"The post comment's post."},{"name":"comment","in":"path","required":true,"schema":{"type":"string"},"description":"The post comment's comment."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/post-cta-clicks/{id}":{"patch":{"operationId":"patch-post-cta-clicks-id","tags":["Community"],"x-section":"Post","summary":"Update a post cta click","description":"Counts a click on a post's call-to-action. One per user.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the post cta click."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/post-feed/{posts}&{popular}&{ads}&{original_post_id}&{location_ads}":{"get":{"operationId":"get-post-feed-posts-popular-ads-original-post-id-location-ads","tags":["Community"],"x-section":"Post","summary":"Retrieve a post feed","description":"Posts to show after one post, by interests, with ads. Answers { posts, length, location_ads_skip, ads_skip }.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"posts","in":"path","required":true,"schema":{"type":"string"},"description":"The post feed's posts."},{"name":"popular","in":"path","required":true,"schema":{"type":"string"},"description":"The post feed's popular."},{"name":"ads","in":"path","required":true,"schema":{"type":"string"},"description":"The post feed's ads."},{"name":"original_post_id","in":"path","required":true,"schema":{"type":"string"},"description":"The post feed's original post id."},{"name":"location_ads","in":"path","required":true,"schema":{"type":"string"},"description":"The post feed's location ads."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/post-insights/{id}":{"get":{"operationId":"get-post-insights-id","tags":["Community"],"x-section":"Post","summary":"Retrieve a post insight","description":"A post's insights: views, reach, likes, shares, saves and clicks over time. 403 when the post is not the user's or an account's they manage.","x-access":["user"],"x-models":["ConnectedAccount","Post"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the post insight."},{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only post insights with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/post-poll/{id}":{"patch":{"operationId":"patch-post-poll-id","tags":["Community"],"x-section":"Post","summary":"Update a post poll","description":"Votes in a post's poll (answer), once per user. 403 \"User already voted.\"","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the post poll."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"answer":{"type":"string","description":"The post poll's answer."}}}}}}}},"/post-reach/{id}":{"patch":{"operationId":"patch-post-reach-id","tags":["Community"],"x-section":"Post","summary":"Update a post reach","description":"Counts that a post reached the signed-in user. One per user.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the post reach."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/post-times-showed/{id}":{"patch":{"operationId":"patch-post-times-showed-id","tags":["Community"],"x-section":"Post","summary":"Update a post times showed","description":"Counts that a post was shown in a feed. Answers with no body.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the post times showed."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/post-views/{id}":{"patch":{"operationId":"patch-post-views-id","tags":["Community"],"x-section":"Post","summary":"Record a view of a post","description":"Counts a view of a post by the signed-in user. One view per user. Counts as an interaction, which feeds its ranking.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the post."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/post/{id}":{"get":{"operationId":"get-post-id","tags":["Community"],"x-section":"Post","summary":"Retrieve a post","description":"Opens a post in the app (redirects to the app's post page). The website has no post page of its own; see /static-post for a shareable one.","x-access":["optional-user"],"x-models":["MyContact"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the post."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/price-plan-posts/{skip}":{"get":{"operationId":"get-price-plan-posts-skip","tags":["Community"],"x-section":"Post","summary":"List all price plan posts","description":"Subscriber-only posts of creators the user subscribes to. Nine at a time, newest first, with each post's plans.","x-access":["user"],"x-models":["Subscription","Post"],"parameters":[{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/profile-feed/{user}&{post}&{skip}":{"get":{"operationId":"get-profile-feed-user-post-skip","tags":["Community"],"x-section":"Post","summary":"List all profile feeds","description":"A user's posts from one post on, for scrolling their profile. Answers { posts, length }.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string"},"description":"The profile feed's user."},{"name":"post","in":"path","required":true,"schema":{"type":"string"},"description":"The profile feed's post."},{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/recent-feed/{skip}&{users}":{"get":{"operationId":"get-recent-feed-skip-users","tags":["Community"],"x-section":"Post","summary":"List all feeds","description":"The newest posts, skipping banned users. Answers { posts, postCount }.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"users","in":"path","required":true,"schema":{"type":"string"},"description":"The feed's users."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/remove-thread-post/{post}":{"patch":{"operationId":"patch-remove-thread-post-post","tags":["Community"],"x-section":"Post","summary":"Remove a remove thread post","description":"Takes a post out of its thread. Answers with no body.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"post","in":"path","required":true,"schema":{"type":"string"},"description":"The remove thread post's post."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/saved-posts":{"get":{"operationId":"get-saved-posts","tags":["Community"],"x-section":"Post","summary":"List all saved posts","description":"Posts the signed-in user saved. With each post's plans, when it is subscriber-only.","x-access":["user"],"x-models":["Post","Comment"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/sponsored-post-attributions":{"post":{"operationId":"post-sponsored-post-attributions","tags":["Community"],"x-section":"Post","summary":"Create a sponsored post attribution","description":"Attributes an ad interaction to a user (post_id, attributed_user_id). Charges the ad's budget for one click (or a thousand views) and credits 10% of that to the attributed user as revenue (see /user-attributions). Does nothing for a post that is not a running ad.","x-access":["user"],"x-models":["Post"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"post_id":{"type":"string","description":"The sponsored post attribution's post id."},"attributed_user_id":{"type":"string","description":"The sponsored post attribution's attributed user id."}}}}}}}},"/static-post/{id}":{"get":{"operationId":"get-static-post-id","tags":["Community"],"x-section":"Post","summary":"Retrieve a static post","description":"A post's shareable page, with its comments. For link previews and visitors without the app: a server-rendered page with the post's meta tags. Cached for an hour.","x-access":[],"x-models":["Post","Comment"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the static post."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/static-profile/{handle}":{"get":{"operationId":"get-static-profile-handle","tags":["Community"],"x-section":"Post","summary":"Retrieve a static profile","description":"A user's shareable profile page, with their posts, products and services. Server-rendered with the profile's meta tags, for link previews. Cached for an hour.","x-access":[],"x-models":["User","Post","Comment","Product","Service","BlogPost","PricePlan","Program","Subscription","Media"],"parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string"},"description":"The static profile's handle."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/threads/{skip}&{users}":{"get":{"operationId":"get-threads-skip-users","tags":["Community"],"x-section":"Post","summary":"List all threads","description":"The threads feed: text posts from who the user follows and by interest. Answers { posts, length }.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"users","in":"path","required":true,"schema":{"type":"string"},"description":"The thread's users."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/trending-videos/{category}&{skip}":{"get":{"operationId":"get-trending-videos-category-skip","tags":["Community"],"x-section":"Post","summary":"List all trending videos","description":"Trending videos in a category. Answers { posts, postCount }.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"category","in":"path","required":true,"schema":{"type":"string"},"description":"The trending video's category."},{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/update-repost/{post}&{repost}":{"patch":{"operationId":"patch-update-repost-post-repost","tags":["Community"],"x-section":"Post","summary":"Update the repost","description":"Adds a repost to a post's reposts. Answers with no body.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"post","in":"path","required":true,"schema":{"type":"string"},"description":"The repost's post."},{"name":"repost","in":"path","required":true,"schema":{"type":"string"},"description":"The repost's repost."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-exclusive-feed/{user}/{skip}/{limit}":{"get":{"operationId":"get-user-exclusive-feed-user-skip-limit","tags":["Community"],"x-section":"Post","summary":"List all user exclusive feeds","description":"A user's subscriber-only posts, when the visitor subscribes to them. Answers { posts, length }, newest first, with the plans that open them.","x-access":["optional-user"],"x-models":["Subscription","Post"],"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string"},"description":"The user exclusive feed's user."},{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"limit","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to return."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/user-expirable-posts/{user}":{"get":{"operationId":"get-user-expirable-posts-user","tags":["Community"],"x-section":"Post","summary":"List all user expirable posts","description":"A user's current stories, with what they are attached to. Newest first.","x-access":["user"],"x-models":["Post","Program","Service","BlogPost","Product","Group"],"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string"},"description":"The user expirable post's user."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-feed/{user}/{skip}/{limit}":{"get":{"operationId":"get-user-feed-user-skip-limit","tags":["Community"],"x-section":"Post","summary":"List all user feeds","description":"A user's posts that everyone may see, a page at a time. Answers { posts, length }, newest first. Subscriber-only posts are left out: see /user-exclusive-feed.","x-access":["optional-user"],"x-models":["Post","Comment"],"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string"},"description":"The user feed's user."},{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"limit","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to return."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/user-group-feed/{posts}&{public_groups}&{users}":{"get":{"operationId":"get-user-group-feed-posts-public-groups-users","tags":["Community"],"x-section":"Post","summary":"List all user group feeds","description":"Posts from the user's groups and public groups. Answers { posts, length }, newest first.","x-access":["user"],"x-models":["Group","GroupJoinRequest","Post"],"parameters":[{"name":"posts","in":"path","required":true,"schema":{"type":"string"},"description":"The user group feed's posts."},{"name":"public_groups","in":"path","required":true,"schema":{"type":"string"},"description":"The user group feed's public groups."},{"name":"users","in":"path","required":true,"schema":{"type":"string"},"description":"The user group feed's users."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-liked-posts/{skip}":{"get":{"operationId":"get-user-liked-posts-skip","tags":["Community"],"x-section":"Post","summary":"List all user liked posts","description":"Posts the signed-in user liked, a page at a time. Answers { posts, postCount }. 403 for an account the user may not act for.","x-access":["user"],"x-models":["ConnectedAccount","User","Post"],"parameters":[{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only user liked posts with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-long-video-ads/{id}":{"get":{"operationId":"get-user-long-video-ads-id","tags":["Community"],"x-section":"Post","summary":"Retrieve a user long video ad","description":"Ads to show in a long video, by the viewer's interests and location. Ads by interest first, then by location.","x-access":["optional-user"],"x-models":["Post"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user long video ad."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/user-post":{"post":{"operationId":"post-user-post","tags":["Community"],"x-section":"Post","summary":"Create a user post","description":"Publishes a post by the signed-in user (text, title, medias, poll, group), checks its pictures for explicit content and queues its videos for transcoding. 403 when the text or title is too long, 404 when the group does not exist. Pictures are checked for explicit content and given an AI caption; videos are queued for transcoding and the post fills in when they are ready.","x-access":["user"],"x-models":["Group","GroupJoinRequest","ConnectedAccount","MyContact","Media","Message","UserEngagementNotification","Post"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"The post's text."},"title":{"type":"string","description":"The post's title."},"posted_in":{"type":"string","description":"Group.id."},"selected_account_id":{"type":"string","description":"The user post's selected account id."},"medias":{"description":"Pictures and videos of the post."},"exclusive":{"type":"boolean","description":"Only for subscribers."},"mentions":{"type":"array","items":{"type":"string"},"description":"User ids."},"transcode":{"type":"string","description":"The user post's transcode."},"link":{"type":"string","description":"The user post's link."}}}}}}}},"/user-post-like/{id}":{"patch":{"operationId":"patch-user-post-like-id","tags":["Community"],"x-section":"Post","summary":"Like or unlike a user post","description":"Likes, dislikes or takes back a reaction on a post, and notifies its author. Sending the same reaction again takes it back. Answers the post. Counts as an interaction, which feeds its ranking.","x-access":["user"],"x-models":["Post","UserEngagementNotification"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user post."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"likes":{"type":"array","items":{"type":"string"},"description":"User ids."},"dislikes":{"type":"array","items":{"type":"string"},"description":"User ids."}}}}}}}},"/user-post-link-preview":{"post":{"operationId":"post-user-post-link-preview","tags":["Community"],"x-section":"Post","summary":"Create a user post link","description":"A link's preview for a post (link): its Open Graph title, picture and site name. The page is fetched by the server. Cached for an hour.","x-access":["optional-user","user"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"link":{"type":"string","description":"The user post link's link."}}}}}}}},"/user-post-object/{id}":{"get":{"operationId":"get-user-post-object-id","tags":["Community"],"x-section":"Post","summary":"Retrieve a user post object","description":"The product, service, post or program a post is attached to. 404 when there is no such post. Cached per user for 5 minutes.","x-access":["optional-user"],"x-models":["Post","Program","Service","BlogPost","Product"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user post object."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/user-post-save/{id}":{"patch":{"operationId":"patch-user-post-save-id","tags":["Community"],"x-section":"Post","summary":"Save or unsave a user post","description":"Saves or unsaves a post for the signed-in user. Calling it again unsaves. Answers the post.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user post."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-post-share/{id}":{"patch":{"operationId":"patch-user-post-share-id","tags":["Community"],"x-section":"Post","summary":"Update a user post share","description":"Records that the signed-in user shared a post (share). Answers the post.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user post share."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"share":{"type":"string","description":"The user post share's share."}}}}}}}},"/user-post/{id}":{"get":{"operationId":"get-user-post-id","tags":["Community"],"x-section":"Post","summary":"Retrieve a user post","description":"One post with its comments and more posts to show after it. 404 when there is no such post. Cached for 5 minutes.","x-access":["optional-user"],"x-models":["Post","VideoInteraction"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user post."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-user-post-id","tags":["Community"],"x-section":"Post","summary":"Update a user post","description":"Edits a post of the signed-in user, or of an account they manage (?on_behalf_of), and notifies new mentions. 403 \"Unauthorized\" when the post is not the user's or an account's they manage. Answers the updated post.","x-access":["user"],"x-models":["Post","ConnectedAccount","UserEngagementNotification"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user post."},{"name":"on_behalf_of","in":"query","required":false,"schema":{"type":"string"},"description":"Only user posts with this on behalf of."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"mentions":{"type":"array","items":{"type":"string"},"description":"User ids."}}}}}}},"delete":{"operationId":"delete-user-post-id","tags":["Community"],"x-section":"Post","summary":"Delete a user post","description":"Deletes a post with its comments and media (its author or the group's admin). Its comments and stored media are deleted with it. 403 when the user is neither its author nor the group's admin.","x-access":["user"],"x-models":["Post","Group","Comment","Media","User"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user post."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/video-feed/{video_id}&{posts}&{popular}&{ads}":{"get":{"operationId":"get-video-feed-video-id-posts-popular-ads","tags":["Community"],"x-section":"Post","summary":"Retrieve a video feed","description":"Videos to watch after a video, by the user's interests. Cached per user for 5 minutes.","x-access":["user"],"x-models":["Post"],"parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"string"},"description":"The video feed's video id."},{"name":"posts","in":"path","required":true,"schema":{"type":"string"},"description":"The video feed's posts."},{"name":"popular","in":"path","required":true,"schema":{"type":"string"},"description":"The video feed's popular."},{"name":"ads","in":"path","required":true,"schema":{"type":"string"},"description":"The video feed's ads."},{"name":"current_video","in":"query","required":false,"schema":{"type":"string"},"description":"Only video feeds with this current video."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/viewed-expirable-posts/{skip}":{"get":{"operationId":"get-viewed-expirable-posts-skip","tags":["Community"],"x-section":"Post","summary":"List all viewed expirable posts","description":"Stories the user has already seen.","x-access":["user"],"parameters":[{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/all-ratings/{id}&{item}&{skip}&{limit}":{"get":{"operationId":"get-all-ratings-id-item-skip-limit","tags":["Community"],"x-section":"Rating","summary":"Retrieve a rating","description":"An item's ratings page, a page at a time. Answers { ratings, count } in the app. 404 when the item does not exist.","x-access":[],"x-models":["ProfessionalAccount","Service","Rating","Model","MyContact"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the rating."},{"name":"item","in":"path","required":true,"schema":{"type":"string"},"description":"The rating's item."},{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"limit","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to return."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/rating":{"post":{"operationId":"post-rating","tags":["Community"],"x-section":"Rating","summary":"Create a rating","description":"Saves a rating with its pictures. Multipart with pictures. Reads no token: it comes from the rating email's page. Answers 201.","x-access":[],"x-models":["Media","Rating"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string","description":"The rating's body."}}}}}}}},"/rating/{id}":{"get":{"operationId":"get-rating-id","tags":["Community"],"x-section":"Rating","summary":"Retrieve a rating","description":"One rating. Answers the rating.","x-access":["user"],"x-models":["Rating"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the rating."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/ratings-table":{"get":{"operationId":"get-ratings-table","tags":["Community"],"x-section":"Rating","summary":"Retrieve the ratings table","description":"Ratings of one kind of item (?type), with the items. Newest first.","x-access":["user"],"x-models":["Model","Rating"],"parameters":[{"name":"charAt","in":"query","required":false,"schema":{"type":"string"},"description":"Only ratings tables with this char at."},{"name":"slice","in":"query","required":false,"schema":{"type":"string"},"description":"Only ratings tables with this slice."},{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"Only ratings tables with this type."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/user-rating/{email}&{validation_code}&{type}&{id}":{"get":{"operationId":"get-user-rating-email-validation-code-type-id","tags":["Community"],"x-section":"Rating","summary":"Retrieve a user rating","description":"The rating page from a rating email. A wrong code goes to the not-found page.","x-access":[],"x-models":["Order","Booking","Service","Subscription","PricePlan","MyContact"],"parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string"},"description":"An email address."},{"name":"validation_code","in":"path","required":true,"schema":{"type":"string"},"description":"The user rating's validation code."},{"name":"type","in":"path","required":true,"schema":{"type":"string"},"description":"The user rating's type."},{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the user rating."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/brands":{"get":{"operationId":"get-brands","tags":["Custom content"],"x-section":"Brand","summary":"List all brands","description":"The brands. Answers an array of every record.","x-access":[],"x-models":["Brand"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/brands/{id}":{"get":{"operationId":"get-brands-id","tags":["Custom content"],"x-section":"Brand","summary":"Retrieve a brand","description":"One brand. 404 when there is no such record.","x-access":[],"x-models":["Brand"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the brand."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/brands/{id}/logo":{"get":{"operationId":"get-brands-id-logo","tags":["Custom content"],"x-section":"Brand","summary":"Retrieve a brand","description":"A brand's logo. Answers the image bytes, or 404.","x-access":[],"x-models":["Brand","Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the brand."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-brands-id-logo","tags":["Custom content"],"x-section":"Brand","summary":"Create a brand","description":"Uploads a brand's logo (logo, form field). Multipart upload; the logo is resized and stored.","x-access":["user"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the brand."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]},"delete":{"operationId":"delete-brands-id-logo","tags":["Custom content"],"x-section":"Brand","summary":"Delete a brand","description":"Removes a brand's logo. Deletes the media record too.","x-access":["user"],"x-models":["Brand","Media"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the brand."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."}},"security":[{"bearer":[]}]}},"/dynamic-page":{"get":{"operationId":"get-dynamic-page","tags":["Custom content"],"x-section":"Dynamic Page","summary":"Retrieve the dynamic page","description":"Get all DynamicdynamicPages. Answers an array of every record.","x-access":["admin"],"x-models":["DynamicPage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-dynamic-page","tags":["Custom content"],"x-section":"Dynamic Page","summary":"Create a dynamic page","description":"Creates a custom-model page. Answers 201 with no body.","x-access":["admin"],"x-models":["DynamicPage"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Name of the page."}}}}}}}},"/dynamic-page-statistics/{url}":{"get":{"operationId":"get-dynamic-page-statistics-url","tags":["Custom content"],"x-section":"Dynamic Page","summary":"Get dynamic page statistics","description":"Totals of a custom-model page's records between ?from and ?to. The same access rules as GET /dynamic-page/:url.","x-access":["optional-user"],"x-models":["DynamicPage"],"parameters":[{"name":"url","in":"path","required":true,"schema":{"type":"string"},"description":"The dynamic page's URL slug, as in its address on the site."},{"name":"from","in":"query","required":false,"schema":{"type":"string"},"description":"Only dynamic pages with this from."},{"name":"to","in":"query","required":false,"schema":{"type":"string"},"description":"Only dynamic pages with this to."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/dynamic-page/{id}":{"patch":{"operationId":"patch-dynamic-page-id","tags":["Custom content"],"x-section":"Dynamic Page","summary":"Update a dynamic page","description":"Updates a custom-model page. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["DynamicPage"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the dynamic page."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Name of the page."}}}}}}},"delete":{"operationId":"delete-dynamic-page-id","tags":["Custom content"],"x-section":"Dynamic Page","summary":"Delete a dynamic page","description":"Deletes a custom-model page. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["DynamicPage"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the dynamic page."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/dynamic-page/{url}":{"get":{"operationId":"get-dynamic-page-url","tags":["Custom content"],"x-section":"Dynamic Page","summary":"Retrieve a dynamic page","description":"One custom-model page. Follows the page's access settings: 401 for a sign-in-only page, 403 when the user may not see the records. Records owned per user show only the user's own.","x-access":["optional-user"],"x-models":["DynamicPage","DynamicModel","Model"],"parameters":[{"name":"url","in":"path","required":true,"schema":{"type":"string"},"description":"The dynamic page's URL slug, as in its address on the site."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/all-used-schemas":{"get":{"operationId":"get-all-used-schemas","tags":["Custom content"],"x-section":"Dynamic Trigger","summary":"List all used schemas","description":"Every model's schema, for writing triggers. Answers the model names.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/dynamic-trigger":{"get":{"operationId":"get-dynamic-trigger","tags":["Custom content"],"x-section":"Dynamic Trigger","summary":"Retrieve the dynamic trigger","description":"Get all DynamicTriggers. Answers an array of every record.","x-access":["admin"],"x-models":["DynamicTrigger"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-dynamic-trigger","tags":["Custom content"],"x-section":"Dynamic Trigger","summary":"Create a dynamic trigger","description":"Creates a trigger. Answers 201 with no body. The trigger starts working at once.","x-access":["admin"],"x-models":["DynamicTrigger"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DynamicTrigger"}}}}}},"/dynamic-trigger/{id}":{"get":{"operationId":"get-dynamic-trigger-id","tags":["Custom content"],"x-section":"Dynamic Trigger","summary":"Retrieve a dynamic trigger","description":"One trigger. 404 when there is no such record.","x-access":["admin"],"x-models":["DynamicTrigger"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the dynamic trigger."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-dynamic-trigger-id","tags":["Custom content"],"x-section":"Dynamic Trigger","summary":"Update a dynamic trigger","description":"Updates a trigger. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["admin"],"x-models":["DynamicTrigger"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the dynamic trigger."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"last_error":{"type":"string","description":"The error of the last run, if it failed."},"last_run_at":{"type":"string","description":"When it last ran."},"last_run_status":{"type":"string","description":"One of: success, failed."}}}}}}},"delete":{"operationId":"delete-dynamic-trigger-id","tags":["Custom content"],"x-section":"Dynamic Trigger","summary":"Delete a dynamic trigger","description":"Deletes a trigger. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["DynamicTrigger"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the dynamic trigger."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/dynamicmodel":{"get":{"operationId":"get-dynamicmodel","tags":["Custom content"],"x-section":"Dynamicmodel","summary":"Retrieve the content type","description":"Get all DynamicModels. Answers an array of every record.","x-access":["admin"],"x-models":["DynamicModel"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-dynamicmodel","tags":["Custom content"],"x-section":"Dynamicmodel","summary":"Create a content type","description":"Creates a custom model. Each field is checked first: 400 { error, details } lists what is wrong. Its API routes exist as soon as it is saved. Answers 201.","x-access":["admin"],"x-models":["DynamicModel"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"The content type's name."},"fields":{"type":"string","description":"The content type's fields."}}}}}}}},"/dynamicmodel-input-fields":{"get":{"operationId":"get-dynamicmodel-input-fields","tags":["Custom content"],"x-section":"Dynamicmodel","summary":"List all content type input fields","description":"Custom models with user_input=true for a ref type (?ref: User, Service...). 400 without ?ref.","x-access":[],"x-models":["DynamicModel"],"parameters":[{"name":"ref","in":"query","required":false,"schema":{"type":"string"},"description":"Only content type input fields with this ref."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/dynamicmodel-select-fields":{"get":{"operationId":"get-dynamicmodel-select-fields","tags":["Custom content"],"x-section":"Dynamicmodel","summary":"List all content type select fields","description":"Custom models with user_input=false for a ref type (?ref), including their records. 400 without ?ref.","x-access":[],"x-models":["DynamicModel","Model"],"parameters":[{"name":"ref","in":"query","required":false,"schema":{"type":"string"},"description":"Only content type select fields with this ref."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/dynamicmodel/{id}":{"get":{"operationId":"get-dynamicmodel-id","tags":["Custom content"],"x-section":"Dynamicmodel","summary":"Retrieve a content type","description":"One custom model. 404 when there is no such record.","x-access":["admin"],"x-models":["DynamicModel"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the content type."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-dynamicmodel-id","tags":["Custom content"],"x-section":"Dynamicmodel","summary":"Update a content type","description":"Updates a custom model. The same field checks; the custom routes are rebuilt so the change applies at once. Existing records keep fields that were removed. Answers the model, or 404.","x-access":["admin"],"x-models":["DynamicModel"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the content type."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"fields":{"type":"string","description":"The content type's fields."}}}}}}},"delete":{"operationId":"delete-dynamicmodel-id","tags":["Custom content"],"x-section":"Dynamicmodel","summary":"Delete a content type","description":"Deletes a custom model. Its API routes go too. Answers the deleted model, or 404.","x-access":["admin"],"x-models":["DynamicModel"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the content type."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/all-miniapps/{skip}":{"get":{"operationId":"get-all-miniapps-skip","tags":["Custom content"],"x-section":"Miniapp","summary":"List all mini apps","description":"Approved mini apps, a page at a time. Answers { miniapps, count, usedMiniApps }, ten at a time, newest first.","x-access":["user"],"x-models":["MiniApp"],"parameters":[{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/mini-app-insights/{id}":{"get":{"operationId":"get-mini-app-insights-id","tags":["Custom content"],"x-section":"Miniapp","summary":"Retrieve a mini app insight","description":"A mini app's views and openings over time. Views and openings per day.","x-access":["user"],"x-models":["MiniApp"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the mini app insight."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/mini-app-open/{id}":{"patch":{"operationId":"patch-mini-app-open-id","tags":["Custom content"],"x-section":"Miniapp","summary":"Update a mini app open","description":"Counts an opening of a mini app. Answers with no body.","x-access":["user"],"x-models":["MiniApp"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the mini app open."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/mini-app-view/{id}":{"patch":{"operationId":"patch-mini-app-view-id","tags":["Custom content"],"x-section":"Miniapp","summary":"Record a view of a mini app","description":"Counts a view of a mini app's store page. Answers with no body.","x-access":["user"],"x-models":["MiniApp"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the mini app."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/miniapps":{"post":{"operationId":"post-miniapps","tags":["Custom content"],"x-section":"Miniapp","summary":"Create a mini app","description":"Creates a mini app. Answers 201 with the created record; 400 with the reason when a field is invalid.","x-access":["user"],"x-models":["MiniApp"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MiniApp"}}}}}},"/miniapps-get-user-data":{"get":{"operationId":"get-miniapps-get-user-data","tags":["Custom content"],"x-section":"Miniapp","summary":"Retrieve the mini apps user data","description":"The signed-in user's data a mini app may read, after a valid code. 401 for an expired or wrong code.","x-access":[],"x-models":["User","MiniApp","MyContact"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/miniapps-receiver-validate-authorization-code":{"get":{"operationId":"get-miniapps-receiver-validate-authorization-code","tags":["Custom content"],"x-section":"Miniapp","summary":"Retrieve the mini apps receiver authorization code","description":"The receiving side of a mini app code check. 401 \"Unauthorized\" for an expired or wrong code.","x-access":[],"x-models":["MyContact"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/miniapps-temp-authorization-code":{"get":{"operationId":"get-miniapps-temp-authorization-code","tags":["Custom content"],"x-section":"Miniapp","summary":"Retrieve the mini apps temp authorization code","description":"A short-lived code a mini app exchanges to sign the user in. Answers { code }, valid for a few seconds. 401 without a valid token.","x-access":[],"x-models":["User","MiniApp"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/miniapps-validate-authorization-code":{"get":{"operationId":"get-miniapps-validate-authorization-code","tags":["Custom content"],"x-section":"Miniapp","summary":"Retrieve the mini apps authorization code","description":"Checks a mini app's authorization code with the issuing site. 401 \"Unauthorized\" for an expired or wrong code.","x-access":[],"x-models":["User","MiniApp"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/miniapps/{id}":{"get":{"operationId":"get-miniapps-id","tags":["Custom content"],"x-section":"Miniapp","summary":"Retrieve a mini app","description":"One mini app with its ratings and similar mini apps. Answers { miniapp, collections, userMiniApps, average_rating, total_ratings, ... }. Never includes the private key.","x-access":["user"],"x-models":["MiniApp","Collection","Rating"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the mini app."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-miniapps-id","tags":["Custom content"],"x-section":"Miniapp","summary":"Update a mini app","description":"Updates a mini app. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.","x-access":["user"],"x-models":["MiniApp"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the mini app."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"previews":{"description":"Screenshots shown in the store."}}}}}}},"delete":{"operationId":"delete-miniapps-id","tags":["Custom content"],"x-section":"Miniapp","summary":"Delete a mini app","description":"Deletes a mini app. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["user"],"x-models":["MiniApp"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the mini app."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/my-mini-apps":{"get":{"operationId":"get-my-mini-apps","tags":["Custom content"],"x-section":"Miniapp","summary":"List all mini apps","description":"The signed-in user's mini apps. Newest first, without their private keys.","x-access":["user"],"x-models":["MiniApp"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/referer":{"get":{"operationId":"get-referer","tags":["Custom content"],"x-section":"Miniapp","summary":"Retrieve the referer","description":"The page that sent the request (referer header). Answers the referer header as text.","x-access":[],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/user-mini-apps/{owner_id}":{"get":{"operationId":"get-user-mini-apps-owner-id","tags":["Custom content"],"x-section":"Miniapp","summary":"Retrieve a user mini app","description":"A user's mini apps. Newest first, without their private keys.","x-access":["user"],"x-models":["MiniApp"],"parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string"},"description":"User.id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/create-new-dynamic-model":{"post":{"operationId":"post-create-new-dynamic-model","tags":["Custom content"],"x-section":"AI builder","summary":"Create a dynamic model with AI","description":"AI: designs a custom model (fields, access) from the owner's description. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the dynamic model, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/create-new-dynamic-page":{"post":{"operationId":"post-create-new-dynamic-page","tags":["Custom content"],"x-section":"AI builder","summary":"Create a dynamic page with AI","description":"AI: builds a page that lists or edits a custom model's records. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.","x-access":["admin"],"x-models":["DynamicModel"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the dynamic page, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"model_id":{"type":"string","description":"The dynamic page's model id."}}}}}}}},"/create-new-dynamic-trigger":{"post":{"operationId":"post-create-new-dynamic-trigger","tags":["Custom content"],"x-section":"AI builder","summary":"Create a dynamic trigger with AI","description":"AI: writes a trigger that runs when a model's records change. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"x-models":["DynamicModel"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the dynamic trigger, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"model_id":{"type":"string","description":"The dynamic trigger's model id."}}}}}}}},"/delete-dynamic-model":{"post":{"operationId":"post-delete-dynamic-model","tags":["Custom content"],"x-section":"AI builder","summary":"Create a delete dynamic model","description":"AI: deletes custom models and their routes. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.","x-access":["admin"],"x-models":["DynamicModel","ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"item_ids":{"type":"string","description":"The delete dynamic model's item ids."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/delete-dynamic-page":{"post":{"operationId":"post-delete-dynamic-page","tags":["Custom content"],"x-section":"AI builder","summary":"Create a delete dynamic page","description":"AI: deletes custom-model pages. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.","x-access":["admin"],"x-models":["DynamicPage","ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"item_ids":{"type":"string","description":"The delete dynamic page's item ids."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/delete-dynamic-trigger":{"post":{"operationId":"post-delete-dynamic-trigger","tags":["Custom content"],"x-section":"AI builder","summary":"Create a delete dynamic trigger","description":"AI: deletes triggers. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.","x-access":["admin"],"x-models":["DynamicTrigger","ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"item_ids":{"type":"string","description":"The delete dynamic trigger's item ids."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/generate-dynamic-model":{"post":{"operationId":"post-generate-dynamic-model","tags":["Custom content"],"x-section":"AI builder","summary":"Generate a dynamic model with AI","description":"AI: routes a request for a custom model to create-new-dynamic-model. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the dynamic model, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/generate-dynamic-page":{"post":{"operationId":"post-generate-dynamic-page","tags":["Custom content"],"x-section":"AI builder","summary":"Generate a dynamic page with AI","description":"AI: routes a request for a custom-model page to create-new-dynamic-page. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the dynamic page, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/generate-dynamic-trigger":{"post":{"operationId":"post-generate-dynamic-trigger","tags":["Custom content"],"x-section":"AI builder","summary":"Generate a dynamic trigger with AI","description":"AI: routes a request for a trigger to create-new-dynamic-trigger. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the dynamic trigger, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/modify-dynamic-model":{"post":{"operationId":"post-modify-dynamic-model","tags":["Custom content"],"x-section":"AI builder","summary":"Modify a dynamic model with AI","description":"AI: routes a change to a custom model to update-dynamic-model. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the dynamic model, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"item_id":{"type":"string","description":"The ID of the dynamic model to change."},"item_data":{"type":"string","description":"The current dynamic model, as JSON - the AI changes it and returns the result."}}}}}}}},"/modify-dynamic-page":{"post":{"operationId":"post-modify-dynamic-page","tags":["Custom content"],"x-section":"AI builder","summary":"Modify a dynamic page with AI","description":"AI: routes a change to a custom-model page to update-dynamic-page. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the dynamic page, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"item_id":{"type":"string","description":"The ID of the dynamic page to change."},"item_ids":{"type":"string","description":"The dynamic page's item ids."},"item_data":{"type":"string","description":"The current dynamic page, as JSON - the AI changes it and returns the result."}}}}}}}},"/modify-dynamic-trigger":{"post":{"operationId":"post-modify-dynamic-trigger","tags":["Custom content"],"x-section":"AI builder","summary":"Modify a dynamic trigger with AI","description":"AI: routes a change to a trigger to update-dynamic-trigger. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the dynamic trigger, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"item_id":{"type":"string","description":"The ID of the dynamic trigger to change."},"item_ids":{"type":"string","description":"The dynamic trigger's item ids."},"item_data":{"type":"string","description":"The current dynamic trigger, as JSON - the AI changes it and returns the result."}}}}}}}},"/run-dynamic-trigger":{"post":{"operationId":"post-run-dynamic-trigger","tags":["Custom content"],"x-section":"AI builder","summary":"Create a run dynamic trigger","description":"AI: runs a trigger once now, as a test. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.","x-access":["admin"],"x-models":["DynamicTrigger","ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"item_ids":{"type":"string","description":"The run dynamic trigger's item ids."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/toggle-dynamic-trigger":{"post":{"operationId":"post-toggle-dynamic-trigger","tags":["Custom content"],"x-section":"AI builder","summary":"Toggle a dynamic trigger","description":"AI: turns triggers on or off. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.","x-access":["admin"],"x-models":["DynamicTrigger","ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"item_ids":{"type":"string","description":"The dynamic trigger's item ids."},"enabled":{"type":"boolean","description":"The trigger runs."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/update-dynamic-model":{"post":{"operationId":"post-update-dynamic-model","tags":["Custom content"],"x-section":"AI builder","summary":"Update a dynamic model with AI","description":"AI: changes a custom model as the owner asked. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the dynamic model, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"item_id":{"type":"string","description":"The ID of the dynamic model to change."}}}}}}}},"/update-dynamic-page":{"post":{"operationId":"post-update-dynamic-page","tags":["Custom content"],"x-section":"AI builder","summary":"Update a dynamic page with AI","description":"AI: changes a custom-model page as the owner asked. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"x-models":["DynamicModel"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the dynamic page, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"item_id":{"type":"string","description":"The ID of the dynamic page to change."},"model_id":{"type":"string","description":"The dynamic page's model id."}}}}}}}},"/update-dynamic-trigger":{"post":{"operationId":"post-update-dynamic-trigger","tags":["Custom content"],"x-section":"AI builder","summary":"Update a dynamic trigger with AI","description":"AI: changes a trigger as the owner asked. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"x-models":["DynamicModel"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the dynamic trigger, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"item_id":{"type":"string","description":"The ID of the dynamic trigger to change."},"model_id":{"type":"string","description":"The dynamic trigger's model id."}}}}}}}},"/ai-chat-orchestrator":{"post":{"operationId":"post-ai-chat-orchestrator","tags":["AI builder"],"x-section":"Ai Orchestrator","summary":"Create an AI chat orchestrator","description":"AI: the chat's entry point: saves the owner's message and runs the agent for it, one turn per chat at a time. Send chatId and prompt. Answers one of the chat actions: RESPONSE (a reply), JOB (work started: poll GET /async-jobs/:id), a proposal to confirm, or ERROR. 429 while the chat already has a turn running; 400 without chatId or prompt. Language, credits and the plan state come from the chat, not the request.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"429":{"description":"Slow down: the site's request limit was reached, an AI chat already has a request running, or the hourly limit of AI search answers is used up. Wait and retry."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the AI chat orchestrator, in plain words - any language."},"originalPrompt":{"type":"string","description":"The AI chat orchestrator's original prompt."},"current_page_url":{"type":"string","description":"The AI chat orchestrator's current page url."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"attachments":{"type":"string","description":"The AI chat orchestrator's attachments."}}}}}}}},"/ai-clone/analyze":{"post":{"operationId":"post-ai-clone-analyze","tags":["AI builder"],"x-section":"Ai Orchestrator","summary":"Duplicate a AI","description":"AI: reads a site the owner wants to clone and drafts a brief of it (pages, products, look). Send chatId and the site's url. Starts reading the site as a job; the brief is kept as a pending plan that /ai-clone/brief, /ai-clone/refine and /ai-clone/products work on. A second call while one runs gets the running one.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"429":{"description":"Slow down: the site's request limit was reached, an AI chat already has a request running, or the hourly limit of AI search answers is used up. Wait and retry."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"url":{"type":"string","description":"The AI's URL slug, as in its address on the site."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/ai-clone/brief":{"post":{"operationId":"post-ai-clone-brief","tags":["AI builder"],"x-section":"Ai Orchestrator","summary":"Duplicate a AI","description":"AI: saves the owner's edits to the pending clone brief. 404 when there is no pending clone analysis for the chat. Answers the updated brief.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/ai-clone/products":{"post":{"operationId":"post-ai-clone-products","tags":["AI builder"],"x-section":"Ai Orchestrator","summary":"Duplicate a AI","description":"AI: the clone brief's products with their credit cost. Send chatId and count (how many products to copy, capped at what the site has). Answers { action: 'PRODUCTS', productCount, estimate }: the clone's credit estimate for pages and products.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"count":{"type":"string","description":"The AI's count."}}}}}}}},"/ai-clone/refine":{"post":{"operationId":"post-ai-clone-refine","tags":["AI builder"],"x-section":"Ai Orchestrator","summary":"Duplicate a AI","description":"AI: changes the pending clone brief as the owner asked in words. Send chatId and text. 429 while another request runs for the chat; 404 without a pending clone analysis. Answers the updated brief.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"429":{"description":"Slow down: the site's request limit was reached, an AI chat already has a request running, or the hourly limit of AI search answers is used up. Wait and retry."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"text":{"type":"string","description":"The AI's text."}}}}}}}},"/async-jobs/{id}":{"get":{"operationId":"get-async-jobs-id","tags":["AI builder"],"x-section":"Async Job","summary":"Retrieve an async job","description":"A background job's progress and result, polled by the admin while AI work runs. Answers the job: percent, status, complete, and result when done. A plan job whose process died is retired here and comes back complete, with a resume offer in its chat. 404 when there is no such job.","x-access":["admin"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the async job."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/all-chat-history":{"get":{"operationId":"get-all-chat-history","tags":["AI builder"],"x-section":"Chat History","summary":"Retrieve the chat history","description":"Every AI chat, each with its newest message, the most recently used first. Answers an array, newest first.","x-access":["admin"],"x-models":["ChatHistory","ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/chat-history":{"get":{"operationId":"get-chat-history","tags":["AI builder"],"x-section":"Chat History","summary":"Retrieve the chat history","description":"The latest AI chat with its messages. Answers { chatHistory, messages }: the newest 20 messages.","x-access":["admin"],"x-models":["ChatHistory","ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-chat-history","tags":["AI builder"],"x-section":"Chat History","summary":"Create a chat history","description":"Starts a new AI chat. Answers { chatHistory }.","x-access":["admin"],"x-models":["ChatHistory"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/chat-history/{id}":{"get":{"operationId":"get-chat-history-id","tags":["AI builder"],"x-section":"Chat History","summary":"Retrieve a chat history","description":"One AI chat. 404 when there is no such record.","x-access":["admin"],"x-models":["ChatHistory"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the chat history."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-chat-history-id","tags":["AI builder"],"x-section":"Chat History","summary":"Update a chat history","description":"Renames an AI chat (title). 404 when there is no such chat.","x-access":["admin"],"x-models":["ChatHistory"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the chat history."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Name of the chat, shown in the chat list."}}}}}}},"delete":{"operationId":"delete-chat-history-id","tags":["AI builder"],"x-section":"Chat History","summary":"Delete a chat history","description":"Deletes an AI chat with its messages. Answers the deleted record, or 404. Records that point to it are not changed.","x-access":["admin"],"x-models":["ChatHistory","ChatMessage"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the chat history."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/chat-message/{chatId}":{"post":{"operationId":"post-chat-message-chatid","tags":["AI builder"],"x-section":"Chat Message","summary":"Create a chat message","description":"Adds a message to an AI chat. Answers { message }.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[{"name":"chatId","in":"path","required":true,"schema":{"type":"string"},"description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatMessage"}}}}}},"/chat-message/{chatId}/{messageId}":{"patch":{"operationId":"patch-chat-message-chatid-messageid","tags":["AI builder"],"x-section":"Chat Message","summary":"Update a chat message","description":"Updates a chat message's text, data or options. Answers { message }. 404 when it is not in that chat.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[{"name":"chatId","in":"path","required":true,"schema":{"type":"string"},"description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},{"name":"messageId","in":"path","required":true,"schema":{"type":"string"},"description":"The chat message's message id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"The message's text."},"data":{"type":"string","description":"The chat message's data."},"options":{"type":"array","items":{"type":"string"},"description":"Quick replies offered under the message."}}}}}}}},"/chat-message/{chatId}/{skip}/{limit}":{"get":{"operationId":"get-chat-message-chatid-skip-limit","tags":["AI builder"],"x-section":"Chat Message","summary":"Retrieve a chat message","description":"A chat's messages, a page at a time; offers to resume a build that stopped. Answers { messages }, newest first.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[{"name":"chatId","in":"path","required":true,"schema":{"type":"string"},"description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},{"name":"skip","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to skip - for paging."},{"name":"limit","in":"path","required":true,"schema":{"type":"string"},"description":"How many results to return."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/chat-message/{chatId}/last-error":{"delete":{"operationId":"delete-chat-message-chatid-last-error","tags":["AI builder"],"x-section":"Chat Message","summary":"Delete a chat message","description":"Deletes a chat's last error message and the message that caused it, to retry. Answers { deleted }: how many messages were removed.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[{"name":"chatId","in":"path","required":true,"schema":{"type":"string"},"description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/ai-builder/hero-animation/{pageId}":{"get":{"operationId":"get-ai-builder-hero-animation-pageid","tags":["AI builder"],"x-section":"Hero Animation","summary":"Retrieve an AI builder","description":"Returns one AI builder, found by its ID.","x-access":["admin"],"x-models":["AboutPage"],"parameters":[{"name":"pageId","in":"path","required":true,"schema":{"type":"string"},"description":"The AI builder's page id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/ai-builder/hero-animation/{pageId}/apply":{"post":{"operationId":"post-ai-builder-hero-animation-pageid-apply","tags":["AI builder"],"x-section":"Hero Animation","summary":"Apply the AI builder","description":"Apply the AI builder.","x-access":["admin"],"x-models":["Media","AboutPage"],"parameters":[{"name":"pageId","in":"path","required":true,"schema":{"type":"string"},"description":"The AI builder's page id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"409":{"description":"It clashes with the current state: the item is already being processed, a version is already applied, or an AI plan or preview is no longer available."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"media":{"type":"string","description":"The AI builder's media."}}}}}}}},"/ai-builder/hero-animation/{pageId}/dismiss":{"post":{"operationId":"post-ai-builder-hero-animation-pageid-dismiss","tags":["AI builder"],"x-section":"Hero Animation","summary":"Dismiss the AI builder","description":"Dismiss the AI builder.","x-access":["admin"],"x-models":["AboutPage"],"parameters":[{"name":"pageId","in":"path","required":true,"schema":{"type":"string"},"description":"The AI builder's page id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/ai-builder/hero-animation/{pageId}/revert":{"post":{"operationId":"post-ai-builder-hero-animation-pageid-revert","tags":["AI builder"],"x-section":"Hero Animation","summary":"Revert the AI builder","description":"Revert the AI builder.","x-access":["admin"],"x-models":["AboutPage"],"parameters":[{"name":"pageId","in":"path","required":true,"schema":{"type":"string"},"description":"The AI builder's page id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/ai-builder/hero-animation/{pageId}/start":{"post":{"operationId":"post-ai-builder-hero-animation-pageid-start","tags":["AI builder"],"x-section":"Hero Animation","summary":"Start the AI builder","description":"Start the AI builder.","x-access":["admin"],"x-models":["AboutPage"],"parameters":[{"name":"pageId","in":"path","required":true,"schema":{"type":"string"},"description":"The AI builder's page id."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"403":{"description":"The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"409":{"description":"It clashes with the current state: the item is already being processed, a version is already applied, or an AI plan or preview is no longer available."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"idea":{"type":"string","description":"The AI builder's idea."},"mediaIds":{"type":"string","description":"The AI builder's media ids."}}}}}}}},"/ai-stop":{"post":{"operationId":"post-ai-stop","tags":["AI builder"],"x-section":"Planners","summary":"Create an AI","description":"AI: stops the agent turn and plan running in a chat (chatId) before their next step. Answers { stopped: true, plans } with how many plans were told to stop. A plan finishes the step it is on, then stops and is marked partially completed. Jobs that are not a plan (a single page, a picture) run to the end.","x-access":["admin"],"x-models":["ChatHistory"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."}}}}}}}},"/create-dynamic-features-plan":{"post":{"operationId":"post-create-dynamic-features-plan","tags":["AI builder"],"x-section":"Planners","summary":"Create a dynamic features plan with AI","description":"AI: builds the custom models and pages of an accepted features plan. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the dynamic features plan, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/create-dynamic-modification-plan":{"post":{"operationId":"post-create-dynamic-modification-plan","tags":["AI builder"],"x-section":"Planners","summary":"Create a dynamic modification plan with AI","description":"AI: applies an accepted custom model modification plan. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the dynamic modification plan, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/create-plan":{"post":{"operationId":"post-create-plan","tags":["AI builder"],"x-section":"Planners","summary":"Create a plan with AI","description":"AI: runs the agent for a /create-plan message: plans the work and runs it as a background job. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the plan, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"notice":{"type":"string","description":"The plan's notice."},"reference_request":{"type":"string","description":"The plan's reference request."},"selection_request":{"type":"string","description":"The plan's selection request."}}}}}}}},"/generate-companion-app-plan":{"post":{"operationId":"post-generate-companion-app-plan","tags":["AI builder"],"x-section":"Planners","summary":"Generate a companion app plan with AI","description":"AI: talks through the companion app settings with the owner and proposes the changes. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.","x-access":["admin"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the companion app plan, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/generate-dynamic-features-plan":{"post":{"operationId":"post-generate-dynamic-features-plan","tags":["AI builder"],"x-section":"Planners","summary":"Generate a dynamic features plan with AI","description":"AI: drafts a plan of custom models and pages for a feature the owner described. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the dynamic features plan, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/generate-dynamic-modification-plan":{"post":{"operationId":"post-generate-dynamic-modification-plan","tags":["AI builder"],"x-section":"Planners","summary":"Generate a dynamic modification plan with AI","description":"AI: drafts changes to existing custom models and pages. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the dynamic modification plan, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/generate-page-link-plan":{"post":{"operationId":"post-generate-page-link-plan","tags":["AI builder"],"x-section":"Planners","summary":"Generate a page link plan with AI","description":"AI: works out which record a new page is about and where to link it, then builds it. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the page link plan, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."},"item_ids":{"type":"string","description":"The page link plan's item ids."}}}}}}}},"/generate-project-plan":{"post":{"operationId":"post-generate-project-plan","tags":["AI builder"],"x-section":"Planners","summary":"Generate a project plan with AI","description":"AI: drafts a business project plan for the site from the chat. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the project plan, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/generate-social-mode-plan":{"post":{"operationId":"post-generate-social-mode-plan","tags":["AI builder"],"x-section":"Planners","summary":"Generate a social mode plan with AI","description":"AI: talks through the social mode settings with the owner and proposes the changes. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the social mode plan, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/unfinished-plans":{"get":{"operationId":"get-unfinished-plans","tags":["AI builder"],"x-section":"Planners","summary":"List all unfinished plans","description":"AI: the owner's plans that stopped before finishing, each with its chat, offering to resume stalled ones. Answers { unfinished }: up to 20, the most recently touched first, each with its planId, chat and title. A plan whose process died is offered for resuming.","x-access":["admin"],"x-models":["ChatHistory"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/unfinished-plans/{id}":{"delete":{"operationId":"delete-unfinished-plans-id","tags":["AI builder"],"x-section":"Planners","summary":"Delete an unfinished plan","description":"AI: deletes an unfinished plan and closes its job and chat cards. Answers { deleted: true }, or { deleted: false } when there is no such plan. 409 while the build is still running: stop it first.","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the unfinished plan."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"409":{"description":"It clashes with the current state: the item is already being processed, a version is already applied, or an AI plan or preview is no longer available."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/site-wide-edit":{"post":{"operationId":"post-site-wide-edit","tags":["AI builder"],"x-section":"Site Wide Edit","summary":"Create a site wide edit","description":"Finds every place a requested text change applies to and proposes it,. as a chat card, for confirmation. Background job; the card is the result.","x-access":["admin"],"x-models":["MyContact","ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the AI should do with the site wide edit, in plain words - any language."},"chatId":{"type":"string","description":"The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat."},"aiVersion":{"type":"string","description":"Which version of the AI builder to use; leave it out for the current one."}}}}}}}},"/site-wide-edit/apply":{"post":{"operationId":"post-site-wide-edit-apply","tags":["AI builder"],"x-section":"Site Wide Edit","summary":"Apply the site wide edit","description":"Writes the ticked changes of a proposal; keeps each field's previous value for undo. Answers { applied, skipped, reloads_index }; reloads_index tells the admin to reload the page it shows. 400 \"Nothing to apply\".","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"messageId":{"type":"string","description":"The site wide edit's message id."}}}}}}}},"/site-wide-edit/undo":{"post":{"operationId":"post-site-wide-edit-undo","tags":["AI builder"],"x-section":"Site Wide Edit","summary":"Undo the site wide edit","description":"Puts back what an applied change replaced - where nothing has changed it since. Answers { restored, changedSince }: fields edited again since are left as they are. 400 \"Nothing to undo\".","x-access":["admin"],"x-models":["ChatMessage"],"parameters":[],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"messageId":{"type":"string","description":"The site wide edit's message id."}}}}}}}},"/associated-groups/{id}":{"get":{"operationId":"get-associated-groups-id","tags":["Associated Groups"],"x-section":"Associated Groups","summary":"Retrieve an associated group","description":"Returns one associated group, found by its ID.","x-access":[],"x-models":["Collection"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the associated group."},{"name":"topic","in":"query","required":false,"schema":{"type":"string"},"description":"Only associated groups with this topic."},{"name":"service","in":"query","required":false,"schema":{"type":"string"},"description":"Only associated groups with this service."},{"name":"donation-topic","in":"query","required":false,"schema":{"type":"string"},"description":"Only associated groups with this donation topic."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/client":{"get":{"operationId":"get-client","tags":["Client"],"x-section":"Client","summary":"Retrieve the client","description":"Returns the client.","x-access":[],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only clients with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only clients with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/client/{id}":{"get":{"operationId":"get-client-id","tags":["Client"],"x-section":"Client","summary":"Retrieve a client","description":"Returns one client, found by its ID.","x-access":[],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the client."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only clients with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/color":{"get":{"operationId":"get-color","tags":["Color"],"x-section":"Color","summary":"Retrieve the color","description":"Returns the color.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only colors with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only colors with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-color","tags":["Color"],"x-section":"Color","summary":"Create a color","description":"Creates a color from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/color/{id}":{"get":{"operationId":"get-color-id","tags":["Color"],"x-section":"Color","summary":"Retrieve a color","description":"Returns one color, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the color."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only colors with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-color-id","tags":["Color"],"x-section":"Color","summary":"Update a color","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the color."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-color-id","tags":["Color"],"x-section":"Color","summary":"Delete a color","description":"Deletes the color. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the color."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/complication":{"get":{"operationId":"get-complication","tags":["Complication"],"x-section":"Complication","summary":"Retrieve the complication","description":"Returns the complication.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only complications with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only complications with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-complication","tags":["Complication"],"x-section":"Complication","summary":"Create a complication","description":"Creates a complication from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/complication/{id}":{"get":{"operationId":"get-complication-id","tags":["Complication"],"x-section":"Complication","summary":"Retrieve a complication","description":"Returns one complication, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the complication."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only complications with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-complication-id","tags":["Complication"],"x-section":"Complication","summary":"Update a complication","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the complication."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-complication-id","tags":["Complication"],"x-section":"Complication","summary":"Delete a complication","description":"Deletes the complication. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the complication."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/daniellsapunkov-streetlightcontrol":{"get":{"operationId":"get-daniellsapunkov-streetlightcontrol","tags":["Daniellsapunkov Streetlightcontrol"],"x-section":"Daniellsapunkov Streetlightcontrol","summary":"Retrieve the daniellsapunkov streetlightcontrol","description":"Returns the daniellsapunkov streetlightcontrol.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only daniellsapunkov streetlightcontrols with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only daniellsapunkov streetlightcontrols with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-daniellsapunkov-streetlightcontrol","tags":["Daniellsapunkov Streetlightcontrol"],"x-section":"Daniellsapunkov Streetlightcontrol","summary":"Create a daniellsapunkov streetlightcontrol","description":"Creates a daniellsapunkov streetlightcontrol from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/daniellsapunkov-streetlightcontrol/{id}":{"get":{"operationId":"get-daniellsapunkov-streetlightcontrol-id","tags":["Daniellsapunkov Streetlightcontrol"],"x-section":"Daniellsapunkov Streetlightcontrol","summary":"Retrieve a daniellsapunkov streetlightcontrol","description":"Returns one daniellsapunkov streetlightcontrol, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the daniellsapunkov streetlightcontrol."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only daniellsapunkov streetlightcontrols with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-daniellsapunkov-streetlightcontrol-id","tags":["Daniellsapunkov Streetlightcontrol"],"x-section":"Daniellsapunkov Streetlightcontrol","summary":"Update a daniellsapunkov streetlightcontrol","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the daniellsapunkov streetlightcontrol."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-daniellsapunkov-streetlightcontrol-id","tags":["Daniellsapunkov Streetlightcontrol"],"x-section":"Daniellsapunkov Streetlightcontrol","summary":"Delete a daniellsapunkov streetlightcontrol","description":"Deletes the daniellsapunkov streetlightcontrol. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the daniellsapunkov streetlightcontrol."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/dataroom":{"get":{"operationId":"get-dataroom","tags":["Dataroom"],"x-section":"Dataroom","summary":"Retrieve the dataroom","description":"Returns the dataroom.","x-access":[],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only datarooms with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only datarooms with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-dataroom","tags":["Dataroom"],"x-section":"Dataroom","summary":"Create a dataroom","description":"Creates a dataroom from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/dataroom/{id}":{"get":{"operationId":"get-dataroom-id","tags":["Dataroom"],"x-section":"Dataroom","summary":"Retrieve a dataroom","description":"Returns one dataroom, found by its ID.","x-access":[],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the dataroom."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only datarooms with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-dataroom-id","tags":["Dataroom"],"x-section":"Dataroom","summary":"Update a dataroom","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the dataroom."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-dataroom-id","tags":["Dataroom"],"x-section":"Dataroom","summary":"Delete a dataroom","description":"Deletes the dataroom. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the dataroom."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/discountvouchers":{"get":{"operationId":"get-discountvouchers","tags":["Discountvouchers"],"x-section":"Discountvouchers","summary":"List all discountvouchers","description":"Returns the site's discountvouchers, newest first unless a sort is given.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only discountvouchers with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only discountvouchers with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-discountvouchers","tags":["Discountvouchers"],"x-section":"Discountvouchers","summary":"Create a discountvoucher","description":"Creates a discountvoucher from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/discountvouchers/{id}":{"get":{"operationId":"get-discountvouchers-id","tags":["Discountvouchers"],"x-section":"Discountvouchers","summary":"Retrieve a discountvoucher","description":"Returns one discountvoucher, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the discountvoucher."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only discountvouchers with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-discountvouchers-id","tags":["Discountvouchers"],"x-section":"Discountvouchers","summary":"Update a discountvoucher","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the discountvoucher."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-discountvouchers-id","tags":["Discountvouchers"],"x-section":"Discountvouchers","summary":"Delete a discountvoucher","description":"Deletes the discountvoucher. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the discountvoucher."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/doc-feature":{"get":{"operationId":"get-doc-feature","tags":["Doc Feature"],"x-section":"Doc Feature","summary":"Retrieve the doc feature","description":"Returns the doc feature.","x-access":[],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only doc features with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only doc features with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-doc-feature","tags":["Doc Feature"],"x-section":"Doc Feature","summary":"Create a doc feature","description":"Creates a doc feature from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/doc-feature/{id}":{"get":{"operationId":"get-doc-feature-id","tags":["Doc Feature"],"x-section":"Doc Feature","summary":"Retrieve a doc feature","description":"Returns one doc feature, found by its ID.","x-access":[],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the doc feature."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only doc features with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-doc-feature-id","tags":["Doc Feature"],"x-section":"Doc Feature","summary":"Update a doc feature","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the doc feature."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-doc-feature-id","tags":["Doc Feature"],"x-section":"Doc Feature","summary":"Delete a doc feature","description":"Deletes the doc feature. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the doc feature."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/extbookingsexport":{"get":{"operationId":"get-extbookingsexport","tags":["Extbookingsexport"],"x-section":"Extbookingsexport","summary":"Retrieve the extbookingsexport","description":"Returns the extbookingsexport.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only extbookingsexports with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only extbookingsexports with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-extbookingsexport","tags":["Extbookingsexport"],"x-section":"Extbookingsexport","summary":"Create an extbookingsexport","description":"Creates an extbookingsexport from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/extbookingsexport/{id}":{"get":{"operationId":"get-extbookingsexport-id","tags":["Extbookingsexport"],"x-section":"Extbookingsexport","summary":"Retrieve an extbookingsexport","description":"Returns one extbookingsexport, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the extbookingsexport."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only extbookingsexports with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-extbookingsexport-id","tags":["Extbookingsexport"],"x-section":"Extbookingsexport","summary":"Update an extbookingsexport","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the extbookingsexport."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-extbookingsexport-id","tags":["Extbookingsexport"],"x-section":"Extbookingsexport","summary":"Delete an extbookingsexport","description":"Deletes the extbookingsexport. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the extbookingsexport."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/fuelbrand":{"get":{"operationId":"get-fuelbrand","tags":["Fuelbrand"],"x-section":"Fuelbrand","summary":"Retrieve the fuelbrand","description":"Returns the fuelbrand.","x-access":[],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only fuelbrands with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only fuelbrands with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-fuelbrand","tags":["Fuelbrand"],"x-section":"Fuelbrand","summary":"Create a fuelbrand","description":"Creates a fuelbrand from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/fuelbrand/{id}":{"get":{"operationId":"get-fuelbrand-id","tags":["Fuelbrand"],"x-section":"Fuelbrand","summary":"Retrieve a fuelbrand","description":"Returns one fuelbrand, found by its ID.","x-access":[],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the fuelbrand."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only fuelbrands with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-fuelbrand-id","tags":["Fuelbrand"],"x-section":"Fuelbrand","summary":"Update a fuelbrand","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the fuelbrand."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-fuelbrand-id","tags":["Fuelbrand"],"x-section":"Fuelbrand","summary":"Delete a fuelbrand","description":"Deletes the fuelbrand. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the fuelbrand."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/horoscope":{"get":{"operationId":"get-horoscope","tags":["Horoscope"],"x-section":"Horoscope","summary":"Retrieve the horoscope","description":"Returns the horoscope.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only horoscopes with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only horoscopes with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-horoscope","tags":["Horoscope"],"x-section":"Horoscope","summary":"Create a horoscope","description":"Creates a horoscope from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/horoscope/{id}":{"get":{"operationId":"get-horoscope-id","tags":["Horoscope"],"x-section":"Horoscope","summary":"Retrieve a horoscope","description":"Returns one horoscope, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the horoscope."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only horoscopes with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-horoscope-id","tags":["Horoscope"],"x-section":"Horoscope","summary":"Update a horoscope","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the horoscope."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-horoscope-id","tags":["Horoscope"],"x-section":"Horoscope","summary":"Delete a horoscope","description":"Deletes the horoscope. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the horoscope."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/insurance":{"get":{"operationId":"get-insurance","tags":["Insurance"],"x-section":"Insurance","summary":"Retrieve the insurance","description":"Returns the insurance.","x-access":[],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only insurances with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only insurances with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-insurance","tags":["Insurance"],"x-section":"Insurance","summary":"Create an insurance","description":"Creates an insurance from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/insurance/{id}":{"get":{"operationId":"get-insurance-id","tags":["Insurance"],"x-section":"Insurance","summary":"Retrieve an insurance","description":"Returns one insurance, found by its ID.","x-access":[],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the insurance."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only insurances with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-insurance-id","tags":["Insurance"],"x-section":"Insurance","summary":"Update an insurance","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the insurance."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-insurance-id","tags":["Insurance"],"x-section":"Insurance","summary":"Delete an insurance","description":"Deletes the insurance. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the insurance."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/jarmin3-websiteconfigbackup":{"get":{"operationId":"get-jarmin3-websiteconfigbackup","tags":["Jarmin3 Websiteconfigbackup"],"x-section":"Jarmin3 Websiteconfigbackup","summary":"Retrieve the jarmin3 websiteconfigbackup","description":"Returns the jarmin3 websiteconfigbackup.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only jarmin3 websiteconfigbackups with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only jarmin3 websiteconfigbackups with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-jarmin3-websiteconfigbackup","tags":["Jarmin3 Websiteconfigbackup"],"x-section":"Jarmin3 Websiteconfigbackup","summary":"Create a jarmin3 websiteconfigbackup","description":"Creates a jarmin3 websiteconfigbackup from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/jarmin3-websiteconfigbackup/{id}":{"get":{"operationId":"get-jarmin3-websiteconfigbackup-id","tags":["Jarmin3 Websiteconfigbackup"],"x-section":"Jarmin3 Websiteconfigbackup","summary":"Retrieve a jarmin3 websiteconfigbackup","description":"Returns one jarmin3 websiteconfigbackup, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the jarmin3 websiteconfigbackup."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only jarmin3 websiteconfigbackups with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-jarmin3-websiteconfigbackup-id","tags":["Jarmin3 Websiteconfigbackup"],"x-section":"Jarmin3 Websiteconfigbackup","summary":"Update a jarmin3 websiteconfigbackup","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the jarmin3 websiteconfigbackup."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-jarmin3-websiteconfigbackup-id","tags":["Jarmin3 Websiteconfigbackup"],"x-section":"Jarmin3 Websiteconfigbackup","summary":"Delete a jarmin3 websiteconfigbackup","description":"Deletes the jarmin3 websiteconfigbackup. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the jarmin3 websiteconfigbackup."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/kitchensink-locales":{"get":{"operationId":"get-kitchensink-locales","tags":["Kitchensink Locales"],"x-section":"Kitchensink Locales","summary":"List all kitchensink locales","description":"Returns the site's kitchensink locales, newest first unless a sort is given.","x-access":[],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only kitchensink locales with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only kitchensink locales with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/kitchensink-locales/{id}":{"get":{"operationId":"get-kitchensink-locales-id","tags":["Kitchensink Locales"],"x-section":"Kitchensink Locales","summary":"Retrieve a kitchensink locale","description":"Returns one kitchensink locale, found by its ID.","x-access":[],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the kitchensink locale."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only kitchensink locales with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}}},"/make":{"get":{"operationId":"get-make","tags":["Make"],"x-section":"Make","summary":"Retrieve the make","description":"Returns the make.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only makes with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only makes with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-make","tags":["Make"],"x-section":"Make","summary":"Create a make","description":"Creates a make from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/make/{id}":{"get":{"operationId":"get-make-id","tags":["Make"],"x-section":"Make","summary":"Retrieve a make","description":"Returns one make, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the make."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only makes with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-make-id","tags":["Make"],"x-section":"Make","summary":"Update a make","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the make."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-make-id","tags":["Make"],"x-section":"Make","summary":"Delete a make","description":"Deletes the make. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the make."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/material":{"get":{"operationId":"get-material","tags":["Material"],"x-section":"Material","summary":"Retrieve the material","description":"Returns the material.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only materials with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only materials with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-material","tags":["Material"],"x-section":"Material","summary":"Create a material","description":"Creates a material from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/material/{id}":{"get":{"operationId":"get-material-id","tags":["Material"],"x-section":"Material","summary":"Retrieve a material","description":"Returns one material, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the material."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only materials with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-material-id","tags":["Material"],"x-section":"Material","summary":"Update a material","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the material."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-material-id","tags":["Material"],"x-section":"Material","summary":"Delete a material","description":"Deletes the material. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the material."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/medproduct":{"get":{"operationId":"get-medproduct","tags":["Medproduct"],"x-section":"Medproduct","summary":"Retrieve the medproduct","description":"Returns the medproduct.","x-access":[],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only medproducts with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only medproducts with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-medproduct","tags":["Medproduct"],"x-section":"Medproduct","summary":"Create a medproduct","description":"Creates a medproduct from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/medproduct/{id}":{"get":{"operationId":"get-medproduct-id","tags":["Medproduct"],"x-section":"Medproduct","summary":"Retrieve a medproduct","description":"Returns one medproduct, found by its ID.","x-access":[],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the medproduct."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only medproducts with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-medproduct-id","tags":["Medproduct"],"x-section":"Medproduct","summary":"Update a medproduct","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the medproduct."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-medproduct-id","tags":["Medproduct"],"x-section":"Medproduct","summary":"Delete a medproduct","description":"Deletes the medproduct. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the medproduct."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/medproductprogress":{"get":{"operationId":"get-medproductprogress","tags":["Medproductprogress"],"x-section":"Medproductprogress","summary":"Retrieve the medproductprogress","description":"Returns the medproductprogress.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only medproductprogresses with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only medproductprogresses with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/medproductprogress/{id}":{"get":{"operationId":"get-medproductprogress-id","tags":["Medproductprogress"],"x-section":"Medproductprogress","summary":"Retrieve a medproductprogress","description":"Returns one medproductprogress, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the medproductprogress."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only medproductprogresses with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/model":{"get":{"operationId":"get-model","tags":["Model"],"x-section":"Model","summary":"Retrieve the model","description":"Returns the model.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only models with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only models with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-model","tags":["Model"],"x-section":"Model","summary":"Create a model","description":"Creates a model from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/model/{id}":{"get":{"operationId":"get-model-id","tags":["Model"],"x-section":"Model","summary":"Retrieve a model","description":"Returns one model, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the model."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only models with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-model-id","tags":["Model"],"x-section":"Model","summary":"Update a model","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the model."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-model-id","tags":["Model"],"x-section":"Model","summary":"Delete a model","description":"Deletes the model. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the model."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/mypetcare-pets":{"get":{"operationId":"get-mypetcare-pets","tags":["Mypetcare Pets"],"x-section":"Mypetcare Pets","summary":"List all mypetcare pets","description":"Returns the site's mypetcare pets, newest first unless a sort is given.","x-access":[],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only mypetcare pets with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only mypetcare pets with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-mypetcare-pets","tags":["Mypetcare Pets"],"x-section":"Mypetcare Pets","summary":"Create a mypetcare pet","description":"Creates a mypetcare pet from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/mypetcare-pets/{id}":{"get":{"operationId":"get-mypetcare-pets-id","tags":["Mypetcare Pets"],"x-section":"Mypetcare Pets","summary":"Retrieve a mypetcare pet","description":"Returns one mypetcare pet, found by its ID.","x-access":[],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the mypetcare pet."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only mypetcare pets with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-mypetcare-pets-id","tags":["Mypetcare Pets"],"x-section":"Mypetcare Pets","summary":"Update a mypetcare pet","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the mypetcare pet."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-mypetcare-pets-id","tags":["Mypetcare Pets"],"x-section":"Mypetcare Pets","summary":"Delete a mypetcare pet","description":"Deletes the mypetcare pet. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the mypetcare pet."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/panam-donator":{"get":{"operationId":"get-panam-donator","tags":["Panam Donator"],"x-section":"Panam Donator","summary":"Retrieve the panam donator","description":"Returns the panam donator.","x-access":[],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only panam donators with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only panam donators with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-panam-donator","tags":["Panam Donator"],"x-section":"Panam Donator","summary":"Create a panam donator","description":"Creates a panam donator from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/panam-donator/{id}":{"get":{"operationId":"get-panam-donator-id","tags":["Panam Donator"],"x-section":"Panam Donator","summary":"Retrieve a panam donator","description":"Returns one panam donator, found by its ID.","x-access":[],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the panam donator."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only panam donators with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-panam-donator-id","tags":["Panam Donator"],"x-section":"Panam Donator","summary":"Update a panam donator","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the panam donator."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-panam-donator-id","tags":["Panam Donator"],"x-section":"Panam Donator","summary":"Delete a panam donator","description":"Deletes the panam donator. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the panam donator."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/panam-sequencenumbers":{"get":{"operationId":"get-panam-sequencenumbers","tags":["Panam Sequencenumbers"],"x-section":"Panam Sequencenumbers","summary":"List all panam sequencenumbers","description":"Returns the site's panam sequencenumbers, newest first unless a sort is given.","x-access":[],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only panam sequencenumbers with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only panam sequencenumbers with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-panam-sequencenumbers","tags":["Panam Sequencenumbers"],"x-section":"Panam Sequencenumbers","summary":"Create a panam sequencenumber","description":"Creates a panam sequencenumber from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/panam-sequencenumbers/{id}":{"get":{"operationId":"get-panam-sequencenumbers-id","tags":["Panam Sequencenumbers"],"x-section":"Panam Sequencenumbers","summary":"Retrieve a panam sequencenumber","description":"Returns one panam sequencenumber, found by its ID.","x-access":[],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the panam sequencenumber."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only panam sequencenumbers with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-panam-sequencenumbers-id","tags":["Panam Sequencenumbers"],"x-section":"Panam Sequencenumbers","summary":"Update a panam sequencenumber","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the panam sequencenumber."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-panam-sequencenumbers-id","tags":["Panam Sequencenumbers"],"x-section":"Panam Sequencenumbers","summary":"Delete a panam sequencenumber","description":"Deletes the panam sequencenumber. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the panam sequencenumber."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/panam-totaldonation":{"get":{"operationId":"get-panam-totaldonation","tags":["Panam Totaldonation"],"x-section":"Panam Totaldonation","summary":"Retrieve the panam totaldonation","description":"Returns the panam totaldonation.","x-access":[],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only panam totaldonations with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only panam totaldonations with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-panam-totaldonation","tags":["Panam Totaldonation"],"x-section":"Panam Totaldonation","summary":"Create a panam totaldonation","description":"Creates a panam totaldonation from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/panam-totaldonation/{id}":{"get":{"operationId":"get-panam-totaldonation-id","tags":["Panam Totaldonation"],"x-section":"Panam Totaldonation","summary":"Retrieve a panam totaldonation","description":"Returns one panam totaldonation, found by its ID.","x-access":[],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the panam totaldonation."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only panam totaldonations with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-panam-totaldonation-id","tags":["Panam Totaldonation"],"x-section":"Panam Totaldonation","summary":"Update a panam totaldonation","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the panam totaldonation."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-panam-totaldonation-id","tags":["Panam Totaldonation"],"x-section":"Panam Totaldonation","summary":"Delete a panam totaldonation","description":"Deletes the panam totaldonation. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the panam totaldonation."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/price":{"get":{"operationId":"get-price","tags":["Price"],"x-section":"Price","summary":"Retrieve the price","description":"Returns the price.","x-access":[],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only prices with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only prices with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-price","tags":["Price"],"x-section":"Price","summary":"Create a price","description":"Creates a price from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/price/{id}":{"get":{"operationId":"get-price-id","tags":["Price"],"x-section":"Price","summary":"Retrieve a price","description":"Returns one price, found by its ID.","x-access":[],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the price."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only prices with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-price-id","tags":["Price"],"x-section":"Price","summary":"Update a price","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the price."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-price-id","tags":["Price"],"x-section":"Price","summary":"Delete a price","description":"Deletes the price. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the price."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/reminder":{"get":{"operationId":"get-reminder","tags":["Reminder"],"x-section":"Reminder","summary":"Retrieve the reminder","description":"Returns the reminder.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only reminders with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only reminders with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-reminder","tags":["Reminder"],"x-section":"Reminder","summary":"Create a reminder","description":"Creates a reminder from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/reminder/{id}":{"get":{"operationId":"get-reminder-id","tags":["Reminder"],"x-section":"Reminder","summary":"Retrieve a reminder","description":"Returns one reminder, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the reminder."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only reminders with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-reminder-id","tags":["Reminder"],"x-section":"Reminder","summary":"Update a reminder","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the reminder."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-reminder-id","tags":["Reminder"],"x-section":"Reminder","summary":"Delete a reminder","description":"Deletes the reminder. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the reminder."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/repair":{"get":{"operationId":"get-repair","tags":["Repair"],"x-section":"Repair","summary":"Retrieve the repair","description":"Returns the repair.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only repairs with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only repairs with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-repair","tags":["Repair"],"x-section":"Repair","summary":"Create a repair","description":"Creates a repair from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/repair/{id}":{"get":{"operationId":"get-repair-id","tags":["Repair"],"x-section":"Repair","summary":"Retrieve a repair","description":"Returns one repair, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the repair."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only repairs with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-repair-id","tags":["Repair"],"x-section":"Repair","summary":"Update a repair","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the repair."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-repair-id","tags":["Repair"],"x-section":"Repair","summary":"Delete a repair","description":"Deletes the repair. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the repair."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/revenues":{"get":{"operationId":"get-revenues","tags":["Revenues"],"x-section":"Revenues","summary":"List all revenues","description":"Returns the site's revenues, newest first unless a sort is given.","x-access":[],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only revenues with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only revenues with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-revenues","tags":["Revenues"],"x-section":"Revenues","summary":"Create a revenue","description":"Creates a revenue from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/revenues/{id}":{"get":{"operationId":"get-revenues-id","tags":["Revenues"],"x-section":"Revenues","summary":"Retrieve a revenue","description":"Returns one revenue, found by its ID.","x-access":[],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the revenue."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only revenues with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-revenues-id","tags":["Revenues"],"x-section":"Revenues","summary":"Update a revenue","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the revenue."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-revenues-id","tags":["Revenues"],"x-section":"Revenues","summary":"Delete a revenue","description":"Deletes the revenue. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the revenue."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/smartman-inquiry":{"get":{"operationId":"get-smartman-inquiry","tags":["Smartman Inquiry"],"x-section":"Smartman Inquiry","summary":"Retrieve the smartman inquiry","description":"Returns the smartman inquiry.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only smartman inquiries with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only smartman inquiries with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/smartman-inquiry/{id}":{"get":{"operationId":"get-smartman-inquiry-id","tags":["Smartman Inquiry"],"x-section":"Smartman Inquiry","summary":"Retrieve a smartman inquiry","description":"Returns one smartman inquiry, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the smartman inquiry."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only smartman inquiries with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"delete":{"operationId":"delete-smartman-inquiry-id","tags":["Smartman Inquiry"],"x-section":"Smartman Inquiry","summary":"Delete a smartman inquiry","description":"Deletes the smartman inquiry. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the smartman inquiry."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/startup-fair-lectors":{"get":{"operationId":"get-startup-fair-lectors","tags":["Startup Fair Lectors"],"x-section":"Startup Fair Lectors","summary":"List all startup fair lectors","description":"Returns the site's startup fair lectors, newest first unless a sort is given.","x-access":[],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only startup fair lectors with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only startup fair lectors with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-startup-fair-lectors","tags":["Startup Fair Lectors"],"x-section":"Startup Fair Lectors","summary":"Create a startup fair lector","description":"Creates a startup fair lector from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/startup-fair-lectors/{id}":{"get":{"operationId":"get-startup-fair-lectors-id","tags":["Startup Fair Lectors"],"x-section":"Startup Fair Lectors","summary":"Retrieve a startup fair lector","description":"Returns one startup fair lector, found by its ID.","x-access":[],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the startup fair lector."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only startup fair lectors with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-startup-fair-lectors-id","tags":["Startup Fair Lectors"],"x-section":"Startup Fair Lectors","summary":"Update a startup fair lector","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the startup fair lector."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-startup-fair-lectors-id","tags":["Startup Fair Lectors"],"x-section":"Startup Fair Lectors","summary":"Delete a startup fair lector","description":"Deletes the startup fair lector. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the startup fair lector."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/supplier":{"get":{"operationId":"get-supplier","tags":["Supplier"],"x-section":"Supplier","summary":"Retrieve the supplier","description":"Returns the supplier.","x-access":[],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only suppliers with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only suppliers with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-supplier","tags":["Supplier"],"x-section":"Supplier","summary":"Create a supplier","description":"Creates a supplier from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/supplier/{id}":{"get":{"operationId":"get-supplier-id","tags":["Supplier"],"x-section":"Supplier","summary":"Retrieve a supplier","description":"Returns one supplier, found by its ID.","x-access":[],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the supplier."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only suppliers with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-supplier-id","tags":["Supplier"],"x-section":"Supplier","summary":"Update a supplier","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the supplier."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-supplier-id","tags":["Supplier"],"x-section":"Supplier","summary":"Delete a supplier","description":"Deletes the supplier. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the supplier."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/test123-quoterequest":{"get":{"operationId":"get-test123-quoterequest","tags":["Test123 Quoterequest"],"x-section":"Test123 Quoterequest","summary":"Retrieve the test123 quoterequest","description":"Returns the test123 quoterequest.","x-access":[],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only test123 quoterequests with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only test123 quoterequests with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"post":{"operationId":"post-test123-quoterequest","tags":["Test123 Quoterequest"],"x-section":"Test123 Quoterequest","summary":"Create a test123 quoterequest","description":"Creates a test123 quoterequest from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/test123-quoterequest/{id}":{"get":{"operationId":"get-test123-quoterequest-id","tags":["Test123 Quoterequest"],"x-section":"Test123 Quoterequest","summary":"Retrieve a test123 quoterequest","description":"Returns one test123 quoterequest, found by its ID.","x-access":[],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the test123 quoterequest."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only test123 quoterequests with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}}},"patch":{"operationId":"patch-test123-quoterequest-id","tags":["Test123 Quoterequest"],"x-section":"Test123 Quoterequest","summary":"Update a test123 quoterequest","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the test123 quoterequest."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-test123-quoterequest-id","tags":["Test123 Quoterequest"],"x-section":"Test123 Quoterequest","summary":"Delete a test123 quoterequest","description":"Deletes the test123 quoterequest. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the test123 quoterequest."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/test123-transportroute":{"get":{"operationId":"get-test123-transportroute","tags":["Test123 Transportroute"],"x-section":"Test123 Transportroute","summary":"Retrieve the test123 transportroute","description":"Returns the test123 transportroute.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only test123 transportroutes with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only test123 transportroutes with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-test123-transportroute","tags":["Test123 Transportroute"],"x-section":"Test123 Transportroute","summary":"Create a test123 transportroute","description":"Creates a test123 transportroute from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/test123-transportroute/{id}":{"get":{"operationId":"get-test123-transportroute-id","tags":["Test123 Transportroute"],"x-section":"Test123 Transportroute","summary":"Retrieve a test123 transportroute","description":"Returns one test123 transportroute, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the test123 transportroute."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only test123 transportroutes with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-test123-transportroute-id","tags":["Test123 Transportroute"],"x-section":"Test123 Transportroute","summary":"Update a test123 transportroute","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the test123 transportroute."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-test123-transportroute-id","tags":["Test123 Transportroute"],"x-section":"Test123 Transportroute","summary":"Delete a test123 transportroute","description":"Deletes the test123 transportroute. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the test123 transportroute."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/vehicle":{"get":{"operationId":"get-vehicle","tags":["Vehicle"],"x-section":"Vehicle","summary":"Retrieve the vehicle","description":"Returns the vehicle.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only vehicles with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only vehicles with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-vehicle","tags":["Vehicle"],"x-section":"Vehicle","summary":"Create a vehicle","description":"Creates a vehicle from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/vehicle/{id}":{"get":{"operationId":"get-vehicle-id","tags":["Vehicle"],"x-section":"Vehicle","summary":"Retrieve a vehicle","description":"Returns one vehicle, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the vehicle."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only vehicles with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-vehicle-id","tags":["Vehicle"],"x-section":"Vehicle","summary":"Update a vehicle","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the vehicle."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-vehicle-id","tags":["Vehicle"],"x-section":"Vehicle","summary":"Delete a vehicle","description":"Deletes the vehicle. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the vehicle."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/verthora-productconfiguratorrule":{"get":{"operationId":"get-verthora-productconfiguratorrule","tags":["Verthora Productconfiguratorrule"],"x-section":"Verthora Productconfiguratorrule","summary":"Retrieve the verthora productconfiguratorrule","description":"Returns the verthora productconfiguratorrule.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only verthora productconfiguratorrules with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only verthora productconfiguratorrules with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-verthora-productconfiguratorrule","tags":["Verthora Productconfiguratorrule"],"x-section":"Verthora Productconfiguratorrule","summary":"Create a verthora productconfiguratorrule","description":"Creates a verthora productconfiguratorrule from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/verthora-productconfiguratorrule/{id}":{"get":{"operationId":"get-verthora-productconfiguratorrule-id","tags":["Verthora Productconfiguratorrule"],"x-section":"Verthora Productconfiguratorrule","summary":"Retrieve a verthora productconfiguratorrule","description":"Returns one verthora productconfiguratorrule, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the verthora productconfiguratorrule."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only verthora productconfiguratorrules with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-verthora-productconfiguratorrule-id","tags":["Verthora Productconfiguratorrule"],"x-section":"Verthora Productconfiguratorrule","summary":"Update a verthora productconfiguratorrule","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the verthora productconfiguratorrule."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-verthora-productconfiguratorrule-id","tags":["Verthora Productconfiguratorrule"],"x-section":"Verthora Productconfiguratorrule","summary":"Delete a verthora productconfiguratorrule","description":"Deletes the verthora productconfiguratorrule. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the verthora productconfiguratorrule."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}},"/watch":{"get":{"operationId":"get-watch","tags":["Watch"],"x-section":"Watch","summary":"Retrieve the watch","description":"Returns the watch.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"dependability_filter","in":"query","required":false,"schema":{"type":"string"},"description":"Only watches with this dependability filter."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only watches with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"post":{"operationId":"post-watch","tags":["Watch"],"x-section":"Watch","summary":"Create a watch","description":"Creates a watch from the fields sent.","x-access":["user"],"x-models":["Model"],"parameters":[],"responses":{"201":{"description":"The object was created. Some endpoints send it back; others send an empty body."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}}},"/watch/{id}":{"get":{"operationId":"get-watch-id","tags":["Watch"],"x-section":"Watch","summary":"Retrieve a watch","description":"Returns one watch, found by its ID.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the watch."},{"name":"no_populate","in":"query","required":false,"schema":{"type":"string"},"description":"Only watches with this no populate."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]},"patch":{"operationId":"patch-watch-id","tags":["Watch"],"x-section":"Watch","summary":"Update a watch","description":"Changes the fields sent; the others stay as they are.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the watch."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"400":{"description":"The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}}},"delete":{"operationId":"delete-watch-id","tags":["Watch"],"x-section":"Watch","summary":"Delete a watch","description":"Deletes the watch. This cannot be undone.","x-access":["user"],"x-models":["Model"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the watch."}],"responses":{"200":{"description":"It worked. The answer is the object or list asked for."},"401":{"description":"No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON."},"404":{"description":"No object with that ID or URL slug, or no such endpoint."},"500":{"description":"Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle."}},"security":[{"bearer":[]}]}}}}