{
  "openapi": "3.0.4",
  "info": {
    "title": "Lockedin.me API",
    "description": "Manage your Lockedin.me link-in-bio pages from any tool: change the profile, theme, colors and items, upload pictures, publish and read your numbers. Authenticate with an Agent Key from https://lockedin.me/ai as a Bearer token. Reads need no special grant; changes need links:write and publishing links:publish. Guide: https://lockedin.me/ai",
    "version": "1.0"
  },
  "servers": [
    {
      "url": "https://api.lockedin.me"
    }
  ],
  "paths": {
    "/v1/links/age/policy": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "The site's age check: on or off, minimum age, teens, where it shows",
        "description": "Anonymous, cacheable for five minutes. The site is the one the request's Origin names (or the API host's own). enabled=false when the site has no age check.",
        "operationId": "LinksAgePolicy",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfSiteAgePolicyDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/plan": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Your Lockedin.me plan",
        "description": "Your plan (state Free, Subscribed, Comped or Suspended), the page limit, whether you can publish and which paid options are on (own tracking ids are on for every plan). daysLeft only counts down complimentary access.",
        "operationId": "LinksGetPlan",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPlanDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/me": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Who you are on a Links site",
        "description": "displayName, email and pictureUrl (an https address or null), and flags the server worked out: isAdmin (site administrator), canExceedPageLimit and canUseShortHandles (short, paid-only addresses), plus the site the request's Origin names. Roles are never listed. The flags only shape a form; creating a page decides for real.",
        "operationId": "LinksGetMe",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksMeDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/age": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Your age answer: unset, adult, teen or blocked",
        "description": "{enabled, status, needed, minAge, allowTeens, confirmedUtc, restrictions}. The birth date is never returned. needed is true while the check is on and no birthday is stored; restrictions lists what a teen account does not get.",
        "operationId": "LinksAge",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfSiteAgeStatusDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Give your birthday (once)",
        "description": "Body {birthDate:\"YYYY-MM-DD\"}. Answers like GET /age. 400 invalid_date; 403 too_young (stored: a blocked person cannot try another date); 409 age_locked for a different date than the stored one. While the check is on, creating, copying and publishing pages need a stored birthday (403 age_required) and a teen cannot add e-mail sign-up, contact, booking, map or hours items (403 teen_restricted).",
        "operationId": "LinksSetAge",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "enum": [
                      null
                    ],
                    "nullable": true
                  },
                  {
                    "$ref": "#/components/schemas/SiteAgeRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfSiteAgeStatusDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/handle-check": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Is this address free for you?",
        "description": "Like the anonymous GET /v1/links/handle-check, decided for the signed-in caller: a name held for them, an address they already claimed, and (for an admin or a paid account) short addresses read as free exactly as creating the page would treat them. handle: the address typed; site: optional site key, else the request's Origin decides.",
        "operationId": "LinksCheckHandleAsCaller",
        "parameters": [
          {
            "name": "handle",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "site",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksHandleCheckDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "List your link pages",
        "description": "Your pages and those of businesses you belong to: id, handle, name, status (Draft, Live, Paused, Suspended), theme, public address, whether there are unpublished changes, and view and tap totals.",
        "operationId": "LinksListPages",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfIReadOnlyListOfLinksPageSummaryDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Create a link page",
        "description": "Body: {\"handle\":\"sunny-bakes\",\"displayName\":\"Sunny Bakes\",\"kind\":\"business\",\"theme\":\"storefront\"}. The handle is 3-30 lower-case letters, digits and hyphens and becomes {site host}/{handle}. Needs links:write.",
        "operationId": "LinksCreatePage",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksCreatePageRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/sites": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "The sites pages can be published to",
        "description": "Every enabled site: key (the site argument), host, brand, whether its own host serves pages yet, page limits, and canManage (true for a site administrator, or a Manager or Owner of the business that runs the site).",
        "operationId": "LinksListSites",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfIReadOnlyListOfLinksSiteDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/sites/{site}/pages": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "A site's pages, for its managers",
        "description": "Every page of one site with its owner and plan, newest edit first: for a site administrator or a Manager/Owner of the site's business only (404 otherwise). search filters by handle, name or owner e-mail; status by Draft, Live, Paused or Suspended; page/pageSize paginate (max 100).",
        "operationId": "LinksListSitePages",
        "parameters": [
          {
            "name": "site",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "string"
                }
              ],
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "string"
                }
              ],
              "format": "int32",
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksSitePagesDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/by-handle/{handle}": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Get a page by its handle",
        "description": "",
        "operationId": "LinksGetPageByHandle",
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Get one page with its items",
        "description": "The profile, theme, design, background kind, SEO (seoTitle / seoDescription as typed, seoTitleEffective / seoDescriptionEffective as search engines get them now, seoTitleSuggested / seoDescriptionSuggested as an optimized pair), tracking ids, public address and every item in order. Pictures are reported as hasAvatar / hasImage, never as private addresses.",
        "operationId": "LinksGetPage",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Delete the page",
        "description": "Removes the page from the public site, then its items, pictures, numbers and sign-ups. The owner's decision: a business Manager cannot. Needs links:write.",
        "operationId": "LinksDeletePage",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfboolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/preview": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "The page's draft as an HTML document",
        "description": "{html}: the saved draft drawn by the same renderer as the published page, for a sandboxed iframe's srcdoc. No tracking or analytics scripts. Pictures in it use short-lived signed addresses.",
        "operationId": "LinksGetPreview",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPreviewDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/profile": {
      "patch": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Change the name, headline, bio, location, category, kind, phone or address",
        "description": "Only the fields you send change; an empty string clears one. displayName max 80, headline 120, bio 500, location 80, category 60, kind person|business, phone 7-40 characters (digits, spaces and + ( ) - . only), address 200 (plain text, line breaks allowed, no web address, no < or >; an empty string clears either). Free text stays free, but crude, hateful or sexual wording is a 400 with code text_not_allowed and field (the message names the field, never the word), and a location or category may not hold a web address, e-mail address or phone number. GET /suggest/place and /suggest/categories help fill location and category. Needs links:write.",
        "operationId": "LinksUpdateProfile",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksProfileRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/theme": {
      "put": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Pick the theme",
        "description": "Body: {\"theme\":\"midnight|paper|pop|cover|storefront\"}. Needs links:write.",
        "operationId": "LinksSetTheme",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksThemeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/design": {
      "patch": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Change colors, fonts and button style",
        "description": "Only the fields you send change; \"\" (or -1 for a number) returns one to the theme's own. Colors #rgb or #rrggbb; buttonStyle solid|outline|soft|glass|hard; buttonShape pill|round|square; font sans|serif|rounded|mono|display; avatarShape circle|rounded|square; animation none|subtle|lively; dim 0-80 (darkening of a photo or video background); cover bleed|frame (a stretched edge-to-edge scene, or a framed banner inside the page); coverHeight 20-80 (percent of the screen height); contentTop 0-100 (where the picture and the words start, as a percent of the cover's height: 100 = just under it, smaller numbers climb onto the scene); hide = a list of profile parts not shown on the page, from name, byline, headline, bio, location, category, verified, phone, address, cover (the cover picture), avatar (the profile picture), qr (the QR code button at the top of the page, shown unless hidden) (the text and pictures stay saved; [] shows everything; omit to leave as is); \"\" or -1 returns one to the theme's own. Needs links:write.",
        "operationId": "LinksUpdateDesign",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksDesignRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/seo": {
      "patch": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Change the search title, description and noindex",
        "description": "title max 70 (aim for about 60), description max 200 (aim for about 155). A field you leave out stays; \"\" means use the default (the name and headline, the bio). GET the page for seoTitleEffective / seoDescriptionEffective (in use now) and seoTitleSuggested / seoDescriptionSuggested (optimized, built from the page's own profile) and send those as they are to apply them. Needs links:write.",
        "operationId": "LinksUpdateSeo",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksSeoRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/advanced": {
      "patch": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Your own Google Analytics and Meta Pixel ids, and the footer line",
        "description": "ga4Id like G-ABC123XYZ, metaPixelId 8-20 digits, hideBranding hides \"Made with Lockedin.me\". The ids are free and published on every plan; hiding the footer line is a paid option (saved on any plan, published only on the paid plan). Needs links:write.",
        "operationId": "LinksUpdateAdvanced",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksAdvancedRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/background": {
      "put": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Set the background",
        "description": "Body {\"kind\":\"theme|color|gradient\"}, or {\"studioAssetId\":123} to use a finished image or clip from your Media Studio (a paid option; saved on any plan, published on the paid plan). Uploads are not accepted for backgrounds: they come from the Media Studio. Needs links:write.",
        "operationId": "LinksSetBackground",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksBackgroundRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/items": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Add an item",
        "description": "type: link, header, social, text, video, music, email, textsignup, contact, hours, map, reviews, booking, faq or divider. link/booking need title and url; social needs a network (icon) and a handle or address; contact needs a tel:, sms:, mailto: or WhatsApp address; header and text need words; video takes a YouTube or Vimeo address; music a Spotify, Apple Music or SoundCloud address; hours, faq, email and reviews take data (hours {tz,days:[{d:0-6,o:\"09:00\",c:\"17:00\",x:false}],note}; faq {items:[{q,a}]}; email {button,consent,thanks,name}; reviews {rating,count}). A page holds up to 60 items. Needs links:write.",
        "operationId": "LinksAddItem",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksBlockRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksBlockDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/items/{itemId}": {
      "patch": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Change an item",
        "description": "Only the fields you send change. The type cannot change. Needs links:write.",
        "operationId": "LinksUpdateItem",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "itemId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksBlockRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksBlockDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Delete an item",
        "description": "",
        "operationId": "LinksDeleteItem",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "itemId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfboolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/items/order": {
      "put": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Put the items in order",
        "description": "Body {\"itemIds\":[3,1,2]}: the ids in the order they should appear; any item not listed goes last. Needs links:write.",
        "operationId": "LinksReorderItems",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksReorderRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/avatar": {
      "put": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Upload the profile picture",
        "description": "Body: {\"imageBase64\":\"...\"} (a data: URI is fine) or {\"imageUrl\":\"https://...\"} (a public address we download), or send the raw image bytes with Content-Type image/jpeg, image/png or image/webp. Up to 15 MB; it is re-encoded and its metadata removed. Needs links:write.",
        "operationId": "LinksSetAvatar",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksImageRequest"
              }
            },
            "image/jpeg": {
              "schema": {
                "$ref": "#/components/schemas/LinksImageRequest"
              }
            },
            "image/png": {
              "schema": {
                "$ref": "#/components/schemas/LinksImageRequest"
              }
            },
            "image/webp": {
              "schema": {
                "$ref": "#/components/schemas/LinksImageRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Remove the profile picture",
        "description": "",
        "operationId": "LinksClearAvatar",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/hero-image": {
      "put": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Upload the cover picture",
        "description": "The cover picture: the Cover theme draws it as a full-width hero, every other theme as a rounded banner at the top of the page, and the share card uses it. Same body as the avatar. Needs links:write.",
        "operationId": "LinksSetHeroImage",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksImageRequest"
              }
            },
            "image/jpeg": {
              "schema": {
                "$ref": "#/components/schemas/LinksImageRequest"
              }
            },
            "image/png": {
              "schema": {
                "$ref": "#/components/schemas/LinksImageRequest"
              }
            },
            "image/webp": {
              "schema": {
                "$ref": "#/components/schemas/LinksImageRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Remove the cover picture",
        "description": "",
        "operationId": "LinksClearHeroImage",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/items/{itemId}/image": {
      "put": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Upload an item's picture",
        "description": "A thumbnail for a link, or the picture of a featured card. Same body as the avatar. Needs links:write.",
        "operationId": "LinksSetItemImage",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "itemId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksImageRequest"
              }
            },
            "image/jpeg": {
              "schema": {
                "$ref": "#/components/schemas/LinksImageRequest"
              }
            },
            "image/png": {
              "schema": {
                "$ref": "#/components/schemas/LinksImageRequest"
              }
            },
            "image/webp": {
              "schema": {
                "$ref": "#/components/schemas/LinksImageRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Remove an item's picture",
        "description": "",
        "operationId": "LinksClearItemImage",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "itemId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/handle": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Change the page's address",
        "description": "Body {\"handle\":\"new-address\"}. A live page is published at the new address at once and a small moved notice stays at the old one, which remains reserved for the page. Needs links:write.",
        "operationId": "LinksChangeHandle",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksHandleRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/duplicate": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Copy a page",
        "description": "Body {\"handle\":\"my-page-2\"}. Makes a new DRAFT from your page with the new address: same kind and site, the profile, theme, design, search fields, background, tracking ids, every item (new ids) and the pictures (copied, so removing one never removes the other). Numbers, sign-ups and publish history are not copied. The copy counts toward your plan's pages, so a free account (one personal and one business page) is refused with the plan-limit message. Needs links:write.",
        "operationId": "LinksDuplicatePage",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "enum": [
                      null
                    ],
                    "nullable": true
                  },
                  {
                    "$ref": "#/components/schemas/LinksDuplicateRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/qr.svg": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "The page's QR code (SVG)",
        "description": "An SVG of the page's public address tagged utm_source=qr, so scans show as their own source in the analytics.",
        "operationId": "LinksQrSvg",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/leads.csv": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Email sign-ups as a CSV file",
        "description": "Email, Name, Status, Source, Signed up (UTC), Confirmed (UTC). Same access rule as the list: a person's token, a Lockedin.me key, or a key with links:write.",
        "operationId": "LinksExportLeads",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/text-signups": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Mobile numbers collected by the page's Text sign-up item",
        "description": "Masked numbers (last four digits), status, source and the version of the consent wording. Capture only: nothing is sent to these numbers. Same access rule as the e-mail list.",
        "operationId": "LinksListTextSignups",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "take",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "string"
                }
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfIReadOnlyListOfLinksTextSignupDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/text-signups.csv": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Mobile numbers as a CSV file",
        "description": "Mobile number (E.164), Status, Source, Consent given (UTC), Wording version, Consent wording, Page. The CSV is the proof of consent: keep it with the numbers.",
        "operationId": "LinksExportTextSignups",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/text-signups/{id}/opt-out": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Record that a person asked to stop getting texts",
        "description": "The number is suppressed for good: it is never added to the list again, even after the row is deleted. Needs links:write.",
        "operationId": "LinksOptOutTextSignup",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfboolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/text-signups/{id}": {
      "delete": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Remove one number",
        "description": "Removes a number from the page's list. An opted-out number stays suppressed. Needs links:write.",
        "operationId": "LinksDeleteTextSignup",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfboolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/leads/{leadId}": {
      "delete": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Remove one sign-up",
        "description": "Removes an address from the page's list (the person asked to be removed, or it was a mistake). Needs links:write.",
        "operationId": "LinksDeleteLead",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "leadId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfboolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/publish": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Publish the page",
        "description": "Makes the saved draft live at its public address. paid options the plan does not include are left out and listed in warnings. A page whose text holds crude, hateful or sexual wording is not published: 400 with code text_not_allowed and field naming the fields (never the words). Needs links:publish.",
        "operationId": "LinksPublish",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPublishDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/versions": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Saved versions of the page",
        "description": "Every publish that changes the page's saved content makes a version (the newest 25 are kept): what changed against the one before, who published, and the pictures it shows. Newest first.",
        "operationId": "LinksListVersions",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfIReadOnlyListOfLinksVersionDto"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/versions/{versionId}/restore": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Go back to a saved version",
        "description": "Puts that version's words, theme, design, search fields, pictures and items back in the draft; send {\"publish\":true} to also publish it. The draft's own pictures stay as earlier pictures. Needs links:publish.",
        "operationId": "LinksRestoreVersion",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "versionId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "enum": [
                      null
                    ],
                    "nullable": true
                  },
                  {
                    "$ref": "#/components/schemas/LinksRestoreRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksRestoreDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/media/{slot}": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Earlier profile or cover pictures",
        "description": "slot is avatar or hero. A replaced or removed picture is kept (the newest 8 per slot) so it can be used again.",
        "operationId": "LinksListEarlierPictures",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "slot",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfIReadOnlyListOfLinksMediaDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/media/{mediaId}/use": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Use an earlier picture again",
        "description": "Makes that picture the page's profile or cover picture again; the one it replaces becomes an earlier picture. Needs links:write.",
        "operationId": "LinksUseEarlierPicture",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/unpublish": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Take the page offline",
        "description": "The page becomes a draft again and its address stops answering; nothing is deleted. Needs links:publish.",
        "operationId": "LinksUnpublish",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfboolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/privacy": {
      "patch": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Make the page private, or public again",
        "description": "Body {\"isPrivate\":true}. A private page is never served at its public address: it opens only through private links (/pages/{pageId}/share-links). A live page is republished at once (going private removes its public copy; going public writes it and revokes its private links). The analytics beacon and e-mail sign-up blocks are not available on a private page. Needs links:write.",
        "operationId": "LinksSetPrivacy",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksPrivacyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/share-links": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "List the page's private links",
        "description": "Newest first, up to 200: label, created, expires, maxViews (0 = unlimited), views so far and status (Active, Expired, Used up, Revoked). The token is never returned here; it exists only in the answer that created the link.",
        "operationId": "LinksListShareLinks",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfIReadOnlyListOfLinksShareLinkDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Make a private link (and its QR code)",
        "description": "Body {\"label\":\"For Sam\",\"expiresInMinutes\":60,\"maxViews\":1}: expiresInMinutes 15, 60, 1440 or 10080 (default 60); maxViews 1, 3, 10 or 0 for unlimited (default 1). The page must be private and published. The answer holds url (https://{site host}/p/{token}) and qrSvg once: only a hash of the token is stored, so a lost link cannot be shown again; make another. Opening the link takes one view only when the viewer presses \"Open it\". Needs links:write.",
        "operationId": "LinksCreateShareLink",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "enum": [
                      null
                    ],
                    "nullable": true
                  },
                  {
                    "$ref": "#/components/schemas/LinksShareLinkRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksShareLinkCreatedDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/share-links/{linkId}": {
      "delete": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Revoke a private link",
        "description": "The link stops opening the page at once. Needs links:write.",
        "operationId": "LinksRevokeShareLink",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "linkId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfboolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/analytics": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Views, taps and sources",
        "description": "days 1-90 (default 30). Counted without cookies: views, unique visitors per day, taps, mobile views, the previous period, where visits came from and the most tapped items.",
        "operationId": "LinksGetAnalytics",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "days",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "string"
                }
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksAnalyticsDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/leads": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Email sign-ups collected by the page",
        "description": "take 1-500 (default 100), newest first. These are your subscribers; handle them under your own privacy notice. An Agent Key needs to be a Lockedin.me key or hold links:write to read them.",
        "operationId": "LinksListLeads",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "take",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "string"
                }
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfIReadOnlyListOfLinksLeadDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/google-listing": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "What the page's Google listing would add",
        "description": "Reads the Google listing the page is linked to (its business's, or the one its owner has verified) and returns, per part (profile, website, phone, map, hours, reviews), exactly what would be added to the page and why a part is unavailable. Changes nothing. hasListing is false when the page has no listing.",
        "operationId": "LinksGetGoogleListing",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinkListingLookup"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/google-listing/apply": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Add parts of the Google listing to the page's draft",
        "description": "Optional body {\"profile\":true,\"website\":true,\"phone\":true,\"map\":true,\"hours\":true,\"reviews\":true}; every part defaults to true, send false to leave one out. Only empty profile fields are filled, an item the page already has is skipped, and the page stays a draft (publish is separate). Needs links:write.",
        "operationId": "LinksApplyGoogleListing",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "enum": [
                      null
                    ],
                    "nullable": true
                  },
                  {
                    "$ref": "#/components/schemas/LinkListingSelection"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinkListingApplyResult"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/ai/text": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Write a headline or bio (three options)",
        "description": "Body {\"kind\":\"headline|bio\",\"hint\":\"optional wish\",\"tone\":\"optional\"}. Returns {options:[3 strings]} written only from the page's own facts: nothing is invented, headline at most 120 characters, bio at most 500, plain text, no hashtags or emoji unless the hint asks. Changes nothing. Daily limits per person and per site apply (429, code ai_daily_limit / ai_site_limit, retryAfter in seconds). Needs links:write.",
        "operationId": "LinksAiText",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "enum": [
                      null
                    ],
                    "nullable": true
                  },
                  {
                    "$ref": "#/components/schemas/LinksAiTextRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksAiTextResult"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/ai/avatar": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Generate a profile picture",
        "description": "Body {\"preset\":\"sunny-founder\",\"options\":{\"hairColor\":\"auburn\",\"accessories\":[\"glasses\",\"headphones\"]},\"extra\":\"freckles and a red scarf\",\"basedOnPrompt\":\"text of the version being edited\",\"model\":\"gpt-image-2.5-sunburst\",\"mode\":\"standard\"}; all are optional but a preset, an option or an extra is needed. mode is draft (the cheapest model at low quality, about 10 seconds, counted only against its own daily cap and never against the free generations; the answer has isDraft true), standard (default: Links:Ai:ImageModel, medium quality) or best (gpt-image-2.5-sunburst, high quality; the standard model if sunburst is not deployed); standard and best use one free generation each, and POST /ai/finalize renders a draft again in full quality. Add ?stream=1 to get text/event-stream instead of JSON: {\"type\":\"partial\",\"n\":1,\"imageBase64\":\"data:image/webp;...\"} for each half-drawn picture (about 512 px, the first about 6 seconds in), then {\"type\":\"done\", ...the normal result} or {\"type\":\"error\",\"status\":424,\"code\":\"...\",\"message\":\"...\"}; a comment ping every 10 seconds; closing the connection cancels the call (logged as Cancelled, no allowance used); timings.firstPartialMs is the time to the first preview. The pictures are made from a closed catalog: GET /ai/avatar-options lists the groups (style, age, expression, subject, alienSkin, dinoColor, skin, faceShape, hairStyle, hairColor, facialHair, eyes, outfitColor, outfit, accessories, headwear, eyewear, jewelry, pose, backdrop, texture, lighting), their option ids and icons, the template sentence, the twelve presets (ten people, friendly-alien and dino-dev) and the defaults. The subject is a person, pet, mascot, object, alien or dinosaur (always original, friendly cartoon characters); each group's appliesWhen says which subjects it matters for: skin tone, age, face shape, hair, facial hair and eye color are for a person only, alienSkin only for an alien, dinoColor only for a dinosaur, and the wardrobe (outfit, headwear, eyewear, jewelry, accessories), expression and pose for every character. A group that does not apply to the chosen subject is ignored, never an error, so switching the subject never breaks a request. options maps a group id to an option id (or a list of ids for accessories and jewelry, at most 3); it replaces what the preset has for that group, and a group left out takes the preset's value, else the default. An unknown id is a 400 that lists the allowed ids. extra is free text of at most 100 characters: it is applied to the picture as the owner's adjustments (after the fixed art direction, repeated at the end of the prompt), still moderated and never above the platform's safety rules. model overrides Links:Ai:ImageModel for this call (A/B tests) and is accepted only from a site manager or an admin (403 ai_model_forbidden otherwise; 400 lists the allowed deployments). The picture is stored in the page's draft folder at exact square sizes (512, 256, 128) and returned as imageBase64 (a data:image/webp URI, 512 px) with each size's kind, pixels, path and a signed address valid two hours, plus preset and options (every group as drawn; re-send them with one change to edit) and timings {totalMs, model, quality, size, responseKb, steps:[{name, ms}]} (admit, prompt, model, decode, encode-variants, storage, record). A profile picture can start from the person's own photo (round 4): send referenceImage (a data URI or bare base64 of a JPEG, PNG or WebP, at most 4 MB) or referenceSource (an id from GET /ai/reference-sources) together with referenceConsent true (\"this is my own photo\"; 400 ai_reference_consent without it). The subject must be a person (400 ai_reference_person); a Look never takes a photo (400 ai_reference_avatar_only). The photo is made upright, shrunk to 1024 px and stripped of metadata, drawn as the described illustration through the image-edit route (mode best uses gpt-image-2 with input_fidelity high), used for this one generation and never stored or logged; only a referenceUsed flag is recorded. The person's looks (skin, face, hair, eyes, age) then come from the photo, not from the options. It counts as one generation. Nothing on the page changes until you send the picture to PUT /avatar or POST /ai/apply. Each person has a small free allowance of generations (the first picture and its edits): when it is used the answer is 429 with code ai_image_allowance_used and the allowance. Needs links:write.",
        "operationId": "LinksAiAvatar",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "stream",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "enum": [
                      null
                    ],
                    "nullable": true
                  },
                  {
                    "$ref": "#/components/schemas/LinksAiPictureRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksAiPictureResult"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/ai/look": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Generate a Look (cover picture)",
        "description": "Same body as /ai/avatar, with the Look's groups from GET /ai/look-options (style, scene, timeOfDay, mood, palette, texture, subject, subjectSide) and its four presets (golden-city, cozy-studio, night-neon, calm-garden). The cover is a BACKGROUND: the default subject is none (no person, pet or object is drawn, and an extra that asks for one is a 400 with code ai_subject_needed); a chosen subject stands on subjectSide (left or right, default right), never in the center, with calm empty space in the middle and the lower third for the page's buttons. The Look is drawn as a square master and stored at exact mobile (720x1280), tablet (1024x1280), square (1024x1024) and large-screen (1536x864) sizes; imageBase64 is the tablet size, to apply with PUT /hero-image or POST /ai/apply. Its free allowance is counted separately from the profile picture's. Needs links:write.",
        "operationId": "LinksAiLook",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "stream",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "enum": [
                      null
                    ],
                    "nullable": true
                  },
                  {
                    "$ref": "#/components/schemas/LinksAiPictureRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksAiPictureResult"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/ai/avatar-options": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "The profile picture options",
        "description": "Returns {target,template,slots:[{id,label,group,multi,max,appliesWhen,options:[{id,label,icon,swatch}]}],presets:[{id,label,options}],defaults,allowance,extraMaxLength}: everything a picker needs to let a person toggle words. template is a sentence with {groupId} tokens in reading order to lay the pickers out in; appliesWhen (null = always) maps another group id to the option ids for which this group matters, so a token that does not apply (hair on a pet) can be grayed out; icon is a single emoji or short glyph; swatch is a hex color for the color groups. The words that go into the prompt are never listed. Changes nothing and costs no allowance. Needs links:write.",
        "operationId": "LinksAiAvatarOptions",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksAiOptionsResult"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/ai/look-options": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "The Look (cover picture) options",
        "description": "Same shape as /ai/avatar-options, for the Look. Needs links:write.",
        "operationId": "LinksAiLookOptions",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksAiOptionsResult"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/ai/reference-sources": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "The saved photos that can be the reference of a profile picture",
        "description": "Returns {sources:[{id,label,thumb}],maxBytes,types}: the signed-in account's own saved profile photos (the sources of the jmacweb.com Profile photo page: an uploaded photo, Gravatar, and the Google or GitHub picture a sign-in stored; the Microsoft copy is not offered) as one-tap choices. An account with none gets an empty list. Send an id as referenceSource of POST /ai/avatar (with referenceConsent true) and the server reads that photo itself. Nothing is stored or used. Needs links:write.",
        "operationId": "LinksAiReferenceSources",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksAiReferenceSourcesResult"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/ai/history": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "The page's kept pictures",
        "description": "?target=avatar|look. Up to 12 newest generations whose stored sizes are still kept (7 days), newest first: [{imageId, createdUtc, model, runMs, preset, options, extra, variants:[{kind,width,height,path,url}]}], each url signed for two hours. model, runMs, preset, options and extra come from the EventLog row of the generation and are null for a generation that has none. Read from the page's draft files and the EventLog: no migration. Costs no allowance. Apply one with POST /ai/apply. Needs links:write.",
        "operationId": "LinksAiHistory",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "target",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksAiHistoryResult"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/ai/finalize": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Render a draft again in full quality",
        "description": "Body {\"imageId\":\"...\",\"mode\":\"standard|best\"} (mode default standard). Re-renders an earlier generation, normally a draft, with the options, preset and extra text stored with it (nothing else to send), at the standard model and medium quality or at best (gpt-image-2.5-sunburst, high quality). It is a new generation with a new imageId and uses one free generation. Same answer, errors, timings and ?stream=1 as /ai/avatar and /ai/look. 404 when the stored record is gone, 409 code ai_draft_outdated when its options are no longer in the catalog. Needs links:write.",
        "operationId": "LinksAiFinalize",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "stream",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "enum": [
                      null
                    ],
                    "nullable": true
                  },
                  {
                    "$ref": "#/components/schemas/LinksAiFinalizeRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksAiPictureResult"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/ai/tweak": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Change one thing in an earlier picture",
        "description": "Body {\"imageId\":\"...\",\"options\":{\"skin\":\"tone-6\",\"accessories\":[\"camera\"]},\"extra\":\"optional\",\"mode\":\"draft|standard|best\",\"strength\":\"subtle|normal|strong\",\"model\":\"optional, site managers and admins only\"}. options holds only the groups that CHANGED (group id to an option id, or a list of ids for a multi-select such as accessories); every other group keeps what the picture was made with, so the character stays the same. extra (at most 100 characters) is applied as one more change and kept as the picture's extra text. The server loads the stored generation (its options and extra) and its stored picture (the largest size that holds the whole picture, from the 7-day store), and calls the image-edit route with an edit prompt: keep the identity, face, pose, framing, background and art style exactly and change only what you named. strength: subtle = the smallest change, normal (default) = a clear change, strong = the changed part may be redrawn more freely. mode maps to the same model and quality as a generation (draft = gpt-image-1-mini at low quality, standard = Links:Ai:ImageModel at medium, best = gpt-image-2.5-sunburst at high); model overrides it for site managers and admins, and gpt-image-2 (asked for with model) keeps faces closest (input_fidelity high). Streaming works like a generation: add ?stream=1 for partial previews, then the done event. Answer: the normal picture result plus parentImageId (the picture that was edited) and changed (the group ids that were changed); timings carries edit: true and a load-source step. A tweak is a new generation with a new imageId: it uses one free generation in standard and best and none in draft, the same moderation, daily caps and logging as a generation. 400 code ai_tweak_nothing when nothing differs from the picture; 404 when the picture's record or file is gone (pictures are kept 7 days); 409 code ai_tweak_outdated when its options are no longer in the catalog. Needs links:write.",
        "operationId": "LinksAiTweak",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "stream",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "enum": [
                      null
                    ],
                    "nullable": true
                  },
                  {
                    "$ref": "#/components/schemas/LinksAiTweakRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksAiPictureResult"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/ai/compare": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Run one prompt on several picture models (internal testing)",
        "description": "Body {\"target\":\"avatar|look\",\"preset\":\"...\",\"options\":{...},\"extra\":\"...\",\"models\":[\"gpt-image-2.5-flare\",\"gpt-image-2.5-sunburst\",\"gpt-image-1-mini\"],\"mode\":\"standard|best\"}: the same request as a generation (target default avatar), run with the SAME assembled prompt on every model in parallel (default models: gpt-image-2.5-flare, gpt-image-2.5-sunburst, gpt-image-1-mini; also allowed: gpt-image-2 and FLUX.2-pro from the JMACWeb-Foundry account). Answer: [{model, ok, status, error, code, imageBase64 (a 768 px WebP data URI), imageId, timings {totalMs, steps, ...}, tokens {in, out}, estimatedCostUsd, quality, size}], in the order asked; a model that failed has ok false and its error, the others still answer. With ?stream=1 the answer is text/event-stream: one {\"type\":\"result\", ...the item above} event per model as it finishes, then {\"type\":\"done\",\"count\":n}. The pictures are stored like any generation (an imageId can be applied with POST /ai/apply, kept 7 days) but are left out of GET /ai/history. Only admins, SuperAdmins and accounts on the Links:Ai:CompareUsers list may call it (403 code ai_compare_forbidden; GET /ai/avatar-options reports canCompare). It uses no free allowance and no picture cap, each model call is logged as its own AiUsageLogs row tagged links-ai-compare-{model-slug} (visible on /admin/ai-usage), and a person has 20 runs a day (429 ai_daily_limit). Needs links:write.",
        "operationId": "LinksAiCompare",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "stream",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "enum": [
                      null
                    ],
                    "nullable": true
                  },
                  {
                    "$ref": "#/components/schemas/LinksAiCompareRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfIReadOnlyListOfLinksAiCompareItemDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/ai/apply": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Use a generated picture on the page",
        "description": "Body {\"imageId\":\"...\",\"kind\":\"optional size\"}: puts a stored size of an earlier generation (from a generate answer or GET /ai/history) on the page's DRAFT: an avatar generation becomes the profile picture, a Look becomes the cover picture (hero). kind: avatar square-large (default), square or square-small; Look tablet (default), mobile, square or large. Costs no allowance (the picture already exists), replaces the current picture in that slot and never publishes. 404 when the generation or size is gone. Returns the page. Needs links:write.",
        "operationId": "LinksAiApply",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "enum": [
                      null
                    ],
                    "nullable": true
                  },
                  {
                    "$ref": "#/components/schemas/LinksAiApplyRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPageDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/pages/{pageId}/ai/assistant": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Change the page by talking",
        "description": "Body {\"message\":\"...\",\"history\":[{\"role\":\"user|assistant\",\"text\":\"...\"}]} (message at most 2000 characters, the last 20 history turns are used). Returns {reply, actions:[{tool,summary}], page}. The assistant changes the page only through the same operations as the dashboard (profile, items, theme, design, SEO), as the signed-in person, saved as a DRAFT: it never publishes, changes the address, deletes the page, touches billing, tracking ids or branding, or makes private links, and removes an item only when the message asks. At most 6 changes per message. Needs links:write.",
        "operationId": "LinksAiAssistant",
        "parameters": [
          {
            "name": "pageId",
            "in": "path",
            "required": true,
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "enum": [
                      null
                    ],
                    "nullable": true
                  },
                  {
                    "$ref": "#/components/schemas/LinksAiAssistantRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksAiAssistantResult"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/suggest/place": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Suggest cities for the location field",
        "description": "?q=aust&site=lockedin (q 2 to 60 characters; site is optional and only names where you are typing). Returns {items:[{label, city, region, country, placeId}]}: cities and towns only, from the Google Places API (New) Autocomplete. A location is still free text; use a suggestion's label as the value. An empty list means nothing matched, or suggestions are not available (no key, no quota, a slow answer): it is never an error. Rate limited per person. Signed in (any token or key).",
        "operationId": "LinksSuggestPlace",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "site",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksPlaceSuggestionsResult"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/suggest/categories": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Popular work and interest categories",
        "description": "Returns {work:[~40 {id,label,icon}], interests:[~40 {id,label,icon}]}: a curated list for the category field (work categories for a business page, interests for a personal page). The category stays free text; send the label as the value. Signed in (any token or key).",
        "operationId": "LinksSuggestCategories",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksCategorySuggestionsResult"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/keys": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "List your assistant keys",
        "description": "Your Links keys, newest first (active, expired and revoked): id, name, prefix, scopes (links:write, plus links:publish when the key may publish), createdUtc, expiresUtc, lastUsedUtc, lastUsedClient and status (Active, Expired, Revoked). The secret is never returned. Needs your sign-in token: an Agent Key cannot list keys.",
        "operationId": "LinksListKeys",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfIReadOnlyListOfLinksKeyDto"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Make an assistant key",
        "description": "Body {\"name\":\"Claude on my laptop\",\"canPublish\":false,\"expiresInDays\":90}: name at most 60 characters (blank = My assistant), canPublish false by default (true adds links:publish), expiresInDays one of 30, 90 or 365 (default 90; a key always expires). The key works only on the Links API and MCP server (links:write, optionally links:publish) and never anywhere else. The answer holds key (shown once, only a hash is stored) and the row. Errors carry a code: keys_disabled (403), account_on_hold (403), key_limit (409, too many active keys), key_rate_limited (429, with retryAfter seconds), invalid_expiry and invalid_name (400). Needs your sign-in token: an Agent Key cannot make keys.",
        "operationId": "LinksCreateKey",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "enum": [
                      null
                    ],
                    "nullable": true
                  },
                  {
                    "$ref": "#/components/schemas/LinksKeyCreateRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksKeyCreatedDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/keys/policy": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "What you may ask for when making a key",
        "description": "Returns enabled (keys can be made on this site now), maxActive (your cap; Premium accounts get more), active (how many you hold), expiresInDaysChoices (30, 90, 365 up to the site's longest), defaultExpiresInDays and createPerHour. Optional query site. Needs your sign-in token.",
        "operationId": "LinksKeyPolicy",
        "parameters": [
          {
            "name": "site",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksKeyPolicyDto"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/keys/{keyId}": {
      "delete": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Revoke an assistant key",
        "description": "The key stops working within a minute. Revoking a key that is already revoked answers with it as it is. Only your own Links keys are found. Needs your sign-in token.",
        "operationId": "LinksRevokeKey",
        "parameters": [
          {
            "name": "keyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiResponseOfLinksKeyDto"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/handle-check": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Is this address free?",
        "description": "Anonymous. handle: the address a visitor typed (any case; a pasted address is reduced to its last segment). site: optional site key; else the request's Origin decides. Answers whether it is free, a short message and up to four free alternatives. Reserved words, brands and names held for their owners read as taken.",
        "operationId": "LinksHandleCheck",
        "parameters": [
          {
            "name": "handle",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "site",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/signup/start": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Ask for a sign-up code",
        "description": "Anonymous. Body {\"email\":\"...\",\"handle\":\"optional-claimed-address\",\"site\":\"optional site key\"}. E-mails a 6-digit code (fifteen minutes, five attempts) and answers {status:\"sent\", challengeId, maskedEmail, resendAfterSeconds, expiresInMinutes}. Every deliverable address gets the same answer whether or not an account exists. Earlier codes of the address stay valid until they expire, so a resend before a slow mail lands adds a code rather than cancelling one. An address that asked three times in ten minutes gets {status:\"wait\", maskedEmail, retryAfterSeconds} and no mail.",
        "operationId": "LinksSignupStart",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksSignupStartRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/signup/verify": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Confirm the code and sign in",
        "description": "Anonymous. Body {\"challengeId\":\"...\",\"code\":\"123456\",\"handle\":\"optional\",\"site\":\"optional\",\"deviceInfo\":\"optional\"}. A right code signs the person in, creating the account when there is none, and answers {status:\"verified\", created, pageId, handle, tokens:{accessToken, refreshToken, expiresAtUtc}}; the claimed handle is reserved as a draft page on the site when it is free. An account with an authenticator answers {status:\"two-factor\", twoFactorToken}: finish on POST /api/otp/verify-2fa. Other answers: {status:\"invalid\", attemptsLeft}, {status:\"expired\"}, {status:\"unavailable\"}.",
        "operationId": "LinksSignupVerify",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksSignupVerifyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/public/confirm-preview": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Look at a sign-up confirmation link",
        "description": "Anonymous. Body {\"token\":\"...\"} (the token of the e-mail link). Changes nothing. Answers {status, maskedEmail, page, brandName, brandUrl}: status is ready (waiting for the button), already, expired, invalid or gone; page is {handle, name, avatarUrl, url} only for a public page and null for a private, turned-off or removed one; maskedEmail looks like j***@example.com.",
        "operationId": "LinksConfirmPreview",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksConfirmRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/public/confirm-commit": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Confirm a sign-up",
        "description": "Anonymous. Body {\"token\":\"...\"}. Makes a waiting sign-up a subscriber. Idempotent: answers confirmed the first time (with the owner's thank-you in thanks) and already after that. Other statuses as for confirm-preview.",
        "operationId": "LinksConfirmCommit",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksConfirmRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/signin/providers": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Which outside sign-ins does this site offer?",
        "description": "Anonymous. site: optional site key; else the API host or Origin decides. Answers {providers:[\"google\"]}: the providers with keys for the site.",
        "operationId": "LinksSignInProviders",
        "parameters": [
          {
            "name": "site",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/signin/{provider}/start": {
      "get": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Start a sign-in with an outside provider",
        "description": "Browser navigation, not a fetch. Query: return (an https address on the site's host, where the visitor lands with ?code= or ?error=), handle (optional claimed address), site (optional). Redirects to the provider.",
        "operationId": "LinksSignInStart",
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "return",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "site",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/signin/google/onetap": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Sign in with the Google One Tap credential",
        "description": "Anonymous. Body {\"credential\":\"<Google id token>\",\"site\":\"optional\"}. A right credential answers {status:\"ok\", code} (the same one-time exchange code the redirect flow returns; trade it at /exchange); {status:\"refused\", error} when the account rules say no; {status:\"invalid\"} otherwise.",
        "operationId": "LinksSignInGoogleOneTap",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksOneTapRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    },
    "/v1/links/signin/exchange": {
      "post": {
        "tags": [
          "Lockedin.me Links"
        ],
        "summary": "Trade the exchange code for tokens",
        "description": "Anonymous. Body {\"code\":\"...\",\"handle\":\"optional\",\"site\":\"optional\",\"deviceInfo\":\"optional\"}. A right code answers like /v1/links/signup/verify: {status:\"verified\", created, pageId, handle, tokens:{accessToken, refreshToken, expiresAtUtc}}, or {status:\"two-factor\", twoFactorToken} for an account with an authenticator; any other code answers {status:\"invalid\"}.",
        "operationId": "LinksSignInExchange",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksSignInExchangeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "security": [
          {
            "Bearer": [ ]
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "ApiResponseOfboolean": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "type": "boolean",
            "nullable": true
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfIReadOnlyListOfLinksAiCompareItemDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksAiCompareItemDto"
            },
            "nullable": true
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfIReadOnlyListOfLinksKeyDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksKeyDto"
            },
            "nullable": true
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfIReadOnlyListOfLinksLeadDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksLeadDto"
            },
            "nullable": true
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfIReadOnlyListOfLinksMediaDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksMediaDto"
            },
            "nullable": true
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfIReadOnlyListOfLinksPageSummaryDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksPageSummaryDto"
            },
            "nullable": true
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfIReadOnlyListOfLinksShareLinkDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksShareLinkDto"
            },
            "nullable": true
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfIReadOnlyListOfLinksSiteDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksSiteDto"
            },
            "nullable": true
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfIReadOnlyListOfLinksTextSignupDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksTextSignupDto"
            },
            "nullable": true
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfIReadOnlyListOfLinksVersionDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksVersionDto"
            },
            "nullable": true
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinkListingApplyResult": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinkListingApplyResult"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinkListingLookup": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinkListingLookup"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksAiAssistantResult": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksAiAssistantResult"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksAiHistoryResult": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksAiHistoryResult"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksAiOptionsResult": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksAiOptionsResult"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksAiPictureResult": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksAiPictureResult"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksAiReferenceSourcesResult": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksAiReferenceSourcesResult"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksAiTextResult": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksAiTextResult"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksAnalyticsDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksAnalyticsDto"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksBlockDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksBlockDto"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksCategorySuggestionsResult": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksCategorySuggestionsResult"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksHandleCheckDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksHandleCheckDto"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksKeyCreatedDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksKeyCreatedDto"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksKeyDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksKeyDto"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksKeyPolicyDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksKeyPolicyDto"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksMeDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksMeDto"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksPageDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksPageDto"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksPlaceSuggestionsResult": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksPlaceSuggestionsResult"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksPlanDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksPlanDto"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksPreviewDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksPreviewDto"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksPublishDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksPublishDto"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksRestoreDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksRestoreDto"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksShareLinkCreatedDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksShareLinkCreatedDto"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfLinksSitePagesDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksSitePagesDto"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfSiteAgePolicyDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/SiteAgePolicyDto"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ApiResponseOfSiteAgeStatusDto": {
        "required": [
          "success"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/SiteAgeStatusDto"
              }
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "JsonElement": { },
      "LinkListingApplyResult": {
        "required": [
          "ok",
          "message",
          "applied",
          "skipped"
        ],
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "message": {
            "type": "string"
          },
          "applied": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinkListingOutcome"
            }
          },
          "skipped": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinkListingOutcome"
            }
          }
        }
      },
      "LinkListingInfo": {
        "required": [
          "listingId",
          "placeId",
          "name",
          "address",
          "mapsUrl",
          "ownerVerified",
          "googleConnected"
        ],
        "type": "object",
        "properties": {
          "listingId": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "placeId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "address": {
            "type": "string",
            "nullable": true
          },
          "mapsUrl": {
            "type": "string",
            "nullable": true
          },
          "ownerVerified": {
            "type": "boolean"
          },
          "googleConnected": {
            "type": "boolean"
          }
        }
      },
      "LinkListingLookup": {
        "required": [
          "hasListing",
          "message",
          "suggestion"
        ],
        "type": "object",
        "properties": {
          "hasListing": {
            "type": "boolean"
          },
          "message": {
            "type": "string"
          },
          "suggestion": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinkListingSuggestion"
              }
            ]
          }
        }
      },
      "LinkListingOutcome": {
        "required": [
          "part",
          "summary"
        ],
        "type": "object",
        "properties": {
          "part": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          }
        }
      },
      "LinkListingPart": {
        "required": [
          "part",
          "label",
          "available",
          "reason",
          "values"
        ],
        "type": "object",
        "properties": {
          "part": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "available": {
            "type": "boolean"
          },
          "reason": {
            "type": "string",
            "nullable": true
          },
          "values": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinkListingValue"
            }
          }
        }
      },
      "LinkListingSelection": {
        "type": "object",
        "properties": {
          "profile": {
            "type": "boolean",
            "default": true
          },
          "website": {
            "type": "boolean",
            "default": true
          },
          "phone": {
            "type": "boolean",
            "default": true
          },
          "map": {
            "type": "boolean",
            "default": true
          },
          "hours": {
            "type": "boolean",
            "default": true
          },
          "reviews": {
            "type": "boolean",
            "default": true
          }
        }
      },
      "LinkListingSuggestion": {
        "required": [
          "pageId",
          "listing",
          "parts",
          "note"
        ],
        "type": "object",
        "properties": {
          "pageId": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "listing": {
            "$ref": "#/components/schemas/LinkListingInfo"
          },
          "parts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinkListingPart"
            }
          },
          "note": {
            "type": "string"
          }
        }
      },
      "LinkListingValue": {
        "required": [
          "label",
          "value"
        ],
        "type": "object",
        "properties": {
          "label": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        }
      },
      "LinksAdvancedRequest": {
        "type": "object",
        "properties": {
          "ga4Id": {
            "type": "string",
            "nullable": true
          },
          "metaPixelId": {
            "type": "string",
            "nullable": true
          },
          "hideBranding": {
            "type": "boolean",
            "nullable": true
          }
        }
      },
      "LinksAiAction": {
        "required": [
          "tool",
          "summary"
        ],
        "type": "object",
        "properties": {
          "tool": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          }
        }
      },
      "LinksAiAllowanceDto": {
        "required": [
          "kind",
          "used",
          "limit",
          "remaining",
          "remainingEdits"
        ],
        "type": "object",
        "properties": {
          "kind": {
            "type": "string"
          },
          "used": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "limit": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "remaining": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "remainingEdits": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "unlimited": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "LinksAiApplyRequest": {
        "type": "object",
        "properties": {
          "imageId": {
            "type": "string",
            "nullable": true
          },
          "kind": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksAiAssistantRequest": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string",
            "nullable": true
          },
          "history": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksAiTurn"
            },
            "nullable": true
          }
        }
      },
      "LinksAiAssistantResult": {
        "required": [
          "reply",
          "actions",
          "page"
        ],
        "type": "object",
        "properties": {
          "reply": {
            "type": "string"
          },
          "actions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksAiAction"
            }
          },
          "page": {
            "$ref": "#/components/schemas/LinksPageDto"
          },
          "timings": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksAiTimingsDto"
              }
            ]
          }
        }
      },
      "LinksAiCompareItemDto": {
        "required": [
          "model",
          "ok",
          "status",
          "error",
          "code",
          "imageBase64",
          "imageId",
          "timings",
          "tokens",
          "estimatedCostUsd",
          "quality",
          "size"
        ],
        "type": "object",
        "properties": {
          "model": {
            "type": "string"
          },
          "ok": {
            "type": "boolean"
          },
          "status": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "error": {
            "type": "string",
            "nullable": true
          },
          "code": {
            "type": "string",
            "nullable": true
          },
          "imageBase64": {
            "type": "string",
            "nullable": true
          },
          "imageId": {
            "type": "string",
            "nullable": true
          },
          "timings": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksAiTimingsDto"
              }
            ]
          },
          "tokens": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksAiTokensDto"
              }
            ]
          },
          "estimatedCostUsd": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "double",
            "nullable": true
          },
          "quality": {
            "type": "string",
            "nullable": true
          },
          "size": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksAiCompareRequest": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string",
            "nullable": true
          },
          "preset": {
            "type": "string",
            "nullable": true
          },
          "options": {
            "type": "object",
            "nullable": true
          },
          "extra": {
            "type": "string",
            "nullable": true
          },
          "models": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "mode": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksAiFinalizeRequest": {
        "type": "object",
        "properties": {
          "imageId": {
            "type": "string",
            "nullable": true
          },
          "mode": {
            "type": "string",
            "nullable": true
          },
          "referenceImage": {
            "type": "string",
            "nullable": true
          },
          "referenceSource": {
            "type": "string",
            "nullable": true
          },
          "referenceConsent": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "LinksAiHistoryItemDto": {
        "required": [
          "imageId",
          "createdUtc",
          "model",
          "runMs",
          "preset",
          "options",
          "extra",
          "variants"
        ],
        "type": "object",
        "properties": {
          "imageId": {
            "type": "string"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "model": {
            "type": "string",
            "nullable": true
          },
          "runMs": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int64",
            "nullable": true
          },
          "preset": {
            "type": "string",
            "nullable": true
          },
          "options": {
            "type": "object",
            "nullable": true
          },
          "extra": {
            "type": "string",
            "nullable": true
          },
          "variants": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksAiVariantDto"
            }
          },
          "isDraft": {
            "type": "boolean",
            "default": false
          },
          "mode": {
            "type": "string",
            "nullable": true
          },
          "parentImageId": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksAiHistoryResult": {
        "required": [
          "target",
          "items"
        ],
        "type": "object",
        "properties": {
          "target": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksAiHistoryItemDto"
            }
          }
        }
      },
      "LinksAiModeDto": {
        "required": [
          "id",
          "label",
          "hint",
          "costNote",
          "counts"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "hint": {
            "type": "string"
          },
          "costNote": {
            "type": "string",
            "nullable": true
          },
          "counts": {
            "type": "boolean"
          }
        }
      },
      "LinksAiOptionDto": {
        "required": [
          "id",
          "label",
          "swatch"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "swatch": {
            "type": "string",
            "nullable": true
          },
          "icon": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksAiOptionsResult": {
        "required": [
          "target",
          "slots",
          "presets",
          "defaults",
          "allowance",
          "extraMaxLength"
        ],
        "type": "object",
        "properties": {
          "target": {
            "type": "string"
          },
          "slots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksAiSlotDto"
            }
          },
          "presets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksAiPresetDto"
            }
          },
          "defaults": {
            "type": "object"
          },
          "allowance": {
            "$ref": "#/components/schemas/LinksAiAllowanceDto"
          },
          "extraMaxLength": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "template": {
            "type": "string",
            "default": ""
          },
          "modes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksAiModeDto"
            },
            "nullable": true
          },
          "canCompare": {
            "type": "boolean",
            "default": false
          },
          "tweak": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksAiTweakInfoDto"
              }
            ]
          }
        }
      },
      "LinksAiPictureRequest": {
        "type": "object",
        "properties": {
          "preset": {
            "type": "string",
            "nullable": true
          },
          "options": {
            "type": "object",
            "nullable": true
          },
          "extra": {
            "type": "string",
            "nullable": true
          },
          "basedOnPrompt": {
            "type": "string",
            "nullable": true
          },
          "model": {
            "type": "string",
            "nullable": true
          },
          "mode": {
            "type": "string",
            "nullable": true
          },
          "referenceImage": {
            "type": "string",
            "nullable": true
          },
          "referenceSource": {
            "type": "string",
            "nullable": true
          },
          "referenceConsent": {
            "type": "boolean",
            "default": false
          },
          "matchProfile": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "LinksAiPictureResult": {
        "required": [
          "imageBase64",
          "imageId",
          "model",
          "variants",
          "allowance"
        ],
        "type": "object",
        "properties": {
          "imageBase64": {
            "type": "string"
          },
          "imageId": {
            "type": "string"
          },
          "model": {
            "type": "string"
          },
          "variants": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksAiVariantDto"
            }
          },
          "allowance": {
            "$ref": "#/components/schemas/LinksAiAllowanceDto"
          },
          "preset": {
            "type": "string",
            "nullable": true
          },
          "options": {
            "type": "object",
            "nullable": true
          },
          "timings": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksAiTimingsDto"
              }
            ]
          },
          "isDraft": {
            "type": "boolean",
            "default": false
          },
          "mode": {
            "type": "string",
            "default": "standard"
          },
          "parentImageId": {
            "type": "string",
            "nullable": true
          },
          "changed": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "tokens": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksAiTokensDto"
              }
            ]
          },
          "estimatedCostUsd": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "double",
            "nullable": true
          },
          "matchedProfile": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "LinksAiPresetDto": {
        "required": [
          "id",
          "label",
          "options"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "options": {
            "type": "object"
          }
        }
      },
      "LinksAiReferenceSourceDto": {
        "required": [
          "id",
          "label",
          "thumb"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "thumb": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksAiReferenceSourcesResult": {
        "required": [
          "sources",
          "maxBytes",
          "types"
        ],
        "type": "object",
        "properties": {
          "sources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksAiReferenceSourceDto"
            }
          },
          "maxBytes": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int64"
          },
          "types": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "LinksAiSlotDto": {
        "required": [
          "id",
          "label",
          "group",
          "multi",
          "max",
          "options"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "group": {
            "type": "string"
          },
          "multi": {
            "type": "boolean"
          },
          "max": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "options": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksAiOptionDto"
            }
          },
          "appliesWhen": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "nullable": true
          }
        }
      },
      "LinksAiStepDto": {
        "required": [
          "name",
          "ms"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "ms": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int64"
          }
        }
      },
      "LinksAiStrengthDto": {
        "required": [
          "id",
          "label",
          "hint"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "hint": {
            "type": "string"
          }
        }
      },
      "LinksAiTextRequest": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "nullable": true
          },
          "hint": {
            "type": "string",
            "nullable": true
          },
          "tone": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksAiTextResult": {
        "required": [
          "options"
        ],
        "type": "object",
        "properties": {
          "options": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "timings": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksAiTimingsDto"
              }
            ]
          }
        }
      },
      "LinksAiTimingsDto": {
        "required": [
          "totalMs",
          "steps"
        ],
        "type": "object",
        "properties": {
          "totalMs": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int64"
          },
          "steps": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksAiStepDto"
            }
          },
          "model": {
            "type": "string",
            "nullable": true
          },
          "quality": {
            "type": "string",
            "nullable": true
          },
          "size": {
            "type": "string",
            "nullable": true
          },
          "responseKb": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "double",
            "nullable": true
          },
          "firstPartialMs": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int64",
            "nullable": true
          },
          "edit": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "LinksAiTokensDto": {
        "required": [
          "in",
          "out"
        ],
        "type": "object",
        "properties": {
          "in": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "out": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          }
        }
      },
      "LinksAiTurn": {
        "type": "object",
        "properties": {
          "role": {
            "type": "string",
            "nullable": true
          },
          "text": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksAiTweakInfoDto": {
        "required": [
          "strengths",
          "defaultStrength"
        ],
        "type": "object",
        "properties": {
          "strengths": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksAiStrengthDto"
            }
          },
          "defaultStrength": {
            "type": "string"
          }
        }
      },
      "LinksAiTweakRequest": {
        "type": "object",
        "properties": {
          "imageId": {
            "type": "string",
            "nullable": true
          },
          "options": {
            "type": "object",
            "nullable": true
          },
          "extra": {
            "type": "string",
            "nullable": true
          },
          "mode": {
            "type": "string",
            "nullable": true
          },
          "strength": {
            "type": "string",
            "nullable": true
          },
          "model": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksAiVariantDto": {
        "required": [
          "kind",
          "width",
          "height",
          "path",
          "url"
        ],
        "type": "object",
        "properties": {
          "kind": {
            "type": "string"
          },
          "width": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "height": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "path": {
            "type": "string"
          },
          "url": {
            "type": "string"
          }
        }
      },
      "LinksAnalyticsDto": {
        "required": [
          "days",
          "views",
          "visitors",
          "taps",
          "mobileViews",
          "tapRatePercent",
          "previousViews",
          "previousTaps",
          "byDay",
          "bySource",
          "topItems"
        ],
        "type": "object",
        "properties": {
          "days": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "views": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "visitors": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "taps": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "mobileViews": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "tapRatePercent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              }
            ],
            "format": "double"
          },
          "previousViews": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "previousTaps": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "byDay": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksDayDto"
            }
          },
          "bySource": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksSourceDto"
            }
          },
          "topItems": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksTopItemDto"
            }
          },
          "shares": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32",
            "default": 0
          },
          "previousVisitors": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int32",
            "nullable": true
          },
          "hasData": {
            "type": "boolean",
            "nullable": true
          },
          "range": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/SiteStatsRange"
              }
            ]
          },
          "kpis": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SiteStatKpi"
            },
            "nullable": true
          },
          "pages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SiteStatRow"
            },
            "nullable": true
          },
          "countries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SiteStatRow"
            },
            "nullable": true
          },
          "devices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SiteStatRow"
            },
            "nullable": true
          },
          "events": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SiteEventTotal"
            },
            "nullable": true
          },
          "funnel": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/SiteFunnel"
              }
            ]
          }
        }
      },
      "LinksBackgroundRequest": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "nullable": true
          },
          "studioAssetId": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int64",
            "nullable": true
          }
        }
      },
      "LinksBlockDto": {
        "required": [
          "id",
          "type",
          "title",
          "url",
          "subtitle",
          "icon",
          "hasImage",
          "visible",
          "featured",
          "addUtm",
          "position",
          "startsUtc",
          "endsUtc",
          "source",
          "data"
        ],
        "type": "object",
        "properties": {
          "id": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int64"
          },
          "type": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "subtitle": {
            "type": "string"
          },
          "icon": {
            "type": "string"
          },
          "hasImage": {
            "type": "boolean"
          },
          "visible": {
            "type": "boolean"
          },
          "featured": {
            "type": "boolean"
          },
          "addUtm": {
            "type": "boolean"
          },
          "position": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "startsUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "endsUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "source": {
            "type": "string"
          },
          "data": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/JsonElement"
              }
            ]
          },
          "imageUrl": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksBlockRequest": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "url": {
            "type": "string",
            "nullable": true
          },
          "subtitle": {
            "type": "string",
            "nullable": true
          },
          "icon": {
            "type": "string",
            "nullable": true
          },
          "visible": {
            "type": "boolean",
            "nullable": true
          },
          "featured": {
            "type": "boolean",
            "nullable": true
          },
          "addUtm": {
            "type": "boolean",
            "nullable": true
          },
          "startsUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "endsUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "data": { }
        }
      },
      "LinksCategorySuggestion": {
        "required": [
          "id",
          "label",
          "icon"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "icon": {
            "type": "string"
          }
        }
      },
      "LinksCategorySuggestionsResult": {
        "required": [
          "work",
          "interests"
        ],
        "type": "object",
        "properties": {
          "work": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksCategorySuggestion"
            }
          },
          "interests": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksCategorySuggestion"
            }
          }
        }
      },
      "LinksConfirmRequest": {
        "required": [
          "token"
        ],
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksCreatePageRequest": {
        "required": [
          "handle",
          "displayName"
        ],
        "type": "object",
        "properties": {
          "handle": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "nullable": true
          },
          "theme": {
            "type": "string",
            "nullable": true
          },
          "site": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksDayDto": {
        "required": [
          "day",
          "views",
          "visitors",
          "taps"
        ],
        "type": "object",
        "properties": {
          "day": {
            "type": "string"
          },
          "views": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "visitors": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "taps": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "shares": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32",
            "default": 0
          }
        }
      },
      "LinksDesignDto": {
        "required": [
          "accent",
          "accent2",
          "background",
          "background2",
          "text",
          "buttonStyle",
          "buttonShape",
          "font",
          "avatarShape",
          "animation",
          "dim",
          "cover",
          "coverHeight",
          "contentTop",
          "hide"
        ],
        "type": "object",
        "properties": {
          "accent": {
            "type": "string"
          },
          "accent2": {
            "type": "string"
          },
          "background": {
            "type": "string"
          },
          "background2": {
            "type": "string"
          },
          "text": {
            "type": "string"
          },
          "buttonStyle": {
            "type": "string"
          },
          "buttonShape": {
            "type": "string"
          },
          "font": {
            "type": "string"
          },
          "avatarShape": {
            "type": "string"
          },
          "animation": {
            "type": "string"
          },
          "dim": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "cover": {
            "type": "string"
          },
          "coverHeight": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "contentTop": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "hide": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "heroKind": {
            "type": "string",
            "default": ""
          },
          "heroVideo": {
            "type": "string",
            "default": ""
          },
          "coverX": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32",
            "default": -1
          },
          "coverY": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32",
            "default": -1
          },
          "avatarX": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32",
            "default": 0
          }
        }
      },
      "LinksDesignRequest": {
        "type": "object",
        "properties": {
          "accent": {
            "type": "string",
            "nullable": true
          },
          "accent2": {
            "type": "string",
            "nullable": true
          },
          "background": {
            "type": "string",
            "nullable": true
          },
          "background2": {
            "type": "string",
            "nullable": true
          },
          "text": {
            "type": "string",
            "nullable": true
          },
          "buttonStyle": {
            "type": "string",
            "nullable": true
          },
          "buttonShape": {
            "type": "string",
            "nullable": true
          },
          "font": {
            "type": "string",
            "nullable": true
          },
          "avatarShape": {
            "type": "string",
            "nullable": true
          },
          "animation": {
            "type": "string",
            "nullable": true
          },
          "dim": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int32",
            "nullable": true
          },
          "cover": {
            "type": "string",
            "nullable": true
          },
          "coverHeight": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int32",
            "nullable": true
          },
          "contentTop": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int32",
            "nullable": true
          },
          "hide": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "heroKind": {
            "type": "string",
            "nullable": true
          },
          "heroVideo": {
            "type": "string",
            "nullable": true
          },
          "coverX": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int32",
            "nullable": true
          },
          "coverY": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int32",
            "nullable": true
          },
          "avatarX": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int32",
            "nullable": true
          }
        }
      },
      "LinksDuplicateRequest": {
        "required": [
          "handle"
        ],
        "type": "object",
        "properties": {
          "handle": {
            "type": "string"
          }
        }
      },
      "LinksHandleCheckDto": {
        "required": [
          "handle",
          "available",
          "message",
          "suggestions",
          "site"
        ],
        "type": "object",
        "properties": {
          "handle": {
            "type": "string"
          },
          "available": {
            "type": "boolean"
          },
          "message": {
            "type": "string"
          },
          "suggestions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "site": {
            "type": "string",
            "nullable": true
          },
          "reservedFor": {
            "type": "string",
            "nullable": true
          },
          "needsPremium": {
            "type": "boolean",
            "default": false
          },
          "signInAgain": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "LinksHandleRequest": {
        "required": [
          "handle"
        ],
        "type": "object",
        "properties": {
          "handle": {
            "type": "string"
          }
        }
      },
      "LinksImageRequest": {
        "type": "object",
        "properties": {
          "imageBase64": {
            "type": "string",
            "nullable": true
          },
          "imageUrl": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksKeyCreatedDto": {
        "required": [
          "key",
          "row"
        ],
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "row": {
            "$ref": "#/components/schemas/LinksKeyDto"
          }
        }
      },
      "LinksKeyCreateRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "canPublish": {
            "type": "boolean",
            "default": false
          },
          "expiresInDays": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int32",
            "nullable": true
          },
          "site": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksKeyDto": {
        "required": [
          "id",
          "name",
          "prefix",
          "scopes",
          "createdUtc",
          "expiresUtc",
          "lastUsedUtc",
          "lastUsedClient",
          "status"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "prefix": {
            "type": "string"
          },
          "scopes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "expiresUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lastUsedUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lastUsedClient": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "string"
          }
        }
      },
      "LinksKeyPolicyDto": {
        "required": [
          "enabled",
          "maxActive",
          "active",
          "expiresInDaysChoices",
          "defaultExpiresInDays",
          "createPerHour"
        ],
        "type": "object",
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "maxActive": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "active": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "expiresInDaysChoices": {
            "type": "array",
            "items": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "string"
                }
              ],
              "format": "int32"
            }
          },
          "defaultExpiresInDays": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "createPerHour": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          }
        }
      },
      "LinksLeadDto": {
        "required": [
          "id",
          "email",
          "name",
          "source",
          "signedUpUtc"
        ],
        "type": "object",
        "properties": {
          "id": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int64"
          },
          "email": {
            "type": "string"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "source": {
            "type": "string"
          },
          "signedUpUtc": {
            "type": "string",
            "format": "date-time"
          },
          "status": {
            "type": "string",
            "default": "stored"
          },
          "confirmedUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "LinksMediaDto": {
        "required": [
          "id",
          "slot",
          "replacedUtc",
          "url"
        ],
        "type": "object",
        "properties": {
          "id": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int64"
          },
          "slot": {
            "type": "string"
          },
          "replacedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "url": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksMeDto": {
        "required": [
          "displayName",
          "email",
          "pictureUrl",
          "isAdmin",
          "canExceedPageLimit",
          "canUseShortHandles",
          "site"
        ],
        "type": "object",
        "properties": {
          "displayName": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "pictureUrl": {
            "type": "string",
            "nullable": true
          },
          "isAdmin": {
            "type": "boolean"
          },
          "canExceedPageLimit": {
            "type": "boolean"
          },
          "canUseShortHandles": {
            "type": "boolean"
          },
          "site": {
            "type": "string",
            "nullable": true
          },
          "otherDirectory": {
            "type": "boolean",
            "default": false
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "viewer": {
            "type": "string",
            "default": "User"
          },
          "policies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksPolicyDto"
            },
            "nullable": true
          },
          "planLabel": {
            "type": "string",
            "default": ""
          },
          "adminDashboard": {
            "type": "boolean",
            "default": false
          },
          "user": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/SiteMeUser"
              }
            ]
          },
          "signIn": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/SiteMeSignIn"
              }
            ]
          },
          "teamRole": {
            "type": "string",
            "nullable": true
          },
          "guide": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/SitePolicyGuide"
              }
            ]
          },
          "links": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/SiteMeLinks"
              }
            ]
          },
          "app": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/SiteAppInfo"
              }
            ]
          }
        }
      },
      "LinksOneTapRequest": {
        "required": [
          "credential"
        ],
        "type": "object",
        "properties": {
          "credential": {
            "type": "string",
            "nullable": true
          },
          "site": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksPageDto": {
        "required": [
          "id",
          "handle",
          "displayName",
          "businessName",
          "headline",
          "bio",
          "location",
          "category",
          "kind",
          "status",
          "theme",
          "design",
          "backgroundKind",
          "hasAvatar",
          "hasHeroImage",
          "seoTitle",
          "seoDescription",
          "seoTitleEffective",
          "seoDescriptionEffective",
          "seoTitleSuggested",
          "seoDescriptionSuggested",
          "noIndex",
          "ga4Id",
          "metaPixelId",
          "hideBranding",
          "verified",
          "publicUrl",
          "hasUnpublishedChanges",
          "publishedUtc",
          "items"
        ],
        "type": "object",
        "properties": {
          "id": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "handle": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "businessName": {
            "type": "string"
          },
          "headline": {
            "type": "string"
          },
          "bio": {
            "type": "string"
          },
          "location": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "theme": {
            "type": "string"
          },
          "design": {
            "$ref": "#/components/schemas/LinksDesignDto"
          },
          "backgroundKind": {
            "type": "string"
          },
          "hasAvatar": {
            "type": "boolean"
          },
          "hasHeroImage": {
            "type": "boolean"
          },
          "seoTitle": {
            "type": "string"
          },
          "seoDescription": {
            "type": "string"
          },
          "seoTitleEffective": {
            "type": "string"
          },
          "seoDescriptionEffective": {
            "type": "string"
          },
          "seoTitleSuggested": {
            "type": "string"
          },
          "seoDescriptionSuggested": {
            "type": "string"
          },
          "noIndex": {
            "type": "boolean"
          },
          "ga4Id": {
            "type": "string"
          },
          "metaPixelId": {
            "type": "string"
          },
          "hideBranding": {
            "type": "boolean"
          },
          "verified": {
            "type": "boolean"
          },
          "publicUrl": {
            "type": "string"
          },
          "hasUnpublishedChanges": {
            "type": "boolean"
          },
          "publishedUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksBlockDto"
            }
          },
          "site": {
            "type": "string",
            "default": "lockedin"
          },
          "avatarUrl": {
            "type": "string",
            "nullable": true
          },
          "heroUrl": {
            "type": "string",
            "nullable": true
          },
          "isPrivate": {
            "type": "boolean",
            "default": false
          },
          "phone": {
            "type": "string",
            "default": ""
          },
          "address": {
            "type": "string",
            "default": ""
          },
          "role": {
            "type": "string",
            "default": "Owner"
          },
          "capabilities": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "accessVersion": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32",
            "default": 0
          },
          "shared": {
            "type": "boolean",
            "default": false
          },
          "sharedBy": {
            "type": "string",
            "nullable": true
          },
          "lastEditedBy": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksPageSummaryDto": {
        "required": [
          "id",
          "handle",
          "displayName",
          "kind",
          "status",
          "theme",
          "publicUrl",
          "hasUnpublishedChanges",
          "publishedUtc",
          "itemCount",
          "views",
          "clicks"
        ],
        "type": "object",
        "properties": {
          "id": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "handle": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "theme": {
            "type": "string"
          },
          "publicUrl": {
            "type": "string"
          },
          "hasUnpublishedChanges": {
            "type": "boolean"
          },
          "publishedUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "itemCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "views": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int64"
          },
          "clicks": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int64"
          },
          "site": {
            "type": "string",
            "default": "lockedin"
          },
          "avatarUrl": {
            "type": "string",
            "nullable": true
          },
          "avatarShape": {
            "type": "string",
            "default": "circle"
          },
          "accent": {
            "type": "string",
            "default": ""
          },
          "shares": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int64",
            "default": 0
          },
          "signups": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32",
            "default": 0
          },
          "recent": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksDayDto"
            },
            "nullable": true
          },
          "verified": {
            "type": "boolean",
            "default": false
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lastEditedUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "role": {
            "type": "string",
            "default": "Owner"
          },
          "shared": {
            "type": "boolean",
            "default": false
          },
          "sharedBy": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksPlaceSuggestionDto": {
        "required": [
          "label",
          "city",
          "region",
          "country",
          "placeId"
        ],
        "type": "object",
        "properties": {
          "label": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "region": {
            "type": "string",
            "nullable": true
          },
          "country": {
            "type": "string",
            "nullable": true
          },
          "placeId": {
            "type": "string"
          }
        }
      },
      "LinksPlaceSuggestionsResult": {
        "required": [
          "items"
        ],
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksPlaceSuggestionDto"
            }
          }
        }
      },
      "LinksPlanDto": {
        "required": [
          "state",
          "label",
          "detail",
          "daysLeft",
          "endsUtc",
          "maxPages",
          "canPublish",
          "servesPages",
          "paid",
          "studioBackground",
          "removeBranding",
          "ownTrackingIds",
          "subscribeUrl"
        ],
        "type": "object",
        "properties": {
          "state": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          },
          "daysLeft": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "endsUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "maxPages": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "canPublish": {
            "type": "boolean"
          },
          "servesPages": {
            "type": "boolean"
          },
          "paid": {
            "type": "boolean"
          },
          "studioBackground": {
            "type": "boolean"
          },
          "removeBranding": {
            "type": "boolean"
          },
          "ownTrackingIds": {
            "type": "boolean"
          },
          "subscribeUrl": {
            "type": "string"
          },
          "pagesPerKind": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "LinksPolicyDto": {
        "required": [
          "key",
          "label",
          "allowed"
        ],
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "allowed": {
            "type": "boolean"
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "group": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksPreviewDto": {
        "required": [
          "html"
        ],
        "type": "object",
        "properties": {
          "html": {
            "type": "string"
          }
        }
      },
      "LinksPrivacyRequest": {
        "required": [
          "isPrivate"
        ],
        "type": "object",
        "properties": {
          "isPrivate": {
            "type": "boolean"
          }
        }
      },
      "LinksProfileRequest": {
        "type": "object",
        "properties": {
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "headline": {
            "type": "string",
            "nullable": true
          },
          "bio": {
            "type": "string",
            "nullable": true
          },
          "location": {
            "type": "string",
            "nullable": true
          },
          "category": {
            "type": "string",
            "nullable": true
          },
          "kind": {
            "type": "string",
            "nullable": true
          },
          "businessName": {
            "type": "string",
            "nullable": true
          },
          "phone": {
            "type": "string",
            "nullable": true
          },
          "address": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksPublishDto": {
        "required": [
          "published",
          "message",
          "url",
          "warnings",
          "changed"
        ],
        "type": "object",
        "properties": {
          "published": {
            "type": "boolean"
          },
          "message": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "nullable": true
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "changed": {
            "type": "boolean"
          }
        }
      },
      "LinksReorderRequest": {
        "required": [
          "itemIds"
        ],
        "type": "object",
        "properties": {
          "itemIds": {
            "type": "array",
            "items": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "string"
                }
              ],
              "format": "int64"
            }
          }
        }
      },
      "LinksRestoreDto": {
        "required": [
          "page",
          "publish"
        ],
        "type": "object",
        "properties": {
          "page": {
            "$ref": "#/components/schemas/LinksPageDto"
          },
          "publish": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/LinksPublishDto"
              }
            ]
          }
        }
      },
      "LinksRestoreRequest": {
        "type": "object",
        "properties": {
          "publish": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "LinksSeoRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "noIndex": {
            "type": "boolean",
            "nullable": true
          }
        }
      },
      "LinksShareLinkCreatedDto": {
        "required": [
          "id",
          "label",
          "url",
          "qrSvg",
          "expiresUtc",
          "maxViews"
        ],
        "type": "object",
        "properties": {
          "id": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int64"
          },
          "label": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "qrSvg": {
            "type": "string"
          },
          "expiresUtc": {
            "type": "string",
            "format": "date-time"
          },
          "maxViews": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          }
        }
      },
      "LinksShareLinkDto": {
        "required": [
          "id",
          "label",
          "createdUtc",
          "expiresUtc",
          "maxViews",
          "views",
          "status",
          "revokedUtc"
        ],
        "type": "object",
        "properties": {
          "id": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int64"
          },
          "label": {
            "type": "string"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "expiresUtc": {
            "type": "string",
            "format": "date-time"
          },
          "maxViews": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "views": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "status": {
            "type": "string"
          },
          "revokedUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "LinksShareLinkRequest": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string",
            "nullable": true
          },
          "expiresInMinutes": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int32",
            "nullable": true
          },
          "maxViews": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int32",
            "nullable": true
          }
        }
      },
      "LinksSignInExchangeRequest": {
        "required": [
          "code"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "nullable": true
          },
          "handle": {
            "type": "string",
            "nullable": true
          },
          "site": {
            "type": "string",
            "nullable": true
          },
          "deviceInfo": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksSignupStartRequest": {
        "required": [
          "email"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "nullable": true
          },
          "handle": {
            "type": "string",
            "nullable": true
          },
          "site": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksSignupVerifyRequest": {
        "required": [
          "challengeId",
          "code"
        ],
        "type": "object",
        "properties": {
          "challengeId": {
            "type": "string",
            "format": "uuid"
          },
          "code": {
            "type": "string",
            "nullable": true
          },
          "handle": {
            "type": "string",
            "nullable": true
          },
          "site": {
            "type": "string",
            "nullable": true
          },
          "deviceInfo": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "LinksSiteDto": {
        "required": [
          "key",
          "host",
          "brandName",
          "brandUrl",
          "staticLive",
          "freePageLimit",
          "paidPageLimit",
          "enabled",
          "isDefault",
          "canManage"
        ],
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "host": {
            "type": "string"
          },
          "brandName": {
            "type": "string"
          },
          "brandUrl": {
            "type": "string"
          },
          "staticLive": {
            "type": "boolean"
          },
          "freePageLimit": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "paidPageLimit": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "enabled": {
            "type": "boolean"
          },
          "isDefault": {
            "type": "boolean"
          },
          "canManage": {
            "type": "boolean"
          }
        }
      },
      "LinksSitePageDto": {
        "required": [
          "id",
          "handle",
          "displayName",
          "kind",
          "status",
          "verified",
          "ownerName",
          "ownerEmail",
          "plan",
          "views",
          "clicks",
          "openReports",
          "publishedUtc",
          "createdUtc",
          "publicUrl"
        ],
        "type": "object",
        "properties": {
          "id": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "handle": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "verified": {
            "type": "boolean"
          },
          "ownerName": {
            "type": "string"
          },
          "ownerEmail": {
            "type": "string"
          },
          "plan": {
            "type": "string"
          },
          "views": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int64"
          },
          "clicks": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int64"
          },
          "openReports": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "publishedUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "publicUrl": {
            "type": "string"
          }
        }
      },
      "LinksSitePagesDto": {
        "required": [
          "site",
          "total",
          "page",
          "pageSize",
          "pages"
        ],
        "type": "object",
        "properties": {
          "site": {
            "type": "string"
          },
          "total": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "page": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "pageSize": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "pages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinksSitePageDto"
            }
          }
        }
      },
      "LinksSourceDto": {
        "required": [
          "source",
          "views",
          "taps"
        ],
        "type": "object",
        "properties": {
          "source": {
            "type": "string"
          },
          "views": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "taps": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "label": {
            "type": "string",
            "nullable": true
          },
          "visitors": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int32",
            "nullable": true
          }
        }
      },
      "LinksTextSignupDto": {
        "required": [
          "id",
          "phone",
          "source",
          "consentUtc",
          "status",
          "consentVersion"
        ],
        "type": "object",
        "properties": {
          "id": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int64"
          },
          "phone": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "consentUtc": {
            "type": "string",
            "format": "date-time"
          },
          "status": {
            "type": "string"
          },
          "consentVersion": {
            "type": "string"
          }
        }
      },
      "LinksThemeRequest": {
        "required": [
          "theme"
        ],
        "type": "object",
        "properties": {
          "theme": {
            "type": "string"
          }
        }
      },
      "LinksTopItemDto": {
        "required": [
          "itemId",
          "title",
          "type",
          "removed",
          "taps",
          "tapRatePercent"
        ],
        "type": "object",
        "properties": {
          "itemId": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int64"
          },
          "title": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "removed": {
            "type": "boolean"
          },
          "taps": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "tapRatePercent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              }
            ],
            "format": "double"
          }
        }
      },
      "LinksVersionDto": {
        "required": [
          "id",
          "number",
          "createdUtc",
          "by",
          "byYou",
          "restoredFrom",
          "changes",
          "items",
          "avatarUrl",
          "heroUrl",
          "isLatest"
        ],
        "type": "object",
        "properties": {
          "id": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int64"
          },
          "number": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "by": {
            "type": "string",
            "nullable": true
          },
          "byYou": {
            "type": "boolean"
          },
          "restoredFrom": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int32",
            "nullable": true
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "items": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "avatarUrl": {
            "type": "string",
            "nullable": true
          },
          "heroUrl": {
            "type": "string",
            "nullable": true
          },
          "isLatest": {
            "type": "boolean"
          }
        }
      },
      "ProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int32",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "instance": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "SiteAgePolicyDto": {
        "required": [
          "enabled",
          "minAge",
          "allowTeens",
          "teenMinAge",
          "atSignIn",
          "atDashboard"
        ],
        "type": "object",
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "minAge": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "allowTeens": {
            "type": "boolean"
          },
          "teenMinAge": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "atSignIn": {
            "type": "boolean"
          },
          "atDashboard": {
            "type": "boolean"
          }
        }
      },
      "SiteAgeRequest": {
        "required": [
          "birthDate"
        ],
        "type": "object",
        "properties": {
          "birthDate": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "SiteAgeStatusDto": {
        "required": [
          "enabled",
          "status",
          "needed",
          "minAge",
          "allowTeens",
          "confirmedUtc",
          "restrictions"
        ],
        "type": "object",
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "status": {
            "type": "string"
          },
          "needed": {
            "type": "boolean"
          },
          "minAge": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "allowTeens": {
            "type": "boolean"
          },
          "confirmedUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "restrictions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "SiteAppInfo": {
        "required": [
          "minVersion",
          "storeUrl"
        ],
        "type": "object",
        "properties": {
          "minVersion": {
            "type": "string",
            "nullable": true
          },
          "storeUrl": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "SiteEventTotal": {
        "required": [
          "kind",
          "label",
          "count",
          "previous",
          "delta"
        ],
        "type": "object",
        "properties": {
          "kind": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "count": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "previous": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "delta": {
            "$ref": "#/components/schemas/SiteStatDelta"
          }
        }
      },
      "SiteFunnel": {
        "required": [
          "steps",
          "medianResponseMinutes",
          "targetMinutes",
          "responseSamples",
          "conversionPct",
          "conversionText"
        ],
        "type": "object",
        "properties": {
          "steps": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SiteFunnelStep"
            }
          },
          "medianResponseMinutes": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "double",
            "nullable": true
          },
          "targetMinutes": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "responseSamples": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "conversionPct": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "double",
            "nullable": true
          },
          "conversionText": {
            "type": "string"
          }
        }
      },
      "SiteFunnelStep": {
        "required": [
          "key",
          "label",
          "value",
          "previous",
          "delta",
          "hint"
        ],
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "value": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "previous": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "delta": {
            "$ref": "#/components/schemas/SiteStatDelta"
          },
          "hint": {
            "type": "string"
          }
        }
      },
      "SiteMeLinks": {
        "required": [
          "dashboard",
          "memberships",
          "billing",
          "book"
        ],
        "type": "object",
        "properties": {
          "dashboard": {
            "type": "string",
            "nullable": true
          },
          "memberships": {
            "type": "string"
          },
          "billing": {
            "type": "boolean"
          },
          "book": {
            "type": "string"
          }
        }
      },
      "SiteMeSignIn": {
        "required": [
          "method",
          "lastSignInUtc"
        ],
        "type": "object",
        "properties": {
          "method": {
            "type": "string"
          },
          "lastSignInUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "SiteMeUser": {
        "required": [
          "id",
          "email",
          "name",
          "pictureUrl"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "pictureUrl": {
            "type": "string",
            "nullable": true
          },
          "timeZone": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "SitePolicyByRole": {
        "required": [
          "customer",
          "viewer",
          "manager",
          "admin"
        ],
        "type": "object",
        "properties": {
          "customer": {
            "type": "boolean"
          },
          "viewer": {
            "type": "boolean"
          },
          "manager": {
            "type": "boolean"
          },
          "admin": {
            "type": "boolean"
          }
        }
      },
      "SitePolicyGuide": {
        "required": [
          "roles",
          "groups"
        ],
        "type": "object",
        "properties": {
          "roles": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "groups": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SitePolicyGuideGroup"
            }
          }
        }
      },
      "SitePolicyGuideGroup": {
        "required": [
          "key",
          "title",
          "rows"
        ],
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SitePolicyGuideRow"
            }
          }
        }
      },
      "SitePolicyGuideRow": {
        "required": [
          "key",
          "label",
          "by"
        ],
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "by": {
            "$ref": "#/components/schemas/SitePolicyByRole"
          }
        }
      },
      "SiteStatDelta": {
        "required": [
          "value",
          "pct",
          "direction",
          "goodWhen",
          "text"
        ],
        "type": "object",
        "properties": {
          "value": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              }
            ],
            "format": "double"
          },
          "pct": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "double",
            "nullable": true
          },
          "direction": {
            "type": "string"
          },
          "goodWhen": {
            "type": "string"
          },
          "text": {
            "type": "string"
          }
        }
      },
      "SiteStatKpi": {
        "required": [
          "key",
          "label",
          "value",
          "unit",
          "previous",
          "delta",
          "hint"
        ],
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "value": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "double",
            "nullable": true
          },
          "unit": {
            "type": "string",
            "nullable": true
          },
          "previous": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "double",
            "nullable": true
          },
          "delta": {
            "oneOf": [
              {
                "enum": [
                  null
                ],
                "nullable": true
              },
              {
                "$ref": "#/components/schemas/SiteStatDelta"
              }
            ]
          },
          "hint": {
            "type": "string"
          }
        }
      },
      "SiteStatRow": {
        "required": [
          "key",
          "label",
          "count",
          "pct"
        ],
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "count": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "pct": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              }
            ],
            "format": "double"
          },
          "visitors": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int32",
            "nullable": true
          },
          "taps": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              },
              {
                "enum": [
                  null
                ],
                "nullable": true
              }
            ],
            "format": "int32",
            "nullable": true
          }
        }
      },
      "SiteStatsRange": {
        "required": [
          "days",
          "from",
          "to",
          "previousFrom",
          "previousTo",
          "timeZone"
        ],
        "type": "object",
        "properties": {
          "days": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "format": "int32"
          },
          "from": {
            "type": "string"
          },
          "to": {
            "type": "string"
          },
          "previousFrom": {
            "type": "string"
          },
          "previousTo": {
            "type": "string"
          },
          "timeZone": {
            "type": "string"
          }
        }
      }
    },
    "securitySchemes": {
      "Bearer": {
        "type": "http",
        "description": "Bearer token: a sign-in token from the Lockedin.me sign-in (POST /v1/links/signup/verify), or a long-lived Agent Key made at https://lockedin.me/ai.",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  },
  "tags": [
    {
      "name": "Lockedin.me Links"
    }
  ]
}