{
  "components": {
    "headers": {
      "Deprecation": {
        "description": "Present when the operation is deprecated (RFC 9745): the Unix time, prefixed with @, at which it was deprecated. A Link field with rel=\"deprecation\" points to the policy.",
        "schema": {
          "example": "@1798761600",
          "type": "string"
        }
      },
      "Idempotent-Replayed": {
        "description": "true when this response is the stored answer to an earlier request with the same Idempotency-Key.",
        "schema": {
          "type": "boolean"
        }
      },
      "RateLimit": {
        "description": "What is left of the quota: `\"\u003cname\u003e\";r=\u003cremaining requests\u003e;t=\u003cseconds until the window resets\u003e` (draft-ietf-httpapi-ratelimit-headers).",
        "schema": {
          "example": "\"token\";r=598;t=42",
          "type": "string"
        }
      },
      "RateLimit-Limit": {
        "description": "Requests allowed in the current window.",
        "schema": {
          "example": 600,
          "type": "integer"
        }
      },
      "RateLimit-Policy": {
        "description": "The quota that applies to this caller, as a structured field: `\"\u003cname\u003e\";q=\u003crequests\u003e;w=\u003cwindow seconds\u003e` (draft-ietf-httpapi-ratelimit-headers).",
        "schema": {
          "example": "\"token\";q=600;w=60",
          "type": "string"
        }
      },
      "RateLimit-Remaining": {
        "description": "Requests left in the current window.",
        "schema": {
          "example": 598,
          "type": "integer"
        }
      },
      "RateLimit-Reset": {
        "description": "Seconds until the current window resets.",
        "schema": {
          "example": 42,
          "type": "integer"
        }
      },
      "Retry-After": {
        "description": "Seconds to wait before retrying a refused request.",
        "schema": {
          "example": 42,
          "type": "integer"
        }
      },
      "Sunset": {
        "description": "Present when a deprecated operation has a scheduled end (RFC 8594): the HTTP date after which it may stop working.",
        "schema": {
          "example": "Thu, 01 Jul 2027 00:00:00 GMT",
          "type": "string"
        }
      },
      "X-RateLimit-Limit": {
        "description": "Same as RateLimit-Limit, for clients that read the X- convention.",
        "schema": {
          "example": 600,
          "type": "integer"
        }
      },
      "X-RateLimit-Remaining": {
        "description": "Same as RateLimit-Remaining, for clients that read the X- convention.",
        "schema": {
          "example": 598,
          "type": "integer"
        }
      },
      "X-RateLimit-Reset": {
        "description": "Unix time, in seconds, at which the current window resets.",
        "schema": {
          "example": 1791650400,
          "type": "integer"
        }
      }
    },
    "parameters": {
      "IdempotencyKey": {
        "description": "A unique value, such as a UUID, that makes retrying this request safe (draft-ietf-httpapi-idempotency-key-header). A retry with the same key and the same request returns the first response, with Idempotent-Replayed: true, instead of running again. Keys are scoped to the token and kept for 24 hours. The same key with a different request is refused with 422; a retry while the first request is still running gets 409 with Retry-After.",
        "in": "header",
        "name": "Idempotency-Key",
        "required": false,
        "schema": {
          "example": "4f7d2c1e-8a8b-4b5e-9f8c-2d3e1a6b7c90",
          "maxLength": 255,
          "minLength": 1,
          "type": "string"
        }
      }
    },
    "responses": {
      "200": {
        "description": "Everything worked as expected."
      },
      "400": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        },
        "description": "The request was unacceptable, often due to missing a required parameter."
      },
      "401": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        },
        "description": "No valid API key provided."
      },
      "402": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        },
        "description": "The parameters were valid but the request failed."
      },
      "403": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        },
        "description": "The API key doesn't have permissions to perform the request."
      },
      "404": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        },
        "description": "The requested resource doesn't exist."
      },
      "409": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        },
        "description": "The request conflicts with another request (perhaps due to using the same idempotent key)."
      },
      "429": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        },
        "description": "Too many requests hit the API too quickly. We recommend an exponential backoff of your requests."
      },
      "500": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        },
        "description": "Something went wrong on the server end."
      },
      "502": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        },
        "description": "Something went wrong on the server end."
      },
      "503": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        },
        "description": "Something went wrong on the server end."
      },
      "504": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        },
        "description": "Something went wrong on the server end."
      },
      "TooManyRequests": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        },
        "description": "Too many requests. Wait the number of seconds in Retry-After, or until the RateLimit window resets, then retry.",
        "headers": {
          "RateLimit": {
            "$ref": "#/components/headers/RateLimit"
          },
          "RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimit-Limit"
          },
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimit-Policy"
          },
          "RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimit-Remaining"
          },
          "RateLimit-Reset": {
            "$ref": "#/components/headers/RateLimit-Reset"
          },
          "Retry-After": {
            "$ref": "#/components/headers/Retry-After"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/X-RateLimit-Limit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/X-RateLimit-Remaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/X-RateLimit-Reset"
          }
        }
      },
      "default": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        },
        "description": "Unexpected error"
      }
    },
    "schemas": {
      "Action": {
        "default": "ACTION_UNSPECIFIED",
        "description": "- ACTION_UNSPECIFIED: Action not specified\n - ACTION_SCAN: QR code scan\n - ACTION_CLICK: First-time direct link click",
        "enum": [
          "ACTION_UNSPECIFIED",
          "ACTION_SCAN",
          "ACTION_CLICK"
        ],
        "title": "The type of event action",
        "type": "string"
      },
      "AgentClaim": {
        "description": "What a claim link would hand over.",
        "properties": {
          "email": {
            "description": "The email the agent named for this claim. The workspace can only be claimed with it.",
            "type": "string"
          },
          "expiresAt": {
            "format": "date-time",
            "title": "When the code stops working",
            "type": "string"
          },
          "postClaimScopes": {
            "items": {
              "$ref": "#/components/schemas/ApiScope"
            },
            "title": "What the agent may do once the workspace is claimed",
            "type": "array"
          },
          "registeredAt": {
            "format": "date-time",
            "title": "When the agent registered",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/AgentClaimStatus",
            "title": "Where the link stands"
          }
        },
        "title": "AgentClaim",
        "type": "object"
      },
      "AgentClaimStatus": {
        "default": "AGENT_CLAIM_STATUS_UNSPECIFIED",
        "description": "Where a claim link stands.\n\n - AGENT_CLAIM_STATUS_PENDING: The link is live: enter the code to claim the workspace\n - AGENT_CLAIM_STATUS_CLAIMED: The workspace has been claimed\n - AGENT_CLAIM_STATUS_EXPIRED: The link or the registration expired, or the agent started a newer claim",
        "enum": [
          "AGENT_CLAIM_STATUS_UNSPECIFIED",
          "AGENT_CLAIM_STATUS_PENDING",
          "AGENT_CLAIM_STATUS_CLAIMED",
          "AGENT_CLAIM_STATUS_EXPIRED"
        ],
        "title": "AgentClaimStatus",
        "type": "string"
      },
      "AnalyticsDashboard": {
        "properties": {
          "chatMessages": {
            "items": {
              "$ref": "#/components/schemas/ChatDisplayMessage",
              "type": "object"
            },
            "title": "User-visible chat messages for rendering in the chat panel",
            "type": "array"
          },
          "config": {
            "$ref": "#/components/schemas/DashboardConfig"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "linkId": {
            "description": "Link this dashboard is scoped to. Empty for the workspace-wide dashboard.",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "title": "AnalyticsDashboard represents a workspace's analytics dashboard",
        "type": "object"
      },
      "AnalyticsDashboardServiceGenerateWidgetSummaryBody": {
        "properties": {
          "force": {
            "title": "Regenerate even when the stored result is still current",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "AnalyticsDashboardServiceUpdateDashboardBody": {
        "properties": {
          "config": {
            "$ref": "#/components/schemas/DashboardConfig"
          },
          "name": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "AnalyticsWidgetResult": {
        "description": "AnalyticsWidgetResult is a generated result for an on-demand widget tab.",
        "properties": {
          "currentCount": {
            "format": "int32",
            "title": "How many values exist now, for \"N new answers since this ran\"",
            "type": "integer"
          },
          "generatedAt": {
            "format": "date-time",
            "title": "When it was produced",
            "type": "string"
          },
          "sourceCount": {
            "format": "int32",
            "title": "How many values it was generated from",
            "type": "integer"
          },
          "stale": {
            "description": "True when the underlying values have changed since it was generated, so\nthe UI can offer a re-run rather than presenting stale prose as current.",
            "type": "boolean"
          },
          "text": {
            "title": "The generated analysis",
            "type": "string"
          },
          "widgetId": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "ApiScope": {
        "default": "API_SCOPE_UNSPECIFIED",
        "description": "ApiScope is one permission an API token or OAuth grant can hold.\n\nA write scope also grants the read scope of the same resource.\n\n - API_SCOPE_UNSPECIFIED: Not a scope. Rejected wherever a scope is expected.\n - API_SCOPE_LINKS_READ: Read links, their QR code images, tags, folders and link settings.\n - API_SCOPE_LINKS_WRITE: Create, update and delete links, tags, folders and link settings.\n - API_SCOPE_WORKFLOWS_READ: Read the workflow steps behind a link and validate them.\n - API_SCOPE_WORKFLOWS_WRITE: Create, connect, update, lay out and delete workflow steps.\n - API_SCOPE_QRCODES_READ: Read QR code designs and QR code templates.\n - API_SCOPE_QRCODES_WRITE: Change QR code designs and create, publish and delete QR code templates.\n - API_SCOPE_PAGE_THEMES_READ: Read page themes and page theme templates.\n - API_SCOPE_PAGE_THEMES_WRITE: Change page themes and create, publish and delete page theme templates.\n - API_SCOPE_MEDIA_READ: Read uploaded media.\n - API_SCOPE_MEDIA_WRITE: Upload and delete media.\n - API_SCOPE_DOMAINS_READ: Read custom domains and their DNS instructions.\n - API_SCOPE_DOMAINS_WRITE: Add, verify, update and delete custom domains.\n - API_SCOPE_VISITORS_READ: Read and search visitors and their attributes.\n - API_SCOPE_VISITORS_WRITE: Identify, update and delete visitors and their attributes.\n - API_SCOPE_ANALYTICS_READ: Read events, metrics, time series, analytics data and dashboards.\n - API_SCOPE_ANALYTICS_WRITE: Create, update and delete analytics dashboards and generate widget summaries.\n - API_SCOPE_WEBHOOKS_READ: Read webhooks.\n - API_SCOPE_WEBHOOKS_WRITE: Create, update and delete webhooks.\n - API_SCOPE_INTEGRATIONS_READ: Read the Slack and Google Forms integrations.\n - API_SCOPE_INTEGRATIONS_WRITE: Connect, configure, test, sync and disconnect the Slack and Google Forms integrations.\n - API_SCOPE_WORKSPACE_READ: Read the workspace and its settings.\n - API_SCOPE_WORKSPACE_WRITE: Update the workspace, request enrollment and delete the workspace.\n - API_SCOPE_MEMBERS_READ: Read workspace members.\n - API_SCOPE_MEMBERS_WRITE: Update, revoke, sign out and remove members. Inviting a member or changing a sign-in email or password needs full access.\n - API_SCOPE_TOKENS_READ: Read API tokens and their scopes, never their secrets.\n - API_SCOPE_TOKENS_WRITE: Create, update and delete API tokens, limited to the scopes the calling token holds.\n - API_SCOPE_BILLING_WRITE: Open checkout, credit top-up and billing portal sessions.\n - API_SCOPE_ASSISTANT_READ: Read the Assistant conversation.\n - API_SCOPE_ASSISTANT_WRITE: Send files to the Assistant, clear the conversation and contact support.",
        "enum": [
          "API_SCOPE_UNSPECIFIED",
          "API_SCOPE_LINKS_READ",
          "API_SCOPE_LINKS_WRITE",
          "API_SCOPE_WORKFLOWS_READ",
          "API_SCOPE_WORKFLOWS_WRITE",
          "API_SCOPE_QRCODES_READ",
          "API_SCOPE_QRCODES_WRITE",
          "API_SCOPE_PAGE_THEMES_READ",
          "API_SCOPE_PAGE_THEMES_WRITE",
          "API_SCOPE_MEDIA_READ",
          "API_SCOPE_MEDIA_WRITE",
          "API_SCOPE_DOMAINS_READ",
          "API_SCOPE_DOMAINS_WRITE",
          "API_SCOPE_VISITORS_READ",
          "API_SCOPE_VISITORS_WRITE",
          "API_SCOPE_ANALYTICS_READ",
          "API_SCOPE_ANALYTICS_WRITE",
          "API_SCOPE_WEBHOOKS_READ",
          "API_SCOPE_WEBHOOKS_WRITE",
          "API_SCOPE_INTEGRATIONS_READ",
          "API_SCOPE_INTEGRATIONS_WRITE",
          "API_SCOPE_WORKSPACE_READ",
          "API_SCOPE_WORKSPACE_WRITE",
          "API_SCOPE_MEMBERS_READ",
          "API_SCOPE_MEMBERS_WRITE",
          "API_SCOPE_TOKENS_READ",
          "API_SCOPE_TOKENS_WRITE",
          "API_SCOPE_BILLING_WRITE",
          "API_SCOPE_ASSISTANT_READ",
          "API_SCOPE_ASSISTANT_WRITE"
        ],
        "type": "string"
      },
      "ApiScopeAccess": {
        "default": "API_SCOPE_ACCESS_UNSPECIFIED",
        "description": "ApiScopeAccess is what a scope allows on its resource.\n\n - API_SCOPE_ACCESS_UNSPECIFIED: Not set.\n - API_SCOPE_ACCESS_READ: Reads only.\n - API_SCOPE_ACCESS_WRITE: Reads and writes.",
        "enum": [
          "API_SCOPE_ACCESS_UNSPECIFIED",
          "API_SCOPE_ACCESS_READ",
          "API_SCOPE_ACCESS_WRITE"
        ],
        "type": "string"
      },
      "ApiScopeInfo": {
        "description": "ApiScopeInfo describes one scope for people and agents choosing scopes.",
        "properties": {
          "access": {
            "$ref": "#/components/schemas/ApiScopeAccess",
            "description": "Whether the scope reads or writes the resource."
          },
          "description": {
            "description": "What the scope allows.",
            "type": "string"
          },
          "name": {
            "description": "The scope string as it appears in OAuth grants and error messages (e.g. links:read).",
            "example": "links:read",
            "type": "string"
          },
          "resource": {
            "description": "The resource the scope covers (e.g. links).",
            "example": "links",
            "type": "string"
          },
          "scope": {
            "description": "ApiScope is one permission an API token or OAuth grant can hold.\n\nA write scope also grants the read scope of the same resource.\n\n - API_SCOPE_UNSPECIFIED: Not a scope. Rejected wherever a scope is expected.\n - API_SCOPE_LINKS_READ: Read links, their QR code images, tags, folders and link settings.\n - API_SCOPE_LINKS_WRITE: Create, update and delete links, tags, folders and link settings.\n - API_SCOPE_WORKFLOWS_READ: Read the workflow steps behind a link and validate them.\n - API_SCOPE_WORKFLOWS_WRITE: Create, connect, update, lay out and delete workflow steps.\n - API_SCOPE_QRCODES_READ: Read QR code designs and QR code templates.\n - API_SCOPE_QRCODES_WRITE: Change QR code designs and create, publish and delete QR code templates.\n - API_SCOPE_PAGE_THEMES_READ: Read page themes and page theme templates.\n - API_SCOPE_PAGE_THEMES_WRITE: Change page themes and create, publish and delete page theme templates.\n - API_SCOPE_MEDIA_READ: Read uploaded media.\n - API_SCOPE_MEDIA_WRITE: Upload and delete media.\n - API_SCOPE_DOMAINS_READ: Read custom domains and their DNS instructions.\n - API_SCOPE_DOMAINS_WRITE: Add, verify, update and delete custom domains.\n - API_SCOPE_VISITORS_READ: Read and search visitors and their attributes.\n - API_SCOPE_VISITORS_WRITE: Identify, update and delete visitors and their attributes.\n - API_SCOPE_ANALYTICS_READ: Read events, metrics, time series, analytics data and dashboards.\n - API_SCOPE_ANALYTICS_WRITE: Create, update and delete analytics dashboards and generate widget summaries.\n - API_SCOPE_WEBHOOKS_READ: Read webhooks.\n - API_SCOPE_WEBHOOKS_WRITE: Create, update and delete webhooks.\n - API_SCOPE_INTEGRATIONS_READ: Read the Slack and Google Forms integrations.\n - API_SCOPE_INTEGRATIONS_WRITE: Connect, configure, test, sync and disconnect the Slack and Google Forms integrations.\n - API_SCOPE_WORKSPACE_READ: Read the workspace and its settings.\n - API_SCOPE_WORKSPACE_WRITE: Update the workspace, request enrollment and delete the workspace.\n - API_SCOPE_MEMBERS_READ: Read workspace members.\n - API_SCOPE_MEMBERS_WRITE: Update, revoke, sign out and remove members. Inviting a member or changing a sign-in email or password needs full access.\n - API_SCOPE_TOKENS_READ: Read API tokens and their scopes, never their secrets.\n - API_SCOPE_TOKENS_WRITE: Create, update and delete API tokens, limited to the scopes the calling token holds.\n - API_SCOPE_BILLING_WRITE: Open checkout, credit top-up and billing portal sessions.\n - API_SCOPE_ASSISTANT_READ: Read the Assistant conversation.\n - API_SCOPE_ASSISTANT_WRITE: Send files to the Assistant, clear the conversation and contact support.",
            "enum": [
              "API_SCOPE_UNSPECIFIED",
              "API_SCOPE_LINKS_READ",
              "API_SCOPE_LINKS_WRITE",
              "API_SCOPE_WORKFLOWS_READ",
              "API_SCOPE_WORKFLOWS_WRITE",
              "API_SCOPE_QRCODES_READ",
              "API_SCOPE_QRCODES_WRITE",
              "API_SCOPE_PAGE_THEMES_READ",
              "API_SCOPE_PAGE_THEMES_WRITE",
              "API_SCOPE_MEDIA_READ",
              "API_SCOPE_MEDIA_WRITE",
              "API_SCOPE_DOMAINS_READ",
              "API_SCOPE_DOMAINS_WRITE",
              "API_SCOPE_VISITORS_READ",
              "API_SCOPE_VISITORS_WRITE",
              "API_SCOPE_ANALYTICS_READ",
              "API_SCOPE_ANALYTICS_WRITE",
              "API_SCOPE_WEBHOOKS_READ",
              "API_SCOPE_WEBHOOKS_WRITE",
              "API_SCOPE_INTEGRATIONS_READ",
              "API_SCOPE_INTEGRATIONS_WRITE",
              "API_SCOPE_WORKSPACE_READ",
              "API_SCOPE_WORKSPACE_WRITE",
              "API_SCOPE_MEMBERS_READ",
              "API_SCOPE_MEMBERS_WRITE",
              "API_SCOPE_TOKENS_READ",
              "API_SCOPE_TOKENS_WRITE",
              "API_SCOPE_BILLING_WRITE",
              "API_SCOPE_ASSISTANT_READ",
              "API_SCOPE_ASSISTANT_WRITE"
            ]
          }
        },
        "type": "object"
      },
      "ApplyPageThemeTemplateRequest": {
        "properties": {
          "linkId": {
            "title": "Link whose page theme should be restyled",
            "type": "string"
          },
          "pageThemeTemplateId": {
            "description": "Template to apply, addressed by ID. Use this for workspace templates that have not been published and therefore have no slug.",
            "example": "0d7f4d9c-1aef-4ed4-821b-321a3f9cba1d",
            "type": "string"
          },
          "slug": {
            "description": "Slug of the page theme template to apply.\n\nOnly published and built-in templates carry a slug: it is the public\nidentifier the gallery and the marketing site address them by. Supply\npage_theme_template_id instead for a workspace's own drafts, which have\nnone. Exactly one of the two is required.",
            "type": "string"
          }
        },
        "required": [
          "linkId"
        ],
        "title": "Request to apply a page theme template to a link",
        "type": "object"
      },
      "ApplyPageThemeTemplateResponse": {
        "properties": {
          "pageTheme": {
            "$ref": "#/components/schemas/PageTheme",
            "title": "The link's page theme, with the template's styling applied"
          }
        },
        "title": "Response after applying a page theme template",
        "type": "object"
      },
      "ApplyQrcodeTemplateRequest": {
        "description": "ApplyQrcodeTemplateRequest applies a community template's design to an existing link's QR code.",
        "properties": {
          "linkId": {
            "example": "550e8400-e29b-41d4-a716-446655440000",
            "title": "The ID of the link to apply the template to (UUID)",
            "type": "string"
          },
          "qrcodeTemplateId": {
            "description": "Template to apply, addressed by ID. Use this for workspace templates that\nhave never been published and therefore have no slug.",
            "example": "550e8400-e29b-41d4-a716-446655440000",
            "type": "string"
          },
          "templateSlug": {
            "description": "Slug of the QR code template to apply.\n\nOnly published and built-in templates carry a slug: it is the public\nidentifier the gallery and the marketing site address them by. Supply\nqrcode_template_id instead for a workspace's own templates, which have\nnone. Exactly one of the two is required.",
            "example": "google-dinosaur",
            "type": "string"
          }
        },
        "required": [
          "linkId"
        ],
        "type": "object"
      },
      "ApplyQrcodeTemplateResponse": {
        "description": "ApplyQrcodeTemplateResponse returns the updated QR code design after applying the template.",
        "properties": {
          "qrcodeDesign": {
            "$ref": "#/components/schemas/QrcodeDesign",
            "title": "The updated QR code design with the template's styling applied"
          }
        },
        "type": "object"
      },
      "AssistantClearConversationResponse": {
        "title": "AssistantClearConversationResponse is empty on success",
        "type": "object"
      },
      "AssistantCompleteAttachmentUploadResponse": {
        "properties": {
          "fileId": {
            "title": "The attachment's id, to include in a message's file ids",
            "type": "string"
          },
          "mimeType": {
            "title": "The file's MIME type",
            "type": "string"
          },
          "name": {
            "title": "The file's name",
            "type": "string"
          },
          "size": {
            "format": "int64",
            "title": "The file's size in bytes",
            "type": "integer"
          }
        },
        "title": "The completed attachment",
        "type": "object"
      },
      "AssistantContextType": {
        "default": "ASSISTANT_CONTEXT_TYPE_UNSPECIFIED",
        "description": "- ASSISTANT_CONTEXT_TYPE_LINK_ANALYTICS: Building a link's analytics dashboard. context_id is the LINK id, not a\ndashboard id — the dashboard does not exist yet while the user and the\nassistant are still agreeing on what it should show. Once it exists,\nediting it happens under ASSISTANT_CONTEXT_TYPE_ANALYTICS_DASHBOARD instead.\n - ASSISTANT_CONTEXT_TYPE_WORKSPACE: The workspace-wide assistant, with no resource selected. The context id is\nthe WORKSPACE id: this thread is not about any one link, dashboard or\ndesign, and every capability the resource-scoped assistants have is available\nfrom it. One conversation per workspace, so it survives navigation.",
        "enum": [
          "ASSISTANT_CONTEXT_TYPE_UNSPECIFIED",
          "ASSISTANT_CONTEXT_TYPE_ANALYTICS_DASHBOARD",
          "ASSISTANT_CONTEXT_TYPE_WORKFLOW",
          "ASSISTANT_CONTEXT_TYPE_LINK",
          "ASSISTANT_CONTEXT_TYPE_QRCODE_DESIGN",
          "ASSISTANT_CONTEXT_TYPE_PAGE_THEME",
          "ASSISTANT_CONTEXT_TYPE_LINK_ANALYTICS",
          "ASSISTANT_CONTEXT_TYPE_WORKSPACE"
        ],
        "title": "Assistant context types",
        "type": "string"
      },
      "AssistantCreateAttachmentUploadRequest": {
        "properties": {
          "fileName": {
            "example": "menu.pdf",
            "title": "The file's name, shown with the message and kept if the file is stored as media",
            "type": "string"
          },
          "mimeType": {
            "description": "The file's MIME type. Empty is application/octet-stream. An image (PNG, JPEG, WebP, SVG), PDF or\nMP4 video must really be that format.",
            "example": "application/pdf",
            "type": "string"
          },
          "size": {
            "description": "The file's exact size in bytes, at most 50 MB. The PUT must send exactly this many bytes.",
            "example": "7340032",
            "format": "int64",
            "type": "integer"
          }
        },
        "required": [
          "fileName",
          "size"
        ],
        "title": "Request to start a direct attachment upload",
        "type": "object"
      },
      "AssistantCreateAttachmentUploadResponse": {
        "properties": {
          "fileId": {
            "title": "The attachment's id: what CompleteAttachmentUpload and a message's file ids take",
            "type": "string"
          },
          "uploadExpiresAt": {
            "format": "date-time",
            "title": "When upload_url stops accepting the file",
            "type": "string"
          },
          "uploadHeaders": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Headers the upload must carry, exactly as given. The Content-Length must equal the declared size.",
            "type": "object"
          },
          "uploadMethod": {
            "title": "The HTTP method to send them with: always PUT",
            "type": "string"
          },
          "uploadUrl": {
            "description": "Where to send the file's bytes, directly to storage. Short-lived.",
            "type": "string"
          }
        },
        "title": "A reserved attachment and where to upload its file",
        "type": "object"
      },
      "AssistantDisplayMessage": {
        "properties": {
          "attachments": {
            "items": {
              "$ref": "#/components/schemas/AssistantDisplayMessageAttachment",
              "type": "object"
            },
            "type": "array"
          },
          "id": {
            "type": "string"
          },
          "readAt": {
            "description": "When the member had this assistant message on screen. Unset while an\nassistant message has not been seen, and on every user message.",
            "format": "date-time",
            "type": "string"
          },
          "sender": {
            "type": "string"
          },
          "text": {
            "type": "string"
          },
          "timestamp": {
            "format": "date-time",
            "type": "string"
          },
          "uiActions": {
            "description": "The buttons the reply showed, so a reopened conversation offers them again.",
            "items": {
              "$ref": "#/components/schemas/ChatUIAction",
              "type": "object"
            },
            "type": "array"
          }
        },
        "title": "AssistantDisplayMessage is a user-visible message for rendering",
        "type": "object"
      },
      "AssistantDisplayMessageAttachment": {
        "properties": {
          "mimeType": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "title": "AssistantDisplayMessageAttachment is a file attached to a message",
        "type": "object"
      },
      "AssistantGetConversationResponse": {
        "properties": {
          "messages": {
            "items": {
              "$ref": "#/components/schemas/AssistantDisplayMessage",
              "type": "object"
            },
            "type": "array"
          },
          "unreadCount": {
            "description": "Assistant messages in this conversation the member has not seen yet.",
            "format": "int32",
            "type": "integer"
          }
        },
        "title": "AssistantGetConversationResponse contains the display-ready messages",
        "type": "object"
      },
      "AssistantMarkConversationReadRequest": {
        "properties": {
          "contextId": {
            "type": "string"
          },
          "contextType": {
            "$ref": "#/components/schemas/AssistantContextType"
          }
        },
        "title": "AssistantMarkConversationReadRequest marks a conversation's replies as seen",
        "type": "object"
      },
      "AssistantMarkConversationReadResponse": {
        "properties": {
          "markedCount": {
            "format": "int32",
            "type": "integer"
          }
        },
        "title": "AssistantMarkConversationReadResponse reports how many replies this call marked",
        "type": "object"
      },
      "AssistantServiceCompleteAttachmentUploadBody": {
        "title": "Request to complete a direct attachment upload",
        "type": "object"
      },
      "AssistantUploadFileRequest": {
        "properties": {
          "content": {
            "title": "File content (base64-encoded in JSON)",
            "type": "string"
          },
          "mimeType": {
            "title": "MIME type (e.g. \"image/png\", \"application/pdf\")",
            "type": "string"
          },
          "name": {
            "title": "Original filename",
            "type": "string"
          }
        },
        "title": "AssistantUploadFileRequest uploads a file for assistant chat attachment",
        "type": "object"
      },
      "AssistantUploadFileResponse": {
        "properties": {
          "fileId": {
            "title": "Temporary file ID to include in assistant message attachments",
            "type": "string"
          },
          "mimeType": {
            "title": "MIME type (echoed back)",
            "type": "string"
          },
          "name": {
            "title": "Original filename (echoed back)",
            "type": "string"
          }
        },
        "title": "AssistantUploadFileResponse returns the temporary file reference",
        "type": "object"
      },
      "AttributeCapture": {
        "description": "A step's opt-in to save values to the visitor's profile, so a workflow can\nrecord qualification without a form: a tapped choice, a milestone reached,\nor the context of the link that was scanned.\n\nAvailable on every step except conditions, which only route on what is\nalready known. A failed password attempt or a skipped form saves nothing.\nOn forms it saves on top of the answers, which forms already save.",
        "properties": {
          "enabled": {
            "description": "Off keeps the configured writes without running them.",
            "type": "boolean"
          },
          "writes": {
            "description": "Up to 20 values to save. Each runs when the visitor goes through the step.",
            "items": {
              "$ref": "#/components/schemas/AttributeWrite",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "AttributeValueDataPoint": {
        "properties": {
          "label": {
            "type": "string"
          },
          "percentage": {
            "format": "double",
            "type": "number"
          },
          "visitorCount": {
            "format": "int32",
            "type": "integer"
          }
        },
        "title": "AttributeValueDataPoint is one value of an attribute with how many visitors hold it",
        "type": "object"
      },
      "AttributeValueEntry": {
        "properties": {
          "recordedAt": {
            "format": "date-time",
            "title": "When the visitor last set it",
            "type": "string"
          },
          "value": {
            "title": "The value as captured",
            "type": "string"
          }
        },
        "title": "AttributeValueEntry is one recorded value of an attribute",
        "type": "object"
      },
      "AttributeWrite": {
        "description": "One value saved to the visitor's profile.",
        "properties": {
          "key": {
            "description": "The attribute key, such as \"looking_for\" or \"book_a_viewing_at\". Letters,\ndigits, \"_\", \"-\" and \".\"; keys starting with \"$\" are reserved.",
            "example": "looking_for",
            "type": "string"
          },
          "mode": {
            "description": " - ATTRIBUTE_WRITE_MODE_SET: Overwrite, so the profile holds the latest value.\n - ATTRIBUTE_WRITE_MODE_SET_ONCE: Keep the first value, for first-touch facts.",
            "enum": [
              "ATTRIBUTE_WRITE_MODE_UNSPECIFIED",
              "ATTRIBUTE_WRITE_MODE_SET",
              "ATTRIBUTE_WRITE_MODE_SET_ONCE"
            ]
          },
          "type": {
            "description": "VisitorAttributeType is what a value was captured as. It decides how the\nvalue is parsed and which analytics the key can support, which the value\nalone cannot tell you: \"8\" from a rating field and \"8\" typed into a text box\nare different facts.",
            "enum": [
              "VISITOR_ATTRIBUTE_TYPE_UNSPECIFIED",
              "VISITOR_ATTRIBUTE_TYPE_STRING",
              "VISITOR_ATTRIBUTE_TYPE_NUMBER",
              "VISITOR_ATTRIBUTE_TYPE_BOOLEAN",
              "VISITOR_ATTRIBUTE_TYPE_DATE",
              "VISITOR_ATTRIBUTE_TYPE_ENUM"
            ]
          },
          "value": {
            "description": "Literal text, or a template filled in when the visitor goes through the\nstep: {{now}}, {{link.name}}, {{link.metadata.\u003ckey\u003e}}, and on MULTI_LINK\nsteps {{choice.label}} and {{choice.id}} for the button tapped. A write\nwhose value comes out empty is skipped.",
            "example": "{{choice.label}}",
            "type": "string"
          }
        },
        "type": "object"
      },
      "AttributeWriteMode": {
        "default": "ATTRIBUTE_WRITE_MODE_UNSPECIFIED",
        "description": " - ATTRIBUTE_WRITE_MODE_SET: Overwrite, so the profile holds the latest value.\n - ATTRIBUTE_WRITE_MODE_SET_ONCE: Keep the first value, for first-touch facts.",
        "enum": [
          "ATTRIBUTE_WRITE_MODE_UNSPECIFIED",
          "ATTRIBUTE_WRITE_MODE_SET",
          "ATTRIBUTE_WRITE_MODE_SET_ONCE"
        ],
        "type": "string"
      },
      "AutoLayoutWorkflowResponse": {
        "properties": {
          "stepsRepositioned": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "BackButton": {
        "description": "A page step's optional back button: a secondary button under the page's\nmain actions that returns the visitor to the previous page in their\nbrowser, exactly like the browser's own back button. Use it for \"Back to\nmenu\" on a sub-page reached from a MULTI_LINK menu instead of wiring a\nconnection back to the menu.\n\nIt hides itself when there is no previous page in the journey, such as on\nthe first page right after a scan, and it never shows on a step whose\nback_button_available is false. Available on page steps only:\nMESSAGE_PAGE, MULTI_LINK, CONTACT_CARD, SOCIAL_LINKS_PAGE, FORM_SUBMIT,\nPASSWORD_VERIFY and THANK_YOU_PAGE. It is not part of the step's payload:\nset it with the back_button field of workflow_steps_create or\nworkflow_steps_update.",
        "properties": {
          "enabled": {
            "description": "Shows the button. Off keeps the label for when it is switched back on.",
            "type": "boolean"
          },
          "label": {
            "description": "Text on the button, up to 40 characters. Defaults to \"Back\".",
            "example": "Back to menu",
            "type": "string"
          }
        },
        "type": "object"
      },
      "BackgroundOptions": {
        "properties": {
          "themeColor": {
            "$ref": "#/components/schemas/ThemeColor",
            "title": "Color configuration supporting solid colors and gradients"
          }
        },
        "title": "BackgroundOptions represents the styling options for the QR code background",
        "type": "object"
      },
      "BillingInterval": {
        "default": "BILLING_INTERVAL_UNSPECIFIED",
        "description": "- BILLING_INTERVAL_UNSPECIFIED: Not set\n - BILLING_INTERVAL_MONTH: Charged every month\n - BILLING_INTERVAL_YEAR: Charged every year\n - BILLING_INTERVAL_ONE_TIME: Charged once",
        "enum": [
          "BILLING_INTERVAL_UNSPECIFIED",
          "BILLING_INTERVAL_MONTH",
          "BILLING_INTERVAL_YEAR",
          "BILLING_INTERVAL_ONE_TIME"
        ],
        "title": "BillingInterval is how often a price is charged",
        "type": "string"
      },
      "BreakdownDataPoint": {
        "properties": {
          "code": {
            "title": "Optional code (e.g. ISO 3166-1 alpha-2 country code for country dimension)",
            "type": "string"
          },
          "eventCount": {
            "format": "int32",
            "title": "Number of events for this dimension value",
            "type": "integer"
          },
          "label": {
            "title": "Dimension label (e.g. browser name, country name, device type)",
            "type": "string"
          },
          "percentage": {
            "format": "double",
            "title": "Percentage of total events",
            "type": "number"
          }
        },
        "title": "BreakdownDataPoint represents a single dimension breakdown data point",
        "type": "object"
      },
      "CanvasPosition": {
        "properties": {
          "x": {
            "format": "double",
            "title": "X coordinate on the canvas",
            "type": "number"
          },
          "y": {
            "format": "double",
            "title": "Y coordinate on the canvas",
            "type": "number"
          }
        },
        "title": "Canvas position for React Flow node positioning",
        "type": "object"
      },
      "ChatDisplayMessage": {
        "properties": {
          "id": {
            "type": "string"
          },
          "sender": {
            "title": "\"user\" or \"assistant\"",
            "type": "string"
          },
          "text": {
            "type": "string"
          },
          "timestamp": {
            "format": "date-time",
            "type": "string"
          }
        },
        "title": "ChatDisplayMessage is a user-visible chat message for rendering in the UI",
        "type": "object"
      },
      "ChatUIAction": {
        "properties": {
          "label": {
            "type": "string"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/ChatUIOption",
              "type": "object"
            },
            "type": "array"
          },
          "type": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        },
        "title": "ChatUIAction represents an interactive element rendered in the chat",
        "type": "object"
      },
      "ChatUIOption": {
        "properties": {
          "description": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "CheckCustomDomainResponse": {
        "properties": {
          "customDomain": {
            "$ref": "#/components/schemas/CustomDomain"
          }
        },
        "title": "Response containing the status of a custom domain",
        "type": "object"
      },
      "ClaimAgentWorkspaceRequest": {
        "properties": {
          "claimAttemptToken": {
            "title": "The claim_attempt_token from the link the agent handed over",
            "type": "string"
          },
          "firebaseToken": {
            "description": "A Firebase ID token from Google or Microsoft sign-in, for the claim email. Set this or password.",
            "type": "string"
          },
          "password": {
            "description": "A password for the claim email. Set this or firebase_token.",
            "type": "string"
          },
          "userCode": {
            "title": "The 6-digit code the agent gave you",
            "type": "string"
          }
        },
        "title": "Request to claim an agent's workspace",
        "type": "object"
      },
      "ClientRedirectPayload": {
        "properties": {
          "conversionTracking": {
            "example": true,
            "title": "Controls whether lbid is preserved in redirect URL",
            "type": "boolean"
          },
          "destination": {
            "example": "https://brand.example.com/checkout",
            "title": "Fully qualified URL used for the redirect",
            "type": "string"
          }
        },
        "title": "Client redirect payload for EVENT_ACTION_CLIENT_REDIRECT",
        "type": "object"
      },
      "CompleteGoogleFormsOAuthRequest": {
        "properties": {
          "code": {
            "type": "string"
          },
          "state": {
            "type": "string"
          }
        },
        "required": [
          "code",
          "state"
        ],
        "type": "object"
      },
      "CompleteGoogleFormsOAuthResponse": {
        "properties": {
          "integration": {
            "$ref": "#/components/schemas/GoogleFormsIntegration"
          }
        },
        "type": "object"
      },
      "CompleteMediaReplaceResponse": {
        "properties": {
          "detachedReferences": {
            "description": "The uses detached from the media because they keep their own copy of the old file: QR code designs\nthat used it as their logo. They keep showing their current logo.",
            "items": {
              "$ref": "#/components/schemas/MediaReference",
              "type": "object"
            },
            "type": "array"
          },
          "media": {
            "$ref": "#/components/schemas/Media",
            "title": "The media item, same id, holding the new file, with a signed URL and its references"
          },
          "unchanged": {
            "title": "True when the new file was the media's own: nothing changed",
            "type": "boolean"
          }
        },
        "title": "The media item after its file was replaced",
        "type": "object"
      },
      "CompleteMediaUploadResponse": {
        "properties": {
          "media": {
            "$ref": "#/components/schemas/Media",
            "title": "The media item, now READY, with a signed URL"
          }
        },
        "title": "The completed media item",
        "type": "object"
      },
      "CompleteSlackOAuthRequest": {
        "properties": {
          "code": {
            "title": "The authorization code received from Slack",
            "type": "string"
          },
          "state": {
            "title": "The state parameter for CSRF validation",
            "type": "string"
          }
        },
        "required": [
          "code",
          "state"
        ],
        "title": "CompleteSlackOAuthRequest completes the OAuth flow by exchanging the authorization code",
        "type": "object"
      },
      "CompleteSlackOAuthResponse": {
        "properties": {
          "slackIntegration": {
            "$ref": "#/components/schemas/SlackIntegration",
            "title": "The newly created Slack integration"
          }
        },
        "title": "CompleteSlackOAuthResponse returns the created Slack integration",
        "type": "object"
      },
      "ConnectWorkflowStepResponse": {
        "properties": {
          "disconnectedSteps": {
            "description": "Steps that nothing can reach now that this connection changed. Empty means\nthe whole workflow is still connected.",
            "items": {
              "$ref": "#/components/schemas/WorkflowIssue",
              "type": "object"
            },
            "type": "array"
          },
          "unconnectedBranchIds": {
            "description": "Branches of this step that still lead nowhere, reported without being\nasked for.\n\nWiring one branch of a condition and forgetting the rest is the most\ncommon way a workflow ships broken: the visitor who takes an unwired\nbranch falls through to the fallback URL. Nothing here is unreachable, so\na graph-level check would not catch it — only the step itself knows.\nEmpty means every exit of this step leads somewhere.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "workflowStep": {
            "$ref": "#/components/schemas/WorkflowStep",
            "title": "The step the connection leaves from, as it now stands"
          }
        },
        "title": "Response for connecting a workflow step branch",
        "type": "object"
      },
      "ContactCardTraceCard": {
        "description": "ContactCardTraceCard stores vCard metadata captured for contact cards.",
        "properties": {
          "buttonLabel": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "organization": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "postalCode": {
            "type": "string"
          },
          "state": {
            "type": "string"
          },
          "streetAddress": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "website": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "ContactCardTraceData": {
        "description": "ContactCardTraceData stores contact card engagement details.",
        "properties": {
          "card": {
            "$ref": "#/components/schemas/ContactCardTraceCard"
          }
        },
        "type": "object"
      },
      "ContainerConfig": {
        "properties": {
          "backgroundColor": {
            "$ref": "#/components/schemas/ThemeColor",
            "title": "Background color"
          },
          "borderColor": {
            "$ref": "#/components/schemas/ThemeColor",
            "title": "Border color"
          },
          "borderSize": {
            "format": "int32",
            "title": "Border size in pixels (0 or more)",
            "type": "integer"
          },
          "borderStyle": {
            "enum": [
              "PAGE_THEME_BORDER_STYLE_UNSPECIFIED",
              "PAGE_THEME_BORDER_STYLE_SOLID",
              "PAGE_THEME_BORDER_STYLE_DASHED",
              "PAGE_THEME_BORDER_STYLE_DOTTED",
              "PAGE_THEME_BORDER_STYLE_DOUBLE",
              "PAGE_THEME_BORDER_STYLE_GROOVE",
              "PAGE_THEME_BORDER_STYLE_RIDGE"
            ],
            "title": "Border style"
          },
          "opacity": {
            "format": "int32",
            "title": "Opacity (0-100%)",
            "type": "integer"
          },
          "variant": {
            "enum": [
              "PAGE_THEME_CONTAINER_VARIANT_UNSPECIFIED",
              "PAGE_THEME_CONTAINER_VARIANT_ROUNDED",
              "PAGE_THEME_CONTAINER_VARIANT_SQUARE"
            ],
            "title": "Container variant (required when container_config is set)"
          }
        },
        "title": "Container styling configuration",
        "type": "object"
      },
      "CornersDotOptions": {
        "properties": {
          "themeColor": {
            "$ref": "#/components/schemas/ThemeColor",
            "title": "Color configuration supporting solid colors and gradients"
          },
          "type": {
            "enum": [
              "CORNERS_DOT_TYPE_UNSPECIFIED",
              "CORNERS_DOT_TYPE_DOT",
              "CORNERS_DOT_TYPE_SQUARE",
              "CORNERS_DOT_TYPE_HEXAGON",
              "CORNERS_DOT_TYPE_OCTAGON",
              "CORNERS_DOT_TYPE_TEARDROP",
              "CORNERS_DOT_TYPE_STAR"
            ],
            "title": "Rendering style for the dot corners"
          }
        },
        "title": "CornersDotOptions represents the styling options for the dot corners in the QR code",
        "type": "object"
      },
      "CornersDotType": {
        "default": "CORNERS_DOT_TYPE_UNSPECIFIED",
        "enum": [
          "CORNERS_DOT_TYPE_UNSPECIFIED",
          "CORNERS_DOT_TYPE_DOT",
          "CORNERS_DOT_TYPE_SQUARE",
          "CORNERS_DOT_TYPE_HEXAGON",
          "CORNERS_DOT_TYPE_OCTAGON",
          "CORNERS_DOT_TYPE_TEARDROP",
          "CORNERS_DOT_TYPE_STAR"
        ],
        "title": "CornersDotType represents the rendering style for QR code corner inner dots",
        "type": "string"
      },
      "CornersSquareOptions": {
        "properties": {
          "themeColor": {
            "$ref": "#/components/schemas/ThemeColor",
            "title": "Color configuration supporting solid colors and gradients"
          },
          "type": {
            "enum": [
              "CORNERS_SQUARE_TYPE_UNSPECIFIED",
              "CORNERS_SQUARE_TYPE_DOT",
              "CORNERS_SQUARE_TYPE_SQUARE",
              "CORNERS_SQUARE_TYPE_EXTRA_ROUNDED",
              "CORNERS_SQUARE_TYPE_HEXAGON",
              "CORNERS_SQUARE_TYPE_OCTAGON",
              "CORNERS_SQUARE_TYPE_LEAF"
            ],
            "title": "Rendering style for the square corners"
          }
        },
        "title": "CornersSquareOptions represents the styling options for the square corners in the QR code",
        "type": "object"
      },
      "CornersSquareType": {
        "default": "CORNERS_SQUARE_TYPE_UNSPECIFIED",
        "enum": [
          "CORNERS_SQUARE_TYPE_UNSPECIFIED",
          "CORNERS_SQUARE_TYPE_DOT",
          "CORNERS_SQUARE_TYPE_SQUARE",
          "CORNERS_SQUARE_TYPE_EXTRA_ROUNDED",
          "CORNERS_SQUARE_TYPE_HEXAGON",
          "CORNERS_SQUARE_TYPE_OCTAGON",
          "CORNERS_SQUARE_TYPE_LEAF"
        ],
        "title": "CornersSquareType represents the rendering style for QR code corner squares",
        "type": "string"
      },
      "CountryConditionOutcome": {
        "properties": {
          "countryCode": {
            "example": "US",
            "title": "ISO 3166-1 alpha-2 country code (e.g., \"US\", \"FR\", \"GB\")",
            "type": "string"
          },
          "nextStepId": {
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "title": "Workflow step ID to route to for this country (UUID)",
            "type": "string"
          }
        },
        "title": "Country condition outcome definition for EVENT_ACTION_COUNTRY_CONDITION",
        "type": "object"
      },
      "CountryConditionPayload": {
        "properties": {
          "countries": {
            "items": {
              "$ref": "#/components/schemas/CountryConditionOutcome",
              "type": "object"
            },
            "title": "Country routing configuration",
            "type": "array"
          },
          "elseNextStepId": {
            "example": "987fcdeb-a321-45e6-b789-123456789012",
            "title": "Workflow step ID to route to if country doesn't match any configured options (UUID)",
            "type": "string"
          }
        },
        "title": "Country condition payload for EVENT_ACTION_COUNTRY_CONDITION",
        "type": "object"
      },
      "CountryConditionTraceData": {
        "description": "CountryConditionTraceData stores country condition routing metadata.",
        "properties": {
          "countries": {
            "items": {
              "$ref": "#/components/schemas/CountryConditionTraceOption",
              "type": "object"
            },
            "type": "array"
          },
          "hasElse": {
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "CountryConditionTraceOption": {
        "properties": {
          "countryCode": {
            "type": "string"
          },
          "hasRoute": {
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "CreateBulkLinksRequest": {
        "description": "Request to create links in bulk.",
        "properties": {
          "links": {
            "description": "Links to create in one batch.\nEvery item supports the same customization fields as CreateLinkRequest.",
            "items": {
              "$ref": "#/components/schemas/CreateLinkRequest",
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "links"
        ],
        "type": "object"
      },
      "CreateBulkLinksResponse": {
        "description": "Response containing all created links from a successful batch.",
        "properties": {
          "links": {
            "items": {
              "$ref": "#/components/schemas/Link",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "CreateContactLinkRequest": {
        "description": "Request to create a new contact card link.",
        "properties": {
          "customDomainId": {
            "description": "Optional custom domain ID (UUID). Leave empty to use the default domain.\nOnly provide if the user explicitly asks for a specific custom domain.",
            "example": "d290f1ee-6c54-4b01-90e6-d701748f0851",
            "type": "string"
          },
          "directoryId": {
            "description": "Directory to organize this link into. If empty, link is created at root level.",
            "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
            "type": "string"
          },
          "expiredDestination": {
            "description": "Where visitors are sent once the link has expired.\nEmpty serves the built-in expired page instead.",
            "example": "https://example.com/campaign-over",
            "type": "string"
          },
          "expiresAt": {
            "description": "When the link stops resolving. Empty means it never expires.\nMust be in the future. Once it passes the link is removed from the\nworkspace and only the expired destination is served.",
            "example": "2026-12-31T23:59:59Z",
            "format": "date-time",
            "type": "string"
          },
          "fallbackDestination": {
            "description": "Optional fallback URL if vCard download fails or is not supported.",
            "example": "https://company.com/contact",
            "title": "The fallback destination URL to use when vCard download fails or is not supported",
            "type": "string"
          },
          "id": {
            "description": "Optional pre-generated link ID (UUID).\nThe create wizard generates the id up front and navigates to it, so the\nlink has to be created with that id or the page waits on a link that never\narrives. Skipped from the AI tool schema for the same reason as on\nCreateLinkRequest: on a create there is nothing to alias, and exposing it\nonly invites the model to invent a UUID.",
            "example": "550e8400-e29b-41d4-a716-446655440000",
            "type": "string"
          },
          "metadata": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "A map of string key-value pairs. All values must be strings. Nested objects or arrays are not supported. Maximum of 50 keys.",
            "type": "object"
          },
          "name": {
            "example": "Jane Doe Contact Card",
            "title": "The name of the link",
            "type": "string"
          },
          "purpose": {
            "description": "What the user is trying to achieve with this link, in one or two sentences.\nThe link's assistant conversations read it as context, so it is restated\nwhenever the workflow changes shape.",
            "example": "Capture contact details for sales outreach. Good leads: business contacts interested in our services.",
            "type": "string"
          },
          "qrcodeDesignId": {
            "description": "The QR Code design ID (UUID).\nIf you include this value, the specified design will be associated to this link only.\nA design can belong to one record at a time (Link or QR Code Template).\nTrying to use a design that's already assigned will cause an error.",
            "example": "a8c5e111-8894-4f8a-b5db-9efe0d12a210",
            "type": "string"
          },
          "qrcodeTemplateId": {
            "description": "The ID of the QR Code template (UUID)\nIf not given, the default QR Code template will be used to generate the QR Code design.",
            "example": "0d7f4d9c-1aef-4ed4-821b-321a3f9cba1d",
            "type": "string"
          },
          "shortlink": {
            "description": "The shortlink for the link\nIf not given, the shortlink will be generated by the system.",
            "example": "jane-contact",
            "type": "string"
          },
          "tags": {
            "description": "List of tags to associate with the link. If a tag doesn't exist, it will be created.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "vcardData": {
            "$ref": "#/components/schemas/VCardData",
            "description": "Contact information for the vCard link. This field is required.",
            "title": "vCard contact information (required)"
          },
          "waitForQrcode": {
            "description": "Wait for QR code generation to complete. Note: This makes the request slower compared to asynchronous generation.",
            "example": true,
            "type": "boolean"
          }
        },
        "required": [
          "vcardData"
        ],
        "type": "object"
      },
      "CreateContactLinkResponse": {
        "properties": {
          "link": {
            "$ref": "#/components/schemas/Link"
          }
        },
        "title": "Response containing the created contact link",
        "type": "object"
      },
      "CreateCustomDomainRequest": {
        "properties": {
          "name": {
            "description": "The domain name to register. It must be a valid DNS and not already registered in Linkbreakers. Subdomains are also supported.",
            "example": "my-domain.com",
            "type": "string"
          }
        },
        "title": "Request to create a new custom domain",
        "type": "object"
      },
      "CreateCustomDomainResponse": {
        "properties": {
          "customDomain": {
            "$ref": "#/components/schemas/CustomDomain"
          }
        },
        "title": "Response containing the created custom domain",
        "type": "object"
      },
      "CreateDashboardRequest": {
        "properties": {
          "config": {
            "$ref": "#/components/schemas/DashboardConfig",
            "description": "Initial widgets. Empty means the dashboard starts with none, because its\ncontents are normally agreed with the assistant before anything is created."
          },
          "id": {
            "description": "Client-supplied dashboard id. Generated server-side when empty.",
            "type": "string"
          },
          "linkId": {
            "description": "Link to scope this dashboard to. Empty creates the workspace-wide dashboard.",
            "type": "string"
          },
          "name": {
            "description": "Display name. Defaults to \"Default Dashboard\" when empty.",
            "type": "string"
          },
          "useDefaultWidgets": {
            "description": "Fill the dashboard with a starter set instead of leaving it empty, for a\ndashboard made in one step rather than agreed in a conversation. Without\nlink_id it is the workspace set (scans over time, top links, geography,\ntechnology and more). With link_id it is the link set: scans over time,\ngeography, technology, peak hours, and new versus returning visitors, which\nis everything any link records. The service applies it to any link; whether\nit suits one is the caller's judgement, since a workflow that collects\nanswers deserves widgets for them. Ignored when config is set, and hidden\nfrom the assistant, which agrees its widgets with the user and would\notherwise stack them on top of these.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "CreateDashboardResponse": {
        "properties": {
          "dashboard": {
            "$ref": "#/components/schemas/AnalyticsDashboard"
          }
        },
        "type": "object"
      },
      "CreateDirectoryRequest": {
        "properties": {
          "name": {
            "description": "The name of the directory. This field is required.",
            "example": "My Directory",
            "title": "The name of the directory (required)",
            "type": "string"
          },
          "parentDirectoryId": {
            "description": "The ID of the parent directory (UUID)\nIf not provided, the directory will be created at the root level.",
            "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "title": "Request to create a new directory",
        "type": "object"
      },
      "CreateDirectoryResponse": {
        "properties": {
          "directory": {
            "$ref": "#/components/schemas/Directory"
          }
        },
        "title": "Response containing the created directory",
        "type": "object"
      },
      "CreateEventTraceResponse": {
        "properties": {
          "trace": {
            "$ref": "#/components/schemas/EventTrace",
            "title": "The created event trace"
          }
        },
        "title": "CreateEventTraceResponse returns the created trace",
        "type": "object"
      },
      "CreateLinkRequest": {
        "description": "Request to create a new link.",
        "properties": {
          "conversionTracking": {
            "description": "Enable conversion tracking by preserving lbid in redirect URL.",
            "example": true,
            "type": "boolean"
          },
          "customDomainId": {
            "description": "Optional custom domain ID (UUID). Leave empty to use the default domain.",
            "example": "d290f1ee-6c54-4b01-90e6-d701748f0851",
            "type": "string"
          },
          "destination": {
            "description": "The destination URL to shorten. This field is required.",
            "example": "https://example.com",
            "title": "The destination URL to shorten (required)",
            "type": "string"
          },
          "directoryId": {
            "description": "Directory to organize this link into. If empty, link is created at root level.",
            "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
            "type": "string"
          },
          "expiredDestination": {
            "description": "Where visitors are sent once the link has expired.\nEmpty serves the built-in expired page instead.",
            "example": "https://example.com/campaign-over",
            "type": "string"
          },
          "expiresAt": {
            "description": "When the link stops resolving. Empty means it never expires.\nMust be in the future. Once it passes the link is removed from the\nworkspace and only the expired destination is served.",
            "example": "2026-12-31T23:59:59Z",
            "format": "date-time",
            "type": "string"
          },
          "fallbackDestination": {
            "example": "https://example.com/fallback",
            "title": "The fallback destination URL to use when workflow steps are broken",
            "type": "string"
          },
          "id": {
            "description": "Optional pre-generated link ID (UUID).\nSkipped from the AI tool schema: on a create there is no existing link to\nalias, so exposing it only invites the LLM to invent a raw UUID. The system\ngenerates the id and returns it as an alias in the response.",
            "example": "550e8400-e29b-41d4-a716-446655440000",
            "type": "string"
          },
          "metadata": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "A map of string key-value pairs. All values must be strings. Nested objects or arrays are not supported. Maximum of 50 keys.",
            "type": "object"
          },
          "name": {
            "example": "My Link",
            "title": "The name of the link",
            "type": "string"
          },
          "purpose": {
            "description": "What the user is trying to achieve with this link, in one or two sentences.\nThe link's assistant conversations read it as context, so it is restated\nwhenever the workflow changes shape.",
            "example": "Increase newsletter signups. Good leads: marketing qualified leads with budget over $10k.",
            "type": "string"
          },
          "qrcodeDesignId": {
            "description": "The QR Code design ID (UUID).",
            "example": "a8c5e111-8894-4f8a-b5db-9efe0d12a210",
            "type": "string"
          },
          "qrcodeTemplateId": {
            "example": "0d7f4d9c-1aef-4ed4-821b-321a3f9cba1d",
            "title": "The ID of the QR Code template (UUID)",
            "type": "string"
          },
          "shortlink": {
            "description": "The shortlink (URL slug) for the link.\nIf not given, a unique one is generated by the system.",
            "example": "my-link",
            "type": "string"
          },
          "tags": {
            "description": "List of tags to associate with the link. If a tag doesn't exist, it will be created.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "waitForQrcode": {
            "description": "Wait for QR code generation to complete before returning response.",
            "example": true,
            "type": "boolean"
          }
        },
        "required": [
          "destination"
        ],
        "type": "object"
      },
      "CreateLinkResponse": {
        "properties": {
          "link": {
            "$ref": "#/components/schemas/Link"
          },
          "workflowSteps": {
            "description": "The workflow steps that were created alongside the link.\n\nEvery link is created with an entry step (event_action\nEVENT_ACTION_LINK_VISIT, kind KIND_ENTRY) and a default exit step, already\nconnected to each other. They are returned here so a caller never has to\nguess or look up the entry step's id before attaching its own steps to it.",
            "items": {
              "$ref": "#/components/schemas/WorkflowStep",
              "type": "object"
            },
            "readOnly": true,
            "type": "array"
          }
        },
        "title": "Response containing the created link",
        "type": "object"
      },
      "CreateMediaReplaceUploadResponse": {
        "properties": {
          "media": {
            "$ref": "#/components/schemas/Media",
            "description": "The media item as it is now, with its references: the uses the replacement will change. It keeps its\ncurrent file until CompleteReplace."
          },
          "replacementId": {
            "description": "The replacement's id (UUID), which CompleteReplace takes. Empty when unchanged.",
            "type": "string"
          },
          "unchanged": {
            "description": "True when the declared sha256 is the media's own file: nothing to upload, nothing changes.",
            "type": "boolean"
          },
          "uploadExpiresAt": {
            "format": "date-time",
            "title": "When upload_url stops accepting the file",
            "type": "string"
          },
          "uploadHeaders": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Headers the upload must carry, exactly as given: Content-Type, and x-amz-checksum-sha256 when sha256 was declared. The Content-Length must equal the declared size.",
            "type": "object"
          },
          "uploadMethod": {
            "description": "The HTTP method to send them with: always PUT. Empty when unchanged.",
            "type": "string"
          },
          "uploadUrl": {
            "description": "Where to send the new file's bytes, directly to storage. Short-lived. Empty when unchanged.",
            "type": "string"
          }
        },
        "title": "A reserved replacement and where to upload the new file",
        "type": "object"
      },
      "CreateMediaRequest": {
        "properties": {
          "fileData": {
            "description": "The file data to upload, at most 3 MB. It must be transmitted in a base64 string format when sending it through HTTP. Accepted formats are PNG, JPEG, WebP and SVG images, PDF documents and MP4 videos. Larger files go through CreateUpload.",
            "example": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==",
            "type": "string"
          },
          "fileName": {
            "example": "example.jpg",
            "title": "The name of the file",
            "type": "string"
          },
          "mediaType": {
            "$ref": "#/components/schemas/MediaType",
            "description": "Deprecated: an upload no longer needs to say what the media is for. Optional, accepted for\ncompatibility and recorded as uploaded_from when uploaded_from is not set; never validated against."
          },
          "uploadedFrom": {
            "$ref": "#/components/schemas/MediaUploadOrigin",
            "description": "Where the media was uploaded from, so pickers can show a section's own uploads first. It does not\nlimit where the media can be used; see references for where it is used. Unset means\nUPLOAD_ORIGIN_MEDIA_LIBRARY."
          },
          "usage": {
            "$ref": "#/components/schemas/MediaUsage",
            "description": "Deprecated: an upload no longer needs to say what the media is for, and this no longer limits the\nkinds or sizes accepted. Optional, accepted for compatibility and recorded as uploaded_from when\nuploaded_from is not set."
          },
          "visibility": {
            "$ref": "#/components/schemas/MediaVisibility",
            "description": "The visibility of the media.\n\nIf not provided, the media file will be private."
          }
        },
        "title": "Request to create a new media file",
        "type": "object"
      },
      "CreateMediaResponse": {
        "properties": {
          "media": {
            "$ref": "#/components/schemas/Media",
            "title": "Newly stored media record with signed download URL"
          }
        },
        "title": "Response containing the created media file",
        "type": "object"
      },
      "CreateMediaUploadRequest": {
        "properties": {
          "fileName": {
            "example": "menu.pdf",
            "title": "The name of the file, shown in the media library and as the file name visitors download",
            "type": "string"
          },
          "mimeType": {
            "description": "The file's MIME type: image/png, image/jpeg, image/webp, image/svg+xml, application/pdf or video/mp4. The uploaded bytes must be this format.",
            "example": "application/pdf",
            "type": "string"
          },
          "sha256": {
            "description": "Optional: the file's SHA-256 digest, 64 hexadecimal characters. When given, a file the workspace\nalready holds is refused at once with 409 MEDIA_ALREADY_EXISTS (metadata existingMediaId and\nexistingFileName), and storage refuses a PUT whose bytes do not match it, so the PUT must carry\nthe x-amz-checksum-sha256 header from upload_headers. When omitted, the server hashes the file on\ncompletion instead.",
            "example": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
            "type": "string"
          },
          "size": {
            "description": "The file's exact size in bytes. The PUT must send exactly this many bytes.",
            "example": "7340032",
            "format": "int64",
            "type": "integer"
          },
          "uploadedFrom": {
            "$ref": "#/components/schemas/MediaUploadOrigin",
            "description": "Where the media was uploaded from, so pickers can show a section's own uploads first. It does not\nlimit where the media can be used; see references for where it is used. Unset means\nUPLOAD_ORIGIN_MEDIA_LIBRARY."
          },
          "usage": {
            "$ref": "#/components/schemas/MediaUsage",
            "description": "Deprecated: an upload no longer needs to say what the media is for, and this no longer limits the\nkinds or sizes accepted. Optional, accepted for compatibility and recorded as uploaded_from when\nuploaded_from is not set."
          },
          "visibility": {
            "$ref": "#/components/schemas/MediaVisibility",
            "description": "The visibility of the media. If not provided, the media file will be private."
          }
        },
        "required": [
          "fileName",
          "mimeType",
          "size"
        ],
        "title": "Request to start a direct upload",
        "type": "object"
      },
      "CreateMediaUploadResponse": {
        "properties": {
          "media": {
            "$ref": "#/components/schemas/Media",
            "description": "The pending media item. Its id is what CompleteUpload takes."
          },
          "uploadExpiresAt": {
            "format": "date-time",
            "title": "When upload_url stops accepting the file",
            "type": "string"
          },
          "uploadHeaders": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Headers the upload must carry, exactly as given: Content-Type, and x-amz-checksum-sha256 when sha256 was declared. The Content-Length must equal the declared size.",
            "type": "object"
          },
          "uploadMethod": {
            "title": "The HTTP method to send them with: always PUT",
            "type": "string"
          },
          "uploadUrl": {
            "description": "Where to send the file's bytes, directly to storage. Short-lived.",
            "type": "string"
          }
        },
        "title": "A reserved media item and where to upload its file",
        "type": "object"
      },
      "CreateOpenMediaLinkRequest": {
        "description": "Request to create a new link that hands visitors one piece of media.",
        "properties": {
          "customDomainId": {
            "description": "Optional custom domain ID (UUID). Leave empty to use the default domain.\nOnly provide if the user explicitly asks for a specific custom domain.",
            "example": "d290f1ee-6c54-4b01-90e6-d701748f0851",
            "type": "string"
          },
          "directoryId": {
            "description": "Directory to organize this link into. If empty, link is created at root level.",
            "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
            "type": "string"
          },
          "expiredDestination": {
            "description": "Where visitors are sent once the link has expired.\nEmpty serves the built-in expired page instead.",
            "example": "https://example.com/campaign-over",
            "type": "string"
          },
          "expiresAt": {
            "description": "When the link stops resolving. Empty means it never expires.\nMust be in the future. Once it passes the link is removed from the\nworkspace and only the expired destination is served.",
            "example": "2026-12-31T23:59:59Z",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "Optional pre-generated link ID (UUID).\nSame contract as on CreateLinkRequest: the caller may pick the id so a page\ncan navigate to the link before it exists, and it is skipped from the AI\ntool schema so the model is never invited to invent one.",
            "example": "550e8400-e29b-41d4-a716-446655440000",
            "type": "string"
          },
          "mediaId": {
            "description": "Media item handed to visitors: any ready media of the workspace. Required.",
            "example": "5f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f",
            "type": "string"
          },
          "metadata": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "A map of string key-value pairs. All values must be strings. Nested objects or arrays are not supported. Maximum of 50 keys.",
            "type": "object"
          },
          "name": {
            "example": "Spring Menu",
            "title": "The name of the link",
            "type": "string"
          },
          "purpose": {
            "description": "What the user is trying to achieve with this link, in one or two sentences.\nThe link's assistant conversations read it as context, so it is restated\nwhenever the workflow changes shape.",
            "example": "Let restaurant guests open the spring menu from the table QR code.",
            "type": "string"
          },
          "qrcodeDesignId": {
            "description": "The QR Code design ID (UUID).\nIf you include this value, the specified design will be associated to this link only.\nA design can belong to one record at a time (Link or QR Code Template).\nTrying to use a design that's already assigned will cause an error.",
            "example": "a8c5e111-8894-4f8a-b5db-9efe0d12a210",
            "type": "string"
          },
          "qrcodeTemplateId": {
            "description": "The ID of the QR Code template (UUID)\nIf not given, the default QR Code template will be used to generate the QR Code design.",
            "example": "0d7f4d9c-1aef-4ed4-821b-321a3f9cba1d",
            "type": "string"
          },
          "shortlink": {
            "description": "The shortlink for the link\nIf not given, the shortlink will be generated by the system.",
            "example": "menu",
            "type": "string"
          },
          "tags": {
            "description": "List of tags to associate with the link. If a tag doesn't exist, it will be created.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "waitForQrcode": {
            "description": "Wait for QR code generation to complete. Note: This makes the request slower compared to asynchronous generation.",
            "example": true,
            "type": "boolean"
          }
        },
        "required": [
          "mediaId"
        ],
        "type": "object"
      },
      "CreateOpenMediaLinkResponse": {
        "properties": {
          "link": {
            "$ref": "#/components/schemas/Link"
          },
          "workflowSteps": {
            "items": {
              "$ref": "#/components/schemas/WorkflowStep",
              "type": "object"
            },
            "readOnly": true,
            "title": "The workflow steps created alongside the link: the entry step and the OPEN_MEDIA exit step, already connected",
            "type": "array"
          }
        },
        "title": "Response containing the created media link",
        "type": "object"
      },
      "CreatePageThemeTemplateRequest": {
        "description": "CreatePageThemeTemplateRequest represents a request to create a new page theme template.\n\nThe template's styling is copied from an existing page theme, which is normally a\nlink's theme the user wants to reuse. The copy is detached, so editing the link\nafterwards does not change the template.",
        "properties": {
          "description": {
            "title": "The description of the page theme template",
            "type": "string"
          },
          "faq": {
            "title": "FAQ data stored as JSON",
            "type": "string"
          },
          "learnMore": {
            "title": "Extended markdown-supported content for \"learn more\" section",
            "type": "string"
          },
          "name": {
            "title": "The name of the page theme template",
            "type": "string"
          },
          "sourcePageThemeId": {
            "description": "Page theme to copy the styling from, usually a link's own theme. Omit to start from the default styling.",
            "example": "a8c5e111-8894-4f8a-b5db-9efe0d12a210",
            "type": "string"
          },
          "styling": {
            "$ref": "#/components/schemas/PageThemeStyling",
            "description": "Styling to capture, taking precedence over source_page_theme_id.\n\nThe editor sends what is on screen, so saving a theme as a template records\nthe look the user is actually looking at rather than the last saved one."
          },
          "tags": {
            "title": "Tags for categorizing and filtering templates (comma-separated)",
            "type": "string"
          }
        },
        "type": "object"
      },
      "CreatePageThemeTemplateResponse": {
        "properties": {
          "pageThemeTemplate": {
            "$ref": "#/components/schemas/PageThemeTemplate",
            "title": "The created page theme template"
          }
        },
        "title": "CreatePageThemeTemplateResponse represents the response for creating a page theme template",
        "type": "object"
      },
      "CreateQrcodeTemplateRequest": {
        "description": "IMPORTANT: When creating a template, the provided QR code design must be a fresh design\nnot used by any other links or templates. This ensures template independence and immutability.",
        "properties": {
          "description": {
            "title": "The description of the QR code template",
            "type": "string"
          },
          "faq": {
            "title": "FAQ data stored as JSON",
            "type": "string"
          },
          "learnMore": {
            "description": "Extended markdown-supported content providing detailed information about the template",
            "title": "Extended markdown-supported content for \"learn more\" section",
            "type": "string"
          },
          "name": {
            "title": "The name of the QR code template",
            "type": "string"
          },
          "qrcodeDesignId": {
            "description": "The QR code design must be a fresh design not used elsewhere to ensure template independence",
            "example": "a8c5e111-8894-4f8a-b5db-9efe0d12a210",
            "title": "The ID of a fresh QR code design to use for this template (UUID)\nNOTE: The design must not be used by any other links or templates",
            "type": "string"
          },
          "tags": {
            "title": "Tags for categorizing and filtering templates (comma-separated)",
            "type": "string"
          }
        },
        "title": "CreateQrcodeTemplateRequest represents a request to create a new QR code template",
        "type": "object"
      },
      "CreateQrcodeTemplateResponse": {
        "properties": {
          "qrcodeTemplate": {
            "$ref": "#/components/schemas/QrcodeTemplate",
            "title": "The created QR code template"
          }
        },
        "title": "CreateQrcodeTemplateResponse represents the response for creating a QR code template",
        "type": "object"
      },
      "CreateSandboxRequest": {
        "properties": {
          "name": {
            "description": "Optional name, at most 80 characters. Defaults to \"Sandbox\" and the creation time.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "CreateSandboxResponse": {
        "properties": {
          "accessToken": {
            "description": "The secret, starting with lb_test_. Returned only once.",
            "type": "string"
          },
          "sandbox": {
            "$ref": "#/components/schemas/Sandbox"
          },
          "token": {
            "$ref": "#/components/schemas/WorkspaceToken",
            "description": "The sandbox's first API token, with the same scopes as the credential\nthat created the sandbox."
          }
        },
        "type": "object"
      },
      "CreateThankYouLinkRequest": {
        "description": "Request to create a new thank you page link.",
        "properties": {
          "customDomainId": {
            "description": "Optional custom domain ID (UUID). Leave empty to use the default domain.\nOnly provide if the user explicitly asks for a specific custom domain.",
            "example": "d290f1ee-6c54-4b01-90e6-d701748f0851",
            "type": "string"
          },
          "description": {
            "description": "Optional description displayed on the thank you page.",
            "example": "We appreciate your visit.",
            "title": "The description for the thank you page",
            "type": "string"
          },
          "directoryId": {
            "description": "Directory to organize this link into. If empty, link is created at root level.",
            "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
            "type": "string"
          },
          "expiredDestination": {
            "description": "Where visitors are sent once the link has expired.\nEmpty serves the built-in expired page instead.",
            "example": "https://example.com/campaign-over",
            "type": "string"
          },
          "expiresAt": {
            "description": "When the link stops resolving. Empty means it never expires.\nMust be in the future. Once it passes the link is removed from the\nworkspace and only the expired destination is served.",
            "example": "2026-12-31T23:59:59Z",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "Optional pre-generated link ID (UUID).\nSame contract as on CreateLinkRequest: the caller may pick the id so a page\ncan navigate to the link before it exists, and it is skipped from the AI\ntool schema so the model is never invited to invent one.",
            "example": "550e8400-e29b-41d4-a716-446655440000",
            "type": "string"
          },
          "metadata": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "A map of string key-value pairs. All values must be strings. Nested objects or arrays are not supported. Maximum of 50 keys.",
            "type": "object"
          },
          "name": {
            "example": "Thank You Page Link",
            "title": "The name of the link",
            "type": "string"
          },
          "purpose": {
            "description": "What the user is trying to achieve with this link, in one or two sentences.\nThe link's assistant conversations read it as context, so it is restated\nwhenever the workflow changes shape.",
            "example": "Thank visitors after a purchase and measure engagement. Good leads: visitors who completed a purchase.",
            "type": "string"
          },
          "qrcodeDesignId": {
            "description": "The QR Code design ID (UUID).\nIf you include this value, the specified design will be associated to this link only.\nA design can belong to one record at a time (Link or QR Code Template).\nTrying to use a design that's already assigned will cause an error.",
            "example": "a8c5e111-8894-4f8a-b5db-9efe0d12a210",
            "type": "string"
          },
          "qrcodeTemplateId": {
            "description": "The ID of the QR Code template (UUID)\nIf not given, the default QR Code template will be used to generate the QR Code design.",
            "example": "0d7f4d9c-1aef-4ed4-821b-321a3f9cba1d",
            "type": "string"
          },
          "shortlink": {
            "description": "The shortlink for the link\nIf not given, the shortlink will be generated by the system.",
            "example": "thank-you",
            "type": "string"
          },
          "tags": {
            "description": "List of tags to associate with the link. If a tag doesn't exist, it will be created.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "title": {
            "description": "Title displayed on the thank you page. This field is required.",
            "example": "Thank you!",
            "title": "The title for the thank you page (required)",
            "type": "string"
          },
          "waitForQrcode": {
            "description": "Wait for QR code generation to complete. Note: This makes the request slower compared to asynchronous generation.",
            "example": true,
            "type": "boolean"
          }
        },
        "required": [
          "title"
        ],
        "type": "object"
      },
      "CreateThankYouLinkResponse": {
        "properties": {
          "link": {
            "$ref": "#/components/schemas/Link"
          }
        },
        "title": "Response containing the created thank you link",
        "type": "object"
      },
      "CreateWebhookRequest": {
        "properties": {
          "endpointUrl": {
            "title": "The URL endpoint that will receive webhook POST requests",
            "type": "string"
          },
          "linkId": {
            "description": "Filter webhook notifications by a specific link ID.\nOnly events from this link will trigger webhook notifications.\nIf empty, all links in the workspace will trigger notifications.",
            "type": "string"
          },
          "name": {
            "title": "The name of the webhook",
            "type": "string"
          },
          "source": {
            "$ref": "#/components/schemas/WebhookSource",
            "title": "Source of the webhook - indicates creation method (optional, defaults to LINKBREAKERS for manual dashboard creation)"
          },
          "triggers": {
            "description": "Filter webhook notifications by workflow step kinds.\nOnly workflow steps matching these kinds will trigger webhook notifications.\nIf empty, all workflow step kinds will trigger notifications.",
            "items": {
              "description": "- KIND_UNSPECIFIED: Workflow step kind not specified\n - KIND_ENTRY: Entry steps are automatically triggered when a visitor reaches the workflow\n - KIND_EXIT: Exit steps finalize the workflow (commonly a redirect)\n - KIND_INTERACTION: Interaction steps require visitor input (forms, passwords, etc.)\n - KIND_CONDITION: Condition steps evaluate logic and route to different next steps",
              "enum": [
                "KIND_UNSPECIFIED",
                "KIND_ENTRY",
                "KIND_EXIT",
                "KIND_INTERACTION",
                "KIND_CONDITION"
              ]
            },
            "type": "array"
          }
        },
        "required": [
          "name",
          "endpointUrl"
        ],
        "title": "CreateWebhookRequest represents the request to create a new webhook",
        "type": "object"
      },
      "CreateWebhookResponse": {
        "properties": {
          "webhook": {
            "$ref": "#/components/schemas/Webhook",
            "title": "The created webhook"
          }
        },
        "title": "CreateWebhookResponse represents the response after creating a webhook",
        "type": "object"
      },
      "CreateWorkflowStepResponse": {
        "properties": {
          "workflowStep": {
            "$ref": "#/components/schemas/WorkflowStep"
          }
        },
        "title": "Response containing the created workflow step",
        "type": "object"
      },
      "CreateWorkspaceTokenRequest": {
        "properties": {
          "keyType": {
            "description": "- WORKSPACE_TOKEN_KEY_TYPE_UNSPECIFIED: Default value (should not be used)\n - WORKSPACE_TOKEN_KEY_TYPE_SECRET: Secret key with full API access\n - WORKSPACE_TOKEN_KEY_TYPE_PUBLISHABLE: Publishable key with limited access",
            "enum": [
              "WORKSPACE_TOKEN_KEY_TYPE_UNSPECIFIED",
              "WORKSPACE_TOKEN_KEY_TYPE_SECRET",
              "WORKSPACE_TOKEN_KEY_TYPE_PUBLISHABLE"
            ],
            "title": "The key type of the token (required)"
          },
          "name": {
            "title": "The name of the token",
            "type": "string"
          },
          "scopes": {
            "description": "The scopes the token may use. Leave empty for full access. A write scope\nalso grants the read scope of the same resource. Publishable keys take no\nscopes. A token can only grant scopes it holds itself.",
            "items": {
              "description": "ApiScope is one permission an API token or OAuth grant can hold.\n\nA write scope also grants the read scope of the same resource.\n\n - API_SCOPE_UNSPECIFIED: Not a scope. Rejected wherever a scope is expected.\n - API_SCOPE_LINKS_READ: Read links, their QR code images, tags, folders and link settings.\n - API_SCOPE_LINKS_WRITE: Create, update and delete links, tags, folders and link settings.\n - API_SCOPE_WORKFLOWS_READ: Read the workflow steps behind a link and validate them.\n - API_SCOPE_WORKFLOWS_WRITE: Create, connect, update, lay out and delete workflow steps.\n - API_SCOPE_QRCODES_READ: Read QR code designs and QR code templates.\n - API_SCOPE_QRCODES_WRITE: Change QR code designs and create, publish and delete QR code templates.\n - API_SCOPE_PAGE_THEMES_READ: Read page themes and page theme templates.\n - API_SCOPE_PAGE_THEMES_WRITE: Change page themes and create, publish and delete page theme templates.\n - API_SCOPE_MEDIA_READ: Read uploaded media.\n - API_SCOPE_MEDIA_WRITE: Upload and delete media.\n - API_SCOPE_DOMAINS_READ: Read custom domains and their DNS instructions.\n - API_SCOPE_DOMAINS_WRITE: Add, verify, update and delete custom domains.\n - API_SCOPE_VISITORS_READ: Read and search visitors and their attributes.\n - API_SCOPE_VISITORS_WRITE: Identify, update and delete visitors and their attributes.\n - API_SCOPE_ANALYTICS_READ: Read events, metrics, time series, analytics data and dashboards.\n - API_SCOPE_ANALYTICS_WRITE: Create, update and delete analytics dashboards and generate widget summaries.\n - API_SCOPE_WEBHOOKS_READ: Read webhooks.\n - API_SCOPE_WEBHOOKS_WRITE: Create, update and delete webhooks.\n - API_SCOPE_INTEGRATIONS_READ: Read the Slack and Google Forms integrations.\n - API_SCOPE_INTEGRATIONS_WRITE: Connect, configure, test, sync and disconnect the Slack and Google Forms integrations.\n - API_SCOPE_WORKSPACE_READ: Read the workspace and its settings.\n - API_SCOPE_WORKSPACE_WRITE: Update the workspace, request enrollment and delete the workspace.\n - API_SCOPE_MEMBERS_READ: Read workspace members.\n - API_SCOPE_MEMBERS_WRITE: Update, revoke, sign out and remove members. Inviting a member or changing a sign-in email or password needs full access.\n - API_SCOPE_TOKENS_READ: Read API tokens and their scopes, never their secrets.\n - API_SCOPE_TOKENS_WRITE: Create, update and delete API tokens, limited to the scopes the calling token holds.\n - API_SCOPE_BILLING_WRITE: Open checkout, credit top-up and billing portal sessions.\n - API_SCOPE_ASSISTANT_READ: Read the Assistant conversation.\n - API_SCOPE_ASSISTANT_WRITE: Send files to the Assistant, clear the conversation and contact support.",
              "enum": [
                "API_SCOPE_UNSPECIFIED",
                "API_SCOPE_LINKS_READ",
                "API_SCOPE_LINKS_WRITE",
                "API_SCOPE_WORKFLOWS_READ",
                "API_SCOPE_WORKFLOWS_WRITE",
                "API_SCOPE_QRCODES_READ",
                "API_SCOPE_QRCODES_WRITE",
                "API_SCOPE_PAGE_THEMES_READ",
                "API_SCOPE_PAGE_THEMES_WRITE",
                "API_SCOPE_MEDIA_READ",
                "API_SCOPE_MEDIA_WRITE",
                "API_SCOPE_DOMAINS_READ",
                "API_SCOPE_DOMAINS_WRITE",
                "API_SCOPE_VISITORS_READ",
                "API_SCOPE_VISITORS_WRITE",
                "API_SCOPE_ANALYTICS_READ",
                "API_SCOPE_ANALYTICS_WRITE",
                "API_SCOPE_WEBHOOKS_READ",
                "API_SCOPE_WEBHOOKS_WRITE",
                "API_SCOPE_INTEGRATIONS_READ",
                "API_SCOPE_INTEGRATIONS_WRITE",
                "API_SCOPE_WORKSPACE_READ",
                "API_SCOPE_WORKSPACE_WRITE",
                "API_SCOPE_MEMBERS_READ",
                "API_SCOPE_MEMBERS_WRITE",
                "API_SCOPE_TOKENS_READ",
                "API_SCOPE_TOKENS_WRITE",
                "API_SCOPE_BILLING_WRITE",
                "API_SCOPE_ASSISTANT_READ",
                "API_SCOPE_ASSISTANT_WRITE"
              ]
            },
            "type": "array"
          }
        },
        "required": [
          "keyType"
        ],
        "title": "CreateWorkspaceTokenRequest represents the request to create a new workspace token",
        "type": "object"
      },
      "CreateWorkspaceTokenResponse": {
        "properties": {
          "accessToken": {
            "description": "The actual JWT token to be used for authentication.\nIt is returned only once and cannot be retrieved again.",
            "type": "string"
          },
          "token": {
            "$ref": "#/components/schemas/WorkspaceToken",
            "title": "The workspace token"
          }
        },
        "title": "CreateWorkspaceTokenResponse represents the response after creating a workspace token",
        "type": "object"
      },
      "CreditTopup": {
        "properties": {
          "amounts": {
            "items": {
              "$ref": "#/components/schemas/Money",
              "type": "object"
            },
            "title": "Price of one unit, one entry per currency",
            "type": "array"
          },
          "creditsPerUnit": {
            "format": "int32",
            "title": "Credits bought per unit",
            "type": "integer"
          }
        },
        "title": "CreditTopup is the price of buying platform credits outside a plan",
        "type": "object"
      },
      "CustomDomain": {
        "description": "Captures a branded hostname that Linkbreakers provisions for a workspace so scans and shortlinks resolve\nunder the customer's domain, including verification and certificate lifecycle state.",
        "externalDocs": {
          "description": "Learn more about branded links in Linkbreakers.",
          "url": "https://linkbreakers.com/help/article/how-to-create-branded-links-in-linkbreakers"
        },
        "properties": {
          "activatedAt": {
            "description": "Timestamp when the domain became active after passing verification and certificate checks.",
            "format": "date-time",
            "readOnly": true,
            "title": "Timestamp when the domain was successfully set as active",
            "type": "string"
          },
          "certificateExpiresAt": {
            "description": "When the certificate currently serving this domain expires. While the status is STATUS_RENEWAL_PENDING the domain keeps working until this date, then stops.",
            "format": "date-time",
            "readOnly": true,
            "title": "Expiry of the certificate currently serving this domain",
            "type": "string"
          },
          "cloudflareHostnameStatus": {
            "description": "Raw hostname status reported by the certificate provider, recorded at the last check.",
            "example": "active",
            "readOnly": true,
            "title": "Raw hostname status reported by the certificate provider",
            "type": "string"
          },
          "cloudflareSslStatus": {
            "description": "Raw SSL status reported by the certificate provider, recorded at the last check.",
            "example": "pending_validation",
            "readOnly": true,
            "title": "Raw SSL status reported by the certificate provider",
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "Timestamp when the domain was created",
            "type": "string"
          },
          "id": {
            "example": "d290f1ee-6c54-4b01-90e6-d701748f0851",
            "title": "Unique identifier for the custom domain (UUID)",
            "type": "string"
          },
          "lastCheckedAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "Timestamp of the last verification check",
            "type": "string"
          },
          "lastError": {
            "description": "Human-readable reason the domain is not fully active, as reported at the last check. Empty when the domain is healthy.",
            "readOnly": true,
            "title": "Why the domain is not fully active",
            "type": "string"
          },
          "name": {
            "example": "example.com",
            "title": "The domain name",
            "type": "string"
          },
          "rootDestination": {
            "description": "URL where visitors are redirected when accessing your custom domain without a path (e.g., qr.yourdomain.com). This redirect is not tracked and serves purely for white-label purposes—preventing visitors from seeing linkbreakers.com branding. If not specified, redirects to linkbreakers.com by default.",
            "example": "https://example.com",
            "title": "Root destination URL",
            "type": "string"
          },
          "status": {
            "description": "The status of a custom domain\n\n - STATUS_UNSPECIFIED: The status is not specified\n - STATUS_INACTIVE: The domain is inactive. It was created but not checked yet.\n - STATUS_DOMAIN_PENDING: The domain is pending. Last time it was checked, it was not pointing to the correct Linkbreakers subdomain.\n - STATUS_VERIFICATION_PENDING: The domain is pending verification. Please verify through TXT record.\n - STATUS_CERTIFICATE_PENDING: The domain is pending certificate. The SSL certificate is not yet ready.\n - STATUS_ACTIVE: The domain is fully active\n - STATUS_RENEWAL_PENDING: The domain is still serving traffic on a valid certificate, but the renewal\nof that certificate cannot be validated. It stops working at certificate_expires_at.\n - STATUS_EXPIRED: The certificate expired or was withdrawn. The domain no longer serves HTTPS.",
            "enum": [
              "STATUS_UNSPECIFIED",
              "STATUS_INACTIVE",
              "STATUS_DOMAIN_PENDING",
              "STATUS_VERIFICATION_PENDING",
              "STATUS_CERTIFICATE_PENDING",
              "STATUS_ACTIVE",
              "STATUS_RENEWAL_PENDING",
              "STATUS_EXPIRED"
            ],
            "example": "STATUS_ACTIVE"
          },
          "updatedAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "Timestamp when the domain was last updated",
            "type": "string"
          },
          "workspaceId": {
            "example": "d290f1ee-6c54-4b01-90e6-d701748f0851",
            "title": "The ID of the workspace this domain belongs to (UUID)",
            "type": "string"
          }
        },
        "title": "Custom domain",
        "type": "object"
      },
      "CustomDomainDnsRecord": {
        "properties": {
          "detected": {
            "title": "Whether the record is already published with this value, read from public\nDNS when the guide was built",
            "type": "boolean"
          },
          "host": {
            "description": "What to type in the provider's host field: the name relative to the zone,\ne.g. \"qr\". For the zone apex, \"@\", or empty when the provider wants the\nfield left blank.",
            "type": "string"
          },
          "name": {
            "title": "Fully qualified record name, e.g. \"qr.example.com\"",
            "type": "string"
          },
          "purpose": {
            "$ref": "#/components/schemas/DnsRecordPurpose",
            "title": "Why the record is needed"
          },
          "required": {
            "description": "Whether setup is incomplete without it. The routing record and the\ncertificate delegation record (which keeps HTTPS renewing on its own) are\nboth required.",
            "type": "boolean"
          },
          "type": {
            "$ref": "#/components/schemas/DnsRecordType",
            "title": "Record type"
          },
          "value": {
            "title": "Record value (CNAME target or TXT content)",
            "type": "string"
          }
        },
        "title": "A DNS record to create at the DNS provider",
        "type": "object"
      },
      "CustomDomainOneClickSetup": {
        "properties": {
          "applyUrl": {
            "description": "URL that opens the DNS provider's consent screen with every record filled in.\nThe provider sends the user back to Linkbreakers when done.",
            "type": "string"
          },
          "providerName": {
            "title": "Name of the DNS provider applying the records",
            "type": "string"
          }
        },
        "title": "One-click setup through Domain Connect",
        "type": "object"
      },
      "CustomDomainSetupGuide": {
        "description": "Everything needed to connect a custom domain, derived from the domain's DNS:\nwho manages it, where to go, and what to add.",
        "properties": {
          "customDomainId": {
            "title": "The custom domain ID (UUID)",
            "type": "string"
          },
          "dnsProvider": {
            "$ref": "#/components/schemas/DnsProvider",
            "title": "The DNS provider managing the zone"
          },
          "dnsProviderName": {
            "title": "Display name of the DNS provider, empty when unknown",
            "type": "string"
          },
          "dnsSettingsUrl": {
            "description": "Link to the provider's DNS settings for this zone, or to its domain list\nwhen no direct link exists. Empty when the provider is unknown.",
            "type": "string"
          },
          "domain": {
            "title": "The custom domain, e.g. \"qr.example.com\"",
            "type": "string"
          },
          "hints": {
            "items": {
              "$ref": "#/components/schemas/CustomDomainSetupHint"
            },
            "title": "Provider-specific advice to show alongside the records",
            "type": "array"
          },
          "host": {
            "description": "The domain relative to the zone, e.g. \"qr\". Empty when the domain is the zone itself.",
            "type": "string"
          },
          "hostFieldLabel": {
            "title": "What the provider calls the host field of a DNS record, e.g. \"Name\" or \"Host\"",
            "type": "string"
          },
          "nameservers": {
            "items": {
              "type": "string"
            },
            "title": "The zone's nameservers",
            "type": "array"
          },
          "oneClickSetup": {
            "$ref": "#/components/schemas/CustomDomainOneClickSetup",
            "title": "Present only when the provider supports one-click setup for Linkbreakers"
          },
          "records": {
            "items": {
              "$ref": "#/components/schemas/CustomDomainDnsRecord",
              "type": "object"
            },
            "title": "Records to create, in the order to add them",
            "type": "array"
          },
          "zone": {
            "title": "The DNS zone the domain lives in, usually the registered domain, e.g. \"example.com\"",
            "type": "string"
          }
        },
        "title": "Custom domain setup guide",
        "type": "object"
      },
      "CustomDomainSetupHint": {
        "default": "CUSTOM_DOMAIN_SETUP_HINT_UNSPECIFIED",
        "description": "- CUSTOM_DOMAIN_SETUP_HINT_UNSPECIFIED: Not specified\n - CUSTOM_DOMAIN_SETUP_HINT_CLOUDFLARE_DNS_ONLY: Cloudflare: the CNAME's proxy status must be \"DNS only\" (grey cloud), or Linkbreakers cannot see it\n - CUSTOM_DOMAIN_SETUP_HINT_APEX_DOMAIN: The domain is a root domain: most providers do not allow a CNAME there, a subdomain such as qr.example.com is recommended\n - CUSTOM_DOMAIN_SETUP_HINT_NAMESERVERS_NOT_FOUND: The nameservers could not be read: the domain may not be registered yet, or its DNS is not set up\n - CUSTOM_DOMAIN_SETUP_HINT_GOOGLE_DOMAINS_MOVED: The nameservers are Google's. Domains bought through Google Domains use them too and are now managed at Squarespace",
        "enum": [
          "CUSTOM_DOMAIN_SETUP_HINT_UNSPECIFIED",
          "CUSTOM_DOMAIN_SETUP_HINT_CLOUDFLARE_DNS_ONLY",
          "CUSTOM_DOMAIN_SETUP_HINT_APEX_DOMAIN",
          "CUSTOM_DOMAIN_SETUP_HINT_NAMESERVERS_NOT_FOUND",
          "CUSTOM_DOMAIN_SETUP_HINT_GOOGLE_DOMAINS_MOVED"
        ],
        "title": "Provider-specific advice for adding the records",
        "type": "string"
      },
      "CustomDomainStatus": {
        "default": "STATUS_UNSPECIFIED",
        "description": "The status of a custom domain\n\n - STATUS_UNSPECIFIED: The status is not specified\n - STATUS_INACTIVE: The domain is inactive. It was created but not checked yet.\n - STATUS_DOMAIN_PENDING: The domain is pending. Last time it was checked, it was not pointing to the correct Linkbreakers subdomain.\n - STATUS_VERIFICATION_PENDING: The domain is pending verification. Please verify through TXT record.\n - STATUS_CERTIFICATE_PENDING: The domain is pending certificate. The SSL certificate is not yet ready.\n - STATUS_ACTIVE: The domain is fully active\n - STATUS_RENEWAL_PENDING: The domain is still serving traffic on a valid certificate, but the renewal\nof that certificate cannot be validated. It stops working at certificate_expires_at.\n - STATUS_EXPIRED: The certificate expired or was withdrawn. The domain no longer serves HTTPS.",
        "enum": [
          "STATUS_UNSPECIFIED",
          "STATUS_INACTIVE",
          "STATUS_DOMAIN_PENDING",
          "STATUS_VERIFICATION_PENDING",
          "STATUS_CERTIFICATE_PENDING",
          "STATUS_ACTIVE",
          "STATUS_RENEWAL_PENDING",
          "STATUS_EXPIRED"
        ],
        "title": "Status of a custom domain",
        "type": "string"
      },
      "CustomDomainsServiceUpdateBody": {
        "properties": {
          "rootDestination": {
            "description": "URL where visitors are redirected when accessing your custom domain without a path (e.g., qr.yourdomain.com). This redirect is not tracked and serves purely for white-label purposes—preventing visitors from seeing linkbreakers.com branding. Leave empty to redirect to linkbreakers.com by default.",
            "example": "https://example.com",
            "title": "The root destination URL (optional)",
            "type": "string"
          }
        },
        "title": "Request to update a custom domain",
        "type": "object"
      },
      "DashboardConfig": {
        "properties": {
          "gridColumns": {
            "description": "Width of the grid the widget positions and sizes are expressed in.\nAbsent or 0 means the legacy two-column grid, where w=1 is half-width and\nw=2 is full-width. New dashboards use 8.",
            "format": "int32",
            "type": "integer"
          },
          "widgets": {
            "items": {
              "$ref": "#/components/schemas/DashboardWidget",
              "type": "object"
            },
            "type": "array"
          }
        },
        "title": "DashboardConfig is the structured configuration for a dashboard",
        "type": "object"
      },
      "DashboardScope": {
        "default": "DASHBOARD_SCOPE_UNSPECIFIED",
        "description": "DashboardScope selects dashboards by whether they are tied to a link.\n\n - DASHBOARD_SCOPE_UNSPECIFIED: Every dashboard in the workspace, link-scoped or not.\n - DASHBOARD_SCOPE_WORKSPACE: Only the workspace-wide dashboard, the one with no link.\n - DASHBOARD_SCOPE_LINK: Only dashboards tied to a link.",
        "enum": [
          "DASHBOARD_SCOPE_UNSPECIFIED",
          "DASHBOARD_SCOPE_WORKSPACE",
          "DASHBOARD_SCOPE_LINK"
        ],
        "type": "string"
      },
      "DashboardWidget": {
        "properties": {
          "dataSource": {
            "$ref": "#/components/schemas/WidgetDataSource",
            "title": "What data to fetch"
          },
          "id": {
            "title": "Unique widget identifier",
            "type": "string"
          },
          "position": {
            "$ref": "#/components/schemas/WidgetPosition",
            "title": "Grid position"
          },
          "size": {
            "$ref": "#/components/schemas/WidgetSize",
            "title": "Grid size"
          },
          "title": {
            "title": "Display title",
            "type": "string"
          },
          "visualization": {
            "$ref": "#/components/schemas/WidgetVisualization",
            "title": "How to visualize the data"
          }
        },
        "title": "DashboardWidget represents a single monitor widget on the dashboard",
        "type": "object"
      },
      "DataCollection": {
        "default": "DATA_COLLECTION_UNSPECIFIED",
        "description": "Defines how aggressively Linkbreakers prompts visitors for identifying data before allowing the workflow to continue.\n\n - DATA_COLLECTION_UNSPECIFIED: Data collection preference not specified\n - DATA_COLLECTION_NONE: No visitor data captured; Linkbreakers only logs the scan event.\n - DATA_COLLECTION_BASIC: Minimal data prompts (e.g., email) enabled to keep friction low while identifying high-signal visitors.\n - DATA_COLLECTION_ADVANCED: Full lead capture flows, including custom forms and required fields, before continuing the workflow.",
        "enum": [
          "DATA_COLLECTION_UNSPECIFIED",
          "DATA_COLLECTION_NONE",
          "DATA_COLLECTION_BASIC",
          "DATA_COLLECTION_ADVANCED"
        ],
        "title": "DataCollection",
        "type": "string"
      },
      "DayOfMonthConditionPayload": {
        "properties": {
          "elseNextStepId": {
            "example": "987fcdeb-a321-45e6-b789-123456789012",
            "title": "Workflow step ID to route to if no options match (UUID)",
            "type": "string"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/DayOfMonthOption",
              "type": "object"
            },
            "title": "Day of month routing options",
            "type": "array"
          }
        },
        "title": "Day of month condition payload for EVENT_ACTION_DAY_OF_MONTH_CONDITION",
        "type": "object"
      },
      "DayOfMonthConditionTraceData": {
        "description": "DayOfMonthConditionTraceData stores day-of-month condition routing metadata.",
        "properties": {
          "hasElse": {
            "type": "boolean"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/DayOfMonthConditionTraceOption",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "DayOfMonthConditionTraceOption": {
        "properties": {
          "dayOfMonth": {
            "format": "int32",
            "type": "integer"
          },
          "hasRoute": {
            "type": "boolean"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "DayOfMonthOption": {
        "properties": {
          "dayOfMonth": {
            "description": "Day of month (1-31, or -1 for last day)",
            "example": 1,
            "format": "int32",
            "title": "Day of month (1-31, or -1 for last day of month)",
            "type": "integer"
          },
          "id": {
            "example": "option-1",
            "title": "Unique identifier for this option",
            "type": "string"
          },
          "name": {
            "example": "First of Month",
            "title": "Optional friendly name for this option",
            "type": "string"
          },
          "nextStepId": {
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "title": "Workflow step ID to route to when this option matches (UUID)",
            "type": "string"
          }
        },
        "title": "Day of month option for EVENT_ACTION_DAY_OF_MONTH_CONDITION",
        "type": "object"
      },
      "DayOfWeekConditionPayload": {
        "properties": {
          "elseNextStepId": {
            "example": "987fcdeb-a321-45e6-b789-123456789012",
            "title": "Workflow step ID to route to if no options match (UUID)",
            "type": "string"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/DayOfWeekOption",
              "type": "object"
            },
            "title": "Day of week routing options",
            "type": "array"
          }
        },
        "title": "Day of week condition payload for EVENT_ACTION_DAY_OF_WEEK_CONDITION",
        "type": "object"
      },
      "DayOfWeekConditionTraceData": {
        "description": "DayOfWeekConditionTraceData stores day-of-week condition routing metadata.",
        "properties": {
          "hasElse": {
            "type": "boolean"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/DayOfWeekConditionTraceOption",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "DayOfWeekConditionTraceOption": {
        "properties": {
          "daysOfWeek": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "hasRoute": {
            "type": "boolean"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "DayOfWeekOption": {
        "properties": {
          "daysOfWeek": {
            "description": "Days of the week: 0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, 6=Saturday",
            "example": [
              1,
              2,
              3,
              4,
              5
            ],
            "items": {
              "format": "int32",
              "type": "integer"
            },
            "title": "Days of week (0=Sunday, 1=Monday, ..., 6=Saturday)",
            "type": "array"
          },
          "id": {
            "example": "option-1",
            "title": "Unique identifier for this option",
            "type": "string"
          },
          "name": {
            "example": "Weekdays",
            "title": "Optional friendly name for this option",
            "type": "string"
          },
          "nextStepId": {
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "title": "Workflow step ID to route to when this option matches (UUID)",
            "type": "string"
          }
        },
        "title": "Day of week option for EVENT_ACTION_DAY_OF_WEEK_CONDITION",
        "type": "object"
      },
      "DeleteAttributeResponse": {
        "properties": {
          "success": {
            "title": "Indicates whether the attribute was removed",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "DeleteCustomDomainResponse": {
        "title": "Response for a successful domain deletion",
        "type": "object"
      },
      "DeleteDashboardResponse": {
        "type": "object"
      },
      "DeleteDirectoryResponse": {
        "title": "Response for directory deletion",
        "type": "object"
      },
      "DeleteLinkResponse": {
        "title": "Response for link deletion",
        "type": "object"
      },
      "DeleteMediaResponse": {
        "title": "Response for media file deletion",
        "type": "object"
      },
      "DeletePageThemeTemplateResponse": {
        "description": "DeletePageThemeTemplateResponse confirms deletion of a workspace template.",
        "type": "object"
      },
      "DeleteQrcodeDesignResponse": {
        "description": "DeleteQrcodeDesignResponse confirms the design was removed (empty payload).\n\nEmpty response as the design has been deleted",
        "type": "object"
      },
      "DeleteQrcodeTemplateResponse": {
        "description": "DeleteQrcodeTemplateResponse confirms deletion of a workspace template.",
        "type": "object"
      },
      "DeleteTagResponse": {
        "type": "object"
      },
      "DeleteVisitorResponse": {
        "properties": {
          "success": {
            "title": "Indicates whether the visitor record was deleted",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "DeleteWorkflowStepResponse": {
        "title": "Response for workflow step deletion",
        "type": "object"
      },
      "DetectedGoogleForm": {
        "properties": {
          "accessible": {
            "title": "Whether the form is accessible with the connected Google account",
            "type": "boolean"
          },
          "formId": {
            "title": "The extracted Google Form ID (if resolvable)",
            "type": "string"
          },
          "formUrl": {
            "title": "The Google Form URL (destination)",
            "type": "string"
          },
          "linkId": {
            "title": "The link ID that redirects to this form",
            "type": "string"
          },
          "linkName": {
            "title": "The link name",
            "type": "string"
          }
        },
        "title": "A Google Form auto-detected from a workspace link's redirect destination",
        "type": "object"
      },
      "Device": {
        "description": "Tracks the fingerprint of a visitor's hardware/software so Linkbreakers can de-duplicate scans, enrich analytics,\nand power security heuristics.",
        "properties": {
          "asn": {
            "example": 7922,
            "format": "int64",
            "title": "Autonomous System Number (ASN) - unique identifier for the network routing entity",
            "type": "integer"
          },
          "browserLanguage": {
            "example": "en-US,en;q=0.9",
            "title": "Preferred language/locale from the browser (BCP-47)",
            "type": "string"
          },
          "browserName": {
            "example": "Chrome",
            "title": "Browser family (e.g. \"Safari\", \"Chrome\")",
            "type": "string"
          },
          "browserVersion": {
            "example": "99.0.4844.51",
            "title": "Browser version string",
            "type": "string"
          },
          "city": {
            "example": "New York",
            "title": "City derived from IP geolocation",
            "type": "string"
          },
          "country": {
            "example": "US",
            "title": "Country inferred from IP geolocation (ISO 3166-1 alpha-2)",
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "title": "Timestamp when the device fingerprint was first seen",
            "type": "string"
          },
          "deviceActor": {
            "description": "DeviceActor represents WHO or WHAT is operating the device.\nThis distinguishes between a real human visitor, an automated crawler/scraper bot\n(e.g. Googlebot, BingBot), and an AI/LLM agent acting on behalf of a user\n(e.g. GPTBot, ClaudeBot, Gemini, Grok).\n\n - DEVICE_ACTOR_UNSPECIFIED: Actor not specified or not yet detected\n - DEVICE_ACTOR_HUMAN: Human visitor using a browser (covers MOBILE, TABLET, DESKTOP device types)\n - DEVICE_ACTOR_BOT: Automated crawler or scraper bot (e.g. Googlebot, BingBot, Applebot)\n - DEVICE_ACTOR_AGENT: AI/LLM agent browsing on behalf of a user (e.g. GPTBot, ClaudeBot, Gemini, Grok)\n - DEVICE_ACTOR_UNKNOWN: Unable to classify the actor",
            "enum": [
              "DEVICE_ACTOR_UNSPECIFIED",
              "DEVICE_ACTOR_HUMAN",
              "DEVICE_ACTOR_BOT",
              "DEVICE_ACTOR_AGENT",
              "DEVICE_ACTOR_UNKNOWN"
            ],
            "example": "DEVICE_ACTOR_HUMAN"
          },
          "deviceActorName": {
            "description": "Specific actor or crawler name for non-human traffic (e.g. \"Googlebot\", \"GPTBot\", \"ClaudeBot\").\nOnly populated when device_actor is BOT or AGENT. Null/empty for HUMAN visitors.",
            "example": "GPTBot",
            "type": "string"
          },
          "deviceActorOrigin": {
            "description": "Company or organization behind the actor (e.g. \"Google\", \"OpenAI\", \"Anthropic\").\nOnly populated when device_actor is BOT or AGENT. Null/empty for HUMAN visitors.",
            "example": "OpenAI",
            "type": "string"
          },
          "deviceBrand": {
            "example": "Apple",
            "title": "Hardware brand where available (e.g. \"Apple\")",
            "type": "string"
          },
          "deviceConcurrency": {
            "example": 4,
            "format": "int32",
            "title": "Number of logical CPU cores available to the browser",
            "type": "integer"
          },
          "deviceMemory": {
            "example": 6,
            "format": "double",
            "title": "Approximate browser-reported RAM in gigabytes",
            "type": "number"
          },
          "deviceName": {
            "example": "iPhone 14 Pro",
            "title": "Marketing name exposed by the browser (e.g. \"iPhone\", \"Pixel 7\")",
            "type": "string"
          },
          "deviceType": {
            "description": "DeviceType represents the physical form factor of the device.\nThis describes the hardware category (phone, tablet, laptop, etc.),\nNOT who or what is operating it — see DeviceActor for that.\n\n - DEVICE_TYPE_UNSPECIFIED: Device type not specified or not yet detected\n - DEVICE_TYPE_NATIVE: Native QR scanner (no browser capabilities reported)\n - DEVICE_TYPE_MOBILE: Mobile handset browser\n - DEVICE_TYPE_TABLET: Tablet browser\n - DEVICE_TYPE_DESKTOP: Desktop or laptop browser\n - DEVICE_TYPE_UNKNOWN: Unable to classify the device",
            "enum": [
              "DEVICE_TYPE_UNSPECIFIED",
              "DEVICE_TYPE_NATIVE",
              "DEVICE_TYPE_MOBILE",
              "DEVICE_TYPE_TABLET",
              "DEVICE_TYPE_DESKTOP",
              "DEVICE_TYPE_UNKNOWN"
            ],
            "example": "DEVICE_TYPE_MOBILE"
          },
          "gpu": {
            "example": "Apple GPU",
            "title": "GPU renderer reported by WebGL",
            "type": "string"
          },
          "id": {
            "example": "6f1b2e90-1234-4c8f-91e1-63cd927bf908",
            "title": "Unique identifier for the device fingerprint (UUID)",
            "type": "string"
          },
          "ipAddress": {
            "example": "203.0.113.42",
            "title": "Last IP address observed for this device (IPv4 or IPv6 format depending on availability)",
            "type": "string"
          },
          "isp": {
            "example": "Comcast Cable Communications",
            "title": "Internet Service Provider (ISP) name or organization from IP geolocation",
            "type": "string"
          },
          "lastUsedAt": {
            "format": "date-time",
            "title": "Last time this device was associated with an event",
            "type": "string"
          },
          "networkBandwidth": {
            "example": 10,
            "format": "double",
            "title": "Estimated downlink bandwidth in megabits/second",
            "type": "number"
          },
          "networkConnection": {
            "example": "4g",
            "title": "Effective network connection type (e.g. \"4g\", \"wifi\")",
            "type": "string"
          },
          "networkRtt": {
            "example": 50,
            "format": "double",
            "title": "Estimated round-trip time in milliseconds",
            "type": "number"
          },
          "platformName": {
            "example": "macOS",
            "title": "Operating system family (e.g. \"iOS\", \"Windows\")",
            "type": "string"
          },
          "platformVersion": {
            "example": "10.15.7",
            "title": "Operating system version string",
            "type": "string"
          },
          "region": {
            "example": "CRF",
            "title": "Region or state from IP geolocation",
            "type": "string"
          },
          "screenHeight": {
            "example": 1117,
            "format": "double",
            "title": "Viewport height in CSS pixels",
            "type": "number"
          },
          "screenRatio": {
            "example": 1.55,
            "format": "double",
            "title": "Aspect ratio derived from width/height",
            "type": "number"
          },
          "screenWidth": {
            "example": 1728,
            "format": "double",
            "title": "Viewport width in CSS pixels",
            "type": "number"
          },
          "state": {
            "example": "NY",
            "title": "State/Province when available (normalized string)",
            "type": "string"
          },
          "timezone": {
            "example": "Europe/London",
            "title": "IANA timezone reported by the browser",
            "type": "string"
          },
          "touchScreen": {
            "example": true,
            "title": "Whether the device reports touch capabilities",
            "type": "boolean"
          },
          "updatedAt": {
            "format": "date-time",
            "title": "Timestamp of the latest device metadata update",
            "type": "string"
          },
          "userAgent": {
            "example": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Mobile/15E148 Safari/604.1",
            "title": "Raw user-agent string",
            "type": "string"
          }
        },
        "title": "Device",
        "type": "object"
      },
      "DeviceActor": {
        "default": "DEVICE_ACTOR_UNSPECIFIED",
        "description": "DeviceActor represents WHO or WHAT is operating the device.\nThis distinguishes between a real human visitor, an automated crawler/scraper bot\n(e.g. Googlebot, BingBot), and an AI/LLM agent acting on behalf of a user\n(e.g. GPTBot, ClaudeBot, Gemini, Grok).\n\n - DEVICE_ACTOR_UNSPECIFIED: Actor not specified or not yet detected\n - DEVICE_ACTOR_HUMAN: Human visitor using a browser (covers MOBILE, TABLET, DESKTOP device types)\n - DEVICE_ACTOR_BOT: Automated crawler or scraper bot (e.g. Googlebot, BingBot, Applebot)\n - DEVICE_ACTOR_AGENT: AI/LLM agent browsing on behalf of a user (e.g. GPTBot, ClaudeBot, Gemini, Grok)\n - DEVICE_ACTOR_UNKNOWN: Unable to classify the actor",
        "enum": [
          "DEVICE_ACTOR_UNSPECIFIED",
          "DEVICE_ACTOR_HUMAN",
          "DEVICE_ACTOR_BOT",
          "DEVICE_ACTOR_AGENT",
          "DEVICE_ACTOR_UNKNOWN"
        ],
        "type": "string"
      },
      "DeviceActorConditionOption": {
        "description": "Device actor condition option for EVENT_ACTION_DEVICE_ACTOR_CONDITION.",
        "properties": {
          "id": {
            "example": "option-1",
            "type": "string"
          },
          "name": {
            "example": "Bots",
            "type": "string"
          },
          "nextStepId": {
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "type": "string"
          },
          "value": {
            "description": "Allowed values for device actor routing conditions.",
            "enum": [
              "DEVICE_ACTOR_CONDITION_VALUE_UNSPECIFIED",
              "DEVICE_ACTOR_CONDITION_VALUE_HUMAN",
              "DEVICE_ACTOR_CONDITION_VALUE_BOT",
              "DEVICE_ACTOR_CONDITION_VALUE_AGENT",
              "DEVICE_ACTOR_CONDITION_VALUE_UNKNOWN"
            ],
            "example": "DEVICE_ACTOR_CONDITION_VALUE_BOT"
          }
        },
        "type": "object"
      },
      "DeviceActorConditionPayload": {
        "properties": {
          "elseNextStepId": {
            "example": "987fcdeb-a321-45e6-b789-123456789012",
            "type": "string"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/DeviceActorConditionOption",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "DeviceActorConditionTraceData": {
        "description": "DeviceActorConditionTraceData stores device actor routing metadata.",
        "properties": {
          "deviceActor": {
            "type": "string"
          },
          "hasElse": {
            "type": "boolean"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/DeviceActorConditionTraceOption",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "DeviceActorConditionTraceOption": {
        "properties": {
          "deviceActor": {
            "type": "string"
          },
          "hasRoute": {
            "type": "boolean"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "DeviceActorConditionValue": {
        "default": "DEVICE_ACTOR_CONDITION_VALUE_UNSPECIFIED",
        "description": "Allowed values for device actor routing conditions.",
        "enum": [
          "DEVICE_ACTOR_CONDITION_VALUE_UNSPECIFIED",
          "DEVICE_ACTOR_CONDITION_VALUE_HUMAN",
          "DEVICE_ACTOR_CONDITION_VALUE_BOT",
          "DEVICE_ACTOR_CONDITION_VALUE_AGENT",
          "DEVICE_ACTOR_CONDITION_VALUE_UNKNOWN"
        ],
        "type": "string"
      },
      "DeviceBrandConditionOption": {
        "description": "Device brand condition option for EVENT_ACTION_DEVICE_BRAND_CONDITION.",
        "properties": {
          "id": {
            "example": "option-1",
            "type": "string"
          },
          "name": {
            "example": "Apple Devices",
            "type": "string"
          },
          "nextStepId": {
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "type": "string"
          },
          "value": {
            "description": "Allowed values for device brand routing conditions.",
            "enum": [
              "DEVICE_BRAND_CONDITION_VALUE_UNSPECIFIED",
              "DEVICE_BRAND_CONDITION_VALUE_APPLE",
              "DEVICE_BRAND_CONDITION_VALUE_SAMSUNG",
              "DEVICE_BRAND_CONDITION_VALUE_GOOGLE",
              "DEVICE_BRAND_CONDITION_VALUE_HUAWEI",
              "DEVICE_BRAND_CONDITION_VALUE_XIAOMI",
              "DEVICE_BRAND_CONDITION_VALUE_ONEPLUS"
            ],
            "example": "DEVICE_BRAND_CONDITION_VALUE_APPLE"
          }
        },
        "type": "object"
      },
      "DeviceBrandConditionPayload": {
        "properties": {
          "elseNextStepId": {
            "example": "987fcdeb-a321-45e6-b789-123456789012",
            "type": "string"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/DeviceBrandConditionOption",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "DeviceBrandConditionTraceData": {
        "description": "DeviceBrandConditionTraceData stores device brand routing metadata.",
        "properties": {
          "deviceBrand": {
            "type": "string"
          },
          "hasElse": {
            "type": "boolean"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/DeviceBrandConditionTraceOption",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "DeviceBrandConditionTraceOption": {
        "properties": {
          "deviceBrand": {
            "type": "string"
          },
          "hasRoute": {
            "type": "boolean"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "DeviceBrandConditionValue": {
        "default": "DEVICE_BRAND_CONDITION_VALUE_UNSPECIFIED",
        "description": "Allowed values for device brand routing conditions.",
        "enum": [
          "DEVICE_BRAND_CONDITION_VALUE_UNSPECIFIED",
          "DEVICE_BRAND_CONDITION_VALUE_APPLE",
          "DEVICE_BRAND_CONDITION_VALUE_SAMSUNG",
          "DEVICE_BRAND_CONDITION_VALUE_GOOGLE",
          "DEVICE_BRAND_CONDITION_VALUE_HUAWEI",
          "DEVICE_BRAND_CONDITION_VALUE_XIAOMI",
          "DEVICE_BRAND_CONDITION_VALUE_ONEPLUS"
        ],
        "type": "string"
      },
      "DeviceBrowserConditionOption": {
        "description": "Device browser condition option for EVENT_ACTION_DEVICE_BROWSER_CONDITION.",
        "properties": {
          "id": {
            "example": "option-1",
            "type": "string"
          },
          "name": {
            "example": "Chrome Visitors",
            "type": "string"
          },
          "nextStepId": {
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "type": "string"
          },
          "value": {
            "description": "Allowed values for device browser routing conditions.",
            "enum": [
              "DEVICE_BROWSER_CONDITION_VALUE_UNSPECIFIED",
              "DEVICE_BROWSER_CONDITION_VALUE_CHROME",
              "DEVICE_BROWSER_CONDITION_VALUE_SAFARI",
              "DEVICE_BROWSER_CONDITION_VALUE_FIREFOX",
              "DEVICE_BROWSER_CONDITION_VALUE_EDGE",
              "DEVICE_BROWSER_CONDITION_VALUE_OPERA",
              "DEVICE_BROWSER_CONDITION_VALUE_SAMSUNG_BROWSER"
            ],
            "example": "DEVICE_BROWSER_CONDITION_VALUE_CHROME"
          }
        },
        "type": "object"
      },
      "DeviceBrowserConditionPayload": {
        "properties": {
          "elseNextStepId": {
            "example": "987fcdeb-a321-45e6-b789-123456789012",
            "type": "string"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/DeviceBrowserConditionOption",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "DeviceBrowserConditionTraceData": {
        "description": "DeviceBrowserConditionTraceData stores device browser routing metadata.",
        "properties": {
          "browserName": {
            "type": "string"
          },
          "hasElse": {
            "type": "boolean"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/DeviceBrowserConditionTraceOption",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "DeviceBrowserConditionTraceOption": {
        "properties": {
          "browserName": {
            "type": "string"
          },
          "hasRoute": {
            "type": "boolean"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "DeviceBrowserConditionValue": {
        "default": "DEVICE_BROWSER_CONDITION_VALUE_UNSPECIFIED",
        "description": "Allowed values for device browser routing conditions.",
        "enum": [
          "DEVICE_BROWSER_CONDITION_VALUE_UNSPECIFIED",
          "DEVICE_BROWSER_CONDITION_VALUE_CHROME",
          "DEVICE_BROWSER_CONDITION_VALUE_SAFARI",
          "DEVICE_BROWSER_CONDITION_VALUE_FIREFOX",
          "DEVICE_BROWSER_CONDITION_VALUE_EDGE",
          "DEVICE_BROWSER_CONDITION_VALUE_OPERA",
          "DEVICE_BROWSER_CONDITION_VALUE_SAMSUNG_BROWSER"
        ],
        "type": "string"
      },
      "DeviceDataPoint": {
        "properties": {
          "deviceType": {
            "title": "Device type (e.g. \"DESKTOP\", \"MOBILE\", \"TABLET\")",
            "type": "string"
          },
          "eventCount": {
            "format": "int32",
            "title": "Number of events from this device type",
            "type": "integer"
          },
          "percentage": {
            "format": "double",
            "title": "Percentage of total events",
            "type": "number"
          }
        },
        "title": "DeviceDataPoint represents a device type with its event count",
        "type": "object"
      },
      "DeviceInput": {
        "properties": {
          "browserLanguage": {
            "example": "en-US,en;q=0.9",
            "title": "Preferred language/locale from the browser (BCP-47)",
            "type": "string"
          },
          "browserName": {
            "example": "Chrome",
            "title": "Browser family (e.g. \"Safari\", \"Chrome\")",
            "type": "string"
          },
          "browserVersion": {
            "example": "119.0.6045.105",
            "title": "Browser version string",
            "type": "string"
          },
          "deviceBrand": {
            "example": "Apple",
            "title": "Hardware brand where available (e.g. \"Apple\")",
            "type": "string"
          },
          "deviceConcurrency": {
            "example": 4,
            "format": "int32",
            "title": "Number of logical CPU cores available to the browser",
            "type": "integer"
          },
          "deviceMemory": {
            "example": 6,
            "format": "double",
            "title": "Approximate browser-reported RAM in gigabytes",
            "type": "number"
          },
          "deviceName": {
            "example": "MacBook Pro",
            "title": "Marketing device name exposed by the browser",
            "type": "string"
          },
          "gpu": {
            "example": "Apple GPU",
            "title": "GPU renderer reported by WebGL",
            "type": "string"
          },
          "id": {
            "example": "4da3e6a2-2d54-4b0f-9e17-4b6c2af7e9c5",
            "title": "Device identifier returned from initial fingerprinting (UUID)",
            "type": "string"
          },
          "networkBandwidth": {
            "example": 10,
            "format": "double",
            "title": "Estimated downlink bandwidth in megabits/second",
            "type": "number"
          },
          "networkConnection": {
            "example": "4g",
            "title": "Effective network connection type (e.g. \"4g\", \"wifi\")",
            "type": "string"
          },
          "networkRtt": {
            "example": 50,
            "format": "double",
            "title": "Estimated round-trip time in milliseconds",
            "type": "number"
          },
          "platformName": {
            "example": "macOS",
            "title": "Operating system family (e.g. \"iOS\")",
            "type": "string"
          },
          "platformVersion": {
            "example": "13.4",
            "title": "Operating system version string",
            "type": "string"
          },
          "screenHeight": {
            "example": 1117,
            "format": "double",
            "title": "Current viewport height in CSS pixels",
            "type": "number"
          },
          "screenRatio": {
            "example": 1.55,
            "format": "double",
            "title": "Aspect ratio derived from width/height",
            "type": "number"
          },
          "screenWidth": {
            "example": 1728,
            "format": "double",
            "title": "Current viewport width in CSS pixels",
            "type": "number"
          },
          "touchScreen": {
            "example": true,
            "title": "Whether the device reports touch capabilities",
            "type": "boolean"
          }
        },
        "title": "DeviceInput represents the input for device information",
        "type": "object"
      },
      "DevicePlatformConditionOption": {
        "description": "Device platform condition option for EVENT_ACTION_DEVICE_PLATFORM_CONDITION.",
        "properties": {
          "id": {
            "example": "option-1",
            "type": "string"
          },
          "name": {
            "example": "iOS Visitors",
            "type": "string"
          },
          "nextStepId": {
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "type": "string"
          },
          "value": {
            "description": "Allowed values for device platform routing conditions.",
            "enum": [
              "DEVICE_PLATFORM_CONDITION_VALUE_UNSPECIFIED",
              "DEVICE_PLATFORM_CONDITION_VALUE_IOS",
              "DEVICE_PLATFORM_CONDITION_VALUE_ANDROID",
              "DEVICE_PLATFORM_CONDITION_VALUE_WINDOWS",
              "DEVICE_PLATFORM_CONDITION_VALUE_MACOS",
              "DEVICE_PLATFORM_CONDITION_VALUE_LINUX",
              "DEVICE_PLATFORM_CONDITION_VALUE_CHROMEOS"
            ],
            "example": "DEVICE_PLATFORM_CONDITION_VALUE_IOS"
          }
        },
        "type": "object"
      },
      "DevicePlatformConditionPayload": {
        "properties": {
          "elseNextStepId": {
            "example": "987fcdeb-a321-45e6-b789-123456789012",
            "type": "string"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/DevicePlatformConditionOption",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "DevicePlatformConditionTraceData": {
        "description": "DevicePlatformConditionTraceData stores device platform routing metadata.",
        "properties": {
          "hasElse": {
            "type": "boolean"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/DevicePlatformConditionTraceOption",
              "type": "object"
            },
            "type": "array"
          },
          "platformName": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "DevicePlatformConditionTraceOption": {
        "properties": {
          "hasRoute": {
            "type": "boolean"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "platformName": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "DevicePlatformConditionValue": {
        "default": "DEVICE_PLATFORM_CONDITION_VALUE_UNSPECIFIED",
        "description": "Allowed values for device platform routing conditions.",
        "enum": [
          "DEVICE_PLATFORM_CONDITION_VALUE_UNSPECIFIED",
          "DEVICE_PLATFORM_CONDITION_VALUE_IOS",
          "DEVICE_PLATFORM_CONDITION_VALUE_ANDROID",
          "DEVICE_PLATFORM_CONDITION_VALUE_WINDOWS",
          "DEVICE_PLATFORM_CONDITION_VALUE_MACOS",
          "DEVICE_PLATFORM_CONDITION_VALUE_LINUX",
          "DEVICE_PLATFORM_CONDITION_VALUE_CHROMEOS"
        ],
        "type": "string"
      },
      "DeviceType": {
        "default": "DEVICE_TYPE_UNSPECIFIED",
        "description": "DeviceType represents the physical form factor of the device.\nThis describes the hardware category (phone, tablet, laptop, etc.),\nNOT who or what is operating it — see DeviceActor for that.\n\n - DEVICE_TYPE_UNSPECIFIED: Device type not specified or not yet detected\n - DEVICE_TYPE_NATIVE: Native QR scanner (no browser capabilities reported)\n - DEVICE_TYPE_MOBILE: Mobile handset browser\n - DEVICE_TYPE_TABLET: Tablet browser\n - DEVICE_TYPE_DESKTOP: Desktop or laptop browser\n - DEVICE_TYPE_UNKNOWN: Unable to classify the device",
        "enum": [
          "DEVICE_TYPE_UNSPECIFIED",
          "DEVICE_TYPE_NATIVE",
          "DEVICE_TYPE_MOBILE",
          "DEVICE_TYPE_TABLET",
          "DEVICE_TYPE_DESKTOP",
          "DEVICE_TYPE_UNKNOWN"
        ],
        "type": "string"
      },
      "DeviceTypeConditionOption": {
        "description": "Device type condition option for EVENT_ACTION_DEVICE_TYPE_CONDITION.",
        "properties": {
          "id": {
            "example": "option-1",
            "type": "string"
          },
          "name": {
            "example": "Desktop Users",
            "type": "string"
          },
          "nextStepId": {
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "type": "string"
          },
          "value": {
            "description": "Allowed values for device type routing conditions.",
            "enum": [
              "DEVICE_TYPE_CONDITION_VALUE_UNSPECIFIED",
              "DEVICE_TYPE_CONDITION_VALUE_MOBILE",
              "DEVICE_TYPE_CONDITION_VALUE_DESKTOP",
              "DEVICE_TYPE_CONDITION_VALUE_TABLET",
              "DEVICE_TYPE_CONDITION_VALUE_UNKNOWN"
            ],
            "example": "DEVICE_TYPE_CONDITION_VALUE_DESKTOP"
          }
        },
        "type": "object"
      },
      "DeviceTypeConditionPayload": {
        "properties": {
          "elseNextStepId": {
            "example": "987fcdeb-a321-45e6-b789-123456789012",
            "type": "string"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/DeviceTypeConditionOption",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "DeviceTypeConditionTraceData": {
        "description": "DeviceTypeConditionTraceData stores device type routing metadata.",
        "properties": {
          "deviceType": {
            "type": "string"
          },
          "hasElse": {
            "type": "boolean"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/DeviceTypeConditionTraceOption",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "DeviceTypeConditionTraceOption": {
        "properties": {
          "deviceType": {
            "type": "string"
          },
          "hasRoute": {
            "type": "boolean"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "DeviceTypeConditionValue": {
        "default": "DEVICE_TYPE_CONDITION_VALUE_UNSPECIFIED",
        "description": "Allowed values for device type routing conditions.",
        "enum": [
          "DEVICE_TYPE_CONDITION_VALUE_UNSPECIFIED",
          "DEVICE_TYPE_CONDITION_VALUE_MOBILE",
          "DEVICE_TYPE_CONDITION_VALUE_DESKTOP",
          "DEVICE_TYPE_CONDITION_VALUE_TABLET",
          "DEVICE_TYPE_CONDITION_VALUE_UNKNOWN"
        ],
        "type": "string"
      },
      "DigestFrequency": {
        "default": "DIGEST_FREQUENCY_UNSPECIFIED",
        "description": "- DIGEST_FREQUENCY_UNSPECIFIED: Not specified; defaults to monthly\n - DIGEST_FREQUENCY_NONE: No digest emails\n - DIGEST_FREQUENCY_WEEKLY: Weekly digest every Monday\n - DIGEST_FREQUENCY_MONTHLY: Monthly digest on the 1st of each month",
        "enum": [
          "DIGEST_FREQUENCY_UNSPECIFIED",
          "DIGEST_FREQUENCY_NONE",
          "DIGEST_FREQUENCY_WEEKLY",
          "DIGEST_FREQUENCY_MONTHLY"
        ],
        "title": "DigestFrequency controls how often the workspace receives traffic digest emails",
        "type": "string"
      },
      "DirectoriesServiceUpdateBody": {
        "properties": {
          "name": {
            "example": "My Updated Directory",
            "title": "The new name of the directory",
            "type": "string"
          },
          "parentDirectoryId": {
            "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
            "title": "The ID of the parent directory to move this directory under (UUID)",
            "type": "string"
          },
          "parentDirectoryIdDelete": {
            "title": "Move the directory to root level by removing its parent\nIf true, the parent_directory_id will be set to null",
            "type": "boolean"
          }
        },
        "title": "Request to update a directory",
        "type": "object"
      },
      "Directory": {
        "description": "An organizational bucket that groups links and other directories into a hierarchical folder structure\nwithin a workspace.",
        "externalDocs": {
          "description": "Learn more about directories in Linkbreakers.",
          "url": "https://linkbreakers.com/help/article/what-is-a-directory-in-linkbreakers"
        },
        "properties": {
          "createdAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "When the directory was created",
            "type": "string"
          },
          "id": {
            "example": "d87a9b30-5c8b-4d4e-9fd3-5f5f5f5f5f5f",
            "title": "The unique identifier of the directory (UUID)",
            "type": "string"
          },
          "name": {
            "title": "The name of the directory",
            "type": "string"
          },
          "parentDirectoryId": {
            "description": "The ID of the parent directory (UUID)\nIf not set, the directory is at the root level.",
            "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
            "type": "string"
          },
          "path": {
            "description": "Full hierarchical path separated by slashes, computed server-side",
            "example": "marketing/campaigns/summer-2024",
            "readOnly": true,
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "When the directory was last updated",
            "type": "string"
          },
          "workspaceId": {
            "example": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0",
            "title": "The workspace ID the directory belongs to (UUID)",
            "type": "string"
          }
        },
        "title": "Directory",
        "type": "object"
      },
      "DisconnectWorkflowStepResponse": {
        "properties": {
          "disconnectedSteps": {
            "items": {
              "$ref": "#/components/schemas/WorkflowIssue",
              "type": "object"
            },
            "title": "Steps that nothing can reach now that this connection was cleared",
            "type": "array"
          },
          "unconnectedBranchIds": {
            "items": {
              "type": "string"
            },
            "title": "Branches of this step that lead nowhere, including the one just cleared",
            "type": "array"
          },
          "workflowStep": {
            "$ref": "#/components/schemas/WorkflowStep",
            "title": "The step the connection left from, as it now stands"
          }
        },
        "title": "Response for clearing a workflow step branch",
        "type": "object"
      },
      "DismissAllowanceNoticeRequest": {
        "properties": {
          "key": {
            "$ref": "#/components/schemas/PlanLimitKey",
            "title": "The limit whose notice to dismiss"
          }
        },
        "title": "Request to stop showing the over-limit notice for one limit until its next cycle",
        "type": "object"
      },
      "DnsProvider": {
        "default": "DNS_PROVIDER_UNSPECIFIED",
        "description": "- DNS_PROVIDER_UNSPECIFIED: Not detected\n - DNS_PROVIDER_UNKNOWN: The nameservers do not match any provider Linkbreakers knows",
        "enum": [
          "DNS_PROVIDER_UNSPECIFIED",
          "DNS_PROVIDER_UNKNOWN",
          "DNS_PROVIDER_CLOUDFLARE",
          "DNS_PROVIDER_GODADDY",
          "DNS_PROVIDER_NAMECHEAP",
          "DNS_PROVIDER_SQUARESPACE",
          "DNS_PROVIDER_IONOS",
          "DNS_PROVIDER_OVHCLOUD",
          "DNS_PROVIDER_GANDI",
          "DNS_PROVIDER_HOSTINGER",
          "DNS_PROVIDER_WIX",
          "DNS_PROVIDER_AWS_ROUTE53",
          "DNS_PROVIDER_GOOGLE_CLOUD_DNS",
          "DNS_PROVIDER_DIGITALOCEAN",
          "DNS_PROVIDER_VERCEL",
          "DNS_PROVIDER_PORKBUN",
          "DNS_PROVIDER_NAME_COM",
          "DNS_PROVIDER_HOVER",
          "DNS_PROVIDER_NETWORK_SOLUTIONS",
          "DNS_PROVIDER_BLUEHOST",
          "DNS_PROVIDER_NETLIFY",
          "DNS_PROVIDER_AZURE_DNS",
          "DNS_PROVIDER_DYNADOT",
          "DNS_PROVIDER_NAMESILO"
        ],
        "title": "DNS provider managing a domain, detected from the zone's nameservers",
        "type": "string"
      },
      "DnsRecordPurpose": {
        "default": "DNS_RECORD_PURPOSE_UNSPECIFIED",
        "description": "- DNS_RECORD_PURPOSE_UNSPECIFIED: Not specified\n - DNS_RECORD_PURPOSE_ROUTING: Sends the domain's traffic to Linkbreakers\n - DNS_RECORD_PURPOSE_CERTIFICATE_DELEGATION: Lets the certificate provider issue and renew the HTTPS certificate on its own\n - DNS_RECORD_PURPOSE_OWNERSHIP: Proves ownership of the domain\n - DNS_RECORD_PURPOSE_CERTIFICATE_VALIDATION: Validates the certificate currently being issued",
        "enum": [
          "DNS_RECORD_PURPOSE_UNSPECIFIED",
          "DNS_RECORD_PURPOSE_ROUTING",
          "DNS_RECORD_PURPOSE_CERTIFICATE_DELEGATION",
          "DNS_RECORD_PURPOSE_OWNERSHIP",
          "DNS_RECORD_PURPOSE_CERTIFICATE_VALIDATION"
        ],
        "title": "Why a DNS record is needed",
        "type": "string"
      },
      "DnsRecordType": {
        "default": "DNS_RECORD_TYPE_UNSPECIFIED",
        "description": "- DNS_RECORD_TYPE_UNSPECIFIED: Not specified\n - DNS_RECORD_TYPE_CNAME: CNAME record\n - DNS_RECORD_TYPE_TXT: TXT record",
        "enum": [
          "DNS_RECORD_TYPE_UNSPECIFIED",
          "DNS_RECORD_TYPE_CNAME",
          "DNS_RECORD_TYPE_TXT"
        ],
        "title": "Type of a DNS record to create",
        "type": "string"
      },
      "DotsOptions": {
        "properties": {
          "themeColor": {
            "$ref": "#/components/schemas/ThemeColor",
            "title": "Color configuration supporting solid colors and gradients"
          },
          "type": {
            "enum": [
              "DOTS_TYPE_UNSPECIFIED",
              "DOTS_TYPE_SQUARE",
              "DOTS_TYPE_DOTS",
              "DOTS_TYPE_BUBBLY_DOTS",
              "DOTS_TYPE_CIRCUIT_CHIP",
              "DOTS_TYPE_ROUNDED",
              "DOTS_TYPE_EXTRA_ROUNDED",
              "DOTS_TYPE_CLASSY",
              "DOTS_TYPE_CLASSY_ROUNDED",
              "DOTS_TYPE_HEXAGON",
              "DOTS_TYPE_OCTAGON"
            ],
            "title": "Rendering style for data dots"
          }
        },
        "title": "DotsOptions represents the styling options for the dots in the QR code",
        "type": "object"
      },
      "DotsType": {
        "default": "DOTS_TYPE_UNSPECIFIED",
        "enum": [
          "DOTS_TYPE_UNSPECIFIED",
          "DOTS_TYPE_SQUARE",
          "DOTS_TYPE_DOTS",
          "DOTS_TYPE_BUBBLY_DOTS",
          "DOTS_TYPE_CIRCUIT_CHIP",
          "DOTS_TYPE_ROUNDED",
          "DOTS_TYPE_EXTRA_ROUNDED",
          "DOTS_TYPE_CLASSY",
          "DOTS_TYPE_CLASSY_ROUNDED",
          "DOTS_TYPE_HEXAGON",
          "DOTS_TYPE_OCTAGON"
        ],
        "title": "DotsType represents the rendering style for QR code data dots",
        "type": "string"
      },
      "EntryAccessTraceData": {
        "description": "EntryAccessTraceData stores details for entry access traces.",
        "properties": {
          "accessedAt": {
            "type": "string"
          },
          "action": {
            "type": "string"
          },
          "entrypoint": {
            "type": "string"
          },
          "httpMethod": {
            "type": "string"
          },
          "visitType": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "ErrorResponse": {
        "properties": {
          "code": {
            "description": "HTTP status code",
            "format": "int32",
            "type": "integer"
          },
          "codeType": {
            "default": "UNKNOWN",
            "description": "Custom error code type",
            "type": "string"
          },
          "details": {
            "description": "Additional error details",
            "items": {
              "type": "object"
            },
            "type": "array"
          },
          "message": {
            "description": "Error message",
            "type": "string"
          }
        },
        "required": [
          "code",
          "codeType",
          "message",
          "details"
        ],
        "type": "object"
      },
      "Event": {
        "description": "Records each scan or workflow action Linkbreakers processes, stitching together visitor, device, link, and routing\ndetails so analytics and automations stay in sync.",
        "externalDocs": {
          "description": "Learn more about events in Linkbreakers",
          "url": "https://linkbreakers.com/help/article/what-is-an-event"
        },
        "properties": {
          "action": {
            "$ref": "#/components/schemas/Action",
            "example": "ACTION_SCAN",
            "title": "Type of event generated by the workflow engine"
          },
          "createdAt": {
            "format": "date-time",
            "title": "Timestamp when the event object was created",
            "type": "string"
          },
          "destination": {
            "example": "https://brand.example.com/checkout",
            "title": "Final resolved destination after workflow evaluation",
            "type": "string"
          },
          "destinationAction": {
            "$ref": "#/components/schemas/EventAction",
            "description": "The workflow action that produced the destination URL. CLIENT_REDIRECT indicates a standard URL redirection, while other values represent form submissions, contact cards, etc.",
            "example": "EVENT_ACTION_CLIENT_REDIRECT",
            "title": "Action type that generated this destination (e.g., CLIENT_REDIRECT for URL redirects)"
          },
          "device": {
            "$ref": "#/components/schemas/Device",
            "title": "Snapshot of the device when the event was created (optional include)"
          },
          "deviceId": {
            "example": "6f1b2e90-1234-4c8f-91e1-63cd927bf908",
            "title": "Device fingerprint associated with the event (UUID)",
            "type": "string"
          },
          "entrypoint": {
            "example": "https://linkbreak.ing/4BnH-R19p",
            "title": "Entrypoint URL that received the request (short link)",
            "type": "string"
          },
          "httpMethod": {
            "$ref": "#/components/schemas/HTTPMethod",
            "example": "HTTP_METHOD_GET",
            "title": "HTTP verb used to trigger this event (if applicable)"
          },
          "id": {
            "example": "8b6e1a2c-7d4f-4fd2-8b35-9a4c1f2d993a",
            "title": "Unique identifier for the event object (UUID)",
            "type": "string"
          },
          "journey": {
            "$ref": "#/components/schemas/JourneyProgress",
            "description": "How far the visitor got through the link's workflow on this visit\n(include \"journey\")."
          },
          "link": {
            "$ref": "#/components/schemas/Link",
            "title": "Link information associated with the event"
          },
          "linkId": {
            "example": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
            "title": "Identifier of the link producing the event (UUID)",
            "type": "string"
          },
          "scannedAt": {
            "format": "date-time",
            "title": "When the QR code or link was accessed",
            "type": "string"
          },
          "traces": {
            "items": {
              "$ref": "#/components/schemas/EventTrace",
              "type": "object"
            },
            "title": "Workflow step traces for engagement tracking (included only on demand)",
            "type": "array"
          },
          "triggeredBy": {
            "$ref": "#/components/schemas/TriggeredBy",
            "example": "TRIGGERED_BY_VISITOR",
            "title": "Whether the workflow was triggered by a visitor or automation"
          },
          "updatedAt": {
            "format": "date-time",
            "title": "Timestamp when the event object was last updated (e.g. when enrichment completed)",
            "type": "string"
          },
          "visitType": {
            "$ref": "#/components/schemas/VisitType",
            "example": "VISIT_TYPE_FIRST",
            "title": "Whether this was the first or a returning visit for the same device on the same link"
          },
          "visitor": {
            "$ref": "#/components/schemas/Visitor"
          },
          "visitorId": {
            "example": "4da3e6a2-2d54-4b0f-9e17-4b6c2af7e9c5",
            "title": "Visitor profile associated with the event (UUID)",
            "type": "string"
          },
          "workspace": {
            "$ref": "#/components/schemas/Workspace",
            "title": "Workspace that owns the link"
          },
          "workspaceId": {
            "example": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0",
            "title": "Identifier of the owning workspace (UUID)",
            "type": "string"
          }
        },
        "title": "Event",
        "type": "object"
      },
      "EventAction": {
        "default": "EVENT_ACTION_UNSPECIFIED",
        "description": "- EVENT_ACTION_UNSPECIFIED: Event action not specified\n - EVENT_ACTION_CLIENT_REDIRECT: Redirect visitors to a destination URL\n - EVENT_ACTION_LINK_VISIT: Entry step triggered when the link is visited.\n - EVENT_ACTION_PASSWORD_VERIFY: Require visitors to enter a password before proceeding\n - EVENT_ACTION_FORM_SUBMIT: Present a data collection form to visitors\n - EVENT_ACTION_CONTACT_CARD: Generate a vCard (VCF) response with contact information\n - EVENT_ACTION_MULTI_LINK: A page of buttons where each one continues into more workflow: the button\nleads to a next step, not straight out. Records which button the visitor\npressed, so use it over SOCIAL_LINKS_PAGE when that choice is worth\nmeasuring or when a branch needs to do more than redirect. This is the\nmenu step: for several documents or PDFs, give each one a button\nconnected to an OPEN_MEDIA step for media uploaded to the media library, or to\na CLIENT_REDIRECT when the document is already hosted at a URL.\n - EVENT_ACTION_VISIT_TYPE_CONDITION: Route visitors based on whether it's a first or returning visit\n - EVENT_ACTION_COUNTRY_CONDITION: Route visitors based on their country location\n - EVENT_ACTION_DAY_OF_WEEK_CONDITION: Route visitors based on day of week\n - EVENT_ACTION_TIME_OF_DAY_CONDITION: Route visitors based on time of day\n - EVENT_ACTION_DAY_OF_MONTH_CONDITION: Route visitors based on day of month\n - EVENT_ACTION_SPECIFIC_DATE_CONDITION: Route visitors based on specific calendar dates\n - EVENT_ACTION_SOCIAL_LINKS_PAGE: A page of buttons that each leave for an external URL. Social profiles are\nthe common case, not the only one: app stores, docs, booking pages and\nstorefronts all work, and the name is the only thing about it that is\nsocial. It is an exit step, so the visitor leaves from here.\n - EVENT_ACTION_DEVICE_TYPE_CONDITION: Route visitors based on device type (e.g. MOBILE, DESKTOP, TABLET)\n - EVENT_ACTION_DEVICE_PLATFORM_CONDITION: Route visitors based on device platform / operating system (e.g. iOS, Android, macOS)\n - EVENT_ACTION_DEVICE_BROWSER_CONDITION: Route visitors based on browser family (e.g. Chrome, Safari, Firefox)\n - EVENT_ACTION_DEVICE_BRAND_CONDITION: Route visitors based on hardware brand (e.g. Apple, Samsung, Google)\n - EVENT_ACTION_DEVICE_ACTOR_CONDITION: Route visitors based on actor classification (e.g. HUMAN, BOT, AGENT)\n - EVENT_ACTION_VISITOR_DATA_CONDITION: Route visitors based on their profile data or custom attributes\n - EVENT_ACTION_THANK_YOU_PAGE: Display a final thank you / completion message (exit step)\n - EVENT_ACTION_MESSAGE_PAGE: Text with ONE way onward: a single button, or a timer that moves the\nvisitor automatically. It carries no list of destinations, so a page that\nshould offer a choice between two or more places is not this step. Use\nSOCIAL_LINKS_PAGE when the choices leave for external URLs, or MULTI_LINK\nwhen each choice continues into more workflow. Never put links, documents\nor PDFs on it: it is a message, nothing else.\n - EVENT_ACTION_OPEN_MEDIA: Hand the visitor one piece of uploaded media, opened in their browser (exit step): a PDF,\nan image (PNG, JPEG, WebP, SVG) or an MP4 video. The visitor is sent straight to the media,\nwith no page of its own. Any media of the library can be opened: it is uploaded once and\nreferenced by its media_id; swapping it means pointing the step at another media item,\nand the QR code never changes.",
        "enum": [
          "EVENT_ACTION_UNSPECIFIED",
          "EVENT_ACTION_CLIENT_REDIRECT",
          "EVENT_ACTION_LINK_VISIT",
          "EVENT_ACTION_PASSWORD_VERIFY",
          "EVENT_ACTION_FORM_SUBMIT",
          "EVENT_ACTION_CONTACT_CARD",
          "EVENT_ACTION_MULTI_LINK",
          "EVENT_ACTION_VISIT_TYPE_CONDITION",
          "EVENT_ACTION_COUNTRY_CONDITION",
          "EVENT_ACTION_DAY_OF_WEEK_CONDITION",
          "EVENT_ACTION_TIME_OF_DAY_CONDITION",
          "EVENT_ACTION_DAY_OF_MONTH_CONDITION",
          "EVENT_ACTION_SPECIFIC_DATE_CONDITION",
          "EVENT_ACTION_SOCIAL_LINKS_PAGE",
          "EVENT_ACTION_DEVICE_TYPE_CONDITION",
          "EVENT_ACTION_DEVICE_PLATFORM_CONDITION",
          "EVENT_ACTION_DEVICE_BROWSER_CONDITION",
          "EVENT_ACTION_DEVICE_BRAND_CONDITION",
          "EVENT_ACTION_DEVICE_ACTOR_CONDITION",
          "EVENT_ACTION_VISITOR_DATA_CONDITION",
          "EVENT_ACTION_THANK_YOU_PAGE",
          "EVENT_ACTION_MESSAGE_PAGE",
          "EVENT_ACTION_OPEN_MEDIA"
        ],
        "title": "Event action types for workflow steps",
        "type": "string"
      },
      "EventTrace": {
        "description": "Records workflow step completion for engagement tracking, capturing form submissions, page views,\nand user interactions to measure engagement quality.",
        "properties": {
          "completedAt": {
            "format": "date-time",
            "title": "When this step was completed",
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "title": "When this trace was created",
            "type": "string"
          },
          "eventId": {
            "example": "8b6e1a2c-7d4f-4fd2-8b35-9a4c1f2d993a",
            "title": "Event this trace belongs to (UUID)",
            "type": "string"
          },
          "id": {
            "example": "2a7b8c9d-1e2f-4a5b-9c8d-7e6f5a4b3c2d",
            "title": "Unique identifier for the event trace (UUID)",
            "type": "string"
          },
          "linkId": {
            "example": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
            "title": "Link associated with this trace (UUID)",
            "type": "string"
          },
          "savedAttributes": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "What this step saved to the visitor's profile, when the step is set to\nsave attributes. Keys are attribute keys, values the text saved.",
            "type": "object"
          },
          "stepAction": {
            "example": "contact_form",
            "title": "Workflow step action",
            "type": "string"
          },
          "stepData": {
            "$ref": "#/components/schemas/EventTraceData",
            "title": "JSON data associated with this step (form data, page info, etc.)"
          },
          "stepKind": {
            "example": "INTERACTION",
            "title": "Workflow step kind: ENTRY, EXIT, INTERACTION, CONDITION",
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "title": "When this trace was last updated",
            "type": "string"
          },
          "visitorId": {
            "example": "4da3e6a2-2d54-4b0f-9e17-4b6c2af7e9c5",
            "title": "Visitor who performed this action (UUID, optional)",
            "type": "string"
          },
          "workspaceId": {
            "example": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0",
            "title": "Workspace that owns this trace (UUID)",
            "type": "string"
          }
        },
        "title": "EventTrace",
        "type": "object"
      },
      "EventTraceData": {
        "description": "EventTraceData captures the payload for a completed workflow step.",
        "properties": {
          "contactCard": {
            "$ref": "#/components/schemas/ContactCardTraceData"
          },
          "countryCondition": {
            "$ref": "#/components/schemas/CountryConditionTraceData"
          },
          "dayOfMonthCondition": {
            "$ref": "#/components/schemas/DayOfMonthConditionTraceData"
          },
          "dayOfWeekCondition": {
            "$ref": "#/components/schemas/DayOfWeekConditionTraceData"
          },
          "deviceActorCondition": {
            "$ref": "#/components/schemas/DeviceActorConditionTraceData"
          },
          "deviceBrandCondition": {
            "$ref": "#/components/schemas/DeviceBrandConditionTraceData"
          },
          "deviceBrowserCondition": {
            "$ref": "#/components/schemas/DeviceBrowserConditionTraceData"
          },
          "devicePlatformCondition": {
            "$ref": "#/components/schemas/DevicePlatformConditionTraceData"
          },
          "deviceTypeCondition": {
            "$ref": "#/components/schemas/DeviceTypeConditionTraceData"
          },
          "entryAccess": {
            "$ref": "#/components/schemas/EntryAccessTraceData"
          },
          "form": {
            "$ref": "#/components/schemas/FormTraceData"
          },
          "identifyVisitor": {
            "$ref": "#/components/schemas/IdentifyVisitorTraceData"
          },
          "media": {
            "$ref": "#/components/schemas/MediaTraceData"
          },
          "multiLink": {
            "$ref": "#/components/schemas/MultiLinkTraceData"
          },
          "password": {
            "$ref": "#/components/schemas/PasswordTraceData"
          },
          "redirect": {
            "$ref": "#/components/schemas/RedirectTraceData"
          },
          "socialLinks": {
            "$ref": "#/components/schemas/SocialLinksTraceData"
          },
          "specificDateCondition": {
            "$ref": "#/components/schemas/SpecificDateConditionTraceData"
          },
          "timeOfDayCondition": {
            "$ref": "#/components/schemas/TimeOfDayConditionTraceData"
          },
          "visitTypeCondition": {
            "$ref": "#/components/schemas/VisitTypeConditionTraceData"
          },
          "visitorDataCondition": {
            "$ref": "#/components/schemas/VisitorDataConditionTraceData"
          }
        },
        "type": "object"
      },
      "EventsMetric": {
        "description": "Aggregated analytics calculated on demand for time windows, giving Linkbreakers UIs headline numbers without exposing raw events.",
        "properties": {
          "firstAt": {
            "format": "date-time",
            "title": "Timestamp of the first event in the aggregated range",
            "type": "string"
          },
          "lastAt": {
            "format": "date-time",
            "title": "Timestamp of the last event in the aggregated range",
            "type": "string"
          },
          "topCity": {
            "title": "The top city",
            "type": "string"
          },
          "topCountry": {
            "title": "The top country (ISO code or name)",
            "type": "string"
          },
          "topDeviceType": {
            "description": "DeviceType represents the physical form factor of the device.\nThis describes the hardware category (phone, tablet, laptop, etc.),\nNOT who or what is operating it — see DeviceActor for that.\n\n - DEVICE_TYPE_UNSPECIFIED: Device type not specified or not yet detected\n - DEVICE_TYPE_NATIVE: Native QR scanner (no browser capabilities reported)\n - DEVICE_TYPE_MOBILE: Mobile handset browser\n - DEVICE_TYPE_TABLET: Tablet browser\n - DEVICE_TYPE_DESKTOP: Desktop or laptop browser\n - DEVICE_TYPE_UNKNOWN: Unable to classify the device",
            "enum": [
              "DEVICE_TYPE_UNSPECIFIED",
              "DEVICE_TYPE_NATIVE",
              "DEVICE_TYPE_MOBILE",
              "DEVICE_TYPE_TABLET",
              "DEVICE_TYPE_DESKTOP",
              "DEVICE_TYPE_UNKNOWN"
            ],
            "example": "DEVICE_TYPE_DESKTOP",
            "title": "The top device type"
          },
          "totalCities": {
            "format": "int32",
            "title": "Total number of unique cities seen in the events",
            "type": "integer"
          },
          "totalCountries": {
            "format": "int32",
            "title": "Total number of unique countries seen in the events",
            "type": "integer"
          },
          "totalDeviceTypes": {
            "format": "int32",
            "title": "Number of unique device types",
            "type": "integer"
          },
          "totalEvents": {
            "format": "int32",
            "title": "Total number of events matching the query window",
            "type": "integer"
          }
        },
        "title": "EventsMetric",
        "type": "object"
      },
      "EventsServiceCreateEventTraceBody": {
        "properties": {
          "stepAction": {
            "example": "contact_form",
            "title": "Workflow step action",
            "type": "string"
          },
          "stepData": {
            "$ref": "#/components/schemas/EventTraceData",
            "title": "JSON data associated with this step"
          },
          "stepKind": {
            "example": "INTERACTION",
            "title": "Workflow step kind: ENTRY, EXIT, INTERACTION, CONDITION",
            "type": "string"
          }
        },
        "title": "CreateEventTraceRequest creates a new workflow step trace",
        "type": "object"
      },
      "EventsServiceUpdateDeviceBody": {
        "properties": {
          "deviceInput": {
            "$ref": "#/components/schemas/DeviceInput",
            "title": "Latest snapshot of device characteristics reported by the browser"
          }
        },
        "title": "Request for UpdateDevice mutation",
        "type": "object"
      },
      "EventsTimeSeries": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/EventsTimeSeriesData",
              "type": "object"
            },
            "title": "Sequence of aggregated buckets ordered by timestamp",
            "type": "array"
          },
          "totalData": {
            "format": "int32",
            "title": "Number of data points returned (may be fewer than total intervals when empty buckets omitted)",
            "type": "integer"
          },
          "totalIntervals": {
            "format": "int32",
            "title": "Number of intervals between start and end dates",
            "type": "integer"
          }
        },
        "title": "EventsTimeSeries represents the complete time series data",
        "type": "object"
      },
      "EventsTimeSeriesData": {
        "properties": {
          "eventCount": {
            "format": "int32",
            "title": "Number of events recorded in the interval",
            "type": "integer"
          },
          "timestamp": {
            "format": "date-time",
            "title": "Start timestamp of the interval",
            "type": "string"
          }
        },
        "title": "EventsTimeSeriesData represents a single data point in the time series",
        "type": "object"
      },
      "FindMatchingPageThemeTemplateResponse": {
        "properties": {
          "matched": {
            "title": "Whether the link's styling already exists as a template",
            "type": "boolean"
          },
          "pageThemeTemplate": {
            "$ref": "#/components/schemas/PageThemeTemplate",
            "description": "The matching template. Absent when matched is false. Its backing theme is\nnot included: this answers identity, not styling."
          }
        },
        "title": "Response naming the matching template, when there is one",
        "type": "object"
      },
      "FontConfig": {
        "properties": {
          "bold": {
            "title": "Bold styling",
            "type": "boolean"
          },
          "color": {
            "$ref": "#/components/schemas/ThemeColor",
            "title": "Text color (ThemeColor)"
          },
          "family": {
            "description": " - PAGE_THEME_FONT_FAMILY_UNSPECIFIED: Maps to the default system sans-serif stack.",
            "enum": [
              "PAGE_THEME_FONT_FAMILY_UNSPECIFIED",
              "PAGE_THEME_FONT_FAMILY_DEFAULT",
              "PAGE_THEME_FONT_FAMILY_ARIAL",
              "PAGE_THEME_FONT_FAMILY_HELVETICA",
              "PAGE_THEME_FONT_FAMILY_VERDANA",
              "PAGE_THEME_FONT_FAMILY_GEORGIA",
              "PAGE_THEME_FONT_FAMILY_TIMES_NEW_ROMAN",
              "PAGE_THEME_FONT_FAMILY_COURIER_NEW"
            ]
          },
          "familyStack": {
            "description": "Exact CSS font stack. Takes precedence over family when writing.",
            "example": "\"Gill Sans\", \"Trebuchet MS\", sans-serif",
            "type": "string"
          },
          "fontSize": {
            "format": "int32",
            "title": "Font size in pixels",
            "type": "integer"
          },
          "italic": {
            "title": "Italic styling",
            "type": "boolean"
          }
        },
        "title": "Font configuration with family, styling, and color",
        "type": "object"
      },
      "FormField": {
        "properties": {
          "defaultValue": {
            "title": "Value pre-filled when the form renders",
            "type": "string"
          },
          "helpText": {
            "title": "Helper copy displayed under the input",
            "type": "string"
          },
          "id": {
            "example": "3f0d2b23-9f51-4d56-84d7-5d9d70fb49c2",
            "title": "Unique identifier for this field within the form",
            "type": "string"
          },
          "key": {
            "title": "Field key for data storage (maps to visitor attributes or system fields like $email)",
            "type": "string"
          },
          "label": {
            "title": "Display label for the field",
            "type": "string"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/FormFieldOption",
              "type": "object"
            },
            "title": "Options for radio, checkbox, or select fields",
            "type": "array"
          },
          "order": {
            "format": "int32",
            "title": "Display order (for drag-and-drop reordering)",
            "type": "integer"
          },
          "placeholder": {
            "title": "Placeholder text",
            "type": "string"
          },
          "required": {
            "title": "Whether this field is required",
            "type": "boolean"
          },
          "type": {
            "description": "- FORM_FIELD_TYPE_UNSPECIFIED: Form field type not specified",
            "enum": [
              "FORM_FIELD_TYPE_UNSPECIFIED",
              "FORM_FIELD_TYPE_TEXT",
              "FORM_FIELD_TYPE_EMAIL",
              "FORM_FIELD_TYPE_PHONE",
              "FORM_FIELD_TYPE_TEXTAREA",
              "FORM_FIELD_TYPE_RADIO",
              "FORM_FIELD_TYPE_CHECKBOX",
              "FORM_FIELD_TYPE_DROPDOWN",
              "FORM_FIELD_TYPE_NUMBER",
              "FORM_FIELD_TYPE_DATE",
              "FORM_FIELD_TYPE_RATING"
            ],
            "example": "FORM_FIELD_TYPE_EMAIL",
            "title": "Field type (text, email, radio, etc.)"
          },
          "validationPattern": {
            "title": "Additional field-specific configuration\nOptional regex applied client-side to validate the field value",
            "type": "string"
          }
        },
        "title": "Form field definition for FORM_SUBMIT event action",
        "type": "object"
      },
      "FormFieldOption": {
        "properties": {
          "label": {
            "title": "Human-readable label presented to members",
            "type": "string"
          },
          "value": {
            "title": "Value stored when the option is selected",
            "type": "string"
          }
        },
        "title": "Option for radio, checkbox, or select fields",
        "type": "object"
      },
      "FormFieldType": {
        "default": "FORM_FIELD_TYPE_UNSPECIFIED",
        "description": "- FORM_FIELD_TYPE_UNSPECIFIED: Form field type not specified",
        "enum": [
          "FORM_FIELD_TYPE_UNSPECIFIED",
          "FORM_FIELD_TYPE_TEXT",
          "FORM_FIELD_TYPE_EMAIL",
          "FORM_FIELD_TYPE_PHONE",
          "FORM_FIELD_TYPE_TEXTAREA",
          "FORM_FIELD_TYPE_RADIO",
          "FORM_FIELD_TYPE_CHECKBOX",
          "FORM_FIELD_TYPE_DROPDOWN",
          "FORM_FIELD_TYPE_NUMBER",
          "FORM_FIELD_TYPE_DATE",
          "FORM_FIELD_TYPE_RATING"
        ],
        "title": "Form field types for FORM_SUBMIT event action",
        "type": "string"
      },
      "FormPayload": {
        "properties": {
          "autoSkipIfKnown": {
            "title": "Automatically skip the form when required data is already known",
            "type": "boolean"
          },
          "formDescription": {
            "title": "Body copy rendered above the form fields",
            "type": "string"
          },
          "formFields": {
            "items": {
              "$ref": "#/components/schemas/FormField",
              "type": "object"
            },
            "title": "Form fields to present to visitors",
            "type": "array"
          },
          "formTitle": {
            "title": "Optional heading shown on the visitor form",
            "type": "string"
          },
          "skipButtonText": {
            "title": "Custom text for the skip button (defaults to \"Skip for now\" when skip_form is enabled)",
            "type": "string"
          },
          "skipForm": {
            "title": "Whether the visitor experience should offer a \"Skip\" option and record an empty submission",
            "type": "boolean"
          },
          "submitButtonText": {
            "title": "Custom text for the submit button (defaults to \"Submit\")",
            "type": "string"
          }
        },
        "title": "Form data collection payload for EVENT_ACTION_FORM_SUBMIT",
        "type": "object"
      },
      "FormTraceData": {
        "description": "FormTraceData stores summary data about a form interaction.",
        "properties": {
          "action": {
            "type": "string"
          },
          "autoSkipIfKnown": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          },
          "fields": {
            "items": {
              "$ref": "#/components/schemas/FormTraceDataField",
              "type": "object"
            },
            "type": "array"
          },
          "skipButtonText": {
            "type": "string"
          },
          "skipMethod": {
            "type": "string"
          },
          "skipped": {
            "type": "boolean"
          },
          "submitButtonText": {
            "type": "string"
          },
          "submittedFields": {
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "totalFields": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "FormTraceDataField": {
        "description": "FormTraceDataField stores a single field value captured by the form interaction.",
        "properties": {
          "defaultValue": {
            "type": "string"
          },
          "helpText": {
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "order": {
            "format": "int32",
            "type": "integer"
          },
          "placeholder": {
            "type": "string"
          },
          "required": {
            "type": "boolean"
          },
          "type": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "FunnelBranch": {
        "description": "FunnelBranch is one choice within a step, such as a button on a multi-link\npage.",
        "properties": {
          "label": {
            "title": "The button's label, as the visitor saw it",
            "type": "string"
          },
          "shareOfStep": {
            "format": "double",
            "title": "Visits as a percentage of the journeys that reached the step",
            "type": "number"
          },
          "visits": {
            "description": "Journeys that took this branch. Zero means it was offered and nobody took\nit, which is worth seeing rather than hiding.",
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "FunnelStep": {
        "description": "FunnelStep is one step of the journey, already placed in order.",
        "properties": {
          "branches": {
            "description": "Choices offered inside this step, where it offers one. A multi-link step is\na single row but several different things happened in it.",
            "items": {
              "$ref": "#/components/schemas/FunnelBranch",
              "type": "object"
            },
            "type": "array"
          },
          "conversionRate": {
            "format": "double",
            "title": "Visits as a percentage of those who arrived; the entry step is 100",
            "type": "number"
          },
          "dropOffFromPrevious": {
            "format": "int64",
            "title": "Journeys that did not get here from the step above",
            "type": "integer"
          },
          "identifiedVisitors": {
            "format": "int64",
            "title": "How many of those journeys belong to a known visitor",
            "type": "integer"
          },
          "interactionRate": {
            "description": "Interactions as a percentage of occurrences.\n\nThe action is recorded on the trace the step already opened, so both counts\ncome from the same rows and this cannot exceed 100, however many times one\nvisitor pressed. Branch shares can add up past 100, which is a different\nand honest number: a social links page is not a fork, and one visitor may\nopen every link on it.",
            "format": "double",
            "type": "number"
          },
          "interactions": {
            "description": "Journeys where the visitor acted on the step rather than only reaching it:\npressing a link on a social links page, choosing a button on a multi-link.\nZero on steps that offer nothing to act on.",
            "format": "int64",
            "type": "integer"
          },
          "occurrences": {
            "format": "int64",
            "title": "Every trace recorded, so a step that repeats stays visible",
            "type": "integer"
          },
          "stepAction": {
            "title": "Workflow step, e.g. \"LINK_VISIT\", \"FORM_SUBMIT\", \"CLIENT_REDIRECT\"",
            "type": "string"
          },
          "stepKind": {
            "title": "\"ENTRY\", \"CONDITION\", \"INTERACTION\" or \"EXIT\"",
            "type": "string"
          },
          "visits": {
            "description": "Journeys that reached this step, counted per event. Events are used rather\nthan visitors because visitor_id is NULL on most traces in practice, and\ncounting visitors makes later steps look wider than the arrival they came\nfrom, which pushes conversion rates above 100%.",
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "GenerateWidgetSummaryResponse": {
        "properties": {
          "result": {
            "$ref": "#/components/schemas/AnalyticsWidgetResult"
          }
        },
        "type": "object"
      },
      "GeoDataPoint": {
        "properties": {
          "eventCount": {
            "format": "int32",
            "title": "Number of events from this location",
            "type": "integer"
          },
          "location": {
            "title": "Location name (country name or city name)",
            "type": "string"
          },
          "percentage": {
            "format": "double",
            "title": "Percentage of total events",
            "type": "number"
          }
        },
        "title": "GeoDataPoint represents a geographic location with its event count",
        "type": "object"
      },
      "GetAgentClaimRequest": {
        "properties": {
          "claimAttemptToken": {
            "title": "The claim_attempt_token from the link the agent handed over",
            "type": "string"
          }
        },
        "title": "Request to read a claim link",
        "type": "object"
      },
      "GetAttributeDistributionRequest": {
        "properties": {
          "endDate": {
            "format": "date-time",
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "limit": {
            "format": "int32",
            "title": "Maximum number of values (default 10)",
            "type": "integer"
          },
          "linkId": {
            "type": "string"
          },
          "startDate": {
            "format": "date-time",
            "type": "string"
          }
        },
        "title": "GetAttributeDistributionRequest retrieves how attribute values are spread",
        "type": "object"
      },
      "GetAttributeDistributionResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/AttributeValueDataPoint",
              "type": "object"
            },
            "type": "array"
          },
          "total": {
            "format": "int32",
            "type": "integer"
          }
        },
        "title": "GetAttributeDistributionResponse contains the value spread for an attribute",
        "type": "object"
      },
      "GetAttributeMetricRequest": {
        "description": "GetAttributeMetricRequest retrieves aggregate statistics for one visitor\nattribute, for example the average rating.",
        "properties": {
          "endDate": {
            "format": "date-time",
            "title": "Inclusive end timestamp",
            "type": "string"
          },
          "key": {
            "title": "Attribute key, for example \"rating\"",
            "type": "string"
          },
          "linkId": {
            "description": "Optional link filter (UUID). Attributes belong to the visitor rather than\nto a link, so this filters the audience: visitors who interacted with the\nlink, whatever set the attribute.",
            "type": "string"
          },
          "startDate": {
            "format": "date-time",
            "title": "Inclusive start timestamp",
            "type": "string"
          }
        },
        "type": "object"
      },
      "GetAttributeMetricResponse": {
        "properties": {
          "audienceCount": {
            "format": "int32",
            "title": "Visitors in the audience, whether or not they have the attribute",
            "type": "integer"
          },
          "averageValue": {
            "format": "double",
            "type": "number"
          },
          "coverageRate": {
            "format": "double",
            "title": "Share of the audience carrying the attribute, 0 to 1",
            "type": "number"
          },
          "maxValue": {
            "format": "double",
            "type": "number"
          },
          "minValue": {
            "format": "double",
            "type": "number"
          },
          "totalCount": {
            "format": "int32",
            "title": "Visitors carrying the attribute at all",
            "type": "integer"
          },
          "usableCount": {
            "description": "Values that parsed as numbers, so the denominator for averages. Lower than\ntotal_count when some values do not match the attribute's declared type.",
            "format": "int32",
            "type": "integer"
          }
        },
        "title": "GetAttributeMetricResponse contains aggregate statistics for an attribute",
        "type": "object"
      },
      "GetAttributeValuesRequest": {
        "description": "GetAttributeValuesRequest lists individual values of one attribute, for free\ntext such as comments where a distribution would be meaningless.",
        "properties": {
          "endDate": {
            "format": "date-time",
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "limit": {
            "format": "int32",
            "title": "Maximum number of values (default 50)",
            "type": "integer"
          },
          "linkId": {
            "type": "string"
          },
          "startDate": {
            "format": "date-time",
            "type": "string"
          }
        },
        "type": "object"
      },
      "GetAttributeValuesResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/AttributeValueEntry",
              "type": "object"
            },
            "type": "array"
          },
          "total": {
            "format": "int32",
            "type": "integer"
          }
        },
        "title": "GetAttributeValuesResponse contains the recorded values, most recent first",
        "type": "object"
      },
      "GetBreakdownRequest": {
        "properties": {
          "dimension": {
            "title": "Dimension to break down by: \"browser\", \"platform\", \"device_type\", \"country\", \"city\", \"visit_type\"",
            "type": "string"
          },
          "endDate": {
            "format": "date-time",
            "title": "Inclusive end timestamp",
            "type": "string"
          },
          "limit": {
            "format": "int32",
            "title": "Maximum number of results (default 10)",
            "type": "integer"
          },
          "linkId": {
            "title": "Optional link filter (UUID); when omitted aggregates workspace-wide",
            "type": "string"
          },
          "startDate": {
            "format": "date-time",
            "title": "Inclusive start timestamp",
            "type": "string"
          }
        },
        "title": "GetBreakdownRequest retrieves a ranked breakdown of events by any dimension",
        "type": "object"
      },
      "GetBreakdownResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/BreakdownDataPoint",
              "type": "object"
            },
            "title": "Ordered list of dimension values by event count (descending)",
            "type": "array"
          },
          "total": {
            "format": "int32",
            "title": "Total number of events in the date range",
            "type": "integer"
          }
        },
        "title": "GetBreakdownResponse contains dimension breakdown data",
        "type": "object"
      },
      "GetCustomDomainResponse": {
        "properties": {
          "customDomain": {
            "$ref": "#/components/schemas/CustomDomain"
          }
        },
        "title": "Response containing the requested custom domain",
        "type": "object"
      },
      "GetCustomDomainSetupGuideResponse": {
        "properties": {
          "setupGuide": {
            "$ref": "#/components/schemas/CustomDomainSetupGuide"
          }
        },
        "title": "Response containing the setup guide of a custom domain",
        "type": "object"
      },
      "GetDeviceDistributionRequest": {
        "properties": {
          "endDate": {
            "format": "date-time",
            "title": "Inclusive end timestamp",
            "type": "string"
          },
          "linkId": {
            "title": "Optional link filter (UUID); when omitted aggregates workspace-wide",
            "type": "string"
          },
          "startDate": {
            "format": "date-time",
            "title": "Inclusive start timestamp",
            "type": "string"
          }
        },
        "title": "GetDeviceDistributionRequest retrieves device type distribution",
        "type": "object"
      },
      "GetDeviceDistributionResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/DeviceDataPoint",
              "type": "object"
            },
            "title": "Device type breakdown",
            "type": "array"
          },
          "totalEvents": {
            "format": "int32",
            "title": "Total number of events in the date range",
            "type": "integer"
          }
        },
        "title": "GetDeviceDistributionResponse contains device distribution data",
        "type": "object"
      },
      "GetDirectoryResponse": {
        "properties": {
          "directory": {
            "$ref": "#/components/schemas/Directory"
          }
        },
        "title": "Response containing the directory details",
        "type": "object"
      },
      "GetEventsTimeSeriesRequest": {
        "properties": {
          "endDate": {
            "format": "date-time",
            "title": "Inclusive end timestamp for the time series",
            "type": "string"
          },
          "intervalInMinutes": {
            "format": "int32",
            "title": "Size of each bucket in minutes (supports 5/15/60/etc.)",
            "type": "integer"
          },
          "linkId": {
            "description": "Optional filtering by link ID",
            "example": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
            "title": "Optional filter to limit data to a specific link (UUID)",
            "type": "string"
          },
          "startDate": {
            "format": "date-time",
            "title": "Inclusive start timestamp for the time series",
            "type": "string"
          }
        },
        "title": "Request message for getting events time series",
        "type": "object"
      },
      "GetEventsTimeSeriesResponse": {
        "properties": {
          "timeSeries": {
            "$ref": "#/components/schemas/EventsTimeSeries",
            "title": "Aggregated time series results"
          }
        },
        "title": "Response message for getting events time series",
        "type": "object"
      },
      "GetGeoBreakdownRequest": {
        "properties": {
          "endDate": {
            "format": "date-time",
            "title": "Inclusive end timestamp",
            "type": "string"
          },
          "groupBy": {
            "title": "Group by \"country\" or \"city\"",
            "type": "string"
          },
          "limit": {
            "format": "int32",
            "title": "Maximum number of results (default 10)",
            "type": "integer"
          },
          "linkId": {
            "title": "Optional link filter (UUID); when omitted aggregates workspace-wide",
            "type": "string"
          },
          "startDate": {
            "format": "date-time",
            "title": "Inclusive start timestamp",
            "type": "string"
          }
        },
        "title": "GetGeoBreakdownRequest retrieves geographic distribution of events",
        "type": "object"
      },
      "GetGeoBreakdownResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/GeoDataPoint",
              "type": "object"
            },
            "title": "Ordered list of locations by event count (descending)",
            "type": "array"
          },
          "totalEvents": {
            "format": "int32",
            "title": "Total number of events in the date range",
            "type": "integer"
          }
        },
        "title": "GetGeoBreakdownResponse contains geographic breakdown data",
        "type": "object"
      },
      "GetGoogleFormsIntegrationResponse": {
        "properties": {
          "integration": {
            "$ref": "#/components/schemas/GoogleFormsIntegration"
          }
        },
        "type": "object"
      },
      "GetGoogleFormsOAuthURLResponse": {
        "properties": {
          "oauthUrl": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "GetGroupedTimeSeriesRequest": {
        "properties": {
          "endDate": {
            "format": "date-time",
            "type": "string"
          },
          "groupBy": {
            "$ref": "#/components/schemas/GroupByDimension",
            "title": "Dimension to group by"
          },
          "intervalInMinutes": {
            "format": "int32",
            "type": "integer"
          },
          "limit": {
            "description": "Max number of groups to return (top N by volume). Default 5.",
            "format": "int32",
            "type": "integer"
          },
          "linkId": {
            "title": "Optional link filter (UUID); when omitted aggregates workspace-wide",
            "type": "string"
          },
          "startDate": {
            "format": "date-time",
            "type": "string"
          }
        },
        "title": "GetGroupedTimeSeriesRequest fetches time-bucketed event data grouped by a dimension",
        "type": "object"
      },
      "GetGroupedTimeSeriesResponse": {
        "properties": {
          "series": {
            "items": {
              "$ref": "#/components/schemas/TimeSeriesSeries",
              "type": "object"
            },
            "type": "array"
          },
          "totalEvents": {
            "format": "int32",
            "title": "Total events across all series",
            "type": "integer"
          }
        },
        "title": "GetGroupedTimeSeriesResponse contains multiple named time series",
        "type": "object"
      },
      "GetHourOfDayDistributionRequest": {
        "properties": {
          "endDate": {
            "format": "date-time",
            "type": "string"
          },
          "linkId": {
            "title": "Optional link filter (UUID); when omitted aggregates workspace-wide",
            "type": "string"
          },
          "startDate": {
            "format": "date-time",
            "type": "string"
          }
        },
        "title": "GetHourOfDayDistributionRequest fetches event counts aggregated by hour of day",
        "type": "object"
      },
      "GetHourOfDayDistributionResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/HourOfDayDataPoint",
              "type": "object"
            },
            "type": "array"
          },
          "totalEvents": {
            "format": "int32",
            "type": "integer"
          }
        },
        "title": "GetHourOfDayDistributionResponse contains 24 data points (one per hour)",
        "type": "object"
      },
      "GetLinkResponse": {
        "properties": {
          "link": {
            "$ref": "#/components/schemas/Link"
          }
        },
        "title": "Response containing the link details",
        "type": "object"
      },
      "GetLinkSettingResponse": {
        "description": "GetLinkSettingResponse returns the link-setting profile for inspection in the dashboard.",
        "properties": {
          "linkSetting": {
            "$ref": "#/components/schemas/LinkSetting"
          }
        },
        "type": "object"
      },
      "GetMediaResponse": {
        "properties": {
          "media": {
            "$ref": "#/components/schemas/Media"
          }
        },
        "title": "Response containing the media file details",
        "type": "object"
      },
      "GetPageThemeResponse": {
        "properties": {
          "pageTheme": {
            "$ref": "#/components/schemas/PageTheme",
            "title": "The page theme"
          }
        },
        "title": "Response containing a page theme",
        "type": "object"
      },
      "GetQrcodeDesignResponse": {
        "description": "GetQrcodeDesignResponse returns the design definition hydrated with computed fields.",
        "properties": {
          "qrcodeDesign": {
            "$ref": "#/components/schemas/QrcodeDesign",
            "title": "The QR code design"
          }
        },
        "type": "object"
      },
      "GetSlackIntegrationResponse": {
        "properties": {
          "slackIntegration": {
            "$ref": "#/components/schemas/SlackIntegration",
            "title": "The Slack integration (nil if not connected)"
          }
        },
        "title": "GetSlackIntegrationResponse returns the Slack integration",
        "type": "object"
      },
      "GetSlackOAuthURLResponse": {
        "properties": {
          "oauthUrl": {
            "title": "The full Slack OAuth authorization URL to redirect the user to",
            "type": "string"
          }
        },
        "title": "GetSlackOAuthURLResponse returns the Slack OAuth authorization URL",
        "type": "object"
      },
      "GetStepFunnelRequest": {
        "description": "GetStepFunnelRequest asks how far visitors get through a link's workflow.",
        "properties": {
          "endDate": {
            "format": "date-time",
            "title": "Inclusive end timestamp",
            "type": "string"
          },
          "linkId": {
            "title": "Optional link filter (UUID); when omitted aggregates workspace-wide",
            "type": "string"
          },
          "startDate": {
            "format": "date-time",
            "title": "Inclusive start timestamp",
            "type": "string"
          }
        },
        "type": "object"
      },
      "GetStepFunnelResponse": {
        "description": "GetStepFunnelResponse contains the ordered funnel.",
        "properties": {
          "completionRate": {
            "format": "double",
            "title": "Conversion rate of the final step",
            "type": "number"
          },
          "entryVisits": {
            "format": "int64",
            "title": "Journeys that arrived; the denominator of every rate",
            "type": "integer"
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/FunnelStep",
              "type": "object"
            },
            "title": "Steps in the order a visitor meets them, arrival first",
            "type": "array"
          }
        },
        "type": "object"
      },
      "GetTopLinksRequest": {
        "properties": {
          "endDate": {
            "format": "date-time",
            "type": "string"
          },
          "limit": {
            "format": "int32",
            "title": "Max number of links to return (default 10)",
            "type": "integer"
          },
          "linkId": {
            "title": "Optional link filter (UUID); when omitted aggregates workspace-wide",
            "type": "string"
          },
          "startDate": {
            "format": "date-time",
            "type": "string"
          }
        },
        "title": "GetTopLinksRequest fetches the top performing links by event count",
        "type": "object"
      },
      "GetTopLinksResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/TopLinkDataPoint",
              "type": "object"
            },
            "type": "array"
          },
          "totalEvents": {
            "format": "int32",
            "type": "integer"
          }
        },
        "title": "GetTopLinksResponse contains the ranked links",
        "type": "object"
      },
      "GetVisitorTrendsRequest": {
        "properties": {
          "endDate": {
            "format": "date-time",
            "title": "Inclusive end timestamp",
            "type": "string"
          },
          "intervalInMinutes": {
            "format": "int32",
            "title": "Bucket size in minutes (e.g. 60 for hourly, 1440 for daily)",
            "type": "integer"
          },
          "linkId": {
            "title": "Optional link filter (UUID); when omitted aggregates workspace-wide",
            "type": "string"
          },
          "startDate": {
            "format": "date-time",
            "title": "Inclusive start timestamp",
            "type": "string"
          }
        },
        "title": "GetVisitorTrendsRequest retrieves new vs returning visitor trends",
        "type": "object"
      },
      "GetVisitorTrendsResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/VisitorTrendDataPoint",
              "type": "object"
            },
            "title": "Time-bucketed visitor trend data",
            "type": "array"
          },
          "totalNew": {
            "format": "int32",
            "title": "Total new visitors in the range",
            "type": "integer"
          },
          "totalReturning": {
            "format": "int32",
            "title": "Total returning visitors in the range",
            "type": "integer"
          }
        },
        "title": "GetVisitorTrendsResponse contains visitor trend data",
        "type": "object"
      },
      "GetWebhookResponse": {
        "properties": {
          "webhook": {
            "$ref": "#/components/schemas/Webhook",
            "title": "Webhook details"
          }
        },
        "title": "GetWebhookResponse represents the response containing a webhook",
        "type": "object"
      },
      "GetWidgetSummaryResponse": {
        "properties": {
          "result": {
            "$ref": "#/components/schemas/AnalyticsWidgetResult",
            "title": "Absent when nothing has been generated yet"
          }
        },
        "type": "object"
      },
      "GetWorkflowStepResponse": {
        "properties": {
          "workflowStep": {
            "$ref": "#/components/schemas/WorkflowStep"
          }
        },
        "title": "Response containing the workflow step details",
        "type": "object"
      },
      "GetWorkspaceTokenResponse": {
        "properties": {
          "token": {
            "$ref": "#/components/schemas/WorkspaceToken",
            "title": "Token metadata (does not include the secret access token)"
          }
        },
        "title": "GetWorkspaceTokenResponse represents the response containing a workspace token",
        "type": "object"
      },
      "GoogleFormsIntegration": {
        "description": "GoogleFormsIntegration represents a connected Google account.\nForms are auto-detected from workflow steps — no manual configuration needed.",
        "properties": {
          "createdAt": {
            "format": "date-time",
            "readOnly": true,
            "type": "string"
          },
          "createdBy": {
            "type": "string"
          },
          "googleEmail": {
            "type": "string"
          },
          "id": {
            "example": "d22f7bf1-83a9-4f3a-9b37-9a3a21b6ac11",
            "type": "string"
          },
          "lastSyncedAt": {
            "format": "date-time",
            "readOnly": true,
            "type": "string"
          },
          "responsesSynced": {
            "format": "int64",
            "readOnly": true,
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/GoogleFormsIntegrationStatus"
          },
          "updatedAt": {
            "format": "date-time",
            "readOnly": true,
            "type": "string"
          },
          "visitorsEnriched": {
            "format": "int64",
            "readOnly": true,
            "type": "integer"
          },
          "workspaceId": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "GoogleFormsIntegrationStatus": {
        "default": "GOOGLE_FORMS_INTEGRATION_STATUS_UNSPECIFIED",
        "enum": [
          "GOOGLE_FORMS_INTEGRATION_STATUS_UNSPECIFIED",
          "GOOGLE_FORMS_INTEGRATION_STATUS_ACTIVE",
          "GOOGLE_FORMS_INTEGRATION_STATUS_PAUSED",
          "GOOGLE_FORMS_INTEGRATION_STATUS_DISCONNECTED"
        ],
        "type": "string"
      },
      "GroupByDimension": {
        "default": "GROUP_BY_DIMENSION_UNSPECIFIED",
        "description": "GroupByDimension defines the available dimensions for grouping analytics data.\nAdd new dimensions here as the platform grows.",
        "enum": [
          "GROUP_BY_DIMENSION_UNSPECIFIED",
          "GROUP_BY_DIMENSION_COUNTRY",
          "GROUP_BY_DIMENSION_CITY",
          "GROUP_BY_DIMENSION_DEVICE_TYPE",
          "GROUP_BY_DIMENSION_VISIT_TYPE",
          "GROUP_BY_DIMENSION_BROWSER",
          "GROUP_BY_DIMENSION_PLATFORM"
        ],
        "type": "string"
      },
      "HTTPMethod": {
        "default": "HTTP_METHOD_UNSPECIFIED",
        "description": "- HTTP_METHOD_UNSPECIFIED: HTTP method not specified",
        "enum": [
          "HTTP_METHOD_UNSPECIFIED",
          "HTTP_METHOD_GET",
          "HTTP_METHOD_POST",
          "HTTP_METHOD_PUT",
          "HTTP_METHOD_DELETE",
          "HTTP_METHOD_PATCH",
          "HTTP_METHOD_OPTIONS",
          "HTTP_METHOD_HEAD"
        ],
        "title": "The HTTP method used when the event was generated",
        "type": "string"
      },
      "HourOfDayDataPoint": {
        "properties": {
          "eventCount": {
            "format": "int32",
            "title": "Number of events in this hour across the date range",
            "type": "integer"
          },
          "hour": {
            "format": "int32",
            "title": "Hour of day (0-23)",
            "type": "integer"
          }
        },
        "title": "HourOfDayDataPoint represents event count for a specific hour (0-23)",
        "type": "object"
      },
      "IdentifyRequest": {
        "properties": {
          "lbid": {
            "title": "LBID (base64 encoded event ID) that initiated the visit (click/scan)",
            "type": "string"
          },
          "setOnce": {
            "title": "If true, only set fields that are empty (set-once semantics); defaults to false (merge/overwrite)",
            "type": "boolean"
          },
          "visitor": {
            "$ref": "#/components/schemas/VisitorInput",
            "title": "Payload with reserved and custom fields"
          }
        },
        "title": "Identify a visitor using LBID and optional attributes",
        "type": "object"
      },
      "IdentifyResponse": {
        "properties": {
          "created": {
            "title": "Indicates whether a new visitor profile was created as part of the identification",
            "type": "boolean"
          },
          "visitor": {
            "$ref": "#/components/schemas/Visitor",
            "title": "Visitor profile after merging incoming attributes"
          }
        },
        "type": "object"
      },
      "IdentifyVisitorTraceData": {
        "description": "IdentifyVisitorTraceData stores visitor identification enrichment metadata.",
        "properties": {
          "customAttributes": {
            "format": "int32",
            "type": "integer"
          },
          "fieldsUpdated": {
            "format": "int32",
            "type": "integer"
          },
          "setOnce": {
            "type": "boolean"
          },
          "systemFields": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "ImportMediaRequest": {
        "properties": {
          "assistantAttachmentId": {
            "description": "The id of a file the caller attached to their own Assistant conversation. Attachments are\nshort-lived and belong to the member who attached them, in that workspace.",
            "type": "string"
          },
          "fileName": {
            "description": "The name shown in the media library and as the file name visitors download. Empty takes the\nattachment's name, or the last segment of the URL's path.",
            "example": "menu.pdf",
            "type": "string"
          },
          "uploadedFrom": {
            "$ref": "#/components/schemas/MediaUploadOrigin",
            "description": "Where the media was imported from, information only. Unset means UPLOAD_ORIGIN_ASSISTANT for an\nattachment and UPLOAD_ORIGIN_MEDIA_LIBRARY for a URL."
          },
          "url": {
            "description": "A public https URL the file is downloaded from, on port 443. Redirects are followed only to\nother public https URLs, at most five. The file's kind is read from its bytes.",
            "example": "https://example.com/menu.pdf",
            "type": "string"
          }
        },
        "title": "Request to import a media file",
        "type": "object"
      },
      "ImportMediaResponse": {
        "properties": {
          "media": {
            "$ref": "#/components/schemas/Media",
            "title": "The media item, READY, with a signed URL"
          }
        },
        "title": "The imported media file",
        "type": "object"
      },
      "ImportPageThemeTemplateRequest": {
        "properties": {
          "slug": {
            "description": "The slug of the public page theme template to import into your workspace",
            "example": "midnight-glass",
            "title": "The slug of the public template to import",
            "type": "string"
          }
        },
        "title": "ImportPageThemeTemplateRequest represents a request to import a public template by slug",
        "type": "object"
      },
      "ImportPageThemeTemplateResponse": {
        "properties": {
          "pageThemeTemplate": {
            "$ref": "#/components/schemas/PageThemeTemplate",
            "title": "The imported page theme template (now owned by the importing workspace)"
          }
        },
        "title": "ImportPageThemeTemplateResponse represents the response after importing a template",
        "type": "object"
      },
      "ImportQrcodeTemplateRequest": {
        "properties": {
          "slug": {
            "description": "The slug of the public QR code template to import into your workspace",
            "example": "minimalist-corporate",
            "title": "The slug of the public template to import",
            "type": "string"
          }
        },
        "title": "ImportQrcodeTemplateRequest represents a request to import a public template by slug",
        "type": "object"
      },
      "ImportQrcodeTemplateResponse": {
        "properties": {
          "qrcodeTemplate": {
            "$ref": "#/components/schemas/QrcodeTemplate",
            "title": "The imported QR code template (now owned by the importing workspace)"
          }
        },
        "title": "ImportQrcodeTemplateResponse represents the response after importing a template",
        "type": "object"
      },
      "InviteMemberRequest": {
        "description": "InviteMemberRequest seeds a new teammate invite email and pending membership.",
        "properties": {
          "email": {
            "title": "Email address of the invitee",
            "type": "string"
          },
          "firstName": {
            "title": "First name used in invitation email and dashboard",
            "type": "string"
          },
          "lastName": {
            "title": "Last name used in invitation email and dashboard",
            "type": "string"
          }
        },
        "type": "object"
      },
      "Job": {
        "description": "A long-running operation.",
        "properties": {
          "completedAt": {
            "description": "When the job finished, once it has.",
            "format": "date-time",
            "type": "string"
          },
          "createdAt": {
            "description": "When the job was accepted.",
            "format": "date-time",
            "type": "string"
          },
          "error": {
            "$ref": "#/components/schemas/JobError",
            "description": "Set when status is JOB_STATUS_FAILED."
          },
          "id": {
            "description": "Job ID (UUID).",
            "type": "string"
          },
          "itemCount": {
            "description": "How many items the job was submitted with.",
            "format": "int32",
            "type": "integer"
          },
          "linksBulkCreate": {
            "$ref": "#/components/schemas/LinksBulkCreateResult",
            "description": "Set when a JOB_TYPE_LINKS_BULK_CREATE job succeeded."
          },
          "status": {
            "description": "Where a job stands.\n\n - JOB_STATUS_UNSPECIFIED: Not set.\n - JOB_STATUS_PENDING: Accepted and waiting to run.\n - JOB_STATUS_RUNNING: Running now.\n - JOB_STATUS_SUCCEEDED: Finished; the result is set.\n - JOB_STATUS_FAILED: Finished without doing its work; error says why. Nothing was created.",
            "enum": [
              "JOB_STATUS_UNSPECIFIED",
              "JOB_STATUS_PENDING",
              "JOB_STATUS_RUNNING",
              "JOB_STATUS_SUCCEEDED",
              "JOB_STATUS_FAILED"
            ]
          },
          "statusUrl": {
            "description": "Path to poll for this job's status.",
            "type": "string"
          },
          "type": {
            "description": "What a job does.\n\n - JOB_TYPE_UNSPECIFIED: Not set.\n - JOB_TYPE_LINKS_BULK_CREATE: Creates a batch of links (POST /v1/links/bulk/jobs).",
            "enum": [
              "JOB_TYPE_UNSPECIFIED",
              "JOB_TYPE_LINKS_BULK_CREATE"
            ]
          }
        },
        "type": "object"
      },
      "JobError": {
        "description": "Why a job failed.",
        "properties": {
          "codeType": {
            "description": "Stable error code, the same codeType a synchronous call would return.",
            "type": "string"
          },
          "message": {
            "description": "Human-readable explanation.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "JobStatus": {
        "default": "JOB_STATUS_UNSPECIFIED",
        "description": "Where a job stands.\n\n - JOB_STATUS_UNSPECIFIED: Not set.\n - JOB_STATUS_PENDING: Accepted and waiting to run.\n - JOB_STATUS_RUNNING: Running now.\n - JOB_STATUS_SUCCEEDED: Finished; the result is set.\n - JOB_STATUS_FAILED: Finished without doing its work; error says why. Nothing was created.",
        "enum": [
          "JOB_STATUS_UNSPECIFIED",
          "JOB_STATUS_PENDING",
          "JOB_STATUS_RUNNING",
          "JOB_STATUS_SUCCEEDED",
          "JOB_STATUS_FAILED"
        ],
        "type": "string"
      },
      "JobType": {
        "default": "JOB_TYPE_UNSPECIFIED",
        "description": "What a job does.\n\n - JOB_TYPE_UNSPECIFIED: Not set.\n - JOB_TYPE_LINKS_BULK_CREATE: Creates a batch of links (POST /v1/links/bulk/jobs).",
        "enum": [
          "JOB_TYPE_UNSPECIFIED",
          "JOB_TYPE_LINKS_BULK_CREATE"
        ],
        "type": "string"
      },
      "JourneyProgress": {
        "description": "How far one visit got through a workflow. Conditions are not counted,\nsince a visitor never sees them.",
        "properties": {
          "completed": {
            "description": "Whether the visit reached an exit (a redirect, contact card, thank-you\nor social links page).",
            "type": "boolean"
          },
          "stepsReached": {
            "description": "Steps the visitor reached on this visit, the entry included.",
            "format": "int32",
            "type": "integer"
          },
          "stepsTotal": {
            "description": "Steps on their path from entry to an exit: the ones reached plus the\nfewest still ahead of where they stopped. Equal to steps_reached once\nthey reach an exit.",
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "Link": {
        "description": "Core resource that ties a shortlink or QR entrypoint to its workflow, destination, and analytics metadata,\nletting Linkbreakers serve dynamic experiences while tracking scans for a workspace.",
        "externalDocs": {
          "description": "Learn more about links in Linkbreakers",
          "url": "https://linkbreakers.com/help/article/whats-a-link"
        },
        "properties": {
          "createdAt": {
            "description": "When the link was created.",
            "format": "date-time",
            "readOnly": true,
            "type": "string"
          },
          "customDomain": {
            "$ref": "#/components/schemas/CustomDomain",
            "description": "The custom domain that is used to access the link.\nUse the include parameter when available to include the custom domain in the response."
          },
          "customDomainId": {
            "description": "The ID of the custom domain (UUID).\nThis is the custom domain that is used to access the link.\nIf not defined, the link will be accessed using the default domain.",
            "example": "d290f1ee-6c54-4b01-90e6-d701748f0851",
            "type": "string"
          },
          "directoryId": {
            "description": "The ID of the directory this link belongs to (UUID).\nIf not set, the link is at the root level (not in any directory).",
            "example": "d87a9b30-5c8b-4d4e-9fd3-5f5f5f5f5f5f",
            "type": "string"
          },
          "entrypoint": {
            "description": "The entrypoint URL\nThis is the URL that is available to be redirected to the destination.",
            "example": "https://linkbreak.ing/4BnH-R19p",
            "readOnly": true,
            "type": "string"
          },
          "eventCount": {
            "description": "The number of time the link has been scanned.\nThis number isn't refreshed instantly but will update itself within a few seconds.",
            "example": 128,
            "format": "int64",
            "readOnly": true,
            "type": "integer"
          },
          "expiredDestination": {
            "description": "Where visitors are sent once the link has expired.\nEmpty serves the built-in expired page instead.",
            "example": "https://example.com/campaign-over",
            "type": "string"
          },
          "expiresAt": {
            "description": "When the link stops resolving. Empty means it never expires.\nMust be in the future. Once it passes the link is removed from the\nworkspace and only the expired destination is served.",
            "example": "2026-12-31T23:59:59Z",
            "format": "date-time",
            "type": "string"
          },
          "fallbackDestination": {
            "example": "https://brand.example.com/fallback",
            "title": "The fallback destination URL to use when workflow steps are broken",
            "type": "string"
          },
          "id": {
            "example": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
            "title": "The unique identifier of the link (UUID)",
            "type": "string"
          },
          "metadata": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "A map of string key-value pairs. All values must be strings. Nested objects or arrays are not supported. Maximum of 50 keys.",
            "type": "object"
          },
          "name": {
            "title": "The name of the link",
            "type": "string"
          },
          "pageTheme": {
            "$ref": "#/components/schemas/PageTheme",
            "description": "The page theme configuration for this link.\nUse the include parameter with \"pageTheme\" to include page theme data in the response."
          },
          "pageThemeId": {
            "description": "The ID of the page theme for this link (UUID).",
            "example": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
            "type": "string"
          },
          "pageThemeTemplateId": {
            "description": "The page theme template this link's styling was applied from (UUID).\n\nEmpty when the theme was styled by hand rather than taken from a template.\nSet when a template is applied, and unchanged by later edits, so it records\nwhere the look came from rather than what it is now.",
            "example": "0d7f4d9c-1aef-4ed4-821b-321a3f9cba1d",
            "type": "string"
          },
          "purpose": {
            "description": "What the user is trying to achieve with this link, in one or two sentences.",
            "type": "string"
          },
          "qrcodeDesign": {
            "$ref": "#/components/schemas/QrcodeDesign",
            "description": "The custom domain that is used to access the link.\nUse the include parameter when available to include the custom domain in the response."
          },
          "qrcodeDesignId": {
            "description": "The ID of the link design (UUID).\nThis is the ID of the design that is used to generate the QR Code.\nIf not defined, the design from the QR Code template will be used.",
            "example": "a8c5e111-8894-4f8a-b5db-9efe0d12a210",
            "type": "string"
          },
          "qrcodePendingUpdateSince": {
            "description": "When the link is pending QR Code update.\nThis happens when the QR Code Design is updated and the QR Code image is still being processed.",
            "format": "date-time",
            "readOnly": true,
            "type": "string"
          },
          "qrcodeSignedUrl": {
            "description": "The signed URL for the QR Code image.\nThis URL eventually expires.",
            "example": "https://cdn.linkbreakers.com/qrcodes/1b9d6bcd.png?signature=abc123",
            "readOnly": true,
            "type": "string"
          },
          "qrcodeTemplateId": {
            "description": "The ID of the design template (UUID).\nThis is the template that is used to generate the first QR Code Design assigned to the link.\nIf not defined, a default QR Code Design will be generated.",
            "example": "0d7f4d9c-1aef-4ed4-821b-321a3f9cba1d",
            "type": "string"
          },
          "shortlink": {
            "description": "The short link for the link.\nThis is the path segment that is attached to the URL. It can be defined by the client or generated by the system but is never null.\nIt is unique within a custom domain or Linkbreakers default domain.",
            "example": "4BnH-R19p",
            "type": "string"
          },
          "tags": {
            "description": "The tags associated with the link.",
            "items": {
              "$ref": "#/components/schemas/apiTag",
              "type": "object"
            },
            "type": "array"
          },
          "updatedAt": {
            "description": "When the link was last updated.",
            "format": "date-time",
            "readOnly": true,
            "type": "string"
          },
          "workspaceId": {
            "example": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0",
            "title": "The workspace ID the link belongs to (UUID)",
            "type": "string"
          }
        },
        "title": "Link",
        "type": "object"
      },
      "LinkSetting": {
        "description": "Stores per-link compliance preferences that drive how Linkbreakers collects visitor data before executing the workflow.",
        "properties": {
          "createdAt": {
            "format": "date-time",
            "title": "Timestamp when the setting profile was created",
            "type": "string"
          },
          "dataCollection": {
            "$ref": "#/components/schemas/DataCollection",
            "example": "DATA_COLLECTION_BASIC",
            "title": "Data collection mode that controls visitor prompts and requirements"
          },
          "id": {
            "example": "fbb5c4b6-2a10-4f35-8cb1-60c613a92d2a",
            "title": "Unique identifier for the link-level setting profile (UUID)",
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "title": "Timestamp when the setting profile was last updated",
            "type": "string"
          }
        },
        "title": "LinkSetting",
        "type": "object"
      },
      "LinkSortField": {
        "default": "LINK_SORT_FIELD_UNSPECIFIED",
        "description": "- LINK_SORT_FIELD_UNSPECIFIED: Sort field not specified (defaults to updated_at)\n - LINK_SORT_FIELD_CREATED_AT: Sort by creation date\n - LINK_SORT_FIELD_UPDATED_AT: Sort by last update date\n - LINK_SORT_FIELD_SHORTLINK: Sort by shortlink name\n - LINK_SORT_FIELD_NAME: Sort by link name\n - LINK_SORT_FIELD_EVENT_COUNT: Sort by event count",
        "enum": [
          "LINK_SORT_FIELD_UNSPECIFIED",
          "LINK_SORT_FIELD_CREATED_AT",
          "LINK_SORT_FIELD_UPDATED_AT",
          "LINK_SORT_FIELD_SHORTLINK",
          "LINK_SORT_FIELD_NAME",
          "LINK_SORT_FIELD_EVENT_COUNT"
        ],
        "title": "Fields that can be used to sort links",
        "type": "string"
      },
      "LinkView": {
        "default": "LINK_VIEW_UNSPECIFIED",
        "description": "- LINK_VIEW_UNSPECIFIED: Return all links regardless of directory (default)\n - LINK_VIEW_DIRECTORY: Return links scoped to a directory.\nWhen directory_id is set, returns links in that directory.\nWhen directory_id is empty, returns root-level links (no directory).",
        "enum": [
          "LINK_VIEW_UNSPECIFIED",
          "LINK_VIEW_DIRECTORY"
        ],
        "title": "View mode for link listing",
        "type": "string"
      },
      "LinkVisitPayload": {
        "description": "Reserved for future link visit specific configuration",
        "title": "Entry payload for EVENT_ACTION_LINK_VISIT (currently no specific fields)",
        "type": "object"
      },
      "LinksBulkCreateResult": {
        "description": "Result of a JOB_TYPE_LINKS_BULK_CREATE job.",
        "properties": {
          "linkIds": {
            "description": "IDs of the created links, in the order they were submitted. Fetch each\nwith GET /v1/links/{id}.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "LinksServiceUpdateBody": {
        "properties": {
          "directoryId": {
            "example": "d87a9b30-5c8b-4d4e-9fd3-5f5f5f5f5f5f",
            "title": "The ID of the directory to move this link into (UUID)",
            "type": "string"
          },
          "directoryIdDelete": {
            "title": "Remove the link from its directory (move to root)\nIf true, the directory_id will be set to null",
            "type": "boolean"
          },
          "expiredDestination": {
            "description": "Where visitors are sent once the link has expired.\nEmpty serves the built-in expired page instead.",
            "example": "https://example.com/campaign-over",
            "type": "string"
          },
          "expiredDestinationDelete": {
            "description": "Remove the expired destination from this link.\nIf true, expired_destination is cleared and expired visitors see the\nbuilt-in expired page instead.",
            "type": "boolean"
          },
          "expiresAt": {
            "description": "When the link stops resolving. Empty leaves the current value untouched.\nMust be in the future. Once it passes the link is removed from the\nworkspace and only the expired destination is served.",
            "example": "2026-12-31T23:59:59Z",
            "format": "date-time",
            "type": "string"
          },
          "expiresAtDelete": {
            "description": "Remove the expiration from this link.\nIf true, expires_at is cleared and the link stops expiring.",
            "type": "boolean"
          },
          "fallbackDestination": {
            "example": "https://example.com/fallback",
            "title": "The fallback destination URL to use when workflow steps are broken",
            "type": "string"
          },
          "name": {
            "example": "My Updated Link",
            "title": "The new name of the link",
            "type": "string"
          },
          "pageThemeId": {
            "example": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
            "title": "Page theme ID to assign to this link",
            "type": "string"
          },
          "purpose": {
            "description": "What the user is trying to achieve with this link, in one or two sentences.\nThe link's assistant conversations read it as context, so it is restated\nwhenever the workflow changes shape.",
            "example": "Increase newsletter signups. Good leads: marketing qualified leads with budget over $10k.",
            "type": "string"
          },
          "qrcodeTemplateId": {
            "example": "0d7f4d9c-1aef-4ed4-821b-321a3f9cba1d",
            "title": "QR code template ID to assign to this link",
            "type": "string"
          },
          "qrcodeTemplateIdDelete": {
            "title": "Delete the QR code template ID from this link\nIf true, the qrcode_template_id will be set to null",
            "type": "boolean"
          },
          "tags": {
            "description": "Set the tags to associate with the link.\nIf a tag with the given name doesn't exist, it will be created.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "tagsDelete": {
            "description": "Delete all tags from the link\nIf true, all tags will be removed from the link.",
            "type": "boolean"
          }
        },
        "title": "Request to update a link",
        "type": "object"
      },
      "ListAllowancesResponse": {
        "properties": {
          "allowances": {
            "items": {
              "$ref": "#/components/schemas/WorkspaceAllowance",
              "type": "object"
            },
            "title": "One entry per limit the plan sets",
            "type": "array"
          },
          "limits": {
            "description": "Every limit this workspace is allowed, as enforced for its subscription, including the ones not counted per cycle such as webhooks and the Assistant rate. A trial or sponsored workspace can be allowed less than the plan it reports, and these are what it gets.",
            "items": {
              "$ref": "#/components/schemas/PlanLimit",
              "type": "object"
            },
            "type": "array"
          },
          "plan": {
            "$ref": "#/components/schemas/PricingPlanId",
            "description": "The plan the limits come from. A trial or sponsored workspace reports the plan it is allowed what of."
          }
        },
        "title": "The workspace's allowances",
        "type": "object"
      },
      "ListApiScopesResponse": {
        "description": "ListApiScopesResponse lists every scope a token can hold.",
        "properties": {
          "scopes": {
            "description": "Every scope, ordered by resource then read before write.",
            "items": {
              "$ref": "#/components/schemas/ApiScopeInfo",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "ListCustomDomainsResponse": {
        "properties": {
          "customDomains": {
            "items": {
              "$ref": "#/components/schemas/CustomDomain",
              "type": "object"
            },
            "type": "array"
          },
          "nextPageToken": {
            "description": "Cursor to continue listing custom domains. Empty on the last page.",
            "type": "string"
          },
          "totalCount": {
            "description": "How many records exist in total, so a client can tell a complete answer\nfrom a page of one. A local-first client reads absence from this list as\ndeletion, and may only do so when the count it was given matches what it\nreceived: without that, one page would look like the whole model and\neverything beyond it would be removed locally.",
            "format": "int64",
            "type": "integer"
          }
        },
        "title": "Response containing a list of custom domains",
        "type": "object"
      },
      "ListDashboardsResponse": {
        "properties": {
          "dashboards": {
            "items": {
              "$ref": "#/components/schemas/AnalyticsDashboard",
              "type": "object"
            },
            "type": "array"
          },
          "nextPageToken": {
            "description": "Cursor to continue listing dashboards. Empty on the last page.",
            "type": "string"
          },
          "totalCount": {
            "description": "How many records exist in total, so a client can tell a complete answer\nfrom a page of one. A local-first client reads absence from this list as\ndeletion, and may only do so when the count it was given matches what it\nreceived: without that, one page would look like the whole model and\neverything beyond it would be removed locally.",
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "ListDetectedGoogleFormsResponse": {
        "properties": {
          "forms": {
            "items": {
              "$ref": "#/components/schemas/DetectedGoogleForm",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "ListDirectoriesResponse": {
        "properties": {
          "directories": {
            "items": {
              "$ref": "#/components/schemas/Directory",
              "type": "object"
            },
            "title": "The list of directories matching the filter criteria",
            "type": "array"
          },
          "nextPageToken": {
            "description": "Cursor to continue listing directories",
            "example": "eyJkaXJlY3RvcnlJZCI6IjEwIn0=",
            "title": "Token for retrieving the next page of results",
            "type": "string"
          },
          "totalCount": {
            "description": "How many records exist in total, so a client can tell a complete answer\nfrom a page of one. A local-first client reads absence from this list as\ndeletion, and may only do so when the count it was given matches what it\nreceived: without that, one page would look like the whole model and\neverything beyond it would be removed locally.",
            "format": "int64",
            "type": "integer"
          }
        },
        "title": "Response containing a list of directories",
        "type": "object"
      },
      "ListEventTracesResponse": {
        "properties": {
          "traces": {
            "items": {
              "$ref": "#/components/schemas/EventTrace",
              "type": "object"
            },
            "title": "List of event traces ordered by completed_at",
            "type": "array"
          }
        },
        "title": "ListEventTracesResponse returns all traces for an event",
        "type": "object"
      },
      "ListEventsCsvResponse": {
        "description": "ListEventsCsvResponse streams the export payload when ResponseFormat is set to RESPONSE_FORMAT_CSV.",
        "properties": {
          "contentType": {
            "title": "MIME type associated with the payload (e.g. text/csv)",
            "type": "string"
          },
          "csvData": {
            "title": "CSV payload encoded as UTF-8",
            "type": "string"
          }
        },
        "type": "object"
      },
      "ListEventsJsonResponse": {
        "description": "ListEventsJsonResponse returns paginated event objects suitable for dashboards.",
        "properties": {
          "events": {
            "items": {
              "$ref": "#/components/schemas/Event",
              "type": "object"
            },
            "title": "Page of event objects",
            "type": "array"
          },
          "hasMore": {
            "description": "Whether there are more events beyond this page",
            "title": "Whether another page exists after this result set",
            "type": "boolean"
          },
          "nextPageToken": {
            "description": "Cursor token returned when another page is available",
            "example": "eyJwYWdlIjoxfQ==",
            "title": "Cursor token for the next page, if any",
            "type": "string"
          },
          "totalCount": {
            "description": "Total number of events matching the query",
            "example": 240,
            "format": "int64",
            "title": "Total number of records matching the filter",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "ListEventsResponse": {
        "description": "ListEventsResponse contains either the JSON payload or CSV export for the matching events.",
        "properties": {
          "csv": {
            "$ref": "#/components/schemas/ListEventsCsvResponse"
          },
          "json": {
            "$ref": "#/components/schemas/ListEventsJsonResponse"
          }
        },
        "type": "object"
      },
      "ListLinksResponse": {
        "properties": {
          "links": {
            "items": {
              "$ref": "#/components/schemas/Link",
              "type": "object"
            },
            "type": "array"
          },
          "nextPageToken": {
            "description": "Cursor to fetch the next page of links",
            "example": "eyJsaW5rSWQiOiI0YmEifQ==",
            "title": "Token for retrieving the next page of results",
            "type": "string"
          },
          "totalCount": {
            "description": "Total number of links matching the current filters",
            "example": 42,
            "format": "int64",
            "title": "Total number of links matching the current filters",
            "type": "integer"
          }
        },
        "title": "Response containing a list of links",
        "type": "object"
      },
      "ListMediaResponse": {
        "properties": {
          "media": {
            "items": {
              "$ref": "#/components/schemas/Media",
              "type": "object"
            },
            "title": "Page of media entries including fresh signed URLs",
            "type": "array"
          },
          "nextPageToken": {
            "description": "Cursor to continue listing media assets",
            "example": "eyJtZWRpYUlkIjoiNWIifQ==",
            "title": "Token for retrieving the next page of results",
            "type": "string"
          },
          "totalCount": {
            "format": "int64",
            "title": "Every media item matching the filters, across all pages",
            "type": "integer"
          }
        },
        "title": "Response containing a list of media files",
        "type": "object"
      },
      "ListMyWorkspacesResponse": {
        "description": "ListMyWorkspacesResponse lists every workspace the caller can act in.",
        "properties": {
          "workspaces": {
            "description": "The caller's workspaces, the most recently used first. An API token sees\nonly its own workspace.",
            "items": {
              "$ref": "#/components/schemas/MyWorkspace",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "ListPageThemeTemplatesResponse": {
        "properties": {
          "hasMore": {
            "title": "Whether another page exists after this result set",
            "type": "boolean"
          },
          "nextPageToken": {
            "description": "Cursor token returned when another page is available",
            "title": "Cursor token for the next page, if any",
            "type": "string"
          },
          "pageThemeTemplates": {
            "items": {
              "$ref": "#/components/schemas/PageThemeTemplate",
              "type": "object"
            },
            "type": "array"
          },
          "totalCount": {
            "description": "How many records exist in total, so a client can tell a complete answer\nfrom a page of one. A local-first client reads absence from this list as\ndeletion, and may only do so when the count it was given matches what it\nreceived: without that, one page would look like the whole model and\neverything beyond it would be removed locally.",
            "format": "int64",
            "type": "integer"
          }
        },
        "title": "ListPageThemeTemplatesResponse represents the response for listing page theme templates",
        "type": "object"
      },
      "ListPageThemesResponse": {
        "properties": {
          "nextPageToken": {
            "description": "Cursor to continue listing page themes. Empty on the last page.",
            "type": "string"
          },
          "pageThemes": {
            "items": {
              "$ref": "#/components/schemas/PageTheme",
              "type": "object"
            },
            "title": "List of page themes",
            "type": "array"
          },
          "totalCount": {
            "description": "How many records exist in total, so a client can tell a complete answer\nfrom a page of one. A local-first client reads absence from this list as\ndeletion, and may only do so when the count it was given matches what it\nreceived: without that, one page would look like the whole model and\neverything beyond it would be removed locally.",
            "format": "int64",
            "type": "integer"
          }
        },
        "title": "Response containing page themes",
        "type": "object"
      },
      "ListPricingPlansResponse": {
        "properties": {
          "creditTopup": {
            "$ref": "#/components/schemas/CreditTopup",
            "description": "Price of buying more credits. Absent when prices could not be read."
          },
          "linkCreatedCreditCost": {
            "format": "int32",
            "title": "Platform credits spent by creating one link",
            "type": "integer"
          },
          "plans": {
            "items": {
              "$ref": "#/components/schemas/PricingPlan",
              "type": "object"
            },
            "title": "Plans, cheapest first",
            "type": "array"
          },
          "pricesUpdatedAt": {
            "description": "When the prices were read from the billing provider. Absent when they never could be.",
            "format": "date-time",
            "type": "string"
          }
        },
        "title": "The pricing catalog",
        "type": "object"
      },
      "ListQrcodeTemplatesResponse": {
        "properties": {
          "hasMore": {
            "title": "Whether another page exists after this result set",
            "type": "boolean"
          },
          "nextPageToken": {
            "description": "Cursor token returned when another page is available",
            "example": "eyJxdHMiOiJxdGVtcGxhdGUifQ==",
            "title": "Cursor token for the next page, if any",
            "type": "string"
          },
          "qrcodeTemplates": {
            "items": {
              "$ref": "#/components/schemas/QrcodeTemplate",
              "type": "object"
            },
            "type": "array"
          },
          "totalCount": {
            "description": "How many records exist in total, so a client can tell a complete answer\nfrom a page of one. A local-first client reads absence from this list as\ndeletion, and may only do so when the count it was given matches what it\nreceived: without that, one page would look like the whole model and\neverything beyond it would be removed locally.",
            "format": "int64",
            "type": "integer"
          }
        },
        "title": "ListQrcodeTemplatesResponse represents the response for listing QR code templates",
        "type": "object"
      },
      "ListResponse": {
        "description": "ListResponse wraps the current page of teammates for the workspace directory.",
        "properties": {
          "members": {
            "items": {
              "$ref": "#/components/schemas/Member",
              "type": "object"
            },
            "title": "Members included in the current page",
            "type": "array"
          },
          "nextPageToken": {
            "description": "Cursor to continue listing members. Empty on the last page.",
            "type": "string"
          },
          "totalCount": {
            "description": "How many members exist in total, so a client can tell a complete answer\nfrom a page of one. A local-first client reads absence from this list as\nthe member having been removed, and may only do so when the count it was\ngiven matches what it received.",
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "ListSandboxesResponse": {
        "properties": {
          "sandboxes": {
            "items": {
              "$ref": "#/components/schemas/Sandbox",
              "type": "object"
            },
            "type": "array"
          },
          "totalCount": {
            "description": "How many sandboxes the workspace holds.",
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "ListSlackChannelsResponse": {
        "properties": {
          "channels": {
            "items": {
              "$ref": "#/components/schemas/SlackChannel",
              "type": "object"
            },
            "title": "Available channels the bot can post to",
            "type": "array"
          }
        },
        "title": "ListSlackChannelsResponse returns available Slack channels",
        "type": "object"
      },
      "ListTagsResponse": {
        "properties": {
          "nextPageToken": {
            "description": "Cursor to continue listing tags",
            "example": "eyJ0YWdJZCI6IjEwIn0=",
            "title": "Token for retrieving the next page of results",
            "type": "string"
          },
          "tags": {
            "items": {
              "$ref": "#/components/schemas/apiTag",
              "type": "object"
            },
            "title": "The list of tags matching the search criteria",
            "type": "array"
          }
        },
        "title": "ListTagsResponse represents the response containing a list of tags",
        "type": "object"
      },
      "ListVisitorAttributeKeysResponse": {
        "properties": {
          "attributeKeys": {
            "description": "Distinct selectable visitor attribute keys, including reserved system fields such as $email and $phone.",
            "example": [
              "$email",
              "$phone",
              "$firstName",
              "$lastName",
              "company",
              "plan"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "attributes": {
            "description": "The same keys with the type their values were captured as, so a client can\noffer the filter operators that fit each one.",
            "items": {
              "$ref": "#/components/schemas/VisitorAttributeKey",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "ListVisitorsCsvResponse": {
        "description": "ListVisitorsCsvResponse carries the raw CSV when ResponseFormat is set to RESPONSE_FORMAT_CSV.",
        "properties": {
          "contentType": {
            "title": "MIME type associated with the payload (e.g. text/csv)",
            "type": "string"
          },
          "csvData": {
            "title": "CSV payload encoded as UTF-8",
            "type": "string"
          }
        },
        "type": "object"
      },
      "ListVisitorsJsonResponse": {
        "description": "ListVisitorsJsonResponse is the default structured payload used by dashboards.",
        "properties": {
          "hasMore": {
            "type": "boolean"
          },
          "nextPageToken": {
            "description": "Cursor token returned when another page is available",
            "example": "eyJ2aXNpdG9ySWQiOiI0ZGEzIn0=",
            "type": "string"
          },
          "totalCount": {
            "description": "Total number of visitors matching the current filters",
            "example": 128,
            "format": "int64",
            "type": "integer"
          },
          "visitors": {
            "items": {
              "$ref": "#/components/schemas/Visitor",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "ListVisitorsRequest": {
        "description": "ListVisitorsRequest controls pagination, search, and export format for visitor roster views.",
        "properties": {
          "attributeFilters": {
            "description": "Only return visitors matching every filter, for example budget \u003e= 800000\nand timeline = \"under_6_months\". At most 20. Over REST, use\nPOST /v1/visitors/search: a query string cannot carry them.",
            "items": {
              "$ref": "#/components/schemas/VisitorAttributeFilter",
              "type": "object"
            },
            "type": "array"
          },
          "email": {
            "title": "optional exact match filter",
            "type": "string"
          },
          "include": {
            "example": [
              "devices",
              "events",
              "links"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "linkId": {
            "example": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
            "title": "optional filter by link ID (UUID; visitors who have interacted with this link)",
            "type": "string"
          },
          "pageSize": {
            "format": "int64",
            "title": "Maximum number of visitors to return (default 50, max 200)",
            "type": "integer"
          },
          "pageToken": {
            "title": "Cursor token to retrieve the next page of results",
            "type": "string"
          },
          "responseFormat": {
            "default": "RESPONSE_FORMAT_JSON",
            "description": "ResponseFormat defines the transport format the API should return for list-style endpoints.\n\n - RESPONSE_FORMAT_UNSPECIFIED: Response format not specified\n - RESPONSE_FORMAT_JSON: Response format JSON\n - RESPONSE_FORMAT_CSV: Response format CSV",
            "enum": [
              "RESPONSE_FORMAT_UNSPECIFIED",
              "RESPONSE_FORMAT_JSON",
              "RESPONSE_FORMAT_CSV"
            ],
            "example": "RESPONSE_FORMAT_JSON"
          },
          "search": {
            "title": "optional fuzzy search across known fields",
            "type": "string"
          },
          "sortDirection": {
            "description": "SortDirection is the ordering applied to any sortable list endpoint.\nShared across resources so a caller learns it once.\n\n - SORT_DIRECTION_UNSPECIFIED: Sort direction not specified (defaults to descending)\n - SORT_DIRECTION_ASC: Sort in ascending order\n - SORT_DIRECTION_DESC: Sort in descending order",
            "enum": [
              "SORT_DIRECTION_UNSPECIFIED",
              "SORT_DIRECTION_ASC",
              "SORT_DIRECTION_DESC"
            ],
            "example": "SORT_DIRECTION_DESC"
          },
          "sortField": {
            "$ref": "#/components/schemas/VisitorSortField",
            "description": "Field to sort by. Defaults to created_at (newest first).",
            "example": "VISITOR_SORT_FIELD_VISIT_COUNT"
          }
        },
        "type": "object"
      },
      "ListVisitorsResponse": {
        "properties": {
          "csv": {
            "$ref": "#/components/schemas/ListVisitorsCsvResponse",
            "title": "CSV payload when requested"
          },
          "json": {
            "$ref": "#/components/schemas/ListVisitorsJsonResponse",
            "title": "Standard JSON payload"
          }
        },
        "type": "object"
      },
      "ListWebhooksResponse": {
        "properties": {
          "nextPageToken": {
            "description": "Cursor to continue listing webhooks. Empty on the last page.",
            "type": "string"
          },
          "totalCount": {
            "description": "How many records exist in total, so a client can tell a complete answer\nfrom a page of one. A local-first client reads absence from this list as\ndeletion, and may only do so when the count it was given matches what it\nreceived: without that, one page would look like the whole model and\neverything beyond it would be removed locally.",
            "format": "int64",
            "type": "integer"
          },
          "webhooks": {
            "items": {
              "$ref": "#/components/schemas/Webhook",
              "type": "object"
            },
            "title": "Webhooks scoped to the calling workspace",
            "type": "array"
          }
        },
        "title": "ListWebhooksResponse returns the webhook inventory for management screens",
        "type": "object"
      },
      "ListWorkflowStepsResponse": {
        "properties": {
          "nextPageToken": {
            "description": "Cursor to fetch the next page of workflow steps",
            "example": "eyJzdGVwSWQiOiI5ODcifQ==",
            "title": "Token for retrieving the next page of results",
            "type": "string"
          },
          "totalCount": {
            "description": "How many steps this link has in total, so a client can tell a complete\nanswer from a page of one. A local-first client reads absence from this\nlist as the step having been deleted, and may only do so when the count it\nwas given matches what it received. The count covers the link asked about\nrather than the workspace, which is the only sense in which this list is\never whole.",
            "format": "int64",
            "type": "integer"
          },
          "workflowSteps": {
            "items": {
              "$ref": "#/components/schemas/WorkflowStep",
              "type": "object"
            },
            "type": "array"
          }
        },
        "title": "Response containing a list of workflow steps",
        "type": "object"
      },
      "ListWorkspaceTokensResponse": {
        "description": "ListWorkspaceTokensResponse returns the active token inventory for audit screens.",
        "properties": {
          "nextPageToken": {
            "description": "Cursor to continue listing tokens. Empty on the last page.",
            "type": "string"
          },
          "tokens": {
            "items": {
              "$ref": "#/components/schemas/WorkspaceToken",
              "type": "object"
            },
            "title": "Tokens scoped to the calling workspace",
            "type": "array"
          },
          "totalCount": {
            "description": "How many records exist in total, so a client can tell a complete answer\nfrom a page of one. A local-first client reads absence from this list as\ndeletion, and may only do so when the count it was given matches what it\nreceived: without that, one page would look like the whole model and\neverything beyond it would be removed locally.",
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "Media": {
        "description": "A file in the workspace's media library: an image, a PDF document or an MP4 video. A media item only has a\nkind; where it is used is derived from its references. Any image can be used as a QR code logo, a page\ntheme's background cover, badge or footer logo (up to 3 MB for those), and any media can be opened by an\nOpen media workflow step. Every item counts toward the workspace's media storage allowance\n(PLAN_LIMIT_KEY_MEDIA_STORAGE_MB in allowances).",
        "externalDocs": {
          "description": "Learn more about media files in Linkbreakers",
          "url": "https://linkbreakers.com/help/article/whats-a-media"
        },
        "properties": {
          "createdAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "When the file was created",
            "type": "string"
          },
          "fileName": {
            "title": "The name of the file",
            "type": "string"
          },
          "id": {
            "example": "5f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f",
            "title": "The unique identifier of the media file (UUID)",
            "type": "string"
          },
          "kind": {
            "description": "- KIND_UNSPECIFIED: Not set\n - KIND_IMAGE: A PNG, JPEG, WebP or SVG image\n - KIND_DOCUMENT: A PDF document\n - KIND_VIDEO: An MP4 video",
            "enum": [
              "KIND_UNSPECIFIED",
              "KIND_IMAGE",
              "KIND_DOCUMENT",
              "KIND_VIDEO"
            ],
            "readOnly": true,
            "title": "What kind of file this is"
          },
          "mediaType": {
            "$ref": "#/components/schemas/MediaType",
            "description": "Deprecated: read uploaded_from for where the media was uploaded from and references for where it is\nused. Still filled with the value recorded at upload; unset for media uploaded from the media library.",
            "example": "TYPE_CENTRAL_QRCODE_IMAGE"
          },
          "mimeType": {
            "readOnly": true,
            "title": "The MIME type of the file",
            "type": "string"
          },
          "references": {
            "description": "Where this media is used: the Open media steps opening it, the page themes showing it and the QR code\ndesigns using it as their logo, each named by the link or the template it belongs to. Empty means it is\nnot used anywhere. Filled by List and Get; Create, CreateUpload and CompleteUpload return it empty.\nDeleting media an Open media step or a page theme uses is refused with MEDIA_IN_USE; a QR code keeps\nits own copy of its logo, so deleting the media changes no QR code and only clears its link to it.",
            "items": {
              "$ref": "#/components/schemas/MediaReference",
              "type": "object"
            },
            "readOnly": true,
            "type": "array"
          },
          "sha256": {
            "description": "The SHA-256 of the file's bytes, 64 lowercase hexadecimal characters, computed by the server. A\nworkspace holds each file once: uploading bytes with the same hash is refused with 409\nMEDIA_ALREADY_EXISTS, naming this media in the error's existingMediaId and existingFileName\nmetadata. Empty while pending, and for media stored before files were hashed.",
            "readOnly": true,
            "type": "string"
          },
          "signedUrl": {
            "title": "Short-lived signed URL for downloading the media asset",
            "type": "string"
          },
          "size": {
            "format": "int64",
            "readOnly": true,
            "title": "The size of the file in bytes",
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/MediaStatus",
            "description": "Whether the file is stored yet. Only CreateUpload and Get of a pending upload return STATUS_PENDING.",
            "readOnly": true
          },
          "updatedAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "When the file was last updated",
            "type": "string"
          },
          "uploadedBy": {
            "description": "The member who uploaded the file\nIf it was uploaded through the public API, or if the member was removed from the workspace, the uploaded_by will be null.",
            "readOnly": true,
            "type": "string"
          },
          "uploadedFrom": {
            "$ref": "#/components/schemas/MediaUploadOrigin",
            "description": "Where the media was uploaded from, so pickers can show a section's own uploads first. It does not\nlimit where the media can be used; see references for where it is used.",
            "readOnly": true
          },
          "usage": {
            "$ref": "#/components/schemas/MediaUsage",
            "description": "Deprecated: read uploaded_from for where the media was uploaded from and references for where it is\nused. Still filled with the value recorded at upload; unset for media uploaded from the media library."
          },
          "visibility": {
            "$ref": "#/components/schemas/MediaVisibility",
            "description": "If not provided, the media file will be private to the workspace.",
            "example": "VISIBILITY_PRIVATE",
            "title": "The visibility of the media"
          },
          "workspaceId": {
            "example": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0",
            "title": "The workspace ID the media file belongs to (UUID)",
            "type": "string"
          }
        },
        "title": "Media",
        "type": "object"
      },
      "MediaKind": {
        "default": "KIND_UNSPECIFIED",
        "description": "- KIND_UNSPECIFIED: Not set\n - KIND_IMAGE: A PNG, JPEG, WebP or SVG image\n - KIND_DOCUMENT: A PDF document\n - KIND_VIDEO: An MP4 video",
        "enum": [
          "KIND_UNSPECIFIED",
          "KIND_IMAGE",
          "KIND_DOCUMENT",
          "KIND_VIDEO"
        ],
        "title": "Kind is what kind of file a media item holds, read from its bytes",
        "type": "string"
      },
      "MediaReference": {
        "description": "MediaReference is one place a media item is used. A media item's references are where it is used;\nnone means it is not used anywhere.",
        "properties": {
          "linkId": {
            "description": "The link that uses the media (UUID): the Open media step's link, a link whose page theme shows it, or a link whose QR code uses it as its logo. Empty when the use is not tied to a link, as for a template's own theme or QR code design.",
            "readOnly": true,
            "type": "string"
          },
          "linkName": {
            "description": "The link's name, or its shortlink when it has no name. Empty when link_id is empty.",
            "readOnly": true,
            "type": "string"
          },
          "pageThemeTemplateId": {
            "description": "The page theme template whose theme shows the media (UUID). Set only for page theme uses that belong to a template rather than a link.",
            "readOnly": true,
            "type": "string"
          },
          "pageThemeTemplateName": {
            "description": "The page theme template's name. Set with page_theme_template_id.",
            "readOnly": true,
            "type": "string"
          },
          "qrcodeTemplateId": {
            "description": "The QR code template whose QR code design uses the media as its logo (UUID). Set only for\nTYPE_QR_CODE_LOGO uses that belong to a QR code template rather than a link.",
            "readOnly": true,
            "type": "string"
          },
          "qrcodeTemplateName": {
            "description": "The QR code template's name. Set with qrcode_template_id.",
            "readOnly": true,
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/MediaReferenceType",
            "readOnly": true,
            "title": "What uses the media"
          },
          "workflowStepId": {
            "description": "The Open media workflow step handing out the media (UUID). Set only for TYPE_OPEN_MEDIA_STEP.",
            "readOnly": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "MediaReferenceType": {
        "default": "TYPE_UNSPECIFIED",
        "description": "- TYPE_UNSPECIFIED: Not set\n - TYPE_OPEN_MEDIA_STEP: An Open media workflow step opens the media for visitors. It blocks deleting the media.\n - TYPE_PAGE_THEME_COVER: A page theme shows the media as its background cover. It blocks deleting the media.\n - TYPE_PAGE_THEME_BADGE: A page theme shows the media as its badge. It blocks deleting the media.\n - TYPE_PAGE_THEME_FOOTER_LOGO: A page theme shows the media as its footer logo. It blocks deleting the media.\n - TYPE_QR_CODE_LOGO: A QR code design uses the media as its logo, in the center of the QR code. The design keeps its\nown copy of the image, so this does not block deleting the media; deleting it clears this use.\nReplacing the media's file detaches it too: the design keeps its current logo.",
        "enum": [
          "TYPE_UNSPECIFIED",
          "TYPE_OPEN_MEDIA_STEP",
          "TYPE_PAGE_THEME_COVER",
          "TYPE_PAGE_THEME_BADGE",
          "TYPE_PAGE_THEME_FOOTER_LOGO",
          "TYPE_QR_CODE_LOGO"
        ],
        "title": "Type is what uses the media",
        "type": "string"
      },
      "MediaSelection": {
        "description": "MediaSelection picks an image from the workspace's media library, or removes it. Any ready image of at\nmost 3 MB can be a background cover, badge or footer logo, wherever it was uploaded from; anything else is\nrefused with MEDIA_NOT_ALLOWED_HERE, whose metadata names the slot, the reason (KIND_NOT_ACCEPTED or\nTOO_LARGE) and the limit.",
        "properties": {
          "delete": {
            "properties": {},
            "type": "object"
          },
          "id": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "MediaServiceCompleteReplaceBody": {
        "title": "Request to complete replacing a media item's file",
        "type": "object"
      },
      "MediaServiceCompleteUploadBody": {
        "title": "Request to complete a direct upload",
        "type": "object"
      },
      "MediaServiceCreateReplaceUploadBody": {
        "properties": {
          "fileName": {
            "description": "The new file's name. The media takes it once the replacement completes; visitors download the file under it.",
            "example": "menu-autumn.pdf",
            "type": "string"
          },
          "mimeType": {
            "description": "The new file's MIME type: image/png, image/jpeg, image/webp, image/svg+xml, application/pdf or video/mp4. The uploaded bytes must be this format.",
            "example": "application/pdf",
            "type": "string"
          },
          "sha256": {
            "description": "Optional: the new file's SHA-256 digest, 64 hexadecimal characters. When given, a file another media\nitem holds is refused at once with 409 MEDIA_ALREADY_EXISTS, the media's own file returns unchanged\ntrue, and storage refuses a PUT whose bytes do not match it, so the PUT must carry the\nx-amz-checksum-sha256 header from upload_headers.",
            "example": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
            "type": "string"
          },
          "size": {
            "description": "The new file's exact size in bytes. The PUT must send exactly this many bytes.",
            "example": "7340032",
            "format": "int64",
            "type": "integer"
          }
        },
        "required": [
          "fileName",
          "mimeType",
          "size"
        ],
        "title": "Request to start replacing a media item's file",
        "type": "object"
      },
      "MediaServiceReplaceImportBody": {
        "properties": {
          "assistantAttachmentId": {
            "description": "The id of a file the caller attached to their own Assistant conversation. Attachments are\nshort-lived and belong to the member who attached them, in that workspace.",
            "type": "string"
          },
          "fileName": {
            "description": "The name the media takes. Empty takes the attachment's name, or the last segment of the URL's path,\nor keeps the media's current name.",
            "example": "menu-autumn.pdf",
            "type": "string"
          },
          "url": {
            "description": "A public https URL the new file is downloaded from, on port 443. Redirects are followed only to\nother public https URLs, at most five. The file's kind is read from its bytes.",
            "example": "https://example.com/menu-autumn.pdf",
            "type": "string"
          }
        },
        "title": "Request to replace a media item's file with one fetched server-side",
        "type": "object"
      },
      "MediaStatus": {
        "default": "STATUS_UNSPECIFIED",
        "description": "- STATUS_UNSPECIFIED: Not set\n - STATUS_PENDING: A direct upload that has not been completed: no file yet, not listed, cannot be used\n - STATUS_READY: Stored and checked, ready to use",
        "enum": [
          "STATUS_UNSPECIFIED",
          "STATUS_PENDING",
          "STATUS_READY"
        ],
        "title": "Status says whether the file behind a media item is stored yet",
        "type": "string"
      },
      "MediaTraceData": {
        "description": "MediaTraceData records the media an OPEN_MEDIA step handed to the visitor. The URL\nthe visitor was sent to is short-lived and never recorded.",
        "properties": {
          "fileName": {
            "title": "The media's file name when it was handed out",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/MediaKind",
            "title": "What kind of media it is: a PDF, an image or a video"
          },
          "mediaId": {
            "title": "The media item handed out (UUID)",
            "type": "string"
          },
          "mimeType": {
            "title": "The media's MIME type",
            "type": "string"
          }
        },
        "type": "object"
      },
      "MediaType": {
        "default": "TYPE_UNSPECIFIED",
        "description": "Deprecated: the value recorded at upload, kept for older clients. See UploadOrigin.\n\n - TYPE_UNSPECIFIED: The media type is not specified\n - TYPE_CENTRAL_QRCODE_IMAGE: The media type is a central QR code image\n - TYPE_BACKGROUND_COVER: The media type is a background cover for page themes\n - TYPE_BADGE: The media type is a badge image for page themes\n - TYPE_FOOTER_LOGO: The media type is a footer logo shown at the bottom of page theme pages\n - TYPE_OPEN_MEDIA: The media is handed to visitors by an Open media workflow step",
        "enum": [
          "TYPE_UNSPECIFIED",
          "TYPE_CENTRAL_QRCODE_IMAGE",
          "TYPE_BACKGROUND_COVER",
          "TYPE_BADGE",
          "TYPE_FOOTER_LOGO",
          "TYPE_OPEN_MEDIA"
        ],
        "type": "string"
      },
      "MediaUploadOrigin": {
        "default": "UPLOAD_ORIGIN_UNSPECIFIED",
        "description": "UploadOrigin is where in the product a media item was uploaded from. It is information only, so\npickers can show a section's own uploads first; it never limits where the media can be used.\nTo add a place, add a value here (next number), map it in core, and pass it from the screen that uploads.\n\n - UPLOAD_ORIGIN_UNSPECIFIED: Not set. Uploads that do not say where they come from are recorded as UPLOAD_ORIGIN_MEDIA_LIBRARY.\n - UPLOAD_ORIGIN_MEDIA_LIBRARY: Uploaded from the media library itself\n - UPLOAD_ORIGIN_QR_CODE_LOGO: Uploaded while picking a QR code's logo\n - UPLOAD_ORIGIN_BACKGROUND_COVER: Uploaded while picking a page theme's background cover\n - UPLOAD_ORIGIN_BADGE: Uploaded while picking a page theme's badge\n - UPLOAD_ORIGIN_FOOTER_LOGO: Uploaded while picking a page theme's footer logo\n - UPLOAD_ORIGIN_OPEN_MEDIA: Uploaded while picking the media an Open media step opens\n - UPLOAD_ORIGIN_ASSISTANT: Imported by the Assistant, from a file attached to a conversation or a URL",
        "enum": [
          "UPLOAD_ORIGIN_UNSPECIFIED",
          "UPLOAD_ORIGIN_MEDIA_LIBRARY",
          "UPLOAD_ORIGIN_QR_CODE_LOGO",
          "UPLOAD_ORIGIN_BACKGROUND_COVER",
          "UPLOAD_ORIGIN_BADGE",
          "UPLOAD_ORIGIN_FOOTER_LOGO",
          "UPLOAD_ORIGIN_OPEN_MEDIA",
          "UPLOAD_ORIGIN_ASSISTANT"
        ],
        "type": "string"
      },
      "MediaUsage": {
        "default": "USAGE_UNSPECIFIED",
        "description": "Deprecated: the value recorded at upload, kept for older clients. It no longer limits anything. Uploads\naccept images (PNG, JPEG, WebP, SVG) up to 10 MB, PDF documents up to 25 MB and MP4 videos up to 50 MB,\nwhatever the usage. Where media is used is checked when it is attached: a QR code logo, background\ncover, badge or footer logo must be an image of at most 3 MB; an Open media step takes any media.\n\n - USAGE_UNSPECIFIED: Not set\n - USAGE_CENTRAL_QRCODE_IMAGE: The logo in the center of a QR code\n - USAGE_BACKGROUND_COVER: A page theme's background cover\n - USAGE_BADGE: A page theme's badge image\n - USAGE_FOOTER_LOGO: A page theme's footer logo\n - USAGE_OPEN_MEDIA: Media an Open media workflow step hands to visitors: a PDF menu or brochure, an image or an MP4 video",
        "enum": [
          "USAGE_UNSPECIFIED",
          "USAGE_CENTRAL_QRCODE_IMAGE",
          "USAGE_BACKGROUND_COVER",
          "USAGE_BADGE",
          "USAGE_FOOTER_LOGO",
          "USAGE_OPEN_MEDIA"
        ],
        "type": "string"
      },
      "MediaVisibility": {
        "default": "VISIBILITY_UNSPECIFIED",
        "description": "- VISIBILITY_UNSPECIFIED: Media visibility not specified\nThe media visibility is not specified\n - VISIBILITY_PUBLIC: The media visibility is public\n - VISIBILITY_PRIVATE: The media visibility is private",
        "enum": [
          "VISIBILITY_UNSPECIFIED",
          "VISIBILITY_PUBLIC",
          "VISIBILITY_PRIVATE"
        ],
        "title": "Visibility represents the visibility of a media file",
        "type": "string"
      },
      "Member": {
        "description": "Describes a teammate invited into a workspace, including their role, login metadata, and last-known activity\nso Linkbreakers can enforce access policies and audit collaboration.",
        "properties": {
          "accessRevokedAt": {
            "format": "date-time",
            "title": "When the member's access was revoked (null means active)",
            "type": "string"
          },
          "accessToken": {
            "example": "lbw_1w8jp9longjwtvalue",
            "title": "Access token issued during sign-in; returned to clients but not persisted on the member record",
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "title": "Timestamp when the member was created",
            "type": "string"
          },
          "displayLanguage": {
            "example": "en-US",
            "title": "Preferred language for emails and product copy (BCP-47)",
            "type": "string"
          },
          "email": {
            "example": "sam.member@example.com",
            "title": "Email address used as the member's login identifier",
            "type": "string"
          },
          "emailVerifiedAt": {
            "format": "date-time",
            "title": "When the member confirmed ownership of their email address (null means unverified)",
            "type": "string"
          },
          "firstName": {
            "example": "Sam",
            "title": "Member's given name used in UI surfaces and emails",
            "type": "string"
          },
          "id": {
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "title": "Unique identifier for the member record (UUID)",
            "type": "string"
          },
          "lastKnownCountry": {
            "example": "US",
            "title": "Country inferred from geolocation during the most recent sign-in (ISO 3166-1 alpha-2)",
            "type": "string"
          },
          "lastKnownIp": {
            "example": "203.0.113.42",
            "title": "IP address seen on the most recent sign-in",
            "type": "string"
          },
          "lastKnownLanguage": {
            "example": "en-US,en;q=0.9",
            "title": "Browser language header captured during the most recent sign-in",
            "type": "string"
          },
          "lastKnownTimezone": {
            "example": "Europe/London",
            "title": "Timezone reported during the most recent sign-in (IANA TZ database)",
            "type": "string"
          },
          "lastName": {
            "example": "Rivera",
            "title": "Member's family name used in UI surfaces and emails",
            "type": "string"
          },
          "lastSigninAt": {
            "format": "date-time",
            "title": "Last time the member successfully authenticated",
            "type": "string"
          },
          "role": {
            "description": "Role enumerates the built-in permission tiers that control what teammates can manage inside a workspace.\n\n - ROLE_UNSPECIFIED: Role not specified (defaults to viewer permissions)",
            "enum": [
              "ROLE_UNSPECIFIED",
              "ROLE_VIEWER",
              "ROLE_ADMIN",
              "ROLE_TECH"
            ],
            "example": "ROLE_ADMIN",
            "title": "Workspace role that controls product permissions"
          },
          "updatedAt": {
            "format": "date-time",
            "title": "Timestamp when member metadata was last updated",
            "type": "string"
          },
          "workspaceId": {
            "example": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0",
            "title": "Workspace the member belongs to (UUID)",
            "type": "string"
          }
        },
        "title": "Member",
        "type": "object"
      },
      "MembersServiceAllowAccessBody": {
        "title": "AllowAccessRequest represents the request to allow access",
        "type": "object"
      },
      "MembersServiceForceSignoutBody": {
        "title": "ForceSignoutRequest represents the request to force sign out",
        "type": "object"
      },
      "MembersServiceRevokeAccessBody": {
        "title": "RevokeAccessRequest represents the request to revoke access",
        "type": "object"
      },
      "MembersServiceSwitchWorkspaceBody": {
        "description": "SwitchWorkspaceRequest moves a signed-in session to another workspace of the\nsame person.",
        "properties": {
          "mfaCode": {
            "description": "One-time code, when the workspace enforces MFA. Call once without it to\nhave the code emailed (the call answers MFA_REQUIRED), then again with it.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "MembersServiceUpdateBody": {
        "description": "UpdateRequest enables admins to update another teammate's profile and role.",
        "properties": {
          "displayLanguage": {
            "title": "Preferred language for product copy and emails",
            "type": "string"
          },
          "email": {
            "title": "Email address used for login and notifications",
            "type": "string"
          },
          "firstName": {
            "title": "First name to display in the product",
            "type": "string"
          },
          "lastName": {
            "title": "Last name to display in the product",
            "type": "string"
          },
          "role": {
            "description": "Role enumerates the built-in permission tiers that control what teammates can manage inside a workspace.\n\n - ROLE_UNSPECIFIED: Role not specified (defaults to viewer permissions)",
            "enum": [
              "ROLE_UNSPECIFIED",
              "ROLE_VIEWER",
              "ROLE_ADMIN",
              "ROLE_TECH"
            ],
            "example": "ROLE_TECH",
            "title": "Role that defines workspace permissions"
          }
        },
        "type": "object"
      },
      "MessagePageNavigationType": {
        "default": "MESSAGE_PAGE_NAVIGATION_TYPE_UNSPECIFIED",
        "description": "- MESSAGE_PAGE_NAVIGATION_TYPE_UNSPECIFIED: Navigation type not specified\n - MESSAGE_PAGE_NAVIGATION_TYPE_BUTTON: Visitor clicks a button to proceed\n - MESSAGE_PAGE_NAVIGATION_TYPE_TIMER: Visitor is automatically redirected after a timer expires",
        "enum": [
          "MESSAGE_PAGE_NAVIGATION_TYPE_UNSPECIFIED",
          "MESSAGE_PAGE_NAVIGATION_TYPE_BUTTON",
          "MESSAGE_PAGE_NAVIGATION_TYPE_TIMER"
        ],
        "title": "MessagePageNavigationType represents how visitors proceed from a message page",
        "type": "string"
      },
      "MessagePagePayload": {
        "properties": {
          "buttonLabel": {
            "title": "Label for the navigation button (only used when navigation_type is BUTTON, defaults to \"Continue\")",
            "type": "string"
          },
          "description": {
            "title": "Optional descriptive text below the title",
            "type": "string"
          },
          "navigationType": {
            "description": "- MESSAGE_PAGE_NAVIGATION_TYPE_UNSPECIFIED: Navigation type not specified\n - MESSAGE_PAGE_NAVIGATION_TYPE_BUTTON: Visitor clicks a button to proceed\n - MESSAGE_PAGE_NAVIGATION_TYPE_TIMER: Visitor is automatically redirected after a timer expires",
            "enum": [
              "MESSAGE_PAGE_NAVIGATION_TYPE_UNSPECIFIED",
              "MESSAGE_PAGE_NAVIGATION_TYPE_BUTTON",
              "MESSAGE_PAGE_NAVIGATION_TYPE_TIMER"
            ],
            "title": "How the visitor proceeds to the next step"
          },
          "timerSeconds": {
            "format": "int32",
            "title": "Seconds before auto-redirect (only used when navigation_type is TIMER)",
            "type": "integer"
          },
          "title": {
            "title": "The main heading displayed on the message page",
            "type": "string"
          }
        },
        "required": [
          "title",
          "navigationType"
        ],
        "title": "MessagePagePayload is a mid-flow informational page with mandatory navigation",
        "type": "object"
      },
      "Money": {
        "properties": {
          "amountMinor": {
            "format": "int32",
            "title": "Amount in the currency's minor unit, e.g. 790 for 7.90 USD",
            "type": "integer"
          },
          "currency": {
            "title": "ISO 4217 currency code, upper case, e.g. \"USD\"",
            "type": "string"
          }
        },
        "title": "Money is an amount in one currency",
        "type": "object"
      },
      "MultiLinkButton": {
        "properties": {
          "id": {
            "example": "btn-1",
            "title": "Unique identifier for this button",
            "type": "string"
          },
          "label": {
            "example": "Continue to Website",
            "title": "Display label for the button",
            "type": "string"
          },
          "nextStepId": {
            "example": "987fcdeb-a321-45e6-b789-123456789012",
            "title": "The ID of the next workflow step to transition to (UUID)",
            "type": "string"
          },
          "order": {
            "format": "int32",
            "title": "Display order for buttons",
            "type": "integer"
          }
        },
        "title": "Button definition for EVENT_ACTION_MULTI_LINK",
        "type": "object"
      },
      "MultiLinkPayload": {
        "properties": {
          "buttons": {
            "items": {
              "$ref": "#/components/schemas/MultiLinkButton",
              "type": "object"
            },
            "title": "Buttons to display on the multi-link page",
            "type": "array"
          },
          "description": {
            "example": "Select one of the options below to continue",
            "title": "Optional description displayed on the multi-link page",
            "type": "string"
          },
          "title": {
            "example": "Choose your destination",
            "title": "Optional title displayed on the multi-link page",
            "type": "string"
          }
        },
        "title": "Multi-link page payload for EVENT_ACTION_MULTI_LINK",
        "type": "object"
      },
      "MultiLinkTraceButton": {
        "description": "MultiLinkTraceButton stores metadata for all buttons available on the multi-link page.",
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "order": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "MultiLinkTraceData": {
        "description": "MultiLinkTraceData stores selection data from a multi-link step.",
        "properties": {
          "availableButtons": {
            "items": {
              "$ref": "#/components/schemas/MultiLinkTraceButton",
              "type": "object"
            },
            "type": "array"
          },
          "description": {
            "type": "string"
          },
          "selectedButton": {
            "$ref": "#/components/schemas/MultiLinkTraceSelectedButton"
          },
          "title": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "MultiLinkTraceSelectedButton": {
        "description": "MultiLinkTraceSelectedButton stores the selected button metadata.",
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "order": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "MyWorkspace": {
        "description": "MyWorkspace is one workspace the signed-in person belongs to, through one of\ntheir memberships.",
        "properties": {
          "current": {
            "title": "Whether this is the workspace the calling token acts in",
            "type": "boolean"
          },
          "enforceMfa": {
            "title": "Whether switching to this workspace asks for an MFA code",
            "type": "boolean"
          },
          "lastSigninAt": {
            "format": "date-time",
            "title": "When the person last signed in to this workspace",
            "type": "string"
          },
          "memberId": {
            "description": "The person's member record in this workspace (UUID). Empty for an API token.",
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "type": "string"
          },
          "role": {
            "description": "Role enumerates the built-in permission tiers that control what teammates can manage inside a workspace.\n\n - ROLE_UNSPECIFIED: Role not specified (defaults to viewer permissions)",
            "enum": [
              "ROLE_UNSPECIFIED",
              "ROLE_VIEWER",
              "ROLE_ADMIN",
              "ROLE_TECH"
            ],
            "example": "ROLE_ADMIN",
            "title": "The person's role in this workspace"
          },
          "workspaceId": {
            "example": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0",
            "title": "Workspace identifier (UUID)",
            "type": "string"
          },
          "workspaceName": {
            "title": "Workspace display name, empty when it was never named",
            "type": "string"
          }
        },
        "type": "object"
      },
      "OpenMediaPayload": {
        "properties": {
          "mediaId": {
            "description": "The media item (UUID) handed to the visitor: any ready media of the workspace (a PDF, an image or an MP4 video).",
            "example": "5f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f",
            "type": "string"
          }
        },
        "required": [
          "mediaId"
        ],
        "title": "OpenMediaPayload hands the visitor one piece of media from the media library (EVENT_ACTION_OPEN_MEDIA)",
        "type": "object"
      },
      "OutputFileFormat": {
        "default": "OUTPUT_FILE_FORMAT_UNSPECIFIED",
        "description": "- OUTPUT_FILE_FORMAT_UNSPECIFIED: Output format not specified (defaults to PNG server-side)\n - OUTPUT_FILE_FORMAT_SVG: Scalable Vector Graphics format for infinite resolution\n - OUTPUT_FILE_FORMAT_PNG: Portable Network Graphics format with transparency support\n - OUTPUT_FILE_FORMAT_JPEG: Joint Photographic Experts Group format for compressed images\n - OUTPUT_FILE_FORMAT_WEBP: WebP format for modern web-optimized compression",
        "enum": [
          "OUTPUT_FILE_FORMAT_UNSPECIFIED",
          "OUTPUT_FILE_FORMAT_SVG",
          "OUTPUT_FILE_FORMAT_PNG",
          "OUTPUT_FILE_FORMAT_JPEG",
          "OUTPUT_FILE_FORMAT_WEBP"
        ],
        "title": "OutputFileFormat represents the format of the QR code output file",
        "type": "string"
      },
      "PageTheme": {
        "externalDocs": {
          "description": "Learn more about page themes in Linkbreakers.",
          "url": "https://linkbreakers.com/help/article/whats-a-page-theme"
        },
        "properties": {
          "badgeEnabled": {
            "title": "--- Badge Section ---\nWhether badge is enabled",
            "type": "boolean"
          },
          "badgeIconColor": {
            "$ref": "#/components/schemas/ThemeColor",
            "title": "Badge icon background color (used when badge is not selected)"
          },
          "badgeId": {
            "title": "Badge image ID (references media table)",
            "type": "string"
          },
          "badgeShape": {
            "enum": [
              "PAGE_THEME_BADGE_SHAPE_UNSPECIFIED",
              "PAGE_THEME_BADGE_SHAPE_CIRCLE",
              "PAGE_THEME_BADGE_SHAPE_SQUARE",
              "PAGE_THEME_BADGE_SHAPE_ROUNDED"
            ],
            "title": "Badge shape"
          },
          "bodyFont": {
            "$ref": "#/components/schemas/FontConfig",
            "title": "Body font configuration"
          },
          "canvasColor": {
            "$ref": "#/components/schemas/ThemeColor",
            "title": "--- Background Section ---\nCanvas color configuration"
          },
          "canvasCoverId": {
            "title": "Optional cover media ID (references media table)",
            "type": "string"
          },
          "canvasCoverMode": {
            "enum": [
              "PAGE_THEME_BACKGROUND_COVER_MODE_UNSPECIFIED",
              "PAGE_THEME_BACKGROUND_COVER_MODE_FULL",
              "PAGE_THEME_BACKGROUND_COVER_MODE_PROGRESSIVE_TOP",
              "PAGE_THEME_BACKGROUND_COVER_MODE_PROGRESSIVE_BOTTOM"
            ],
            "title": "Cover display mode"
          },
          "containerConfig": {
            "$ref": "#/components/schemas/ContainerConfig",
            "title": "Container styling configuration"
          },
          "containerEnabled": {
            "title": "Whether container is enabled",
            "type": "boolean"
          },
          "createdAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "When the page theme was created",
            "type": "string"
          },
          "elementColor": {
            "$ref": "#/components/schemas/ThemeColor",
            "title": "Interactive element background color configuration"
          },
          "elementFont": {
            "$ref": "#/components/schemas/FontConfig",
            "title": "Interactive element text font configuration"
          },
          "footerLogoEnabled": {
            "description": "Whether the footer logo (a small company or brand logo centered at the bottom of every page using this theme) is shown.\n\nTurning it off keeps footer_logo_id, so turning it back on restores the\nsame image.",
            "type": "boolean"
          },
          "footerLogoId": {
            "title": "Footer logo image ID (a media library image)",
            "type": "string"
          },
          "id": {
            "readOnly": true,
            "title": "Page theme ID",
            "type": "string"
          },
          "titleFont": {
            "$ref": "#/components/schemas/FontConfig",
            "title": "--- Typography Section ---\nTitle font configuration"
          },
          "updatedAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "When the page theme was last updated",
            "type": "string"
          },
          "workspaceId": {
            "readOnly": true,
            "title": "Workspace ID this page theme belongs to",
            "type": "string"
          }
        },
        "title": "Page theme configuration",
        "type": "object"
      },
      "PageThemeBadgeShape": {
        "default": "PAGE_THEME_BADGE_SHAPE_UNSPECIFIED",
        "enum": [
          "PAGE_THEME_BADGE_SHAPE_UNSPECIFIED",
          "PAGE_THEME_BADGE_SHAPE_CIRCLE",
          "PAGE_THEME_BADGE_SHAPE_SQUARE",
          "PAGE_THEME_BADGE_SHAPE_ROUNDED"
        ],
        "type": "string"
      },
      "PageThemeBorderStyle": {
        "default": "PAGE_THEME_BORDER_STYLE_UNSPECIFIED",
        "enum": [
          "PAGE_THEME_BORDER_STYLE_UNSPECIFIED",
          "PAGE_THEME_BORDER_STYLE_SOLID",
          "PAGE_THEME_BORDER_STYLE_DASHED",
          "PAGE_THEME_BORDER_STYLE_DOTTED",
          "PAGE_THEME_BORDER_STYLE_DOUBLE",
          "PAGE_THEME_BORDER_STYLE_GROOVE",
          "PAGE_THEME_BORDER_STYLE_RIDGE"
        ],
        "type": "string"
      },
      "PageThemeCanvasCoverMode": {
        "default": "PAGE_THEME_BACKGROUND_COVER_MODE_UNSPECIFIED",
        "enum": [
          "PAGE_THEME_BACKGROUND_COVER_MODE_UNSPECIFIED",
          "PAGE_THEME_BACKGROUND_COVER_MODE_FULL",
          "PAGE_THEME_BACKGROUND_COVER_MODE_PROGRESSIVE_TOP",
          "PAGE_THEME_BACKGROUND_COVER_MODE_PROGRESSIVE_BOTTOM"
        ],
        "type": "string"
      },
      "PageThemeContainerVariant": {
        "default": "PAGE_THEME_CONTAINER_VARIANT_UNSPECIFIED",
        "enum": [
          "PAGE_THEME_CONTAINER_VARIANT_UNSPECIFIED",
          "PAGE_THEME_CONTAINER_VARIANT_ROUNDED",
          "PAGE_THEME_CONTAINER_VARIANT_SQUARE"
        ],
        "type": "string"
      },
      "PageThemeFontFamily": {
        "default": "PAGE_THEME_FONT_FAMILY_UNSPECIFIED",
        "description": " - PAGE_THEME_FONT_FAMILY_UNSPECIFIED: Maps to the default system sans-serif stack.",
        "enum": [
          "PAGE_THEME_FONT_FAMILY_UNSPECIFIED",
          "PAGE_THEME_FONT_FAMILY_DEFAULT",
          "PAGE_THEME_FONT_FAMILY_ARIAL",
          "PAGE_THEME_FONT_FAMILY_HELVETICA",
          "PAGE_THEME_FONT_FAMILY_VERDANA",
          "PAGE_THEME_FONT_FAMILY_GEORGIA",
          "PAGE_THEME_FONT_FAMILY_TIMES_NEW_ROMAN",
          "PAGE_THEME_FONT_FAMILY_COURIER_NEW"
        ],
        "type": "string"
      },
      "PageThemeStyling": {
        "description": "PageThemeStyling is the set of visual values a page theme carries.\n\nIt exists so styling can travel on its own, detached from any stored theme:\nthe editor sends what is currently on screen, which is what the user means by\n\"this look\", whether or not it has been saved yet.",
        "properties": {
          "badge": {
            "$ref": "#/components/schemas/MediaSelection"
          },
          "badgeEnabled": {
            "title": "--- Badge Section ---",
            "type": "boolean"
          },
          "badgeIconColor": {
            "$ref": "#/components/schemas/ThemeColor"
          },
          "badgeShape": {
            "enum": [
              "PAGE_THEME_BADGE_SHAPE_UNSPECIFIED",
              "PAGE_THEME_BADGE_SHAPE_CIRCLE",
              "PAGE_THEME_BADGE_SHAPE_SQUARE",
              "PAGE_THEME_BADGE_SHAPE_ROUNDED"
            ]
          },
          "bodyFont": {
            "$ref": "#/components/schemas/FontConfig"
          },
          "canvasColor": {
            "$ref": "#/components/schemas/ThemeColor",
            "title": "--- Background Section ---"
          },
          "canvasCover": {
            "$ref": "#/components/schemas/MediaSelection"
          },
          "canvasCoverMode": {
            "enum": [
              "PAGE_THEME_BACKGROUND_COVER_MODE_UNSPECIFIED",
              "PAGE_THEME_BACKGROUND_COVER_MODE_FULL",
              "PAGE_THEME_BACKGROUND_COVER_MODE_PROGRESSIVE_TOP",
              "PAGE_THEME_BACKGROUND_COVER_MODE_PROGRESSIVE_BOTTOM"
            ]
          },
          "containerConfig": {
            "$ref": "#/components/schemas/ContainerConfig"
          },
          "containerEnabled": {
            "type": "boolean"
          },
          "elementColor": {
            "$ref": "#/components/schemas/ThemeColor"
          },
          "elementFont": {
            "$ref": "#/components/schemas/FontConfig"
          },
          "footerLogo": {
            "$ref": "#/components/schemas/MediaSelection"
          },
          "footerLogoEnabled": {
            "description": "Small company or brand logo centered at the bottom of every page using the theme.",
            "type": "boolean"
          },
          "titleFont": {
            "$ref": "#/components/schemas/FontConfig",
            "title": "--- Typography Section ---"
          }
        },
        "type": "object"
      },
      "PageThemeTemplate": {
        "description": "Reusable page styling presets that help teams give every link page a consistent look.",
        "externalDocs": {
          "description": "Learn more about page theme templates in Linkbreakers",
          "url": "https://linkbreakers.com/help/article/whats-a-page-theme-template"
        },
        "properties": {
          "badgeSignedUrl": {
            "description": "Signed URL for the template's badge image. Empty when the template has no badge.",
            "type": "string"
          },
          "builtIn": {
            "title": "Whether the template is maintained by Linkbreakers (available to every workspace)",
            "type": "boolean"
          },
          "coverSignedUrl": {
            "description": "Signed URL for the template's cover image. Empty when the template has no cover.",
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "title": "When the template was created",
            "type": "string"
          },
          "description": {
            "title": "Short marketing description displayed in the template picker",
            "type": "string"
          },
          "duplicatedFrom": {
            "description": "Reference to the original public template when this template was created via import. Null for original templates.",
            "example": "0d7f4d9c-1aef-4ed4-821b-321a3f9cba1d",
            "title": "Reference to the original template if this is a duplicate from import (UUID)",
            "type": "string"
          },
          "faq": {
            "description": "Frequently Asked Questions about this template stored as JSON",
            "title": "FAQ data stored as JSON",
            "type": "string"
          },
          "footerLogoSignedUrl": {
            "description": "Signed URL for the template's footer logo image. Empty when the template has no footer logo.",
            "type": "string"
          },
          "id": {
            "example": "0d7f4d9c-1aef-4ed4-821b-321a3f9cba1d",
            "title": "Unique identifier of the template (UUID)",
            "type": "string"
          },
          "learnMore": {
            "description": "Extended markdown-supported content providing detailed information about the template",
            "title": "Extended markdown-supported content for \"learn more\" section",
            "type": "string"
          },
          "name": {
            "title": "Human-readable name shown in the gallery",
            "type": "string"
          },
          "owned": {
            "description": "True when the template belongs to the caller's workspace. False for built-in templates and for community templates published by other workspaces.",
            "type": "boolean"
          },
          "pageTheme": {
            "$ref": "#/components/schemas/PageTheme"
          },
          "pageThemeId": {
            "example": "a8c5e111-8894-4f8a-b5db-9efe0d12a210",
            "title": "Backing page theme that carries the styling (UUID)",
            "type": "string"
          },
          "publishedAt": {
            "description": "When the template was published. Null means private template, only visible to creating workspace.",
            "format": "date-time",
            "title": "When the template was published and made available to all workspaces\nIf null, template is private and only visible to the creating workspace\nBuilt-in templates are always considered published regardless of this field",
            "type": "string"
          },
          "slug": {
            "title": "Slug used in public template selection URLs",
            "type": "string"
          },
          "tags": {
            "title": "Tags for categorizing and filtering templates (comma-separated)",
            "type": "string"
          },
          "thumbnailPendingUpdateSince": {
            "format": "date-time",
            "title": "When the template thumbnail entered the regeneration queue",
            "type": "string"
          },
          "thumbnailSignedUrl": {
            "title": "Signed thumbnail preview of the template styling",
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "title": "When the template metadata was last updated",
            "type": "string"
          },
          "usageCount": {
            "description": "Number of links in the caller's workspace whose theme was applied from this template. Drives the 'most used' ordering in the template picker.",
            "format": "int64",
            "type": "integer"
          },
          "workspaceId": {
            "example": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0",
            "title": "Workspace that owns the template; empty for built-in templates (UUID when present)",
            "type": "string"
          }
        },
        "title": "PageThemeTemplate",
        "type": "object"
      },
      "PageThemeTemplateImages": {
        "description": "PageThemeTemplateImages is one template's perishable URLs. A message rather\nthan three parallel maps, so a record's images stay together.",
        "properties": {
          "badgeSignedUrl": {
            "type": "string"
          },
          "coverSignedUrl": {
            "type": "string"
          },
          "footerLogoSignedUrl": {
            "type": "string"
          },
          "thumbnailSignedUrl": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "PageThemeTemplateScope": {
        "default": "PAGE_THEME_TEMPLATE_SCOPE_UNSPECIFIED",
        "description": "PageThemeTemplateScope selects which templates a list call returns.\n\n - PAGE_THEME_TEMPLATE_SCOPE_UNSPECIFIED: Defaults to PAGE_THEME_TEMPLATE_SCOPE_WORKSPACE.\n - PAGE_THEME_TEMPLATE_SCOPE_WORKSPACE: Only templates owned by the caller's workspace.\n - PAGE_THEME_TEMPLATE_SCOPE_AVAILABLE: Every template the workspace may use: its own, built-in ones, and\ntemplates published by other workspaces.",
        "enum": [
          "PAGE_THEME_TEMPLATE_SCOPE_UNSPECIFIED",
          "PAGE_THEME_TEMPLATE_SCOPE_WORKSPACE",
          "PAGE_THEME_TEMPLATE_SCOPE_AVAILABLE"
        ],
        "type": "string"
      },
      "PageThemeTemplatesServicePublishPageThemeTemplateBody": {
        "title": "PublishPageThemeTemplateRequest represents a request to publish a page theme template",
        "type": "object"
      },
      "PageThemeTemplatesServiceUpdatePageThemeTemplateBody": {
        "properties": {
          "description": {
            "title": "The new description of the page theme template",
            "type": "string"
          },
          "faq": {
            "title": "FAQ data to update (JSON string)",
            "type": "string"
          },
          "learnMore": {
            "title": "Extended markdown-supported content for \"learn more\" section",
            "type": "string"
          },
          "name": {
            "title": "The new name of the page theme template",
            "type": "string"
          },
          "slug": {
            "title": "The new slug for the page theme template (must be unique globally)",
            "type": "string"
          },
          "tags": {
            "title": "The new tags for the page theme template (comma-separated)",
            "type": "string"
          }
        },
        "title": "UpdatePageThemeTemplateRequest represents a request to update an existing page theme template",
        "type": "object"
      },
      "PageThemeTemplatesServiceUpdatePageThemeTemplateStylingBody": {
        "description": "UpdatePageThemeTemplateStylingRequest updates the styling of the template's own\nbacking theme.\n\nTemplate styling is edited through this RPC rather than through UpdatePageTheme so\nthe template's thumbnail is marked for regeneration in the same place the styling\nchanges. Editing the backing theme directly would leave a stale thumbnail.",
        "properties": {
          "badge": {
            "$ref": "#/components/schemas/MediaSelection"
          },
          "badgeEnabled": {
            "title": "--- Badge Section ---",
            "type": "boolean"
          },
          "badgeIconColor": {
            "$ref": "#/components/schemas/ThemeColor"
          },
          "badgeShape": {
            "enum": [
              "PAGE_THEME_BADGE_SHAPE_UNSPECIFIED",
              "PAGE_THEME_BADGE_SHAPE_CIRCLE",
              "PAGE_THEME_BADGE_SHAPE_SQUARE",
              "PAGE_THEME_BADGE_SHAPE_ROUNDED"
            ]
          },
          "bodyFont": {
            "$ref": "#/components/schemas/FontConfig"
          },
          "canvasColor": {
            "$ref": "#/components/schemas/ThemeColor",
            "title": "--- Background Section ---"
          },
          "canvasCover": {
            "$ref": "#/components/schemas/MediaSelection"
          },
          "canvasCoverMode": {
            "enum": [
              "PAGE_THEME_BACKGROUND_COVER_MODE_UNSPECIFIED",
              "PAGE_THEME_BACKGROUND_COVER_MODE_FULL",
              "PAGE_THEME_BACKGROUND_COVER_MODE_PROGRESSIVE_TOP",
              "PAGE_THEME_BACKGROUND_COVER_MODE_PROGRESSIVE_BOTTOM"
            ]
          },
          "containerConfig": {
            "$ref": "#/components/schemas/ContainerConfig"
          },
          "containerEnabled": {
            "type": "boolean"
          },
          "elementColor": {
            "$ref": "#/components/schemas/ThemeColor"
          },
          "elementFont": {
            "$ref": "#/components/schemas/FontConfig"
          },
          "footerLogo": {
            "$ref": "#/components/schemas/MediaSelection"
          },
          "footerLogoEnabled": {
            "description": "Small company or brand logo centered at the bottom of every page using the theme.",
            "type": "boolean"
          },
          "titleFont": {
            "$ref": "#/components/schemas/FontConfig",
            "title": "--- Typography Section ---"
          }
        },
        "type": "object"
      },
      "PageThemesServiceUpdatePageThemeBody": {
        "properties": {
          "badge": {
            "$ref": "#/components/schemas/MediaSelection",
            "title": "Badge media selection to update: any image of at most 3 MB from the media library"
          },
          "badgeEnabled": {
            "title": "--- Badge Section ---\nWhether badge is enabled",
            "type": "boolean"
          },
          "badgeIconColor": {
            "$ref": "#/components/schemas/ThemeColor",
            "title": "Badge icon background color to update"
          },
          "badgeShape": {
            "enum": [
              "PAGE_THEME_BADGE_SHAPE_UNSPECIFIED",
              "PAGE_THEME_BADGE_SHAPE_CIRCLE",
              "PAGE_THEME_BADGE_SHAPE_SQUARE",
              "PAGE_THEME_BADGE_SHAPE_ROUNDED"
            ],
            "title": "Badge shape to update"
          },
          "bodyFont": {
            "$ref": "#/components/schemas/FontConfig",
            "title": "Body font configuration to update"
          },
          "canvasColor": {
            "$ref": "#/components/schemas/ThemeColor",
            "title": "--- Background Section ---\nCanvas color configuration to update"
          },
          "canvasCover": {
            "$ref": "#/components/schemas/MediaSelection",
            "title": "Cover media selection to update: any image of at most 3 MB from the media library"
          },
          "canvasCoverMode": {
            "enum": [
              "PAGE_THEME_BACKGROUND_COVER_MODE_UNSPECIFIED",
              "PAGE_THEME_BACKGROUND_COVER_MODE_FULL",
              "PAGE_THEME_BACKGROUND_COVER_MODE_PROGRESSIVE_TOP",
              "PAGE_THEME_BACKGROUND_COVER_MODE_PROGRESSIVE_BOTTOM"
            ],
            "title": "Cover display mode to update"
          },
          "containerConfig": {
            "$ref": "#/components/schemas/ContainerConfig",
            "title": "Container styling configuration to update"
          },
          "containerEnabled": {
            "title": "Whether container is enabled (false clears container_config)",
            "type": "boolean"
          },
          "elementColor": {
            "$ref": "#/components/schemas/ThemeColor",
            "title": "Interactive element background color configuration to update"
          },
          "elementFont": {
            "$ref": "#/components/schemas/FontConfig",
            "title": "Interactive element text font configuration to update"
          },
          "footerLogo": {
            "$ref": "#/components/schemas/MediaSelection",
            "description": "Footer logo media selection: id of any image of at most 3 MB from the workspace's media library, or delete to remove the image."
          },
          "footerLogoEnabled": {
            "description": "Whether to show the footer logo, a small company or brand logo centered at the bottom of every page using this theme (false hides it but keeps the image).",
            "type": "boolean"
          },
          "titleFont": {
            "$ref": "#/components/schemas/FontConfig",
            "title": "--- Typography Section ---\nTitle font configuration to update"
          }
        },
        "title": "Request to update a page theme",
        "type": "object"
      },
      "PasswordPayload": {
        "properties": {
          "description": {
            "title": "Additional helper copy displayed under the password prompt",
            "type": "string"
          },
          "password": {
            "title": "Plaintext password visitors must enter to continue the workflow",
            "type": "string"
          },
          "title": {
            "title": "Heading shown above the password prompt",
            "type": "string"
          }
        },
        "title": "Password protection payload for EVENT_ACTION_PASSWORD_VERIFY",
        "type": "object"
      },
      "PasswordTraceData": {
        "description": "PasswordTraceData stores password step validation results.",
        "properties": {
          "description": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "validated": {
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "PlanFeature": {
        "default": "PLAN_FEATURE_UNSPECIFIED",
        "description": "- PLAN_FEATURE_UNSPECIFIED: Not set\n - PLAN_FEATURE_BRAND_FREE_PAGES: Visitor pages carry no Linkbreakers branding",
        "enum": [
          "PLAN_FEATURE_UNSPECIFIED",
          "PLAN_FEATURE_BRAND_FREE_PAGES"
        ],
        "title": "PlanFeature names a capability that depends on the plan",
        "type": "string"
      },
      "PlanLimit": {
        "properties": {
          "key": {
            "description": "- PLAN_LIMIT_KEY_UNSPECIFIED: Not set\n - PLAN_LIMIT_KEY_CUSTOM_DOMAINS: Custom domains connected to the workspace\n - PLAN_LIMIT_KEY_TEAM_MEMBERS: Members of the workspace\n - PLAN_LIMIT_KEY_PLATFORM_CREDITS: Platform credits, spent by creating links and by AI features\n - PLAN_LIMIT_KEY_TRACKED_VISITS: Tracked visits (scans and clicks)\n - PLAN_LIMIT_KEY_PUBLIC_API_CALLS: Public API calls\n - PLAN_LIMIT_KEY_WEBHOOKS: Webhooks configured in the workspace\n - PLAN_LIMIT_KEY_ASSISTANT_MESSAGES_PER_MINUTE: Assistant messages per minute\n - PLAN_LIMIT_KEY_LINKS_INCLUDED: Links the monthly platform credits pay for. Links are not capped on their own: each one spends credits.\n - PLAN_LIMIT_KEY_MEDIA_STORAGE_MB: Megabytes of uploaded media (media for Open media steps, QR code logos, page theme images) the workspace may hold at once. A standing total: deleting media frees it.",
            "enum": [
              "PLAN_LIMIT_KEY_UNSPECIFIED",
              "PLAN_LIMIT_KEY_CUSTOM_DOMAINS",
              "PLAN_LIMIT_KEY_TEAM_MEMBERS",
              "PLAN_LIMIT_KEY_PLATFORM_CREDITS",
              "PLAN_LIMIT_KEY_TRACKED_VISITS",
              "PLAN_LIMIT_KEY_PUBLIC_API_CALLS",
              "PLAN_LIMIT_KEY_WEBHOOKS",
              "PLAN_LIMIT_KEY_ASSISTANT_MESSAGES_PER_MINUTE",
              "PLAN_LIMIT_KEY_LINKS_INCLUDED",
              "PLAN_LIMIT_KEY_MEDIA_STORAGE_MB"
            ],
            "title": "What the limit is on"
          },
          "kind": {
            "description": "- PLAN_LIMIT_KIND_UNSPECIFIED: Not set\n - PLAN_LIMIT_KIND_TOTAL: A standing total that does not refill, such as connected domains\n - PLAN_LIMIT_KIND_MONTHLY: An allowance that refills every month\n - PLAN_LIMIT_KIND_PER_MINUTE: A rate that refills every minute\n - PLAN_LIMIT_KIND_UNLIMITED: No ceiling\n - PLAN_LIMIT_KIND_METERED: No ceiling; every unit is billed",
            "enum": [
              "PLAN_LIMIT_KIND_UNSPECIFIED",
              "PLAN_LIMIT_KIND_TOTAL",
              "PLAN_LIMIT_KIND_MONTHLY",
              "PLAN_LIMIT_KIND_PER_MINUTE",
              "PLAN_LIMIT_KIND_UNLIMITED",
              "PLAN_LIMIT_KIND_METERED"
            ],
            "title": "How the limit behaves"
          },
          "value": {
            "description": "The ceiling. Absent when kind is PLAN_LIMIT_KIND_UNLIMITED or PLAN_LIMIT_KIND_METERED.",
            "format": "int32",
            "type": "integer"
          }
        },
        "title": "PlanLimit is one number a plan puts on something",
        "type": "object"
      },
      "PlanLimitKey": {
        "default": "PLAN_LIMIT_KEY_UNSPECIFIED",
        "description": "- PLAN_LIMIT_KEY_UNSPECIFIED: Not set\n - PLAN_LIMIT_KEY_CUSTOM_DOMAINS: Custom domains connected to the workspace\n - PLAN_LIMIT_KEY_TEAM_MEMBERS: Members of the workspace\n - PLAN_LIMIT_KEY_PLATFORM_CREDITS: Platform credits, spent by creating links and by AI features\n - PLAN_LIMIT_KEY_TRACKED_VISITS: Tracked visits (scans and clicks)\n - PLAN_LIMIT_KEY_PUBLIC_API_CALLS: Public API calls\n - PLAN_LIMIT_KEY_WEBHOOKS: Webhooks configured in the workspace\n - PLAN_LIMIT_KEY_ASSISTANT_MESSAGES_PER_MINUTE: Assistant messages per minute\n - PLAN_LIMIT_KEY_LINKS_INCLUDED: Links the monthly platform credits pay for. Links are not capped on their own: each one spends credits.\n - PLAN_LIMIT_KEY_MEDIA_STORAGE_MB: Megabytes of uploaded media (media for Open media steps, QR code logos, page theme images) the workspace may hold at once. A standing total: deleting media frees it.",
        "enum": [
          "PLAN_LIMIT_KEY_UNSPECIFIED",
          "PLAN_LIMIT_KEY_CUSTOM_DOMAINS",
          "PLAN_LIMIT_KEY_TEAM_MEMBERS",
          "PLAN_LIMIT_KEY_PLATFORM_CREDITS",
          "PLAN_LIMIT_KEY_TRACKED_VISITS",
          "PLAN_LIMIT_KEY_PUBLIC_API_CALLS",
          "PLAN_LIMIT_KEY_WEBHOOKS",
          "PLAN_LIMIT_KEY_ASSISTANT_MESSAGES_PER_MINUTE",
          "PLAN_LIMIT_KEY_LINKS_INCLUDED",
          "PLAN_LIMIT_KEY_MEDIA_STORAGE_MB"
        ],
        "title": "PlanLimitKey names one thing a plan puts a number on",
        "type": "string"
      },
      "PlanLimitKind": {
        "default": "PLAN_LIMIT_KIND_UNSPECIFIED",
        "description": "- PLAN_LIMIT_KIND_UNSPECIFIED: Not set\n - PLAN_LIMIT_KIND_TOTAL: A standing total that does not refill, such as connected domains\n - PLAN_LIMIT_KIND_MONTHLY: An allowance that refills every month\n - PLAN_LIMIT_KIND_PER_MINUTE: A rate that refills every minute\n - PLAN_LIMIT_KIND_UNLIMITED: No ceiling\n - PLAN_LIMIT_KIND_METERED: No ceiling; every unit is billed",
        "enum": [
          "PLAN_LIMIT_KIND_UNSPECIFIED",
          "PLAN_LIMIT_KIND_TOTAL",
          "PLAN_LIMIT_KIND_MONTHLY",
          "PLAN_LIMIT_KIND_PER_MINUTE",
          "PLAN_LIMIT_KIND_UNLIMITED",
          "PLAN_LIMIT_KIND_METERED"
        ],
        "title": "PlanLimitKind says how a limit behaves",
        "type": "string"
      },
      "PlanPrice": {
        "properties": {
          "amounts": {
            "items": {
              "$ref": "#/components/schemas/Money",
              "type": "object"
            },
            "title": "The charge for the whole interval, one entry per currency the price is offered in",
            "type": "array"
          },
          "interval": {
            "$ref": "#/components/schemas/BillingInterval",
            "title": "How often the price is charged"
          },
          "monthlyEquivalents": {
            "description": "The charge spread over one month, one entry per currency. Equals amounts for a monthly price.",
            "items": {
              "$ref": "#/components/schemas/Money",
              "type": "object"
            },
            "type": "array"
          }
        },
        "title": "PlanPrice is what a plan costs for one billing interval",
        "type": "object"
      },
      "PlanTrial": {
        "properties": {
          "days": {
            "format": "int32",
            "title": "Length of the trial in days",
            "type": "integer"
          },
          "limits": {
            "description": "What a workspace on the trial is allowed. Mostly the plan's limits, with the exceptions enforcement makes.",
            "items": {
              "$ref": "#/components/schemas/PlanLimit",
              "type": "object"
            },
            "type": "array"
          },
          "signupOffer": {
            "title": "Value of the offer query parameter on the signup link that starts the trial",
            "type": "string"
          },
          "signupUrl": {
            "title": "Signup link that starts the trial",
            "type": "string"
          }
        },
        "title": "PlanTrial is a free, self-serve trial of a plan",
        "type": "object"
      },
      "PreferredLinkType": {
        "default": "PREFERRED_LINK_TYPE_URL",
        "description": "PreferredLinkType indicates the dominant link creation pattern for a workspace.\n\n - PREFERRED_LINK_TYPE_URL: Default when no links exist yet — treated as URL\n - PREFERRED_LINK_TYPE_CONTACT_CARD: Workspace primarily creates contact card links\n - PREFERRED_LINK_TYPE_SOCIAL_LINKS_PAGE: Workspace primarily creates social links pages\n - PREFERRED_LINK_TYPE_MIX: Workspace uses a mix of different link types\n - PREFERRED_LINK_TYPE_OPEN_MEDIA: Workspace primarily creates links that hand out media (OPEN_MEDIA exit step)",
        "enum": [
          "PREFERRED_LINK_TYPE_URL",
          "PREFERRED_LINK_TYPE_CONTACT_CARD",
          "PREFERRED_LINK_TYPE_SOCIAL_LINKS_PAGE",
          "PREFERRED_LINK_TYPE_MIX",
          "PREFERRED_LINK_TYPE_OPEN_MEDIA"
        ],
        "type": "string"
      },
      "PricingPlan": {
        "description": "One plan: what it costs and what it allows.",
        "properties": {
          "contactUrl": {
            "description": "Where to ask for this plan's price. Set only for a plan priced on request, such as Enterprise,\nwhich is billed on the platform credits it uses at a rate agreed with sales.",
            "type": "string"
          },
          "features": {
            "items": {
              "$ref": "#/components/schemas/PlanFeature"
            },
            "title": "Capabilities the plan includes",
            "type": "array"
          },
          "id": {
            "description": "- PRICING_PLAN_ID_UNSPECIFIED: Not set\n - PRICING_PLAN_ID_FREE: Free plan, no payment\n - PRICING_PLAN_ID_LIGHT: Light plan\n - PRICING_PLAN_ID_PRO: Pro plan. Trials and sponsored workspaces are allowed what Pro allows unless a limit says otherwise.\n - PRICING_PLAN_ID_ENTERPRISE: Enterprise plan, billed on usage and priced on request through sales",
            "enum": [
              "PRICING_PLAN_ID_UNSPECIFIED",
              "PRICING_PLAN_ID_FREE",
              "PRICING_PLAN_ID_LIGHT",
              "PRICING_PLAN_ID_PRO",
              "PRICING_PLAN_ID_ENTERPRISE"
            ],
            "title": "Plan identifier"
          },
          "limits": {
            "items": {
              "$ref": "#/components/schemas/PlanLimit",
              "type": "object"
            },
            "title": "Every limit the plan enforces",
            "type": "array"
          },
          "name": {
            "title": "Display name",
            "type": "string"
          },
          "prices": {
            "description": "Recurring prices. Empty for the free plan and for Enterprise, which is priced on request.\nAlso empty for a paid plan whose prices could not be read: treat that as unknown, not free.",
            "items": {
              "$ref": "#/components/schemas/PlanPrice",
              "type": "object"
            },
            "type": "array"
          },
          "trial": {
            "$ref": "#/components/schemas/PlanTrial",
            "description": "Self-serve free trial of this plan. Absent when the plan has none."
          }
        },
        "title": "PricingPlan",
        "type": "object"
      },
      "PricingPlanId": {
        "default": "PRICING_PLAN_ID_UNSPECIFIED",
        "description": "- PRICING_PLAN_ID_UNSPECIFIED: Not set\n - PRICING_PLAN_ID_FREE: Free plan, no payment\n - PRICING_PLAN_ID_LIGHT: Light plan\n - PRICING_PLAN_ID_PRO: Pro plan. Trials and sponsored workspaces are allowed what Pro allows unless a limit says otherwise.\n - PRICING_PLAN_ID_ENTERPRISE: Enterprise plan, billed on usage and priced on request through sales",
        "enum": [
          "PRICING_PLAN_ID_UNSPECIFIED",
          "PRICING_PLAN_ID_FREE",
          "PRICING_PLAN_ID_LIGHT",
          "PRICING_PLAN_ID_PRO",
          "PRICING_PLAN_ID_ENTERPRISE"
        ],
        "title": "PricingPlanId identifies a plan a workspace can subscribe to",
        "type": "string"
      },
      "PublicCreateQrcodeDesignRequest": {
        "description": "PublicCreateQrcodeDesignRequest provisions a new reusable QR code styling preset.",
        "properties": {
          "backgroundOptions": {
            "$ref": "#/components/schemas/BackgroundOptions",
            "title": "The styling options for the background"
          },
          "centralImageData": {
            "description": "The image to use as the central image of the QR Code. The file size limit is 3MB. It must be transmitted in a base64 string format when sending it through HTTP.\nThis endpoint has no workspace, so it cannot take an image from the media library: to use one, create the\ndesign, then set central_image_media_id with Update.",
            "example": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==",
            "type": "string"
          },
          "centralImageMargin": {
            "format": "int32",
            "title": "The margin around the central image in pixels",
            "type": "integer"
          },
          "centralImageSize": {
            "format": "double",
            "title": "The size of the central image relative to the QR code",
            "type": "number"
          },
          "cornersDotOptions": {
            "$ref": "#/components/schemas/CornersDotOptions",
            "title": "The styling options for the dot corners"
          },
          "cornersSquareOptions": {
            "$ref": "#/components/schemas/CornersSquareOptions",
            "title": "The styling options for the square corners"
          },
          "dotsOptions": {
            "$ref": "#/components/schemas/DotsOptions",
            "title": "The styling options for the dots"
          },
          "errorCorrectionLevel": {
            "title": "The error correction level of the QR code",
            "type": "string"
          },
          "height": {
            "format": "int32",
            "title": "The height of the QR code",
            "type": "integer"
          },
          "hideBackgroundDots": {
            "title": "Whether to hide the background dots",
            "type": "boolean"
          },
          "outputFileFormat": {
            "description": "- OUTPUT_FILE_FORMAT_UNSPECIFIED: Output format not specified (defaults to PNG server-side)\n - OUTPUT_FILE_FORMAT_SVG: Scalable Vector Graphics format for infinite resolution\n - OUTPUT_FILE_FORMAT_PNG: Portable Network Graphics format with transparency support\n - OUTPUT_FILE_FORMAT_JPEG: Joint Photographic Experts Group format for compressed images\n - OUTPUT_FILE_FORMAT_WEBP: WebP format for modern web-optimized compression",
            "enum": [
              "OUTPUT_FILE_FORMAT_UNSPECIFIED",
              "OUTPUT_FILE_FORMAT_SVG",
              "OUTPUT_FILE_FORMAT_PNG",
              "OUTPUT_FILE_FORMAT_JPEG",
              "OUTPUT_FILE_FORMAT_WEBP"
            ],
            "example": "OUTPUT_FILE_FORMAT_WEBP",
            "title": "The output file format for the QR code"
          },
          "shape": {
            "description": "- SHAPE_UNSPECIFIED: Shape not specified (defaults to square modules)\n - SHAPE_SQUARE: Traditional square modules for QR code data points\n - SHAPE_CIRCLE: Circular modules for a rounded visual appearance",
            "enum": [
              "SHAPE_UNSPECIFIED",
              "SHAPE_SQUARE",
              "SHAPE_CIRCLE"
            ],
            "example": "SHAPE_SQUARE",
            "title": "The shape of the QR code"
          },
          "width": {
            "format": "int32",
            "title": "The width of the QR code",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "PublicCreateQrcodeDesignResponse": {
        "description": "PublicCreateQrcodeDesignResponse echoes the newly created design with generated metadata.",
        "properties": {
          "qrcodeDesign": {
            "$ref": "#/components/schemas/QrcodeDesign",
            "title": "The created QR code design"
          }
        },
        "type": "object"
      },
      "PublicListPageThemeTemplatesResponse": {
        "properties": {
          "hasMore": {
            "title": "Whether another page exists after this result set",
            "type": "boolean"
          },
          "nextPageToken": {
            "title": "Cursor token for the next page, if any",
            "type": "string"
          },
          "pageThemeTemplates": {
            "items": {
              "$ref": "#/components/schemas/PublicPageThemeTemplate",
              "type": "object"
            },
            "type": "array"
          }
        },
        "title": "PublicListPageThemeTemplatesResponse represents the response for listing public page theme templates",
        "type": "object"
      },
      "PublicListQrcodeTemplatesResponse": {
        "properties": {
          "hasMore": {
            "title": "Whether another page exists after this result set",
            "type": "boolean"
          },
          "nextPageToken": {
            "description": "Cursor token returned when another page is available",
            "example": "eyJxdHMiOiJxdGVtcGxhdGUifQ==",
            "title": "Cursor token for the next page, if any",
            "type": "string"
          },
          "qrcodeTemplates": {
            "items": {
              "$ref": "#/components/schemas/PublicQrcodeTemplate",
              "type": "object"
            },
            "type": "array"
          }
        },
        "title": "PublicListQrcodeTemplatesResponse represents the response for listing QR code templates",
        "type": "object"
      },
      "PublicPageThemeTemplate": {
        "externalDocs": {
          "description": "Learn more about page theme templates in Linkbreakers",
          "url": "https://linkbreakers.com/help/article/whats-a-page-theme-template"
        },
        "properties": {
          "badgeSignedUrl": {
            "description": "Signed URL for the template's badge image. Empty when it has no badge.",
            "type": "string"
          },
          "builtIn": {
            "title": "Whether the template is maintained by Linkbreakers (available to every workspace)",
            "type": "boolean"
          },
          "coverSignedUrl": {
            "description": "Signed URL for the template's cover image. Empty when it has no cover.",
            "type": "string"
          },
          "description": {
            "title": "Short marketing description displayed in the template picker",
            "type": "string"
          },
          "faq": {
            "description": "Frequently Asked Questions about this template stored as JSON",
            "title": "FAQ data stored as JSON",
            "type": "string"
          },
          "footerLogoSignedUrl": {
            "description": "Signed URL for the template's footer logo image. Empty when it has none.",
            "type": "string"
          },
          "learnMore": {
            "description": "Extended markdown-supported content providing detailed information about the template",
            "title": "Extended markdown-supported content for \"learn more\" section",
            "type": "string"
          },
          "name": {
            "title": "Human-readable name shown in the gallery",
            "type": "string"
          },
          "pageTheme": {
            "$ref": "#/components/schemas/PageTheme",
            "description": "The styling itself, so a public gallery can render a live preview rather\nthan only the rasterized thumbnail."
          },
          "publishedAt": {
            "format": "date-time",
            "title": "When the template was published and made available to all workspaces",
            "type": "string"
          },
          "slug": {
            "title": "Slug used in public template selection URLs",
            "type": "string"
          },
          "tags": {
            "title": "Tags for categorizing and filtering templates (comma-separated)",
            "type": "string"
          },
          "thumbnailSignedUrl": {
            "title": "Signed thumbnail preview of the template styling",
            "type": "string"
          },
          "workspace": {
            "$ref": "#/components/schemas/PublicWorkspace",
            "description": "Public information about the workspace that created this template. Empty for built-in templates. Only included when 'workspace' is specified in the include parameter.",
            "title": "Workspace that created this template (only included when requested via include parameter)"
          }
        },
        "title": "PublicPageThemeTemplate represents a page theme template with limited public information",
        "type": "object"
      },
      "PublicQrcodeTemplate": {
        "externalDocs": {
          "description": "Learn more about QR code templates in Linkbreakers",
          "url": "https://linkbreakers.com/help/article/whats-a-qr-code-template"
        },
        "properties": {
          "builtIn": {
            "title": "Whether the template is maintained by Linkbreakers (available to every workspace)",
            "type": "boolean"
          },
          "description": {
            "title": "Short marketing description displayed in the template picker",
            "type": "string"
          },
          "faq": {
            "description": "Frequently Asked Questions about this template stored as JSON",
            "title": "FAQ data stored as JSON",
            "type": "string"
          },
          "learnMore": {
            "description": "Extended markdown-supported content providing detailed information about the template",
            "title": "Extended markdown-supported content for \"learn more\" section",
            "type": "string"
          },
          "name": {
            "title": "Human-readable name shown in the gallery",
            "type": "string"
          },
          "publishedAt": {
            "format": "date-time",
            "title": "When the template was published and made available to all workspaces",
            "type": "string"
          },
          "slug": {
            "title": "Slug used in public template selection URLs",
            "type": "string"
          },
          "tags": {
            "title": "Tags for categorizing and filtering templates (comma-separated)",
            "type": "string"
          },
          "thumbnailSignedUrl": {
            "title": "Signed thumbnail preview of the template design",
            "type": "string"
          },
          "workspace": {
            "$ref": "#/components/schemas/PublicWorkspace",
            "description": "Public information about the workspace that created this template. Empty for built-in templates. Only included when 'workspace' is specified in the include parameter.",
            "title": "Workspace that created this template (only included when requested via include parameter)"
          }
        },
        "title": "PublicQrcodeTemplate represents a QR code template with limited public information",
        "type": "object"
      },
      "PublicWorkspace": {
        "externalDocs": {
          "description": "Learn more about workspaces in Linkbreakers.",
          "url": "https://linkbreakers.com/help/article/what-is-a-workspace"
        },
        "properties": {
          "description": {
            "title": "Optional description providing additional context about the workspace",
            "type": "string"
          },
          "faq": {
            "description": "Frequently Asked Questions about this workspace stored as JSON",
            "title": "FAQ data stored as JSON",
            "type": "string"
          },
          "name": {
            "title": "Human-readable display name",
            "type": "string"
          },
          "publishedAt": {
            "format": "date-time",
            "title": "Timestamp when the workspace was published/made public",
            "type": "string"
          },
          "shortDescription": {
            "title": "Short description for the workspace",
            "type": "string"
          },
          "slug": {
            "title": "Unique slug for the workspace (URL-friendly identifier)",
            "type": "string"
          },
          "tags": {
            "title": "Comma-separated tags for the workspace",
            "type": "string"
          },
          "website": {
            "title": "Website URL for the workspace",
            "type": "string"
          }
        },
        "title": "PublicWorkspace represents a publicly visible workspace with limited data",
        "type": "object"
      },
      "PublishPageThemeTemplateResponse": {
        "properties": {
          "pageThemeTemplate": {
            "$ref": "#/components/schemas/PageThemeTemplate",
            "title": "The published page theme template"
          }
        },
        "title": "PublishPageThemeTemplateResponse represents the response after publishing a page theme template",
        "type": "object"
      },
      "PublishQrcodeTemplateResponse": {
        "properties": {
          "qrcodeTemplate": {
            "$ref": "#/components/schemas/QrcodeTemplate",
            "title": "The published QR code template"
          }
        },
        "title": "PublishQrcodeTemplateResponse represents the response after publishing a QR code template",
        "type": "object"
      },
      "QrcodeDesign": {
        "description": "Captures the visual recipe Linkbreakers uses when rendering downloadable QR codes, including colors, shapes,\nexport options, and center media.\n\nQR Code Designs are the visual representation of a link.\nThey can be attached to QR Code Templates for reusability.\nThey can only be attached to one record at a time.",
        "externalDocs": {
          "description": "Learn more about QR code designs in Linkbreakers",
          "url": "https://linkbreakers.com/help/article/whats-a-qr-code-design"
        },
        "properties": {
          "backgroundOptions": {
            "$ref": "#/components/schemas/BackgroundOptions",
            "title": "The styling options for the background"
          },
          "centralImageMargin": {
            "format": "int32",
            "title": "The margin around the central image in pixels",
            "type": "integer"
          },
          "centralImageMediaId": {
            "description": "The media library item the central image (the QR code logo) was picked from (UUID). Empty when the\nlogo was uploaded directly or there is none. The design keeps its own copy of the image, so the logo\nsurvives the media being deleted; this id may then name media that no longer exists.",
            "readOnly": true,
            "type": "string"
          },
          "centralImageSignedUrl": {
            "readOnly": true,
            "title": "The signed URL for the central image\nThis URL eventually expires",
            "type": "string"
          },
          "centralImageSize": {
            "format": "double",
            "title": "The size of the central image relative to the QR code (0.0-1.0 proportion)",
            "type": "number"
          },
          "cornersDotOptions": {
            "$ref": "#/components/schemas/CornersDotOptions",
            "title": "The styling options for the dot corners"
          },
          "cornersSquareOptions": {
            "$ref": "#/components/schemas/CornersSquareOptions",
            "title": "The styling options for the square corners"
          },
          "createdAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "When the QR code design was created",
            "type": "string"
          },
          "dotsOptions": {
            "$ref": "#/components/schemas/DotsOptions",
            "title": "The styling options for the dots"
          },
          "errorCorrectionLevel": {
            "title": "Error correction level forwarded to the QR renderer (\"L\",\"M\",\"Q\",\"H\")",
            "type": "string"
          },
          "height": {
            "format": "int32",
            "title": "Export height in pixels",
            "type": "integer"
          },
          "hideBackgroundDots": {
            "title": "Whether to remove dots behind the central image to improve contrast",
            "type": "boolean"
          },
          "id": {
            "example": "a8c5e111-8894-4f8a-b5db-9efe0d12a210",
            "title": "The unique identifier of the QR code design (UUID)",
            "type": "string"
          },
          "outputFileFormat": {
            "description": "- OUTPUT_FILE_FORMAT_UNSPECIFIED: Output format not specified (defaults to PNG server-side)\n - OUTPUT_FILE_FORMAT_SVG: Scalable Vector Graphics format for infinite resolution\n - OUTPUT_FILE_FORMAT_PNG: Portable Network Graphics format with transparency support\n - OUTPUT_FILE_FORMAT_JPEG: Joint Photographic Experts Group format for compressed images\n - OUTPUT_FILE_FORMAT_WEBP: WebP format for modern web-optimized compression",
            "enum": [
              "OUTPUT_FILE_FORMAT_UNSPECIFIED",
              "OUTPUT_FILE_FORMAT_SVG",
              "OUTPUT_FILE_FORMAT_PNG",
              "OUTPUT_FILE_FORMAT_JPEG",
              "OUTPUT_FILE_FORMAT_WEBP"
            ],
            "example": "OUTPUT_FILE_FORMAT_PNG",
            "title": "The output file format for the QR code"
          },
          "shape": {
            "description": "- SHAPE_UNSPECIFIED: Shape not specified (defaults to square modules)\n - SHAPE_SQUARE: Traditional square modules for QR code data points\n - SHAPE_CIRCLE: Circular modules for a rounded visual appearance",
            "enum": [
              "SHAPE_UNSPECIFIED",
              "SHAPE_SQUARE",
              "SHAPE_CIRCLE"
            ],
            "example": "SHAPE_SQUARE",
            "title": "The shape of the QR code"
          },
          "updatedAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "When the QR code design was last updated",
            "type": "string"
          },
          "width": {
            "format": "int32",
            "title": "Export width in pixels",
            "type": "integer"
          }
        },
        "title": "QrcodeDesign",
        "type": "object"
      },
      "QrcodeDesignServiceUpdateBody": {
        "description": "UpdateQrcodeDesignRequest updates colors, shapes, and media used when regenerating QR assets.",
        "properties": {
          "backgroundOptions": {
            "$ref": "#/components/schemas/BackgroundOptions",
            "title": "The styling options for the background"
          },
          "centralImageData": {
            "description": "The image to use as the central image of the QR Code. The file size limit is 3MB. It must be transmitted in a base64 string format when sending it through HTTP.",
            "example": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==",
            "type": "string"
          },
          "centralImageDelete": {
            "description": "Set this to true to delete the central image. It can't be used at the same time as transmitting a central image.",
            "type": "boolean"
          },
          "centralImageMargin": {
            "format": "int32",
            "title": "The margin around the central image in pixels",
            "type": "integer"
          },
          "centralImageMediaId": {
            "description": "An image from the workspace's media library to use as the central image (UUID). Any READY image of at\nmost 3 MB can be a QR code logo; anything else is refused with MEDIA_NOT_ALLOWED_HERE. The design keeps\nits own copy of the image: without central_image_data the server reads it from the media itself, with\nit the bytes sent are used and the media is recorded as where they came from. The media then lists this\nQR code among its references. Cannot be combined with central_image_delete. Sending central_image_data\nwithout it, or central_image_delete, clears the recorded media.",
            "type": "string"
          },
          "centralImageSize": {
            "format": "double",
            "title": "The size of the central image relative to the QR code",
            "type": "number"
          },
          "cornersDotOptions": {
            "$ref": "#/components/schemas/CornersDotOptions",
            "title": "The styling options for the dot corners"
          },
          "cornersSquareOptions": {
            "$ref": "#/components/schemas/CornersSquareOptions",
            "title": "The styling options for the square corners"
          },
          "dotsOptions": {
            "$ref": "#/components/schemas/DotsOptions",
            "title": "The styling options for the dots"
          },
          "errorCorrectionLevel": {
            "title": "The error correction level of the QR code",
            "type": "string"
          },
          "height": {
            "format": "int32",
            "title": "The height of the QR code",
            "type": "integer"
          },
          "hideBackgroundDots": {
            "title": "Whether to hide the background dots",
            "type": "boolean"
          },
          "outputFileFormat": {
            "description": "- OUTPUT_FILE_FORMAT_UNSPECIFIED: Output format not specified (defaults to PNG server-side)\n - OUTPUT_FILE_FORMAT_SVG: Scalable Vector Graphics format for infinite resolution\n - OUTPUT_FILE_FORMAT_PNG: Portable Network Graphics format with transparency support\n - OUTPUT_FILE_FORMAT_JPEG: Joint Photographic Experts Group format for compressed images\n - OUTPUT_FILE_FORMAT_WEBP: WebP format for modern web-optimized compression",
            "enum": [
              "OUTPUT_FILE_FORMAT_UNSPECIFIED",
              "OUTPUT_FILE_FORMAT_SVG",
              "OUTPUT_FILE_FORMAT_PNG",
              "OUTPUT_FILE_FORMAT_JPEG",
              "OUTPUT_FILE_FORMAT_WEBP"
            ],
            "example": "OUTPUT_FILE_FORMAT_SVG",
            "title": "The output file format for the QR code"
          },
          "shape": {
            "description": "- SHAPE_UNSPECIFIED: Shape not specified (defaults to square modules)\n - SHAPE_SQUARE: Traditional square modules for QR code data points\n - SHAPE_CIRCLE: Circular modules for a rounded visual appearance",
            "enum": [
              "SHAPE_UNSPECIFIED",
              "SHAPE_SQUARE",
              "SHAPE_CIRCLE"
            ],
            "example": "SHAPE_CIRCLE",
            "title": "The shape of the QR code"
          },
          "width": {
            "format": "int32",
            "title": "The width of the QR code",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "QrcodeTemplate": {
        "description": "Reusable QR code design presets that help teams create branded links with consistent styling and messaging.",
        "externalDocs": {
          "description": "Learn more about QR code templates in Linkbreakers",
          "url": "https://linkbreakers.com/help/article/whats-a-qr-code-template"
        },
        "properties": {
          "builtIn": {
            "title": "Whether the template is maintained by Linkbreakers (available to every workspace)",
            "type": "boolean"
          },
          "createdAt": {
            "format": "date-time",
            "title": "When the template was created",
            "type": "string"
          },
          "description": {
            "title": "Short marketing description displayed in the template picker",
            "type": "string"
          },
          "duplicatedFrom": {
            "description": "Reference to the original public template when this template was created via import. Null for original templates.",
            "example": "0d7f4d9c-1aef-4ed4-821b-321a3f9cba1d",
            "title": "Reference to the original template if this is a duplicate from import (UUID)",
            "type": "string"
          },
          "faq": {
            "description": "Frequently Asked Questions about this template stored as JSON",
            "title": "FAQ data stored as JSON",
            "type": "string"
          },
          "id": {
            "example": "0d7f4d9c-1aef-4ed4-821b-321a3f9cba1d",
            "title": "Unique identifier of the template (UUID)",
            "type": "string"
          },
          "learnMore": {
            "description": "Extended markdown-supported content providing detailed information about the template",
            "title": "Extended markdown-supported content for \"learn more\" section",
            "type": "string"
          },
          "name": {
            "title": "Human-readable name shown in the gallery",
            "type": "string"
          },
          "owned": {
            "description": "True when the template belongs to the caller's workspace. False for built-in templates and for community templates published by other workspaces.",
            "type": "boolean"
          },
          "publishedAt": {
            "description": "When the template was published. Null means private template, only visible to creating workspace.",
            "format": "date-time",
            "title": "When the template was published and made available to all workspaces\nIf null, template is private and only visible to the creating workspace\nBuilt-in templates are always considered published regardless of this field",
            "type": "string"
          },
          "qrcodeDesign": {
            "$ref": "#/components/schemas/QrcodeDesign"
          },
          "qrcodeDesignId": {
            "example": "a8c5e111-8894-4f8a-b5db-9efe0d12a210",
            "title": "Backing QR code design that determines styling defaults (UUID)",
            "type": "string"
          },
          "slug": {
            "title": "Slug used in public template selection URLs",
            "type": "string"
          },
          "tags": {
            "title": "Tags for categorizing and filtering templates (comma-separated)",
            "type": "string"
          },
          "thumbnailPendingUpdateSince": {
            "format": "date-time",
            "title": "When the template thumbnail entered the regeneration queue",
            "type": "string"
          },
          "thumbnailSignedUrl": {
            "title": "Signed thumbnail preview of the template design",
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "title": "When the template metadata was last updated",
            "type": "string"
          },
          "usageCount": {
            "description": "Number of links in the caller's workspace that were created from this template. Drives the 'most used' ordering in the template picker.",
            "format": "int64",
            "type": "integer"
          },
          "workspaceId": {
            "example": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0",
            "title": "Workspace that owns the template; empty for built-in templates (UUID when present)",
            "type": "string"
          }
        },
        "title": "QrcodeTemplate",
        "type": "object"
      },
      "QrcodeTemplateScope": {
        "default": "QRCODE_TEMPLATE_SCOPE_UNSPECIFIED",
        "description": "QrcodeTemplateScope selects which templates a list call returns.\n\n - QRCODE_TEMPLATE_SCOPE_UNSPECIFIED: Defaults to QRCODE_TEMPLATE_SCOPE_WORKSPACE.\n - QRCODE_TEMPLATE_SCOPE_WORKSPACE: Only templates owned by the caller's workspace.\n - QRCODE_TEMPLATE_SCOPE_AVAILABLE: Every template the workspace may use: its own, built-in ones, and\ntemplates published by other workspaces.",
        "enum": [
          "QRCODE_TEMPLATE_SCOPE_UNSPECIFIED",
          "QRCODE_TEMPLATE_SCOPE_WORKSPACE",
          "QRCODE_TEMPLATE_SCOPE_AVAILABLE"
        ],
        "type": "string"
      },
      "QrcodeTemplatesServicePublishQrcodeTemplateBody": {
        "title": "PublishQrcodeTemplateRequest represents a request to publish a QR code template",
        "type": "object"
      },
      "QrcodeTemplatesServiceUpdateQrcodeTemplateBody": {
        "properties": {
          "description": {
            "title": "The new description of the QR code template",
            "type": "string"
          },
          "faq": {
            "title": "FAQ data to update (JSON string)",
            "type": "string"
          },
          "learnMore": {
            "description": "Extended markdown-supported content providing detailed information about the template",
            "title": "Extended markdown-supported content for \"learn more\" section",
            "type": "string"
          },
          "name": {
            "title": "The new name of the QR code template",
            "type": "string"
          },
          "slug": {
            "title": "The new slug for the QR code template (must be unique globally)",
            "type": "string"
          },
          "tags": {
            "title": "The new tags for the QR code template (comma-separated)",
            "type": "string"
          }
        },
        "title": "UpdateQrcodeTemplateRequest represents a request to update an existing QR code template",
        "type": "object"
      },
      "RedirectTraceData": {
        "description": "RedirectTraceData stores redirect exit information.",
        "properties": {
          "conversionTracking": {
            "type": "boolean"
          },
          "destination": {
            "type": "string"
          },
          "fallback": {
            "type": "boolean"
          },
          "fallbackReason": {
            "$ref": "#/components/schemas/RedirectTraceDataFallbackReason",
            "description": "Why the visitor was sent to the fallback destination. Set only when fallback is true."
          }
        },
        "type": "object"
      },
      "RedirectTraceDataFallbackReason": {
        "default": "FALLBACK_REASON_UNSPECIFIED",
        "description": "- FALLBACK_REASON_UNSPECIFIED: No particular reason recorded: the workflow had no step to send the visitor to\n - FALLBACK_REASON_MEDIA_MISSING: The media an OPEN_MEDIA step hands out was deleted, is not uploaded yet, or is not the workspace's",
        "enum": [
          "FALLBACK_REASON_UNSPECIFIED",
          "FALLBACK_REASON_MEDIA_MISSING"
        ],
        "title": "FallbackReason says why a visitor was sent to the link's fallback destination",
        "type": "string"
      },
      "ReplaceMediaImportResponse": {
        "properties": {
          "detachedReferences": {
            "description": "The uses detached from the media because they keep their own copy of the old file: QR code designs\nthat used it as their logo. They keep showing their current logo.",
            "items": {
              "$ref": "#/components/schemas/MediaReference",
              "type": "object"
            },
            "type": "array"
          },
          "media": {
            "$ref": "#/components/schemas/Media",
            "title": "The media item, same id, holding the new file, with a signed URL and its references"
          },
          "unchanged": {
            "title": "True when the new file was the media's own: nothing changed",
            "type": "boolean"
          }
        },
        "title": "The media item after its file was replaced",
        "type": "object"
      },
      "RequestWorkspaceEnrollmentRequest": {
        "properties": {
          "message": {
            "title": "Optional message or reason for enrollment request",
            "type": "string"
          }
        },
        "title": "RequestWorkspaceEnrollmentRequest represents a request for workspace enrollment",
        "type": "object"
      },
      "ResolvePageThemeTemplateImagesRequest": {
        "description": "ResolvePageThemeTemplateImagesRequest asks for signed image URLs.",
        "properties": {
          "templateIds": {
            "description": "Templates to resolve. Ids the caller cannot see are absent from the\nresponse rather than failing the batch.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "templateIds"
        ],
        "type": "object"
      },
      "ResolvePageThemeTemplateImagesResponse": {
        "description": "ResolvePageThemeTemplateImagesResponse carries the resolved images.",
        "properties": {
          "images": {
            "additionalProperties": {
              "$ref": "#/components/schemas/PageThemeTemplateImages"
            },
            "description": "Images by template id. These expire; fetch rather than store.",
            "type": "object"
          }
        },
        "type": "object"
      },
      "ResolveQrcodeImagesRequest": {
        "description": "ResolveQrcodeImagesRequest asks for signed QR code image URLs.",
        "properties": {
          "linkIds": {
            "description": "The links to resolve images for. Ids outside the caller's workspace, and\nlinks with no generated QR code yet, are simply absent from the response\nrather than failing the whole batch: a list draws the rows it can.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "linkIds"
        ],
        "type": "object"
      },
      "ResolveQrcodeImagesResponse": {
        "description": "ResolveQrcodeImagesResponse carries the resolved URLs.",
        "properties": {
          "qrcodeSignedUrls": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Signed URL by link id. These expire, so treat them as good for this\nsession and ask again rather than persisting them.",
            "type": "object"
          }
        },
        "type": "object"
      },
      "ResolveQrcodeTemplateImagesRequest": {
        "description": "ResolveQrcodeTemplateImagesRequest asks for signed thumbnail URLs.",
        "properties": {
          "templateIds": {
            "description": "Templates to resolve. Ids the caller cannot see are absent from the\nresponse rather than failing the batch.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "ResolveQrcodeTemplateImagesResponse": {
        "description": "ResolveQrcodeTemplateImagesResponse carries the resolved thumbnails.",
        "properties": {
          "thumbnailSignedUrls": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Signed thumbnail URL by template id. These expire; fetch rather than store.",
            "type": "object"
          }
        },
        "type": "object"
      },
      "ResolveStepCollisionsResponse": {
        "properties": {
          "stepsRepositioned": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "ResponseFormat": {
        "default": "RESPONSE_FORMAT_UNSPECIFIED",
        "description": "ResponseFormat defines the transport format the API should return for list-style endpoints.\n\n - RESPONSE_FORMAT_UNSPECIFIED: Response format not specified\n - RESPONSE_FORMAT_JSON: Response format JSON\n - RESPONSE_FORMAT_CSV: Response format CSV",
        "enum": [
          "RESPONSE_FORMAT_UNSPECIFIED",
          "RESPONSE_FORMAT_JSON",
          "RESPONSE_FORMAT_CSV"
        ],
        "type": "string"
      },
      "Role": {
        "default": "ROLE_UNSPECIFIED",
        "description": "Role enumerates the built-in permission tiers that control what teammates can manage inside a workspace.\n\n - ROLE_UNSPECIFIED: Role not specified (defaults to viewer permissions)",
        "enum": [
          "ROLE_UNSPECIFIED",
          "ROLE_VIEWER",
          "ROLE_ADMIN",
          "ROLE_TECH"
        ],
        "type": "string"
      },
      "Sandbox": {
        "description": "A sandbox workspace for testing, empty when created, reachable only through\nits own lb_test_ API tokens, and purged at expires_at.",
        "properties": {
          "createdAt": {
            "format": "date-time",
            "readOnly": true,
            "type": "string"
          },
          "expiresAt": {
            "description": "When the sandbox and everything in it is deleted.",
            "format": "date-time",
            "readOnly": true,
            "type": "string"
          },
          "id": {
            "description": "The sandbox workspace id (UUID). Its tokens act on this workspace.",
            "example": "5b1e4d42-c0d3-4afe-a6fd-0c5f5c3962d0",
            "type": "string"
          },
          "name": {
            "example": "CI integration tests",
            "type": "string"
          }
        },
        "type": "object"
      },
      "SettingsServiceUpdateLinkSettingBody": {
        "description": "UpdateLinkSettingRequest changes the visitor-data policy tied to a specific link.",
        "properties": {
          "dataCollection": {
            "$ref": "#/components/schemas/DataCollection",
            "title": "The new data collection setting\nDetermines how much visitor information is requested during workflow steps"
          }
        },
        "type": "object"
      },
      "Shape": {
        "default": "SHAPE_UNSPECIFIED",
        "description": "- SHAPE_UNSPECIFIED: Shape not specified (defaults to square modules)\n - SHAPE_SQUARE: Traditional square modules for QR code data points\n - SHAPE_CIRCLE: Circular modules for a rounded visual appearance",
        "enum": [
          "SHAPE_UNSPECIFIED",
          "SHAPE_SQUARE",
          "SHAPE_CIRCLE"
        ],
        "title": "Shape represents the shape of the QR code",
        "type": "string"
      },
      "ShortlinkAvailabilityResponse": {
        "properties": {
          "available": {
            "title": "Whether the slug is available for use",
            "type": "boolean"
          }
        },
        "title": "Response indicating shortlink availability",
        "type": "object"
      },
      "ShortlinkRandomResponse": {
        "properties": {
          "shortlink": {
            "title": "Suggested available shortlink slug generated by the service",
            "type": "string"
          }
        },
        "title": "Response containing the random shortlink",
        "type": "object"
      },
      "SlackChannel": {
        "properties": {
          "id": {
            "title": "The Slack channel ID",
            "type": "string"
          },
          "isMember": {
            "title": "Whether the bot is a member of this channel (can post to it)",
            "type": "boolean"
          },
          "isPrivate": {
            "title": "Whether this is a private channel",
            "type": "boolean"
          },
          "name": {
            "title": "The channel name",
            "type": "string"
          }
        },
        "title": "A Slack channel available for notification delivery",
        "type": "object"
      },
      "SlackIntegration": {
        "description": "Represents a connected Slack workspace integration that receives event notifications\nin a configured channel when workflow steps complete.",
        "properties": {
          "createdAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "The timestamp when the integration was connected",
            "type": "string"
          },
          "createdBy": {
            "title": "The member who connected the integration (UUID)",
            "type": "string"
          },
          "failureCount": {
            "format": "int64",
            "readOnly": true,
            "title": "Count of failed notification deliveries",
            "type": "integer"
          },
          "id": {
            "example": "d22f7bf1-83a9-4f3a-9b37-9a3a21b6ac11",
            "title": "The unique identifier of the Slack integration (UUID)",
            "type": "string"
          },
          "lastSentAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "The timestamp when a notification was last sent",
            "type": "string"
          },
          "linkId": {
            "description": "Filter notifications by a specific link ID.\nOnly events from this link will trigger notifications.\nIf empty, all links in the workspace will trigger notifications.",
            "example": "d22f7bf1-83a9-4f3a-9b37-9a3a21b6ac11",
            "type": "string"
          },
          "slackChannelId": {
            "example": "C01ABC123",
            "title": "The Slack channel ID where notifications are sent",
            "type": "string"
          },
          "slackChannelName": {
            "example": "general",
            "title": "The Slack channel name where notifications are sent",
            "type": "string"
          },
          "slackTeamId": {
            "example": "T01ABC123",
            "title": "The Slack team/workspace ID",
            "type": "string"
          },
          "slackTeamName": {
            "example": "My Company",
            "title": "The Slack team/workspace name",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/SlackIntegrationStatus",
            "title": "Current status of the integration"
          },
          "successCount": {
            "format": "int64",
            "readOnly": true,
            "title": "Count of successful notification deliveries",
            "type": "integer"
          },
          "triggers": {
            "description": "Filter notifications by workflow step kinds.\nOnly workflow steps matching these kinds will trigger notifications.\nIf empty, all workflow step kinds will trigger notifications.",
            "items": {
              "description": "- KIND_UNSPECIFIED: Workflow step kind not specified\n - KIND_ENTRY: Entry steps are automatically triggered when a visitor reaches the workflow\n - KIND_EXIT: Exit steps finalize the workflow (commonly a redirect)\n - KIND_INTERACTION: Interaction steps require visitor input (forms, passwords, etc.)\n - KIND_CONDITION: Condition steps evaluate logic and route to different next steps",
              "enum": [
                "KIND_UNSPECIFIED",
                "KIND_ENTRY",
                "KIND_EXIT",
                "KIND_INTERACTION",
                "KIND_CONDITION"
              ]
            },
            "type": "array"
          },
          "updatedAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "The timestamp when the integration was last updated",
            "type": "string"
          },
          "workspaceId": {
            "example": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0",
            "title": "The workspace ID this integration belongs to (UUID)",
            "type": "string"
          }
        },
        "title": "SlackIntegration",
        "type": "object"
      },
      "SlackIntegrationStatus": {
        "default": "SLACK_INTEGRATION_STATUS_UNSPECIFIED",
        "description": "- SLACK_INTEGRATION_STATUS_UNSPECIFIED: Status not specified\n - SLACK_INTEGRATION_STATUS_ACTIVE: Integration is active and sending notifications\n - SLACK_INTEGRATION_STATUS_PAUSED: Integration is paused by user action\n - SLACK_INTEGRATION_STATUS_DISCONNECTED: Integration is disconnected",
        "enum": [
          "SLACK_INTEGRATION_STATUS_UNSPECIFIED",
          "SLACK_INTEGRATION_STATUS_ACTIVE",
          "SLACK_INTEGRATION_STATUS_PAUSED",
          "SLACK_INTEGRATION_STATUS_DISCONNECTED"
        ],
        "title": "The status of a Slack integration",
        "type": "string"
      },
      "SocialLinkButton": {
        "properties": {
          "id": {
            "example": "link-1",
            "title": "Unique identifier for this link",
            "type": "string"
          },
          "order": {
            "format": "int32",
            "title": "Display order for links (order 1 will be highlighted)",
            "type": "integer"
          },
          "platform": {
            "example": "instagram",
            "title": "Platform identifier picking the icon. Leave it empty and the API names it\nfrom the URL, which is what you normally want. Known values: appstore,\nplaystore, instagram, tiktok, twitter, facebook, youtube, linkedin,\ngithub, medium, whatsapp, telegram, discord, slack, spotify, applemusic,\ntwitch, snapchat, pinterest, reddit, calendly, website.\nSupported platforms: instagram, tiktok, twitter, facebook, website, youtube, linkedin, github, whatsapp",
            "type": "string"
          },
          "url": {
            "example": "https://instagram.com/username",
            "title": "Destination URL for the link",
            "type": "string"
          }
        },
        "title": "Social link button definition for EVENT_ACTION_SOCIAL_LINKS_PAGE",
        "type": "object"
      },
      "SocialLinkTraceButton": {
        "description": "SocialLinkTraceButton stores metadata for social link buttons.",
        "properties": {
          "id": {
            "type": "string"
          },
          "order": {
            "format": "int32",
            "type": "integer"
          },
          "platform": {
            "type": "string"
          },
          "url": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "SocialLinksDisplayStyle": {
        "default": "SOCIAL_LINKS_DISPLAY_STYLE_UNSPECIFIED",
        "description": "- SOCIAL_LINKS_DISPLAY_STYLE_DETAILED: Display icon with text label (default)\n - SOCIAL_LINKS_DISPLAY_STYLE_COMPACT: Display icons only in a compact row",
        "enum": [
          "SOCIAL_LINKS_DISPLAY_STYLE_UNSPECIFIED",
          "SOCIAL_LINKS_DISPLAY_STYLE_DETAILED",
          "SOCIAL_LINKS_DISPLAY_STYLE_COMPACT"
        ],
        "title": "Display style options for social links page",
        "type": "string"
      },
      "SocialLinksPayload": {
        "properties": {
          "description": {
            "example": "Follow us on your favorite platform",
            "title": "Optional description displayed on the social links page",
            "type": "string"
          },
          "displayStyle": {
            "description": "- SOCIAL_LINKS_DISPLAY_STYLE_DETAILED: Display icon with text label (default)\n - SOCIAL_LINKS_DISPLAY_STYLE_COMPACT: Display icons only in a compact row",
            "enum": [
              "SOCIAL_LINKS_DISPLAY_STYLE_UNSPECIFIED",
              "SOCIAL_LINKS_DISPLAY_STYLE_DETAILED",
              "SOCIAL_LINKS_DISPLAY_STYLE_COMPACT"
            ],
            "title": "Display style for the social links (defaults to detailed if not specified)"
          },
          "links": {
            "items": {
              "$ref": "#/components/schemas/SocialLinkButton",
              "type": "object"
            },
            "title": "Social links to display (up to 10)",
            "type": "array"
          },
          "title": {
            "example": "Connect with us",
            "title": "Optional title displayed on the social links page",
            "type": "string"
          }
        },
        "title": "Social links page payload for EVENT_ACTION_SOCIAL_LINKS_PAGE",
        "type": "object"
      },
      "SocialLinksTraceData": {
        "description": "SocialLinksTraceData stores social links page interaction details.",
        "properties": {
          "description": {
            "type": "string"
          },
          "displayStyle": {
            "type": "string"
          },
          "links": {
            "items": {
              "$ref": "#/components/schemas/SocialLinkTraceButton",
              "type": "object"
            },
            "type": "array"
          },
          "selectedLink": {
            "$ref": "#/components/schemas/SocialLinkTraceButton"
          },
          "title": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "SocketAssistantErrorMessage": {
        "description": "SocketAssistantErrorMessage says why there will be no reply.",
        "properties": {
          "errorCode": {
            "$ref": "#/components/schemas/SocketErrorCode"
          },
          "message": {
            "type": "string"
          },
          "requestId": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/SocketMessageType"
          }
        },
        "type": "object"
      },
      "SocketAssistantProgressMessage": {
        "description": "SocketAssistantProgressMessage says what the assistant is doing while it works.\n\nA reply can take a model several tool calls to produce. Without these the\nscreen has nothing to show for that time.",
        "properties": {
          "detail": {
            "type": "string"
          },
          "requestId": {
            "type": "string"
          },
          "step": {
            "description": "\"thinking\", \"calling_tool\", and so on.",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/SocketMessageType"
          }
        },
        "type": "object"
      },
      "SocketAssistantResponseMessage": {
        "description": "SocketAssistantResponseMessage is the assistant's reply to one message.",
        "properties": {
          "appliedActions": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "contextUpdated": {
            "description": "True when the assistant changed the resource, so the screen should re-read it.",
            "type": "boolean"
          },
          "requestId": {
            "type": "string"
          },
          "responseText": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/SocketMessageType"
          },
          "uiActions": {
            "items": {
              "$ref": "#/components/schemas/ChatUIAction",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "SocketAssistantSendRequest": {
        "description": "SocketAssistantSendRequest asks the assistant for a reply.",
        "properties": {
          "contextId": {
            "type": "string"
          },
          "contextMetadata": {
            "description": "Whatever the page knows and the assistant cannot see.",
            "type": "string"
          },
          "contextType": {
            "type": "string"
          },
          "fileIds": {
            "description": "Files already uploaded, to attach to this turn.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "message": {
            "type": "string"
          },
          "requestId": {
            "description": "Correlates the reply to this message. The client generates it.",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/SocketMessageType"
          }
        },
        "type": "object"
      },
      "SocketConnectedMessage": {
        "description": "SocketConnectedMessage confirms the socket is authenticated.",
        "properties": {
          "memberId": {
            "type": "string"
          },
          "sessionId": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/SocketMessageType"
          },
          "workspaceId": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "SocketContract": {
        "description": "SocketContract names every frame the socket carries.\n\nIts fields are what put these messages in the generated clients: a websocket\nhas no HTTP operation of its own, and a message no operation mentions is not\nemitted. The endpoint answers with the protocol version; the rest of this\nmessage is the schema both sides are generated from.",
        "properties": {
          "assistantError": {
            "$ref": "#/components/schemas/SocketAssistantErrorMessage"
          },
          "assistantProgress": {
            "$ref": "#/components/schemas/SocketAssistantProgressMessage"
          },
          "assistantResponse": {
            "$ref": "#/components/schemas/SocketAssistantResponseMessage"
          },
          "assistantSend": {
            "$ref": "#/components/schemas/SocketAssistantSendRequest"
          },
          "connected": {
            "$ref": "#/components/schemas/SocketConnectedMessage"
          },
          "event": {
            "$ref": "#/components/schemas/SocketEventMessage"
          },
          "ping": {
            "$ref": "#/components/schemas/SocketPingRequest"
          },
          "pong": {
            "$ref": "#/components/schemas/SocketPongMessage"
          },
          "protocolVersion": {
            "type": "string"
          },
          "subscribe": {
            "$ref": "#/components/schemas/SocketSubscribeRequest"
          },
          "subscribeDenied": {
            "$ref": "#/components/schemas/SocketSubscribeDeniedMessage"
          },
          "subscribed": {
            "$ref": "#/components/schemas/SocketSubscribedMessage"
          },
          "unsubscribe": {
            "$ref": "#/components/schemas/SocketUnsubscribeRequest"
          }
        },
        "type": "object"
      },
      "SocketErrorCode": {
        "default": "SOCKET_ERROR_CODE_UNSPECIFIED",
        "description": "SocketErrorCode is why a request could not be served.\n\n - SOCKET_ERROR_CODE_FORBIDDEN: The caller asked for something outside their workspace.",
        "enum": [
          "SOCKET_ERROR_CODE_UNSPECIFIED",
          "SOCKET_ERROR_CODE_RATE_LIMITED",
          "SOCKET_ERROR_CODE_CREDITS_EXHAUSTED",
          "SOCKET_ERROR_CODE_WORKSPACE_NOT_VERIFIED",
          "SOCKET_ERROR_CODE_BUSY",
          "SOCKET_ERROR_CODE_INVALID_CONTEXT",
          "SOCKET_ERROR_CODE_INTERNAL_ERROR",
          "SOCKET_ERROR_CODE_FORBIDDEN"
        ],
        "type": "string"
      },
      "SocketEventMessage": {
        "description": "SocketEventMessage carries something that happened, to everyone on a channel.\n\nThis is the frame the local-first client listens for: a change hint tells it\nits copy may be behind, and it answers by re-reading. It was the one frame\nnot in this contract, sent as the broadcast layer's own JSON, and it worked\nonly because the client hand-parses a `type` field and the two vocabularies\nhappened not to collide. A client generated strictly from this file would\nhave dropped every one of them.\n\nThe payload stays opaque. What is in it belongs to the domain that raised\nthe event, and naming those shapes here would make this file change every\ntime one of them did.",
        "properties": {
          "channel": {
            "description": "Which channel carried it, so a client on several can tell them apart.",
            "type": "string"
          },
          "event": {
            "description": "What happened, as the domain named it.",
            "type": "string"
          },
          "payload": {
            "description": "The event's own body, as JSON.",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/SocketMessageType"
          }
        },
        "type": "object"
      },
      "SocketMessageType": {
        "default": "SOCKET_MESSAGE_TYPE_UNSPECIFIED",
        "description": "SocketMessageType is the discriminator every frame carries.\n\n - SOCKET_MESSAGE_TYPE_ASSISTANT_SEND: Client to server.\n - SOCKET_MESSAGE_TYPE_CONNECTED: Server to client.",
        "enum": [
          "SOCKET_MESSAGE_TYPE_UNSPECIFIED",
          "SOCKET_MESSAGE_TYPE_ASSISTANT_SEND",
          "SOCKET_MESSAGE_TYPE_SUBSCRIBE",
          "SOCKET_MESSAGE_TYPE_UNSUBSCRIBE",
          "SOCKET_MESSAGE_TYPE_PING",
          "SOCKET_MESSAGE_TYPE_CONNECTED",
          "SOCKET_MESSAGE_TYPE_ASSISTANT_RESPONSE",
          "SOCKET_MESSAGE_TYPE_ASSISTANT_PROGRESS",
          "SOCKET_MESSAGE_TYPE_ASSISTANT_ERROR",
          "SOCKET_MESSAGE_TYPE_SUBSCRIBED",
          "SOCKET_MESSAGE_TYPE_SUBSCRIBE_DENIED",
          "SOCKET_MESSAGE_TYPE_PONG",
          "SOCKET_MESSAGE_TYPE_EVENT"
        ],
        "type": "string"
      },
      "SocketPingRequest": {
        "description": "SocketPingRequest keeps the connection alive from the client side.",
        "properties": {
          "type": {
            "$ref": "#/components/schemas/SocketMessageType"
          }
        },
        "type": "object"
      },
      "SocketPongMessage": {
        "description": "SocketPongMessage answers a ping.",
        "properties": {
          "type": {
            "$ref": "#/components/schemas/SocketMessageType"
          }
        },
        "type": "object"
      },
      "SocketSubscribeDeniedMessage": {
        "description": "SocketSubscribeDeniedMessage refuses a channel the caller may not read.\n\nSaid out loud rather than dropped silently: a client that believes it is\nsubscribed and receives nothing cannot tell that apart from a quiet channel.",
        "properties": {
          "channel": {
            "type": "string"
          },
          "code": {
            "$ref": "#/components/schemas/SocketErrorCode"
          },
          "message": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/SocketMessageType"
          }
        },
        "type": "object"
      },
      "SocketSubscribeRequest": {
        "description": "SocketSubscribeRequest joins a channel.",
        "properties": {
          "channel": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/SocketMessageType"
          }
        },
        "type": "object"
      },
      "SocketSubscribedMessage": {
        "description": "SocketSubscribedMessage confirms a channel was joined.",
        "properties": {
          "channel": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/SocketMessageType"
          }
        },
        "type": "object"
      },
      "SocketUnsubscribeRequest": {
        "description": "SocketUnsubscribeRequest leaves a channel.",
        "properties": {
          "channel": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/SocketMessageType"
          }
        },
        "type": "object"
      },
      "SortDirection": {
        "default": "SORT_DIRECTION_UNSPECIFIED",
        "description": "SortDirection is the ordering applied to any sortable list endpoint.\nShared across resources so a caller learns it once.\n\n - SORT_DIRECTION_UNSPECIFIED: Sort direction not specified (defaults to descending)\n - SORT_DIRECTION_ASC: Sort in ascending order\n - SORT_DIRECTION_DESC: Sort in descending order",
        "enum": [
          "SORT_DIRECTION_UNSPECIFIED",
          "SORT_DIRECTION_ASC",
          "SORT_DIRECTION_DESC"
        ],
        "type": "string"
      },
      "SpecificDateConditionPayload": {
        "properties": {
          "elseNextStepId": {
            "example": "987fcdeb-a321-45e6-b789-123456789012",
            "title": "Workflow step ID to route to if no options match (UUID)",
            "type": "string"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/SpecificDateOption",
              "type": "object"
            },
            "title": "Specific date routing options",
            "type": "array"
          }
        },
        "title": "Specific date condition payload for EVENT_ACTION_SPECIFIC_DATE_CONDITION",
        "type": "object"
      },
      "SpecificDateConditionTraceData": {
        "description": "SpecificDateConditionTraceData stores specific-date condition routing metadata.",
        "properties": {
          "hasElse": {
            "type": "boolean"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/SpecificDateConditionTraceOption",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "SpecificDateConditionTraceOption": {
        "properties": {
          "day": {
            "format": "int32",
            "type": "integer"
          },
          "hasRoute": {
            "type": "boolean"
          },
          "id": {
            "type": "string"
          },
          "month": {
            "format": "int32",
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "year": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "SpecificDateOption": {
        "properties": {
          "day": {
            "description": "Day of month (1-31)",
            "example": 25,
            "format": "int32",
            "title": "Day of month (1-31)",
            "type": "integer"
          },
          "id": {
            "example": "option-1",
            "title": "Unique identifier for this option",
            "type": "string"
          },
          "month": {
            "description": "Month (1-12)",
            "example": 12,
            "format": "int32",
            "title": "Month (1-12)",
            "type": "integer"
          },
          "name": {
            "example": "Christmas",
            "title": "Optional friendly name for this option",
            "type": "string"
          },
          "nextStepId": {
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "title": "Workflow step ID to route to when this option matches (UUID)",
            "type": "string"
          },
          "year": {
            "description": "Year (optional, for one-time dates)",
            "example": 2024,
            "format": "int32",
            "title": "Optional year for one-time events",
            "type": "integer"
          }
        },
        "title": "Specific date option for EVENT_ACTION_SPECIFIC_DATE_CONDITION",
        "type": "object"
      },
      "SubscriptionType": {
        "default": "SUBSCRIPTION_TYPE_UNSPECIFIED",
        "description": "- SUBSCRIPTION_TYPE_UNSPECIFIED: Subscription plan not yet assigned\n - SUBSCRIPTION_TYPE_FREE_TRIAL: Workspace is currently in the free trial period\n - SUBSCRIPTION_TYPE_SPONSORED_PRO: Workspace is on the sponsored pro plan with full pro features\n - SUBSCRIPTION_TYPE_PRO_PLAN: Workspace has an active Pro plan subscription\n - SUBSCRIPTION_TYPE_ENTERPRISE_PLAN: Workspace is managed under an Enterprise contract\n - SUBSCRIPTION_TYPE_LIGHT_PLAN: Workspace has an active Light plan subscription",
        "enum": [
          "SUBSCRIPTION_TYPE_UNSPECIFIED",
          "SUBSCRIPTION_TYPE_FREE_TRIAL",
          "SUBSCRIPTION_TYPE_SPONSORED_PRO",
          "SUBSCRIPTION_TYPE_PRO_PLAN",
          "SUBSCRIPTION_TYPE_ENTERPRISE_PLAN",
          "SUBSCRIPTION_TYPE_LIGHT_PLAN"
        ],
        "title": "SubscriptionType represents the type of subscription for a workspace",
        "type": "string"
      },
      "SwitchWorkspaceResponse": {
        "description": "SwitchWorkspaceResponse carries the session for the workspace switched to.",
        "properties": {
          "accessToken": {
            "description": "Access token for the new workspace. The previous token keeps working for\nits own workspace until it is signed out.",
            "type": "string"
          },
          "member": {
            "$ref": "#/components/schemas/Member",
            "title": "The member record in the new workspace, with access_token set"
          },
          "memberId": {
            "title": "The person's member record in the new workspace (UUID)",
            "type": "string"
          },
          "workspaceId": {
            "title": "The workspace switched to (UUID)",
            "type": "string"
          }
        },
        "type": "object"
      },
      "SyncGoogleFormsRequest": {
        "type": "object"
      },
      "SyncGoogleFormsResponse": {
        "properties": {
          "responsesSynced": {
            "format": "int64",
            "type": "integer"
          },
          "visitorsEnriched": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "TestSlackIntegrationRequest": {
        "title": "TestSlackIntegrationRequest sends a test notification",
        "type": "object"
      },
      "TestSlackIntegrationResponse": {
        "properties": {
          "success": {
            "title": "Whether the test notification was sent successfully",
            "type": "boolean"
          }
        },
        "title": "TestSlackIntegrationResponse confirms the test notification was sent",
        "type": "object"
      },
      "ThankYouPagePayload": {
        "properties": {
          "description": {
            "title": "Optional descriptive text below the title",
            "type": "string"
          },
          "title": {
            "title": "The main heading displayed on the thank you page",
            "type": "string"
          }
        },
        "required": [
          "title"
        ],
        "title": "ThankYouPagePayload is a terminal exit page displaying a title and optional description",
        "type": "object"
      },
      "ThemeColor": {
        "description": "Reusable color payload used across design-oriented APIs (page themes, QR code designs, etc.).\nIt supports solid colors and gradients with optional direction and per-stop offsets.",
        "properties": {
          "colors": {
            "description": "Color values in render order (hex, rgb/rgba, hsl/hsla).",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "direction": {
            "description": "Optional direction for linear gradients (e.g. \"135deg\", \"to right\").",
            "type": "string"
          },
          "stops": {
            "description": "Optional stop offsets aligned with `colors` (e.g. \"0%\", \"50%\", \"100%\").",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "type": {
            "enum": [
              "THEME_COLOR_TYPE_UNSPECIFIED",
              "THEME_COLOR_TYPE_SOLID",
              "THEME_COLOR_TYPE_LINEAR",
              "THEME_COLOR_TYPE_RADIAL"
            ],
            "title": "Color type"
          }
        },
        "required": [
          "type",
          "colors"
        ],
        "title": "ThemeColor",
        "type": "object"
      },
      "ThemeColorThemeColorType": {
        "default": "THEME_COLOR_TYPE_UNSPECIFIED",
        "enum": [
          "THEME_COLOR_TYPE_UNSPECIFIED",
          "THEME_COLOR_TYPE_SOLID",
          "THEME_COLOR_TYPE_LINEAR",
          "THEME_COLOR_TYPE_RADIAL"
        ],
        "type": "string"
      },
      "TimeOfDayConditionPayload": {
        "properties": {
          "elseNextStepId": {
            "example": "987fcdeb-a321-45e6-b789-123456789012",
            "title": "Workflow step ID to route to if no ranges match (UUID)",
            "type": "string"
          },
          "ranges": {
            "items": {
              "$ref": "#/components/schemas/TimeOfDayRange",
              "type": "object"
            },
            "title": "Time range routing options",
            "type": "array"
          }
        },
        "title": "Time of day condition payload for EVENT_ACTION_TIME_OF_DAY_CONDITION",
        "type": "object"
      },
      "TimeOfDayConditionTraceData": {
        "description": "TimeOfDayConditionTraceData stores time-of-day condition routing metadata.",
        "properties": {
          "hasElse": {
            "type": "boolean"
          },
          "ranges": {
            "items": {
              "$ref": "#/components/schemas/TimeOfDayConditionTraceRange",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "TimeOfDayConditionTraceRange": {
        "properties": {
          "endTime": {
            "type": "string"
          },
          "hasRoute": {
            "type": "boolean"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "startTime": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "TimeOfDayRange": {
        "properties": {
          "endTime": {
            "description": "End time in 24-hour format (HH:MM)",
            "example": "17:00",
            "title": "End time in 24-hour format (HH:MM)",
            "type": "string"
          },
          "id": {
            "example": "range-1",
            "title": "Unique identifier for this range",
            "type": "string"
          },
          "name": {
            "example": "Business Hours",
            "title": "Optional friendly name for this range",
            "type": "string"
          },
          "nextStepId": {
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "title": "Workflow step ID to route to when this range matches (UUID)",
            "type": "string"
          },
          "startTime": {
            "description": "Start time in 24-hour format (HH:MM)",
            "example": "09:00",
            "title": "Start time in 24-hour format (HH:MM)",
            "type": "string"
          }
        },
        "title": "Time of day range for EVENT_ACTION_TIME_OF_DAY_CONDITION",
        "type": "object"
      },
      "TimeSeriesPoint": {
        "properties": {
          "timestamp": {
            "format": "date-time",
            "type": "string"
          },
          "value": {
            "format": "int32",
            "type": "integer"
          }
        },
        "title": "TimeSeriesPoint is a single data point in a time series",
        "type": "object"
      },
      "TimeSeriesSeries": {
        "properties": {
          "label": {
            "title": "Series label (e.g. country name, device type, \"new\", \"returning\")",
            "type": "string"
          },
          "points": {
            "items": {
              "$ref": "#/components/schemas/TimeSeriesPoint",
              "type": "object"
            },
            "title": "Data points for this series",
            "type": "array"
          }
        },
        "title": "TimeSeriesSeries represents a single named series in a grouped timeseries",
        "type": "object"
      },
      "TopLinkDataPoint": {
        "properties": {
          "eventCount": {
            "format": "int32",
            "title": "Number of events for this link",
            "type": "integer"
          },
          "name": {
            "title": "Link name or shortlink",
            "type": "string"
          },
          "shortlink": {
            "title": "Link shortlink identifier",
            "type": "string"
          }
        },
        "title": "TopLinkDataPoint represents a link ranked by event count",
        "type": "object"
      },
      "TriggeredBy": {
        "default": "TRIGGERED_BY_UNSPECIFIED",
        "description": "- TRIGGERED_BY_UNSPECIFIED: Trigger source not specified\n - TRIGGERED_BY_VISITOR: Visitor initiated the scan (as opposed to system-generated)",
        "enum": [
          "TRIGGERED_BY_UNSPECIFIED",
          "TRIGGERED_BY_VISITOR"
        ],
        "title": "The actor that triggered the event",
        "type": "string"
      },
      "UpdateCustomDomainResponse": {
        "properties": {
          "customDomain": {
            "$ref": "#/components/schemas/CustomDomain"
          }
        },
        "title": "Response containing the updated custom domain",
        "type": "object"
      },
      "UpdateDashboardResponse": {
        "properties": {
          "dashboard": {
            "$ref": "#/components/schemas/AnalyticsDashboard"
          }
        },
        "type": "object"
      },
      "UpdateDeviceResponse": {
        "properties": {
          "success": {
            "title": "True if the device metadata was accepted and stored",
            "type": "boolean"
          }
        },
        "title": "Response for UpdateDevice mutation",
        "type": "object"
      },
      "UpdateDirectoryResponse": {
        "properties": {
          "directory": {
            "$ref": "#/components/schemas/Directory"
          }
        },
        "title": "Response containing the updated directory",
        "type": "object"
      },
      "UpdateGoogleFormsIntegrationRequest": {
        "properties": {
          "status": {
            "$ref": "#/components/schemas/GoogleFormsIntegrationStatus",
            "title": "Only status can be updated (ACTIVE or PAUSED)"
          }
        },
        "type": "object"
      },
      "UpdateGoogleFormsIntegrationResponse": {
        "properties": {
          "integration": {
            "$ref": "#/components/schemas/GoogleFormsIntegration"
          }
        },
        "type": "object"
      },
      "UpdateLinkResponse": {
        "properties": {
          "link": {
            "$ref": "#/components/schemas/Link"
          }
        },
        "title": "Response containing the updated link",
        "type": "object"
      },
      "UpdateLinkSettingResponse": {
        "description": "UpdateLinkSettingResponse returns the link-setting profile after applying changes.",
        "properties": {
          "linkSetting": {
            "$ref": "#/components/schemas/LinkSetting"
          }
        },
        "type": "object"
      },
      "UpdateMeRequest": {
        "description": "UpdateMeRequest allows the signed-in member to manage their own login and profile data.",
        "properties": {
          "email": {
            "title": "New email address for the signed-in member",
            "type": "string"
          },
          "firstName": {
            "title": "First name to display in the product",
            "type": "string"
          },
          "lastName": {
            "title": "Last name to display in the product",
            "type": "string"
          },
          "password": {
            "title": "Optional password update for the signed-in member",
            "type": "string"
          }
        },
        "type": "object"
      },
      "UpdatePageThemeResponse": {
        "properties": {
          "pageTheme": {
            "$ref": "#/components/schemas/PageTheme",
            "title": "The updated page theme"
          }
        },
        "title": "Response after updating a page theme",
        "type": "object"
      },
      "UpdatePageThemeTemplateResponse": {
        "properties": {
          "pageThemeTemplate": {
            "$ref": "#/components/schemas/PageThemeTemplate",
            "title": "The updated page theme template"
          }
        },
        "title": "UpdatePageThemeTemplateResponse represents the response after updating a page theme template",
        "type": "object"
      },
      "UpdatePageThemeTemplateStylingResponse": {
        "description": "UpdatePageThemeTemplateStylingResponse returns the template with its updated theme.",
        "properties": {
          "pageThemeTemplate": {
            "$ref": "#/components/schemas/PageThemeTemplate"
          }
        },
        "type": "object"
      },
      "UpdateQrcodeDesignResponse": {
        "description": "UpdateQrcodeDesignResponse returns the refreshed design after applying edits.",
        "properties": {
          "qrcodeDesign": {
            "$ref": "#/components/schemas/QrcodeDesign",
            "title": "The updated QR code design"
          }
        },
        "type": "object"
      },
      "UpdateQrcodeTemplateResponse": {
        "properties": {
          "qrcodeTemplate": {
            "$ref": "#/components/schemas/QrcodeTemplate",
            "title": "The updated QR code template"
          }
        },
        "title": "UpdateQrcodeTemplateResponse represents the response after updating a QR code template",
        "type": "object"
      },
      "UpdateSlackIntegrationRequest": {
        "properties": {
          "linkId": {
            "title": "Filter notifications by a specific link ID",
            "type": "string"
          },
          "slackChannelId": {
            "title": "The Slack channel ID to send notifications to",
            "type": "string"
          },
          "slackChannelName": {
            "title": "The Slack channel name",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/SlackIntegrationStatus",
            "title": "Integration status (ACTIVE or PAUSED)"
          },
          "triggers": {
            "items": {
              "description": "- KIND_UNSPECIFIED: Workflow step kind not specified\n - KIND_ENTRY: Entry steps are automatically triggered when a visitor reaches the workflow\n - KIND_EXIT: Exit steps finalize the workflow (commonly a redirect)\n - KIND_INTERACTION: Interaction steps require visitor input (forms, passwords, etc.)\n - KIND_CONDITION: Condition steps evaluate logic and route to different next steps",
              "enum": [
                "KIND_UNSPECIFIED",
                "KIND_ENTRY",
                "KIND_EXIT",
                "KIND_INTERACTION",
                "KIND_CONDITION"
              ]
            },
            "title": "Filter notifications by workflow step kinds",
            "type": "array"
          }
        },
        "title": "UpdateSlackIntegrationRequest updates the Slack integration configuration",
        "type": "object"
      },
      "UpdateSlackIntegrationResponse": {
        "properties": {
          "slackIntegration": {
            "$ref": "#/components/schemas/SlackIntegration",
            "title": "The updated Slack integration"
          }
        },
        "title": "UpdateSlackIntegrationResponse returns the updated Slack integration",
        "type": "object"
      },
      "UpdateWebhookResponse": {
        "properties": {
          "webhook": {
            "$ref": "#/components/schemas/Webhook",
            "title": "The updated webhook"
          }
        },
        "title": "UpdateWebhookResponse represents the response after updating a webhook",
        "type": "object"
      },
      "UpdateWorkflowStepResponse": {
        "properties": {
          "workflowStep": {
            "$ref": "#/components/schemas/WorkflowStep"
          }
        },
        "title": "Response containing the updated workflow step",
        "type": "object"
      },
      "UpdateWorkspaceOriginInquiryRequest": {
        "properties": {
          "originInquiry": {
            "title": "Free-form text describing how the workspace found Linkbreakers",
            "type": "string"
          }
        },
        "title": "UpdateWorkspaceOriginInquiryRequest captures the channel where a workspace found Linkbreakers",
        "type": "object"
      },
      "UpdateWorkspaceOriginPurposeRequest": {
        "properties": {
          "originPurpose": {
            "title": "Free-form text describing what the workspace wants to build with Linkbreakers",
            "type": "string"
          }
        },
        "title": "UpdateWorkspaceOriginPurposeRequest captures what the workspace wants to build",
        "type": "object"
      },
      "UpdateWorkspaceRequest": {
        "properties": {
          "description": {
            "title": "Optional description providing additional context about the workspace",
            "type": "string"
          },
          "digestFrequency": {
            "description": "- DIGEST_FREQUENCY_UNSPECIFIED: Not specified; defaults to monthly\n - DIGEST_FREQUENCY_NONE: No digest emails\n - DIGEST_FREQUENCY_WEEKLY: Weekly digest every Monday\n - DIGEST_FREQUENCY_MONTHLY: Monthly digest on the 1st of each month",
            "enum": [
              "DIGEST_FREQUENCY_UNSPECIFIED",
              "DIGEST_FREQUENCY_NONE",
              "DIGEST_FREQUENCY_WEEKLY",
              "DIGEST_FREQUENCY_MONTHLY"
            ],
            "title": "How often the workspace receives traffic digest emails"
          },
          "enforceMfa": {
            "title": "Toggle for enforcing MFA on member sign-in; omitempty leaves current policy",
            "type": "boolean"
          },
          "faq": {
            "title": "FAQ data to update (JSON string)",
            "type": "string"
          },
          "name": {
            "title": "New display name for the workspace",
            "type": "string"
          },
          "shortDescription": {
            "title": "Short description for the workspace",
            "type": "string"
          },
          "slug": {
            "title": "Workspace slug (immutable once set)",
            "type": "string"
          },
          "tags": {
            "title": "Comma-separated tags for the workspace",
            "type": "string"
          },
          "website": {
            "title": "Website URL for the workspace",
            "type": "string"
          }
        },
        "title": "UpdateWorkspaceRequest represents the request to update a workspace",
        "type": "object"
      },
      "UpdateWorkspaceTokenResponse": {
        "description": "UpdateWorkspaceTokenResponse returns the updated token.",
        "properties": {
          "token": {
            "$ref": "#/components/schemas/WorkspaceToken",
            "title": "Token metadata (does not include the secret access token)"
          }
        },
        "type": "object"
      },
      "VCardData": {
        "properties": {
          "buttonLabel": {
            "example": "Add to contacts",
            "title": "Custom label for the contact button",
            "type": "string"
          },
          "city": {
            "example": "San Francisco",
            "title": "City for the vCard address",
            "type": "string"
          },
          "country": {
            "example": "United States",
            "title": "Country for the vCard address",
            "type": "string"
          },
          "email": {
            "example": "hello@acme.com",
            "title": "Email address for the vCard",
            "type": "string"
          },
          "firstName": {
            "example": "Jane",
            "title": "First name for the vCard (required for VCARD links)",
            "type": "string"
          },
          "lastName": {
            "example": "Doe",
            "title": "Last name for the vCard (required for VCARD links)",
            "type": "string"
          },
          "organization": {
            "example": "Acme Corporation",
            "title": "Organization/company name for the vCard",
            "type": "string"
          },
          "phone": {
            "example": "+33123456789",
            "title": "Phone number for the vCard",
            "type": "string"
          },
          "phoneIsWhatsapp": {
            "title": "Whether the phone number is a WhatsApp number",
            "type": "boolean"
          },
          "phoneSmsEnabled": {
            "title": "Whether visitors can also text the phone number",
            "type": "boolean"
          },
          "postalCode": {
            "example": "94102",
            "title": "Postal/ZIP code for the vCard address",
            "type": "string"
          },
          "saveButtonEnabled": {
            "description": "Whether the card shows its save button (\"Add to contacts\"). Defaults to true when unset.",
            "type": "boolean"
          },
          "socialLinks": {
            "items": {
              "$ref": "#/components/schemas/VCardSocialLink",
              "type": "object"
            },
            "title": "Social media links associated with the contact",
            "type": "array"
          },
          "state": {
            "example": "CA",
            "title": "State/province for the vCard address",
            "type": "string"
          },
          "streetAddress": {
            "example": "123 Main Street",
            "title": "Street address for the vCard",
            "type": "string"
          },
          "title": {
            "example": "Software Engineer",
            "title": "Job title for the vCard",
            "type": "string"
          },
          "website": {
            "example": "https://acme.com",
            "title": "Website URL for the vCard",
            "type": "string"
          }
        },
        "title": "VCardData contains the contact information for vCard links",
        "type": "object"
      },
      "VCardPayload": {
        "properties": {
          "buttonLabel": {
            "example": "Add to contacts",
            "title": "Label displayed on the contact button",
            "type": "string"
          },
          "city": {
            "example": "San Francisco",
            "title": "City for the vCard address",
            "type": "string"
          },
          "country": {
            "example": "United States",
            "title": "Country for the vCard address",
            "type": "string"
          },
          "email": {
            "example": "hello@acme.com",
            "title": "Email address for the vCard",
            "type": "string"
          },
          "firstName": {
            "example": "Jane",
            "title": "First name for the vCard",
            "type": "string"
          },
          "lastName": {
            "example": "Doe",
            "title": "Last name for the vCard",
            "type": "string"
          },
          "organization": {
            "example": "Acme Corporation",
            "title": "Organization/company name for the vCard",
            "type": "string"
          },
          "phone": {
            "example": "+33123456789",
            "title": "Phone number for the vCard",
            "type": "string"
          },
          "phoneIsWhatsapp": {
            "title": "Whether the phone number is also a WhatsApp number (shows WhatsApp link on contact card)",
            "type": "boolean"
          },
          "phoneSmsEnabled": {
            "title": "Whether visitors can also text the phone number (shows a \"Send a text\" action that opens the SMS app)",
            "type": "boolean"
          },
          "postalCode": {
            "example": "94102",
            "title": "Postal/ZIP code for the vCard address",
            "type": "string"
          },
          "saveButtonEnabled": {
            "description": "Whether the card shows its save button (\"Add to contacts\"). Defaults to true when unset.",
            "type": "boolean"
          },
          "socialLinks": {
            "items": {
              "$ref": "#/components/schemas/VCardSocialLink",
              "type": "object"
            },
            "title": "Optional social links to display on the contact card and embed in the vCard",
            "type": "array"
          },
          "state": {
            "example": "CA",
            "title": "State/province for the vCard address",
            "type": "string"
          },
          "streetAddress": {
            "example": "123 Main Street",
            "title": "Street address for the vCard",
            "type": "string"
          },
          "title": {
            "example": "Software Engineer",
            "title": "Job title for the vCard",
            "type": "string"
          },
          "website": {
            "example": "https://acme.com",
            "title": "Website URL for the vCard",
            "type": "string"
          }
        },
        "title": "vCard payload for EVENT_ACTION_CONTACT_CARD",
        "type": "object"
      },
      "VCardSocialLink": {
        "properties": {
          "platform": {
            "description": "Platform identifier picking the icon. Leave it empty and the API names it\nfrom the URL, which is what you normally want. Known values: appstore,\nplaystore, instagram, tiktok, twitter, facebook, youtube, linkedin,\ngithub, medium, whatsapp, telegram, discord, slack, spotify, applemusic,\ntwitch, snapchat, pinterest, reddit, calendly, website.",
            "example": "linkedin",
            "type": "string"
          },
          "url": {
            "example": "https://linkedin.com/in/janedoe",
            "title": "Profile URL for this social platform",
            "type": "string"
          }
        },
        "title": "Social link entry for a vCard contact card",
        "type": "object"
      },
      "ValidateWorkflowResponse": {
        "properties": {
          "issues": {
            "items": {
              "$ref": "#/components/schemas/WorkflowIssue",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "ValidationInstructionsCustomDomainResponse": {
        "properties": {
          "validations": {
            "items": {
              "$ref": "#/components/schemas/ValidationInstructionsCustomDomainResponseValidation",
              "type": "object"
            },
            "title": "The list of validations that need to be performed",
            "type": "array"
          }
        },
        "title": "Response containing the status of a custom domain",
        "type": "object"
      },
      "ValidationInstructionsCustomDomainResponseValidation": {
        "properties": {
          "name": {
            "title": "The hostname to validate",
            "type": "string"
          },
          "purpose": {
            "$ref": "#/components/schemas/ValidationPurpose",
            "title": "Indicates whether the record proves ownership or enables TLS provisioning"
          },
          "type": {
            "$ref": "#/components/schemas/ValidationInstructionsCustomDomainResponseValidationType",
            "title": "DNS record type required for validation"
          },
          "value": {
            "title": "The value to set in the record",
            "type": "string"
          }
        },
        "title": "Information about a validation record",
        "type": "object"
      },
      "ValidationInstructionsCustomDomainResponseValidationType": {
        "default": "TYPE_UNSPECIFIED",
        "description": "- TYPE_UNSPECIFIED: Record type not specified\n - TYPE_TXT: TXT DNS record used for validation\n - TYPE_CNAME: CNAME DNS record used for validation",
        "enum": [
          "TYPE_UNSPECIFIED",
          "TYPE_TXT",
          "TYPE_CNAME"
        ],
        "title": "The type of record (e.g. \"txt\")",
        "type": "string"
      },
      "ValidationPurpose": {
        "default": "PURPOSE_UNSPECIFIED",
        "description": "- PURPOSE_UNSPECIFIED: Purpose not specified\n - PURPOSE_OWNERSHIP: DNS record proves ownership of the domain\n - PURPOSE_DOMAIN_VERIFICATION: DNS record enables TLS/domain verification with the provider\n - PURPOSE_DCV_DELEGATION: DNS record delegates certificate validation to the provider so every\nfuture renewal validates automatically without a new record",
        "enum": [
          "PURPOSE_UNSPECIFIED",
          "PURPOSE_OWNERSHIP",
          "PURPOSE_DOMAIN_VERIFICATION",
          "PURPOSE_DCV_DELEGATION"
        ],
        "title": "The purpose of this validation",
        "type": "string"
      },
      "VisitType": {
        "default": "VISIT_TYPE_UNSPECIFIED",
        "description": "- VISIT_TYPE_UNSPECIFIED: Visit type not specified\n - VISIT_TYPE_FIRST: First time this device reaches this link\n - VISIT_TYPE_RETURNING: Returning device reaching this link again",
        "enum": [
          "VISIT_TYPE_UNSPECIFIED",
          "VISIT_TYPE_FIRST",
          "VISIT_TYPE_RETURNING"
        ],
        "title": "The type of visit for a given event",
        "type": "string"
      },
      "VisitTypeConditionOption": {
        "properties": {
          "nextStepId": {
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "title": "Workflow step ID to route to for this visit type (UUID)",
            "type": "string"
          },
          "value": {
            "example": "FIRST",
            "title": "Visit type value to match (e.g. FIRST, RETURNING)",
            "type": "string"
          }
        },
        "type": "object"
      },
      "VisitTypeConditionPayload": {
        "properties": {
          "elseNextStepId": {
            "example": "987fcdeb-a321-45e6-b789-123456789012",
            "title": "Workflow step ID to route to if the visit type does not match any configured options (UUID)",
            "type": "string"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/VisitTypeConditionOption",
              "type": "object"
            },
            "title": "Visit type routing options",
            "type": "array"
          }
        },
        "title": "Visit type condition payload for EVENT_ACTION_VISIT_TYPE_CONDITION",
        "type": "object"
      },
      "VisitTypeConditionTraceData": {
        "description": "VisitTypeConditionTraceData stores visit type condition routing metadata.",
        "properties": {
          "hasElse": {
            "type": "boolean"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/VisitTypeConditionTraceOption",
              "type": "object"
            },
            "type": "array"
          },
          "visitType": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "VisitTypeConditionTraceOption": {
        "properties": {
          "hasRoute": {
            "type": "boolean"
          },
          "value": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "Visitor": {
        "description": "Captures the cross-link profile Linkbreakers builds for someone who scans or clicks, combining reserved identity fields,\nattributed devices, events, and custom traits gathered from forms.",
        "externalDocs": {
          "description": "Learn more about visitor profiles in Linkbreakers.",
          "url": "https://linkbreakers.com/help/article/whats-a-visitor"
        },
        "properties": {
          "attributes": {
            "description": "Arbitrary attributes provided without \"$\" prefix, with the type each value\nwas captured as.",
            "items": {
              "$ref": "#/components/schemas/VisitorAttribute",
              "type": "object"
            },
            "type": "array"
          },
          "createdAt": {
            "format": "date-time",
            "title": "Timestamps",
            "type": "string"
          },
          "deviceCount": {
            "example": 2,
            "format": "int64",
            "title": "Number of devices attributed to this visitor",
            "type": "integer"
          },
          "devices": {
            "items": {
              "$ref": "#/components/schemas/Device",
              "type": "object"
            },
            "title": "Device information collected during visitor interactions",
            "type": "array"
          },
          "email": {
            "description": "from \"$email\"",
            "example": "sam.visitor@example.com",
            "title": "System fields derived from $-prefixed inputs",
            "type": "string"
          },
          "events": {
            "items": {
              "$ref": "#/components/schemas/VisitorEvent",
              "type": "object"
            },
            "title": "Events associated with this visitor",
            "type": "array"
          },
          "firstName": {
            "example": "Sam",
            "title": "from \"$firstName\" (optional)",
            "type": "string"
          },
          "id": {
            "example": "4da3e6a2-2d54-4b0f-9e17-4b6c2af7e9c5",
            "title": "Unique ID (UUID)",
            "type": "string"
          },
          "lastName": {
            "example": "Rivera",
            "title": "from \"$lastName\" (optional)",
            "type": "string"
          },
          "links": {
            "items": {
              "$ref": "#/components/schemas/VisitorLink",
              "type": "object"
            },
            "title": "Links associated with this visitor via events (included only on demand)",
            "type": "array"
          },
          "phone": {
            "example": "+15551234567",
            "title": "from \"$phone\"",
            "type": "string"
          },
          "qrcodeCount": {
            "example": 3,
            "format": "int64",
            "title": "Number of distinct QR codes / links this visitor has interacted with",
            "type": "integer"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "visitCount": {
            "example": 42,
            "format": "int64",
            "title": "Total number of events (visits) recorded for this visitor",
            "type": "integer"
          },
          "workspaceId": {
            "example": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0",
            "title": "Workspace that owns this visitor (UUID)",
            "type": "string"
          }
        },
        "title": "Visitor",
        "type": "object"
      },
      "VisitorAttribute": {
        "description": "VisitorAttribute is one key/value pair on a visitor profile.",
        "properties": {
          "boolValue": {
            "type": "boolean"
          },
          "dateValue": {
            "format": "date-time",
            "type": "string"
          },
          "key": {
            "example": "rating",
            "title": "Attribute key, for example \"rating\"",
            "type": "string"
          },
          "numberValue": {
            "description": "Set only when the value parses as a number. Absent when it does not, so a\nvalue that contradicts its type is still readable but not aggregatable.",
            "format": "double",
            "type": "number"
          },
          "type": {
            "description": "VisitorAttributeType is what a value was captured as. It decides how the\nvalue is parsed and which analytics the key can support, which the value\nalone cannot tell you: \"8\" from a rating field and \"8\" typed into a text box\nare different facts.",
            "enum": [
              "VISITOR_ATTRIBUTE_TYPE_UNSPECIFIED",
              "VISITOR_ATTRIBUTE_TYPE_STRING",
              "VISITOR_ATTRIBUTE_TYPE_NUMBER",
              "VISITOR_ATTRIBUTE_TYPE_BOOLEAN",
              "VISITOR_ATTRIBUTE_TYPE_DATE",
              "VISITOR_ATTRIBUTE_TYPE_ENUM"
            ],
            "title": "What the value was captured as"
          },
          "value": {
            "description": "The raw value as captured. Always populated, whatever the type.",
            "example": "8",
            "type": "string"
          }
        },
        "type": "object"
      },
      "VisitorAttributeFilter": {
        "description": "VisitorAttributeFilter narrows a visitor list to visitors whose attribute\nmatches. Several filters are combined with AND.",
        "properties": {
          "key": {
            "description": "Attribute key, for example \"budget\". Reserved fields ($email, $phone,\n$firstName, $lastName) can be filtered with the STRING_*, EXISTS and\nNOT_EXISTS operators.",
            "example": "budget",
            "type": "string"
          },
          "operator": {
            "$ref": "#/components/schemas/VisitorAttributeFilterOperator",
            "example": "VISITOR_ATTRIBUTE_FILTER_OPERATOR_NUMBER_GREATER_OR_EQUAL",
            "title": "How the attribute is compared with value"
          },
          "value": {
            "description": "Value to compare with: a number for NUMBER_* operators, a date such as\n2026-03-01 or an RFC 3339 timestamp for DATE_* operators. Ignored by\noperators that need no value.",
            "example": "800000",
            "type": "string"
          }
        },
        "type": "object"
      },
      "VisitorAttributeFilterOperator": {
        "default": "VISITOR_ATTRIBUTE_FILTER_OPERATOR_UNSPECIFIED",
        "description": "How an attribute filter compares a visitor's attribute with its value. The\noperators are the ones a VISITOR_DATA_CONDITION workflow step uses, so a\nfilter and a condition written the same way select the same visitors.\n\nSTRING_* operators compare the raw value and are case-sensitive. An absent\nattribute reads as an empty string, so STRING_NOT_EQUALS, STRING_NOT_CONTAINS\nand STRING_IS_EMPTY also match visitors who do not have the attribute.\nNUMBER_* and DATE_* operators only match values captured as a number or a\ndate. BOOLEAN_IS_FALSE matches anything that is not true, including an absent\nattribute.\n\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_STRING_EQUALS: The attribute equals the value\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_STRING_NOT_EQUALS: The attribute differs from the value, or is absent\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_STRING_CONTAINS: The attribute contains the value\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_STRING_NOT_CONTAINS: The attribute does not contain the value, or is absent\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_STRING_STARTS_WITH: The attribute starts with the value\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_STRING_ENDS_WITH: The attribute ends with the value\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_STRING_IS_EMPTY: The attribute is empty or absent. No value needed.\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_STRING_IS_NOT_EMPTY: The attribute is set to a non-empty value. No value needed.\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_NUMBER_EQUALS: The number equals the value\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_NUMBER_NOT_EQUALS: The number differs from the value\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_NUMBER_GREATER_THAN: The number is greater than the value\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_NUMBER_LESS_THAN: The number is less than the value\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_NUMBER_GREATER_OR_EQUAL: The number is greater than or equal to the value\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_NUMBER_LESS_OR_EQUAL: The number is less than or equal to the value\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_DATE_EQUALS: The date equals the value\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_DATE_BEFORE: The date is before the value\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_DATE_AFTER: The date is after the value\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_DATE_BEFORE_OR_EQUAL: The date is on or before the value\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_DATE_AFTER_OR_EQUAL: The date is on or after the value\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_BOOLEAN_IS_TRUE: The attribute is true. No value needed.\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_BOOLEAN_IS_FALSE: The attribute is not true, including absent. No value needed.\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_EXISTS: The visitor has the attribute, whatever its value. No value needed.\n - VISITOR_ATTRIBUTE_FILTER_OPERATOR_NOT_EXISTS: The visitor does not have the attribute. No value needed.",
        "enum": [
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_UNSPECIFIED",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_STRING_EQUALS",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_STRING_NOT_EQUALS",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_STRING_CONTAINS",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_STRING_NOT_CONTAINS",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_STRING_STARTS_WITH",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_STRING_ENDS_WITH",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_STRING_IS_EMPTY",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_STRING_IS_NOT_EMPTY",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_NUMBER_EQUALS",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_NUMBER_NOT_EQUALS",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_NUMBER_GREATER_THAN",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_NUMBER_LESS_THAN",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_NUMBER_GREATER_OR_EQUAL",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_NUMBER_LESS_OR_EQUAL",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_DATE_EQUALS",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_DATE_BEFORE",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_DATE_AFTER",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_DATE_BEFORE_OR_EQUAL",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_DATE_AFTER_OR_EQUAL",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_BOOLEAN_IS_TRUE",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_BOOLEAN_IS_FALSE",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_EXISTS",
          "VISITOR_ATTRIBUTE_FILTER_OPERATOR_NOT_EXISTS"
        ],
        "type": "string"
      },
      "VisitorAttributeKey": {
        "description": "VisitorAttributeKey is one attribute key seen in the workspace.",
        "properties": {
          "key": {
            "example": "budget",
            "title": "Attribute key, for example \"budget\" or \"$email\"",
            "type": "string"
          },
          "type": {
            "description": "VisitorAttributeType is what a value was captured as. It decides how the\nvalue is parsed and which analytics the key can support, which the value\nalone cannot tell you: \"8\" from a rating field and \"8\" typed into a text box\nare different facts.",
            "enum": [
              "VISITOR_ATTRIBUTE_TYPE_UNSPECIFIED",
              "VISITOR_ATTRIBUTE_TYPE_STRING",
              "VISITOR_ATTRIBUTE_TYPE_NUMBER",
              "VISITOR_ATTRIBUTE_TYPE_BOOLEAN",
              "VISITOR_ATTRIBUTE_TYPE_DATE",
              "VISITOR_ATTRIBUTE_TYPE_ENUM"
            ]
          }
        },
        "type": "object"
      },
      "VisitorAttributeType": {
        "default": "VISITOR_ATTRIBUTE_TYPE_UNSPECIFIED",
        "description": "VisitorAttributeType is what a value was captured as. It decides how the\nvalue is parsed and which analytics the key can support, which the value\nalone cannot tell you: \"8\" from a rating field and \"8\" typed into a text box\nare different facts.",
        "enum": [
          "VISITOR_ATTRIBUTE_TYPE_UNSPECIFIED",
          "VISITOR_ATTRIBUTE_TYPE_STRING",
          "VISITOR_ATTRIBUTE_TYPE_NUMBER",
          "VISITOR_ATTRIBUTE_TYPE_BOOLEAN",
          "VISITOR_ATTRIBUTE_TYPE_DATE",
          "VISITOR_ATTRIBUTE_TYPE_ENUM"
        ],
        "type": "string"
      },
      "VisitorDataConditionOption": {
        "description": "Visitor data condition option for EVENT_ACTION_VISITOR_DATA_CONDITION.",
        "properties": {
          "attributeKey": {
            "example": "age",
            "title": "Visitor attribute key to check (e.g., \"age\", \"$email\", \"company\")",
            "type": "string"
          },
          "comparisonValue": {
            "example": "18",
            "title": "Value to compare against (optional for operators like IS_EMPTY)",
            "type": "string"
          },
          "id": {
            "example": "option-1",
            "type": "string"
          },
          "nextStepId": {
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "type": "string"
          },
          "operator": {
            "example": "NUMBER_GREATER_THAN",
            "title": "Operator for comparison (e.g., \"STRING_EQUALS\", \"NUMBER_GREATER_THAN\", \"DATE_BEFORE\")",
            "type": "string"
          }
        },
        "type": "object"
      },
      "VisitorDataConditionPayload": {
        "properties": {
          "elseNextStepId": {
            "example": "987fcdeb-a321-45e6-b789-123456789012",
            "type": "string"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/VisitorDataConditionOption",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "VisitorDataConditionTraceData": {
        "description": "VisitorDataConditionTraceData stores visitor-data routing metadata.",
        "properties": {
          "hasElse": {
            "type": "boolean"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/VisitorDataConditionTraceOption",
              "type": "object"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "VisitorDataConditionTraceOption": {
        "properties": {
          "attributeFound": {
            "type": "boolean"
          },
          "attributeKey": {
            "type": "string"
          },
          "comparisonValue": {
            "type": "string"
          },
          "hasRoute": {
            "type": "boolean"
          },
          "matched": {
            "type": "boolean"
          },
          "observedValue": {
            "type": "string"
          },
          "operator": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "VisitorEvent": {
        "properties": {
          "action": {
            "example": "SCAN",
            "title": "Event action (e.g. SCAN, CLICK)",
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "title": "Timestamp when the event record was created",
            "type": "string"
          },
          "id": {
            "example": "8b6e1a2c-7d4f-4fd2-8b35-9a4c1f2d993a",
            "title": "Unique identifier of the event (UUID)",
            "type": "string"
          },
          "linkId": {
            "example": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
            "title": "Link associated with the event (UUID)",
            "type": "string"
          },
          "scannedAt": {
            "format": "date-time",
            "title": "When the scan occurred (visitor timezone aware)",
            "type": "string"
          },
          "visitType": {
            "example": "FIRST",
            "title": "Visit type (e.g. FIRST, RETURNING)",
            "type": "string"
          }
        },
        "title": "Local VisitorEvent message with minimalist elements to avoid import cycles",
        "type": "object"
      },
      "VisitorInput": {
        "description": "Input payload for identifying/updating a visitor\n- Reserved keys (system fields) have a \"$\" prefix, e.g. \"$email\", \"$phone\", \"$firstName\", \"$lastName\".\n- All other keys are treated as custom attributes and stored in `attributes`.",
        "properties": {
          "data": {
            "title": "Free-form attributes map including $-prefixed reserved keys",
            "type": "object"
          }
        },
        "type": "object"
      },
      "VisitorLink": {
        "description": "Summarizes how a visitor has interacted with a specific link so Linkbreakers can surface per-campaign engagement history.",
        "properties": {
          "entrypoint": {
            "example": "https://linkbreak.ing/4BnH-R19p",
            "title": "Canonical short URL entrypoint",
            "type": "string"
          },
          "eventCount": {
            "example": 12,
            "format": "int64",
            "title": "Number of events generated by this visitor for the link",
            "type": "integer"
          },
          "firstVisitedAt": {
            "format": "date-time",
            "title": "First time the visitor interacted with the link",
            "type": "string"
          },
          "id": {
            "example": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
            "title": "Link identifier (UUID)",
            "type": "string"
          },
          "lastVisitedAt": {
            "format": "date-time",
            "title": "Most recent interaction timestamp",
            "type": "string"
          },
          "name": {
            "example": "Spring Launch Campaign",
            "title": "Friendly link name configured in the dashboard",
            "type": "string"
          },
          "shortlink": {
            "example": "4BnH-R19p",
            "title": "Shortlink slug used in public URLs",
            "type": "string"
          }
        },
        "title": "VisitorLink",
        "type": "object"
      },
      "VisitorSortField": {
        "default": "VISITOR_SORT_FIELD_UNSPECIFIED",
        "description": "- VISITOR_SORT_FIELD_UNSPECIFIED: Sort field not specified (defaults to created_at)\n - VISITOR_SORT_FIELD_CREATED_AT: Sort by the date the visitor was first seen\n - VISITOR_SORT_FIELD_VISIT_COUNT: Sort by total number of visits (events)\n - VISITOR_SORT_FIELD_DEVICE_COUNT: Sort by number of attributed devices\n - VISITOR_SORT_FIELD_QRCODE_COUNT: Sort by number of distinct QR codes interacted with",
        "enum": [
          "VISITOR_SORT_FIELD_UNSPECIFIED",
          "VISITOR_SORT_FIELD_CREATED_AT",
          "VISITOR_SORT_FIELD_VISIT_COUNT",
          "VISITOR_SORT_FIELD_DEVICE_COUNT",
          "VISITOR_SORT_FIELD_QRCODE_COUNT"
        ],
        "title": "Fields that can be used to sort visitors",
        "type": "string"
      },
      "VisitorTrendDataPoint": {
        "properties": {
          "newVisitorCount": {
            "format": "int32",
            "title": "Number of first-time visitors in this interval",
            "type": "integer"
          },
          "returningVisitorCount": {
            "format": "int32",
            "title": "Number of returning visitors in this interval",
            "type": "integer"
          },
          "timestamp": {
            "format": "date-time",
            "title": "Start timestamp of the interval",
            "type": "string"
          }
        },
        "title": "VisitorTrendDataPoint represents visitor counts for a time bucket",
        "type": "object"
      },
      "VisitorsServiceUpdateBody": {
        "properties": {
          "visitor": {
            "$ref": "#/components/schemas/VisitorInput",
            "title": "Partial attributes to merge into the visitor profile"
          }
        },
        "title": "Update a visitor by ID with partial attributes",
        "type": "object"
      },
      "Webhook": {
        "description": "Describes a webhook endpoint that receives event notifications when specified conditions are met,\nproviding real-time integration capabilities for external systems.",
        "externalDocs": {
          "description": "Learn more about webhooks in Linkbreakers",
          "url": "https://linkbreakers.com/help/article/how-do-webhooks-work-in-linkbreakers"
        },
        "properties": {
          "createdAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "The timestamp when the webhook was created",
            "type": "string"
          },
          "createdBy": {
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "title": "The member who created the webhook (UUID)",
            "type": "string"
          },
          "endpointUrl": {
            "example": "https://api.example.com/webhooks/linkbreakers",
            "title": "The URL endpoint that will receive webhook POST requests",
            "type": "string"
          },
          "failureCount": {
            "format": "int64",
            "readOnly": true,
            "title": "Count of failed webhook deliveries",
            "type": "integer"
          },
          "id": {
            "example": "d22f7bf1-83a9-4f3a-9b37-9a3a21b6ac11",
            "title": "The unique identifier of the webhook (UUID)",
            "type": "string"
          },
          "lastDeliveredAt": {
            "description": "The timestamp when the webhook was last successfully delivered to the endpoint.\nThis field is only updated when the webhook endpoint responds with a 2xx status code.\nUse this to track actual successful event notifications to external systems.",
            "format": "date-time",
            "readOnly": true,
            "type": "string"
          },
          "lastSentAt": {
            "description": "The timestamp when the webhook was last triggered (attempted), regardless of success or failure.\nThis field is updated on every webhook transmission attempt, including failed deliveries.\nUse this to track webhook activity and debugging transmission issues.",
            "format": "date-time",
            "readOnly": true,
            "type": "string"
          },
          "linkId": {
            "description": "Filter webhook notifications by a specific link ID.\nOnly events from this link will trigger webhook notifications.\nIf empty, all links in the workspace will trigger notifications.",
            "example": "d22f7bf1-83a9-4f3a-9b37-9a3a21b6ac11",
            "type": "string"
          },
          "name": {
            "example": "Production Event Notifications",
            "title": "The name of the webhook",
            "type": "string"
          },
          "source": {
            "$ref": "#/components/schemas/WebhookSource",
            "example": "WEBHOOK_SOURCE_LINKBREAKERS",
            "title": "Source of the webhook - indicates whether it was created manually through \nthe dashboard or automatically via an integration platform"
          },
          "status": {
            "$ref": "#/components/schemas/WebhookStatus",
            "example": "WEBHOOK_STATUS_ACTIVE",
            "title": "Current status of the webhook"
          },
          "successCount": {
            "format": "int64",
            "readOnly": true,
            "title": "Count of successful webhook deliveries",
            "type": "integer"
          },
          "triggers": {
            "description": "Filter webhook notifications by workflow step kinds.\nOnly workflow steps matching these kinds will trigger webhook notifications.\nIf empty, all workflow step kinds will trigger notifications.",
            "example": [
              "KIND_ENTRY",
              "KIND_EXIT"
            ],
            "items": {
              "description": "- KIND_UNSPECIFIED: Workflow step kind not specified\n - KIND_ENTRY: Entry steps are automatically triggered when a visitor reaches the workflow\n - KIND_EXIT: Exit steps finalize the workflow (commonly a redirect)\n - KIND_INTERACTION: Interaction steps require visitor input (forms, passwords, etc.)\n - KIND_CONDITION: Condition steps evaluate logic and route to different next steps",
              "enum": [
                "KIND_UNSPECIFIED",
                "KIND_ENTRY",
                "KIND_EXIT",
                "KIND_INTERACTION",
                "KIND_CONDITION"
              ]
            },
            "type": "array"
          },
          "updatedAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "The timestamp when the webhook was last updated",
            "type": "string"
          },
          "workspaceId": {
            "example": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0",
            "title": "The workspace ID the webhook belongs to (UUID)",
            "type": "string"
          }
        },
        "title": "Webhook",
        "type": "object"
      },
      "WebhookSource": {
        "default": "WEBHOOK_SOURCE_UNSPECIFIED",
        "description": "- WEBHOOK_SOURCE_UNSPECIFIED: Webhook source not specified (defaults to LINKBREAKERS)\n - WEBHOOK_SOURCE_LINKBREAKERS: Webhook created manually through the Linkbreakers dashboard/platform\n - WEBHOOK_SOURCE_MAKE: Webhook created automatically via Make.com integration\n - WEBHOOK_SOURCE_ZAPIER: Webhook created automatically via Zapier integration",
        "enum": [
          "WEBHOOK_SOURCE_UNSPECIFIED",
          "WEBHOOK_SOURCE_LINKBREAKERS",
          "WEBHOOK_SOURCE_MAKE",
          "WEBHOOK_SOURCE_ZAPIER"
        ],
        "title": "The source of a webhook - indicates whether the webhook was created manually \nthrough the Linkbreakers dashboard or automatically via an integration platform such as Make.com or Zapier",
        "type": "string"
      },
      "WebhookStatus": {
        "default": "WEBHOOK_STATUS_UNSPECIFIED",
        "description": "- WEBHOOK_STATUS_UNSPECIFIED: Webhook status not specified\n - WEBHOOK_STATUS_ACTIVE: Webhook is active and receiving events\n - WEBHOOK_STATUS_DISABLED: Webhook is disabled due to repeated failures\n - WEBHOOK_STATUS_PAUSED: Webhook is paused by user action",
        "enum": [
          "WEBHOOK_STATUS_UNSPECIFIED",
          "WEBHOOK_STATUS_ACTIVE",
          "WEBHOOK_STATUS_DISABLED",
          "WEBHOOK_STATUS_PAUSED"
        ],
        "title": "The status of a webhook",
        "type": "string"
      },
      "WebhooksServiceUpdateBody": {
        "properties": {
          "endpointUrl": {
            "title": "The URL endpoint that will receive webhook POST requests",
            "type": "string"
          },
          "linkId": {
            "description": "Filter webhook notifications by a specific link ID.\nOnly events from this link will trigger webhook notifications.\nIf empty, all links in the workspace will trigger notifications.",
            "type": "string"
          },
          "name": {
            "title": "The name of the webhook",
            "type": "string"
          },
          "source": {
            "$ref": "#/components/schemas/WebhookSource",
            "title": "Source of the webhook - indicates whether created manually or via integration"
          },
          "status": {
            "$ref": "#/components/schemas/WebhookStatus",
            "title": "Current status of the webhook"
          },
          "triggers": {
            "description": "Filter webhook notifications by workflow step kinds.\nOnly workflow steps matching these kinds will trigger webhook notifications.\nIf empty, all workflow step kinds will trigger notifications.",
            "items": {
              "description": "- KIND_UNSPECIFIED: Workflow step kind not specified\n - KIND_ENTRY: Entry steps are automatically triggered when a visitor reaches the workflow\n - KIND_EXIT: Exit steps finalize the workflow (commonly a redirect)\n - KIND_INTERACTION: Interaction steps require visitor input (forms, passwords, etc.)\n - KIND_CONDITION: Condition steps evaluate logic and route to different next steps",
              "enum": [
                "KIND_UNSPECIFIED",
                "KIND_ENTRY",
                "KIND_EXIT",
                "KIND_INTERACTION",
                "KIND_CONDITION"
              ]
            },
            "type": "array"
          }
        },
        "title": "UpdateWebhookRequest represents the request to update a webhook",
        "type": "object"
      },
      "WidgetDataSource": {
        "properties": {
          "endpoint": {
            "title": "The API endpoint path, e.g. \"/v1/timeseries/events\"",
            "type": "string"
          },
          "method": {
            "title": "HTTP method: \"GET\" or \"POST\"",
            "type": "string"
          },
          "params": {
            "title": "Static parameters always sent with the request",
            "type": "object"
          },
          "responseDataPath": {
            "title": "Dot-notation path to the data array in the response, e.g. \"timeSeries.data\" or \"data\"\nEmpty string means the root object is the data (for single-value endpoints like metrics)",
            "type": "string"
          },
          "usesDateRange": {
            "title": "Whether the dashboard date range should be injected (startDate/endDate)",
            "type": "boolean"
          },
          "usesInterval": {
            "title": "Whether interval calculation should be injected (for time-bucketed data)",
            "type": "boolean"
          }
        },
        "title": "WidgetDataSource describes which API endpoint to call and how to pass parameters",
        "type": "object"
      },
      "WidgetFieldMapping": {
        "properties": {
          "chartRole": {
            "title": "Role in the chart: \"label\", \"value\", \"value2\", \"timestamp\", \"category\"",
            "type": "string"
          },
          "displayLabel": {
            "title": "Display label shown in legend and tooltips",
            "type": "string"
          },
          "sourceField": {
            "title": "Field name in the API response objects, e.g. \"eventCount\", \"timestamp\"",
            "type": "string"
          }
        },
        "title": "WidgetFieldMapping maps a field from the API response to a chart role",
        "type": "object"
      },
      "WidgetPosition": {
        "properties": {
          "x": {
            "format": "int32",
            "title": "Leftmost column the widget occupies, 0-based",
            "type": "integer"
          },
          "y": {
            "format": "int32",
            "title": "Topmost row the widget occupies, 0-based",
            "type": "integer"
          }
        },
        "title": "WidgetPosition defines where a widget sits in the grid",
        "type": "object"
      },
      "WidgetSize": {
        "properties": {
          "h": {
            "format": "int32",
            "title": "Row span, one row being roughly 80px tall",
            "type": "integer"
          },
          "w": {
            "description": "Column span. In an 8-column config: 8 = full width, 4 = half, 2 = quarter.",
            "format": "int32",
            "type": "integer"
          }
        },
        "title": "WidgetSize defines how many grid cells a widget spans",
        "type": "object"
      },
      "WidgetTab": {
        "properties": {
          "label": {
            "title": "Tab display label",
            "type": "string"
          },
          "mode": {
            "$ref": "#/components/schemas/WidgetTabMode",
            "description": "How this tab produces its content. Absent means data."
          },
          "params": {
            "title": "Params that override the base data source params when this tab is active",
            "type": "object"
          },
          "view": {
            "$ref": "#/components/schemas/WidgetTabView",
            "description": "How it is drawn. The map used to be chosen by a tab literally labelled\n\"Map\", so renaming it to \"Carte\" lost the map and a data tab called\n\"Site Map clicks\" was hijacked into one."
          }
        },
        "title": "WidgetTab represents a tab for grouped views in a widget",
        "type": "object"
      },
      "WidgetTabMode": {
        "default": "WIDGET_TAB_MODE_UNSPECIFIED",
        "description": "WidgetTabMode says how a tab produces what it shows.\n\n - WIDGET_TAB_MODE_UNSPECIFIED: Fetches the widget's data source with this tab's params, on switch.\n - WIDGET_TAB_MODE_ASSISTANT_SUMMARY: Shows an assistant's analysis of the widget's values. Runs only when the user\nasks, because it costs platform credits, and its result is stored rather\nthan regenerated on every view.",
        "enum": [
          "WIDGET_TAB_MODE_UNSPECIFIED",
          "WIDGET_TAB_MODE_DATA",
          "WIDGET_TAB_MODE_ASSISTANT_SUMMARY"
        ],
        "type": "string"
      },
      "WidgetTabView": {
        "default": "WIDGET_TAB_VIEW_UNSPECIFIED",
        "description": "WidgetTabView says how a tab draws what it fetched.\n\n - WIDGET_TAB_VIEW_UNSPECIFIED: The widget's own chart type.\n - WIDGET_TAB_VIEW_MAP: A world map, which needs rows carrying a country code.",
        "enum": [
          "WIDGET_TAB_VIEW_UNSPECIFIED",
          "WIDGET_TAB_VIEW_CHART",
          "WIDGET_TAB_VIEW_MAP"
        ],
        "type": "string"
      },
      "WidgetVisualization": {
        "properties": {
          "chartType": {
            "title": "Chart type: \"bar\", \"horizontal_bar\", \"line\", \"area\", \"stacked_area\", \"pie\", \"number\", \"list\", \"funnel\"",
            "type": "string"
          },
          "colors": {
            "items": {
              "type": "string"
            },
            "title": "Ordered list of colors for chart series/segments",
            "type": "array"
          },
          "fieldMappings": {
            "items": {
              "$ref": "#/components/schemas/WidgetFieldMapping",
              "type": "object"
            },
            "title": "Maps response fields to chart roles",
            "type": "array"
          },
          "tabs": {
            "description": "Optional tabs for grouped views. Each tab has label and params that override the base params.",
            "items": {
              "$ref": "#/components/schemas/WidgetTab",
              "type": "object"
            },
            "type": "array"
          }
        },
        "title": "WidgetVisualization describes how to render the fetched data",
        "type": "object"
      },
      "WorkflowIssue": {
        "properties": {
          "message": {
            "type": "string"
          },
          "severity": {
            "title": "\"error\" or \"warning\"",
            "type": "string"
          },
          "stepId": {
            "type": "string"
          },
          "stepType": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "WorkflowStep": {
        "description": "Models a node in the Linkbreakers workflow canvas, defining what should occur after a scan (redirects, gates,\nforms) and how it connects to other steps in the visitor journey.",
        "externalDocs": {
          "description": "Learn more about workflows in Linkbreakers",
          "url": "https://linkbreakers.com/help/article/whats-a-workflow"
        },
        "properties": {
          "attributeCapture": {
            "$ref": "#/components/schemas/AttributeCapture",
            "description": "What this step saves to the visitor's profile when a visitor goes through\nit. Absent when the step has never been configured to save anything."
          },
          "backButton": {
            "$ref": "#/components/schemas/BackButton",
            "description": "The page's optional back button, which returns the visitor to the page\nthey came from (such as the menu) without wiring a connection. Absent\nwhen it has never been configured. Only page steps carry one."
          },
          "backButtonAvailable": {
            "description": "Whether this step's back_button can ever show: the step is a page and\nsome visitor reaches it after already seeing another page (a menu, a\nform, a password page). False on a page that comes straight after the\nscan, even through conditions, because a visitor there has no page to go\nback to. A back_button stored on a step where this is false is kept, so\nit shows again once the wiring puts a page before the step.",
            "readOnly": true,
            "type": "boolean"
          },
          "branches": {
            "description": "Every exit of this step, with its current destination.\n\nThis is the vocabulary for connecting the step: pass one of these\nbranch_ids to workflow_steps_connect. An atomic step has exactly one\nbranch, \"next\". A composite step has one per button, option or range,\nplus \"else\" for a condition's fallback. An exit step has none.",
            "items": {
              "$ref": "#/components/schemas/WorkflowStepBranch",
              "type": "object"
            },
            "readOnly": true,
            "type": "array"
          },
          "canvasPosition": {
            "$ref": "#/components/schemas/CanvasPosition",
            "title": "Canvas position for React Flow visualization"
          },
          "childStepIds": {
            "items": {
              "type": "string"
            },
            "readOnly": true,
            "title": "Child workflow step IDs (steps that this step can transition to, UUID)",
            "type": "array"
          },
          "createdAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "When the workflow step was created",
            "type": "string"
          },
          "eventAction": {
            "description": "- EVENT_ACTION_UNSPECIFIED: Event action not specified\n - EVENT_ACTION_CLIENT_REDIRECT: Redirect visitors to a destination URL\n - EVENT_ACTION_LINK_VISIT: Entry step triggered when the link is visited.\n - EVENT_ACTION_PASSWORD_VERIFY: Require visitors to enter a password before proceeding\n - EVENT_ACTION_FORM_SUBMIT: Present a data collection form to visitors\n - EVENT_ACTION_CONTACT_CARD: Generate a vCard (VCF) response with contact information\n - EVENT_ACTION_MULTI_LINK: A page of buttons where each one continues into more workflow: the button\nleads to a next step, not straight out. Records which button the visitor\npressed, so use it over SOCIAL_LINKS_PAGE when that choice is worth\nmeasuring or when a branch needs to do more than redirect. This is the\nmenu step: for several documents or PDFs, give each one a button\nconnected to an OPEN_MEDIA step for media uploaded to the media library, or to\na CLIENT_REDIRECT when the document is already hosted at a URL.\n - EVENT_ACTION_VISIT_TYPE_CONDITION: Route visitors based on whether it's a first or returning visit\n - EVENT_ACTION_COUNTRY_CONDITION: Route visitors based on their country location\n - EVENT_ACTION_DAY_OF_WEEK_CONDITION: Route visitors based on day of week\n - EVENT_ACTION_TIME_OF_DAY_CONDITION: Route visitors based on time of day\n - EVENT_ACTION_DAY_OF_MONTH_CONDITION: Route visitors based on day of month\n - EVENT_ACTION_SPECIFIC_DATE_CONDITION: Route visitors based on specific calendar dates\n - EVENT_ACTION_SOCIAL_LINKS_PAGE: A page of buttons that each leave for an external URL. Social profiles are\nthe common case, not the only one: app stores, docs, booking pages and\nstorefronts all work, and the name is the only thing about it that is\nsocial. It is an exit step, so the visitor leaves from here.\n - EVENT_ACTION_DEVICE_TYPE_CONDITION: Route visitors based on device type (e.g. MOBILE, DESKTOP, TABLET)\n - EVENT_ACTION_DEVICE_PLATFORM_CONDITION: Route visitors based on device platform / operating system (e.g. iOS, Android, macOS)\n - EVENT_ACTION_DEVICE_BROWSER_CONDITION: Route visitors based on browser family (e.g. Chrome, Safari, Firefox)\n - EVENT_ACTION_DEVICE_BRAND_CONDITION: Route visitors based on hardware brand (e.g. Apple, Samsung, Google)\n - EVENT_ACTION_DEVICE_ACTOR_CONDITION: Route visitors based on actor classification (e.g. HUMAN, BOT, AGENT)\n - EVENT_ACTION_VISITOR_DATA_CONDITION: Route visitors based on their profile data or custom attributes\n - EVENT_ACTION_THANK_YOU_PAGE: Display a final thank you / completion message (exit step)\n - EVENT_ACTION_MESSAGE_PAGE: Text with ONE way onward: a single button, or a timer that moves the\nvisitor automatically. It carries no list of destinations, so a page that\nshould offer a choice between two or more places is not this step. Use\nSOCIAL_LINKS_PAGE when the choices leave for external URLs, or MULTI_LINK\nwhen each choice continues into more workflow. Never put links, documents\nor PDFs on it: it is a message, nothing else.\n - EVENT_ACTION_OPEN_MEDIA: Hand the visitor one piece of uploaded media, opened in their browser (exit step): a PDF,\nan image (PNG, JPEG, WebP, SVG) or an MP4 video. The visitor is sent straight to the media,\nwith no page of its own. Any media of the library can be opened: it is uploaded once and\nreferenced by its media_id; swapping it means pointing the step at another media item,\nand the QR code never changes.",
            "enum": [
              "EVENT_ACTION_UNSPECIFIED",
              "EVENT_ACTION_CLIENT_REDIRECT",
              "EVENT_ACTION_LINK_VISIT",
              "EVENT_ACTION_PASSWORD_VERIFY",
              "EVENT_ACTION_FORM_SUBMIT",
              "EVENT_ACTION_CONTACT_CARD",
              "EVENT_ACTION_MULTI_LINK",
              "EVENT_ACTION_VISIT_TYPE_CONDITION",
              "EVENT_ACTION_COUNTRY_CONDITION",
              "EVENT_ACTION_DAY_OF_WEEK_CONDITION",
              "EVENT_ACTION_TIME_OF_DAY_CONDITION",
              "EVENT_ACTION_DAY_OF_MONTH_CONDITION",
              "EVENT_ACTION_SPECIFIC_DATE_CONDITION",
              "EVENT_ACTION_SOCIAL_LINKS_PAGE",
              "EVENT_ACTION_DEVICE_TYPE_CONDITION",
              "EVENT_ACTION_DEVICE_PLATFORM_CONDITION",
              "EVENT_ACTION_DEVICE_BROWSER_CONDITION",
              "EVENT_ACTION_DEVICE_BRAND_CONDITION",
              "EVENT_ACTION_DEVICE_ACTOR_CONDITION",
              "EVENT_ACTION_VISITOR_DATA_CONDITION",
              "EVENT_ACTION_THANK_YOU_PAGE",
              "EVENT_ACTION_MESSAGE_PAGE",
              "EVENT_ACTION_OPEN_MEDIA"
            ],
            "example": "EVENT_ACTION_CLIENT_REDIRECT",
            "title": "The event action type for this workflow step"
          },
          "id": {
            "example": "a5f7b184-9d74-4f2a-9ed9-8f6a98cb12f4",
            "title": "The unique identifier of the workflow step (UUID)",
            "type": "string"
          },
          "kind": {
            "description": "- KIND_UNSPECIFIED: Workflow step kind not specified\n - KIND_ENTRY: Entry steps are automatically triggered when a visitor reaches the workflow\n - KIND_EXIT: Exit steps finalize the workflow (commonly a redirect)\n - KIND_INTERACTION: Interaction steps require visitor input (forms, passwords, etc.)\n - KIND_CONDITION: Condition steps evaluate logic and route to different next steps",
            "enum": [
              "KIND_UNSPECIFIED",
              "KIND_ENTRY",
              "KIND_EXIT",
              "KIND_INTERACTION",
              "KIND_CONDITION"
            ],
            "example": "KIND_INTERACTION",
            "readOnly": true,
            "title": "The kind of workflow step (entry, exit, etc.) - read-only, determined by server"
          },
          "linkId": {
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "title": "The link ID this workflow step belongs to (UUID)",
            "type": "string"
          },
          "nextCanGoBack": {
            "description": "Whether a page added after this step could show a back button: this step\nis a page, or a page comes before it. False for a step no visitor\nreaches.",
            "readOnly": true,
            "type": "boolean"
          },
          "nodeType": {
            "description": "The node type says how many exits a step has. Whatever the answer, you\nconnect every one of them the same way, with workflow_steps_connect: name\nthe branch, name the step it leads to. Read a step's branches field for its\nbranch ids.\n\nExample: a multi-link with 3 buttons has 3 branches, with the buttons' ids.\nA redirect has one branch, \"next\". A country condition has one branch per\ncountry plus \"else\".\n\n - NODE_TYPE_UNSPECIFIED: Workflow step node type not specified\n - NODE_TYPE_COMPOSITE: Composite steps have one exit per button, option or range, plus \"else\"\nfor a condition's fallback.\nExamples: MULTI_LINK, VISIT_TYPE_CONDITION, COUNTRY_CONDITION,\nDAY_OF_WEEK_CONDITION, TIME_OF_DAY_CONDITION, DAY_OF_MONTH_CONDITION,\nSPECIFIC_DATE_CONDITION, DEVICE_*_CONDITION, VISITOR_DATA_CONDITION\n - NODE_TYPE_ATOMIC: Atomic steps have exactly one exit, branch id \"next\". Exit steps\n(THANK_YOU_PAGE, CONTACT_CARD, SOCIAL_LINKS_PAGE, CLIENT_REDIRECT) are\natomic but end the journey, so they have no branches at all.\nExamples: LINK_VISIT, PASSWORD_VERIFY, FORM_SUBMIT, MESSAGE_PAGE",
            "enum": [
              "NODE_TYPE_UNSPECIFIED",
              "NODE_TYPE_COMPOSITE",
              "NODE_TYPE_ATOMIC"
            ],
            "example": "NODE_TYPE_COMPOSITE",
            "readOnly": true,
            "title": "The node type of workflow step (composite, atomic) - read-only, determined by server"
          },
          "parentStepIds": {
            "items": {
              "type": "string"
            },
            "readOnly": true,
            "title": "Parent workflow step IDs (steps that can transition into this step, UUID)",
            "type": "array"
          },
          "payload": {
            "$ref": "#/components/schemas/WorkflowStepPayload",
            "title": "The payload data for this workflow step (varies by event action)"
          },
          "rendersPage": {
            "description": "Whether visitors see this step as a page. Page steps take the options\nevery page has, such as back_button; redirects and conditions do not.",
            "readOnly": true,
            "type": "boolean"
          },
          "updatedAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "When the workflow step was last updated",
            "type": "string"
          }
        },
        "title": "WorkflowStep",
        "type": "object"
      },
      "WorkflowStepBranch": {
        "description": "One exit of a workflow step. Server-derived, returned on every step read.",
        "properties": {
          "branchId": {
            "description": "The id this branch is addressed by: \"next\" for an atomic step's single\nexit, \"else\" for a condition's fallback, or the id the branch carries in\nthe step's payload — a button id, option id, range id, or country code.",
            "type": "string"
          },
          "label": {
            "description": "Human-readable name of the branch: a button's label, a country code, a\ncondition option's name, \"fallback\", \"next step\".",
            "type": "string"
          },
          "nextStepId": {
            "description": "The step this branch leads to. Empty when the branch is unconnected.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "WorkflowStepKind": {
        "default": "KIND_UNSPECIFIED",
        "description": "- KIND_UNSPECIFIED: Workflow step kind not specified\n - KIND_ENTRY: Entry steps are automatically triggered when a visitor reaches the workflow\n - KIND_EXIT: Exit steps finalize the workflow (commonly a redirect)\n - KIND_INTERACTION: Interaction steps require visitor input (forms, passwords, etc.)\n - KIND_CONDITION: Condition steps evaluate logic and route to different next steps",
        "enum": [
          "KIND_UNSPECIFIED",
          "KIND_ENTRY",
          "KIND_EXIT",
          "KIND_INTERACTION",
          "KIND_CONDITION"
        ],
        "title": "Workflow step kinds",
        "type": "string"
      },
      "WorkflowStepNodeType": {
        "default": "NODE_TYPE_UNSPECIFIED",
        "description": "The node type says how many exits a step has. Whatever the answer, you\nconnect every one of them the same way, with workflow_steps_connect: name\nthe branch, name the step it leads to. Read a step's branches field for its\nbranch ids.\n\nExample: a multi-link with 3 buttons has 3 branches, with the buttons' ids.\nA redirect has one branch, \"next\". A country condition has one branch per\ncountry plus \"else\".\n\n - NODE_TYPE_UNSPECIFIED: Workflow step node type not specified\n - NODE_TYPE_COMPOSITE: Composite steps have one exit per button, option or range, plus \"else\"\nfor a condition's fallback.\nExamples: MULTI_LINK, VISIT_TYPE_CONDITION, COUNTRY_CONDITION,\nDAY_OF_WEEK_CONDITION, TIME_OF_DAY_CONDITION, DAY_OF_MONTH_CONDITION,\nSPECIFIC_DATE_CONDITION, DEVICE_*_CONDITION, VISITOR_DATA_CONDITION\n - NODE_TYPE_ATOMIC: Atomic steps have exactly one exit, branch id \"next\". Exit steps\n(THANK_YOU_PAGE, CONTACT_CARD, SOCIAL_LINKS_PAGE, CLIENT_REDIRECT) are\natomic but end the journey, so they have no branches at all.\nExamples: LINK_VISIT, PASSWORD_VERIFY, FORM_SUBMIT, MESSAGE_PAGE",
        "enum": [
          "NODE_TYPE_UNSPECIFIED",
          "NODE_TYPE_COMPOSITE",
          "NODE_TYPE_ATOMIC"
        ],
        "title": "Workflow step node types",
        "type": "string"
      },
      "WorkflowStepPayload": {
        "properties": {
          "clientRedirect": {
            "$ref": "#/components/schemas/ClientRedirectPayload"
          },
          "countryCondition": {
            "$ref": "#/components/schemas/CountryConditionPayload"
          },
          "dayOfMonthCondition": {
            "$ref": "#/components/schemas/DayOfMonthConditionPayload"
          },
          "dayOfWeekCondition": {
            "$ref": "#/components/schemas/DayOfWeekConditionPayload"
          },
          "deviceActorCondition": {
            "$ref": "#/components/schemas/DeviceActorConditionPayload"
          },
          "deviceBrandCondition": {
            "$ref": "#/components/schemas/DeviceBrandConditionPayload"
          },
          "deviceBrowserCondition": {
            "$ref": "#/components/schemas/DeviceBrowserConditionPayload"
          },
          "devicePlatformCondition": {
            "$ref": "#/components/schemas/DevicePlatformConditionPayload"
          },
          "deviceTypeCondition": {
            "$ref": "#/components/schemas/DeviceTypeConditionPayload"
          },
          "form": {
            "$ref": "#/components/schemas/FormPayload"
          },
          "linkVisit": {
            "$ref": "#/components/schemas/LinkVisitPayload"
          },
          "messagePage": {
            "$ref": "#/components/schemas/MessagePagePayload"
          },
          "multiLink": {
            "$ref": "#/components/schemas/MultiLinkPayload"
          },
          "openMedia": {
            "$ref": "#/components/schemas/OpenMediaPayload"
          },
          "password": {
            "$ref": "#/components/schemas/PasswordPayload"
          },
          "socialLinks": {
            "$ref": "#/components/schemas/SocialLinksPayload"
          },
          "specificDateCondition": {
            "$ref": "#/components/schemas/SpecificDateConditionPayload"
          },
          "thankYouPage": {
            "$ref": "#/components/schemas/ThankYouPagePayload"
          },
          "timeOfDayCondition": {
            "$ref": "#/components/schemas/TimeOfDayConditionPayload"
          },
          "vcard": {
            "$ref": "#/components/schemas/VCardPayload"
          },
          "visitTypeCondition": {
            "$ref": "#/components/schemas/VisitTypeConditionPayload"
          },
          "visitorDataCondition": {
            "$ref": "#/components/schemas/VisitorDataConditionPayload"
          }
        },
        "title": "Workflow step payload - uses oneof for type safety based on EventAction",
        "type": "object"
      },
      "WorkflowStepsServiceAutoLayoutWorkflowBody": {
        "type": "object"
      },
      "WorkflowStepsServiceConnectStepBody": {
        "properties": {
          "nextStepId": {
            "example": "456789ab-cdef-1234-5678-9abcdef01234",
            "title": "The ID of the step this branch leads to (UUID)",
            "type": "string"
          }
        },
        "title": "Request to connect one exit of a workflow step to another step",
        "type": "object"
      },
      "WorkflowStepsServiceCreateBody": {
        "properties": {
          "attributeCapture": {
            "$ref": "#/components/schemas/AttributeCapture",
            "description": "What the step saves to the visitor's profile (optional)."
          },
          "backButton": {
            "$ref": "#/components/schemas/BackButton",
            "description": "The page's optional back button, which returns the visitor to the\nprevious page (such as the menu) without wiring a connection. Page steps\nonly: MESSAGE_PAGE, MULTI_LINK, CONTACT_CARD, SOCIAL_LINKS_PAGE,\nFORM_SUBMIT, PASSWORD_VERIFY and THANK_YOU_PAGE. Hidden right after a scan."
          },
          "canvasPosition": {
            "$ref": "#/components/schemas/CanvasPosition",
            "title": "Canvas position for React Flow visualization (optional)"
          },
          "eventAction": {
            "description": "- EVENT_ACTION_UNSPECIFIED: Event action not specified\n - EVENT_ACTION_CLIENT_REDIRECT: Redirect visitors to a destination URL\n - EVENT_ACTION_LINK_VISIT: Entry step triggered when the link is visited.\n - EVENT_ACTION_PASSWORD_VERIFY: Require visitors to enter a password before proceeding\n - EVENT_ACTION_FORM_SUBMIT: Present a data collection form to visitors\n - EVENT_ACTION_CONTACT_CARD: Generate a vCard (VCF) response with contact information\n - EVENT_ACTION_MULTI_LINK: A page of buttons where each one continues into more workflow: the button\nleads to a next step, not straight out. Records which button the visitor\npressed, so use it over SOCIAL_LINKS_PAGE when that choice is worth\nmeasuring or when a branch needs to do more than redirect. This is the\nmenu step: for several documents or PDFs, give each one a button\nconnected to an OPEN_MEDIA step for media uploaded to the media library, or to\na CLIENT_REDIRECT when the document is already hosted at a URL.\n - EVENT_ACTION_VISIT_TYPE_CONDITION: Route visitors based on whether it's a first or returning visit\n - EVENT_ACTION_COUNTRY_CONDITION: Route visitors based on their country location\n - EVENT_ACTION_DAY_OF_WEEK_CONDITION: Route visitors based on day of week\n - EVENT_ACTION_TIME_OF_DAY_CONDITION: Route visitors based on time of day\n - EVENT_ACTION_DAY_OF_MONTH_CONDITION: Route visitors based on day of month\n - EVENT_ACTION_SPECIFIC_DATE_CONDITION: Route visitors based on specific calendar dates\n - EVENT_ACTION_SOCIAL_LINKS_PAGE: A page of buttons that each leave for an external URL. Social profiles are\nthe common case, not the only one: app stores, docs, booking pages and\nstorefronts all work, and the name is the only thing about it that is\nsocial. It is an exit step, so the visitor leaves from here.\n - EVENT_ACTION_DEVICE_TYPE_CONDITION: Route visitors based on device type (e.g. MOBILE, DESKTOP, TABLET)\n - EVENT_ACTION_DEVICE_PLATFORM_CONDITION: Route visitors based on device platform / operating system (e.g. iOS, Android, macOS)\n - EVENT_ACTION_DEVICE_BROWSER_CONDITION: Route visitors based on browser family (e.g. Chrome, Safari, Firefox)\n - EVENT_ACTION_DEVICE_BRAND_CONDITION: Route visitors based on hardware brand (e.g. Apple, Samsung, Google)\n - EVENT_ACTION_DEVICE_ACTOR_CONDITION: Route visitors based on actor classification (e.g. HUMAN, BOT, AGENT)\n - EVENT_ACTION_VISITOR_DATA_CONDITION: Route visitors based on their profile data or custom attributes\n - EVENT_ACTION_THANK_YOU_PAGE: Display a final thank you / completion message (exit step)\n - EVENT_ACTION_MESSAGE_PAGE: Text with ONE way onward: a single button, or a timer that moves the\nvisitor automatically. It carries no list of destinations, so a page that\nshould offer a choice between two or more places is not this step. Use\nSOCIAL_LINKS_PAGE when the choices leave for external URLs, or MULTI_LINK\nwhen each choice continues into more workflow. Never put links, documents\nor PDFs on it: it is a message, nothing else.\n - EVENT_ACTION_OPEN_MEDIA: Hand the visitor one piece of uploaded media, opened in their browser (exit step): a PDF,\nan image (PNG, JPEG, WebP, SVG) or an MP4 video. The visitor is sent straight to the media,\nwith no page of its own. Any media of the library can be opened: it is uploaded once and\nreferenced by its media_id; swapping it means pointing the step at another media item,\nand the QR code never changes.",
            "enum": [
              "EVENT_ACTION_UNSPECIFIED",
              "EVENT_ACTION_CLIENT_REDIRECT",
              "EVENT_ACTION_LINK_VISIT",
              "EVENT_ACTION_PASSWORD_VERIFY",
              "EVENT_ACTION_FORM_SUBMIT",
              "EVENT_ACTION_CONTACT_CARD",
              "EVENT_ACTION_MULTI_LINK",
              "EVENT_ACTION_VISIT_TYPE_CONDITION",
              "EVENT_ACTION_COUNTRY_CONDITION",
              "EVENT_ACTION_DAY_OF_WEEK_CONDITION",
              "EVENT_ACTION_TIME_OF_DAY_CONDITION",
              "EVENT_ACTION_DAY_OF_MONTH_CONDITION",
              "EVENT_ACTION_SPECIFIC_DATE_CONDITION",
              "EVENT_ACTION_SOCIAL_LINKS_PAGE",
              "EVENT_ACTION_DEVICE_TYPE_CONDITION",
              "EVENT_ACTION_DEVICE_PLATFORM_CONDITION",
              "EVENT_ACTION_DEVICE_BROWSER_CONDITION",
              "EVENT_ACTION_DEVICE_BRAND_CONDITION",
              "EVENT_ACTION_DEVICE_ACTOR_CONDITION",
              "EVENT_ACTION_VISITOR_DATA_CONDITION",
              "EVENT_ACTION_THANK_YOU_PAGE",
              "EVENT_ACTION_MESSAGE_PAGE",
              "EVENT_ACTION_OPEN_MEDIA"
            ],
            "example": "EVENT_ACTION_FORM_SUBMIT",
            "title": "The event action type for this workflow step"
          },
          "id": {
            "example": "987fcdeb-a321-45e6-b789-123456789012",
            "title": "Optional ID for the workflow step (UUID; if not provided, will be generated by backend)",
            "type": "string"
          },
          "insertBefore": {
            "description": "Inserts the new step in front of this one: every branch that led to it\nnow leads to the new step, and the new step's \"next\" branch leads on to\nit. Saves creating and then connecting each side by hand.",
            "type": "string"
          },
          "payload": {
            "$ref": "#/components/schemas/WorkflowStepPayload",
            "title": "The payload for the workflow step (structure varies by event action)"
          }
        },
        "title": "Request to create a new workflow step",
        "type": "object"
      },
      "WorkflowStepsServiceResolveStepCollisionsBody": {
        "type": "object"
      },
      "WorkflowStepsServiceUpdateBody": {
        "properties": {
          "attributeCapture": {
            "$ref": "#/components/schemas/AttributeCapture",
            "description": "Replaces what the step saves to the visitor's profile (optional). Send\nthe whole capture: setting enabled to false keeps the writes you send."
          },
          "backButton": {
            "$ref": "#/components/schemas/BackButton",
            "description": "Replaces the page's back button, which returns the visitor to the\nprevious page (such as the menu) without wiring a connection. Leave it\nout to keep the current one. Page steps only: MESSAGE_PAGE, MULTI_LINK,\nCONTACT_CARD, SOCIAL_LINKS_PAGE, FORM_SUBMIT, PASSWORD_VERIFY and\nTHANK_YOU_PAGE. Hidden right after a scan."
          },
          "canvasPosition": {
            "$ref": "#/components/schemas/CanvasPosition",
            "title": "The updated canvas position (optional)"
          },
          "payload": {
            "$ref": "#/components/schemas/WorkflowStepPayload",
            "title": "The updated payload for the workflow step (optional)"
          }
        },
        "title": "Request to update a workflow step",
        "type": "object"
      },
      "Workspace": {
        "description": "Serves as the tenant boundary in Linkbreakers, grouping links, members, settings, billing state,\nand analytics under a single organization's environment.",
        "externalDocs": {
          "description": "Learn more about workspaces in Linkbreakers.",
          "url": "https://linkbreakers.com/help/article/what-is-a-workspace"
        },
        "properties": {
          "country": {
            "title": "ISO 3166-1 alpha-2 country code inferred from the owner signup or link activity",
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "title": "Timestamp when the workspace record was created",
            "type": "string"
          },
          "description": {
            "title": "Optional description providing additional context about the workspace",
            "type": "string"
          },
          "digestFrequency": {
            "description": "- DIGEST_FREQUENCY_UNSPECIFIED: Not specified; defaults to monthly\n - DIGEST_FREQUENCY_NONE: No digest emails\n - DIGEST_FREQUENCY_WEEKLY: Weekly digest every Monday\n - DIGEST_FREQUENCY_MONTHLY: Monthly digest on the 1st of each month",
            "enum": [
              "DIGEST_FREQUENCY_UNSPECIFIED",
              "DIGEST_FREQUENCY_NONE",
              "DIGEST_FREQUENCY_WEEKLY",
              "DIGEST_FREQUENCY_MONTHLY"
            ],
            "title": "How often the workspace receives traffic digest emails (none, weekly, monthly)"
          },
          "enforceMfa": {
            "title": "Whether members must complete multi-factor authentication at sign in",
            "type": "boolean"
          },
          "enrollRequestedAt": {
            "format": "date-time",
            "title": "Timestamp when enrollment was requested for this workspace",
            "type": "string"
          },
          "faq": {
            "description": "Frequently Asked Questions about this workspace stored as JSON",
            "title": "FAQ data stored as JSON",
            "type": "string"
          },
          "id": {
            "example": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0",
            "title": "Unique identifier for the workspace (UUID)",
            "type": "string"
          },
          "inactiveSince": {
            "format": "date-time",
            "title": "When the workspace was flagged as inactive due to lack of activity (cleared on next sign-in/scan)",
            "type": "string"
          },
          "isSandbox": {
            "description": "True for a sandbox workspace: API-only, with its own caps, never billed.",
            "readOnly": true,
            "type": "boolean"
          },
          "linkSettingId": {
            "example": "fbb5c4b6-2a10-4f35-8cb1-60c613a92d2a",
            "title": "Link setting configuration that governs visitor data collection (UUID)",
            "type": "string"
          },
          "name": {
            "title": "Human-readable display name chosen during signup",
            "type": "string"
          },
          "publishedAt": {
            "format": "date-time",
            "title": "Timestamp when the workspace was published/made public",
            "type": "string"
          },
          "sandboxExpiresAt": {
            "description": "When a sandbox workspace is deleted. Unset for a live workspace.",
            "format": "date-time",
            "readOnly": true,
            "type": "string"
          },
          "shortDescription": {
            "title": "Short description for the workspace",
            "type": "string"
          },
          "slug": {
            "title": "Unique slug for the workspace (URL-friendly identifier)",
            "type": "string"
          },
          "subscriptionType": {
            "description": "- SUBSCRIPTION_TYPE_UNSPECIFIED: Subscription plan not yet assigned\n - SUBSCRIPTION_TYPE_FREE_TRIAL: Workspace is currently in the free trial period\n - SUBSCRIPTION_TYPE_SPONSORED_PRO: Workspace is on the sponsored pro plan with full pro features\n - SUBSCRIPTION_TYPE_PRO_PLAN: Workspace has an active Pro plan subscription\n - SUBSCRIPTION_TYPE_ENTERPRISE_PLAN: Workspace is managed under an Enterprise contract\n - SUBSCRIPTION_TYPE_LIGHT_PLAN: Workspace has an active Light plan subscription",
            "enum": [
              "SUBSCRIPTION_TYPE_UNSPECIFIED",
              "SUBSCRIPTION_TYPE_FREE_TRIAL",
              "SUBSCRIPTION_TYPE_SPONSORED_PRO",
              "SUBSCRIPTION_TYPE_PRO_PLAN",
              "SUBSCRIPTION_TYPE_ENTERPRISE_PLAN",
              "SUBSCRIPTION_TYPE_LIGHT_PLAN"
            ],
            "example": "SUBSCRIPTION_TYPE_PRO_PLAN",
            "title": "Billing plan currently applied to the workspace"
          },
          "tags": {
            "title": "Comma-separated tags for the workspace",
            "type": "string"
          },
          "timezone": {
            "title": "Default timezone used to render analytics and schedules (IANA name)",
            "type": "string"
          },
          "trialEndsAt": {
            "format": "date-time",
            "title": "When the free trial period ends (null if not on trial)",
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "title": "Timestamp of the last workspace-level update",
            "type": "string"
          },
          "verifiedAt": {
            "format": "date-time",
            "title": "Timestamp when the workspace passed verification (e.g., owner email confirmed)",
            "type": "string"
          },
          "website": {
            "title": "Website URL for the workspace",
            "type": "string"
          }
        },
        "title": "Workspace",
        "type": "object"
      },
      "WorkspaceAllowance": {
        "description": "One limit the workspace's plan sets, with what the workspace has used of it.",
        "properties": {
          "cheapestActionCost": {
            "format": "int32",
            "title": "Platform credits only: the credits the cheapest action that spends them needs before it runs",
            "type": "integer"
          },
          "cycleEndAt": {
            "description": "The last second of the current cycle; the allowance refills one second later. Absent for totals that never refill and when nothing has been counted yet.",
            "format": "date-time",
            "type": "string"
          },
          "cycleStartAt": {
            "description": "Start of the current cycle. Absent when nothing has been counted yet.",
            "format": "date-time",
            "type": "string"
          },
          "key": {
            "$ref": "#/components/schemas/PlanLimitKey",
            "title": "What the limit is on"
          },
          "kind": {
            "$ref": "#/components/schemas/PlanLimitKind",
            "title": "How the limit behaves"
          },
          "limit": {
            "description": "The ceiling. Absent when kind is PLAN_LIMIT_KIND_UNLIMITED or PLAN_LIMIT_KIND_METERED.",
            "format": "int32",
            "type": "integer"
          },
          "limitBytes": {
            "description": "Media storage only: the most media the workspace may hold, in bytes. Absent for other limits and when there is no ceiling.",
            "format": "int64",
            "type": "integer"
          },
          "lockedCount": {
            "description": "Tracked visits only: visits recorded past the limit in the current cycle that the workspace's plan still locks. Absent for other limits.",
            "format": "int32",
            "type": "integer"
          },
          "lockedTotalCount": {
            "description": "Tracked visits only: every visit the workspace's plan still locks, across all cycles. Upgrading to a plan with a higher limit reveals them. Absent for other limits.",
            "format": "int32",
            "type": "integer"
          },
          "noticeDismissed": {
            "title": "Whether the calling member dismissed the over-limit notice for this limit in the current cycle",
            "type": "boolean"
          },
          "reached": {
            "description": "Whether the limit is used up for the current cycle. Platform credits count as reached once neither the monthly credits nor the purchased top-up credits hold cheapest_action_cost, so nothing that spends credits can run. Never reached on a plan billed per unit used.",
            "type": "boolean"
          },
          "recordedCount": {
            "description": "Tracked visits only: every visit recorded in the current cycle, used plus locked_count. Absent for other limits.",
            "format": "int32",
            "type": "integer"
          },
          "remaining": {
            "description": "Units left in the current cycle. For platform credits, the monthly credits left plus the purchased top-up credits left. Absent when there is no ceiling.",
            "format": "int32",
            "type": "integer"
          },
          "resetsOn": {
            "$ref": "#/components/schemas/typeDate",
            "description": "The day the allowance refills, which is the first day of the next cycle in the workspace's timezone. Absent for totals that never refill and when nothing has been counted yet."
          },
          "used": {
            "description": "Units used in the current cycle. For a total such as custom domains, what the workspace holds.",
            "format": "int32",
            "type": "integer"
          },
          "usedBytes": {
            "description": "Media storage only: the bytes the workspace's media holds, exact. used is the same figure in megabytes, rounded up. Absent for other limits.",
            "format": "int64",
            "type": "integer"
          }
        },
        "title": "WorkspaceAllowance",
        "type": "object"
      },
      "WorkspaceInsight": {
        "description": "Derived workspace usage insight that helps the UI pre-select the right link type when creating new links.\nResults are cached in Redis and refreshed on every successful link creation.",
        "properties": {
          "preferredLinkType": {
            "$ref": "#/components/schemas/PreferredLinkType",
            "title": "The dominant link type used by the workspace"
          }
        },
        "title": "WorkspaceInsight",
        "type": "object"
      },
      "WorkspaceMetric": {
        "description": "Snapshot of high-level counters Linkbreakers surfaces on the dashboard so teams can track workspace growth at a glance.",
        "properties": {
          "tokenCreditsLimit": {
            "format": "int32",
            "title": "Monthly platform credits limit for the current cycle (0 means unlimited)",
            "type": "integer"
          },
          "tokenCreditsUsed": {
            "format": "int32",
            "title": "Monthly platform credits consumed in the current cycle",
            "type": "integer"
          },
          "topupCreditsLimit": {
            "format": "int32",
            "title": "Top-up credits total purchased (available = limit - used)",
            "type": "integer"
          },
          "topupCreditsUsed": {
            "format": "int32",
            "title": "Top-up credits consumed (from purchased credit packs)",
            "type": "integer"
          },
          "totalDirectories": {
            "format": "int32",
            "title": "Total number of directories (including subdirectories) in the workspace",
            "type": "integer"
          },
          "totalEvents": {
            "format": "int32",
            "title": "Historical count of events generated by the workspace",
            "type": "integer"
          },
          "totalLinks": {
            "format": "int32",
            "title": "Number of short links created within the workspace",
            "type": "integer"
          },
          "totalMembers": {
            "format": "int32",
            "title": "Total number of active members in the workspace",
            "type": "integer"
          },
          "totalMonthlyEvents": {
            "format": "int32",
            "title": "Events created within the current rolling month window",
            "type": "integer"
          },
          "totalPageThemeTemplates": {
            "format": "int32",
            "title": "Number of page theme templates owned by the workspace",
            "type": "integer"
          },
          "totalQrcodeTemplates": {
            "format": "int32",
            "title": "Number of QR code templates owned by the workspace",
            "type": "integer"
          }
        },
        "title": "WorkspaceMetric",
        "type": "object"
      },
      "WorkspaceToken": {
        "description": "Describes a long-lived credential Linkbreakers issues so back-end integrations can call workspace APIs\nwithout a human session, while keeping auditing metadata for security reviews.",
        "properties": {
          "createdAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "The timestamp when the token was created",
            "type": "string"
          },
          "createdBy": {
            "example": "123e4567-e89b-12d3-a456-426614174000",
            "title": "The member who created the token (UUID of creator)",
            "type": "string"
          },
          "fullAccess": {
            "description": "True when the token may call every endpoint, including ones behind scopes\nadded later. Tokens created without scopes have full access.",
            "readOnly": true,
            "type": "boolean"
          },
          "id": {
            "example": "d22f7bf1-83a9-4f3a-9b37-9a3a21b6ac11",
            "title": "The unique identifier of the workspace token (UUID)",
            "type": "string"
          },
          "keyType": {
            "description": "- WORKSPACE_TOKEN_KEY_TYPE_UNSPECIFIED: Default value (should not be used)\n - WORKSPACE_TOKEN_KEY_TYPE_SECRET: Secret key with full API access\n - WORKSPACE_TOKEN_KEY_TYPE_PUBLISHABLE: Publishable key with limited access",
            "enum": [
              "WORKSPACE_TOKEN_KEY_TYPE_UNSPECIFIED",
              "WORKSPACE_TOKEN_KEY_TYPE_SECRET",
              "WORKSPACE_TOKEN_KEY_TYPE_PUBLISHABLE"
            ],
            "readOnly": true,
            "title": "The key type of the token (secret or publishable)"
          },
          "lastUsedAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "The timestamp when the token was last used",
            "type": "string"
          },
          "name": {
            "example": "Production token",
            "title": "The name of the token",
            "type": "string"
          },
          "scopes": {
            "description": "The scopes the token holds. With full access, every scope that exists today.",
            "items": {
              "description": "ApiScope is one permission an API token or OAuth grant can hold.\n\nA write scope also grants the read scope of the same resource.\n\n - API_SCOPE_UNSPECIFIED: Not a scope. Rejected wherever a scope is expected.\n - API_SCOPE_LINKS_READ: Read links, their QR code images, tags, folders and link settings.\n - API_SCOPE_LINKS_WRITE: Create, update and delete links, tags, folders and link settings.\n - API_SCOPE_WORKFLOWS_READ: Read the workflow steps behind a link and validate them.\n - API_SCOPE_WORKFLOWS_WRITE: Create, connect, update, lay out and delete workflow steps.\n - API_SCOPE_QRCODES_READ: Read QR code designs and QR code templates.\n - API_SCOPE_QRCODES_WRITE: Change QR code designs and create, publish and delete QR code templates.\n - API_SCOPE_PAGE_THEMES_READ: Read page themes and page theme templates.\n - API_SCOPE_PAGE_THEMES_WRITE: Change page themes and create, publish and delete page theme templates.\n - API_SCOPE_MEDIA_READ: Read uploaded media.\n - API_SCOPE_MEDIA_WRITE: Upload and delete media.\n - API_SCOPE_DOMAINS_READ: Read custom domains and their DNS instructions.\n - API_SCOPE_DOMAINS_WRITE: Add, verify, update and delete custom domains.\n - API_SCOPE_VISITORS_READ: Read and search visitors and their attributes.\n - API_SCOPE_VISITORS_WRITE: Identify, update and delete visitors and their attributes.\n - API_SCOPE_ANALYTICS_READ: Read events, metrics, time series, analytics data and dashboards.\n - API_SCOPE_ANALYTICS_WRITE: Create, update and delete analytics dashboards and generate widget summaries.\n - API_SCOPE_WEBHOOKS_READ: Read webhooks.\n - API_SCOPE_WEBHOOKS_WRITE: Create, update and delete webhooks.\n - API_SCOPE_INTEGRATIONS_READ: Read the Slack and Google Forms integrations.\n - API_SCOPE_INTEGRATIONS_WRITE: Connect, configure, test, sync and disconnect the Slack and Google Forms integrations.\n - API_SCOPE_WORKSPACE_READ: Read the workspace and its settings.\n - API_SCOPE_WORKSPACE_WRITE: Update the workspace, request enrollment and delete the workspace.\n - API_SCOPE_MEMBERS_READ: Read workspace members.\n - API_SCOPE_MEMBERS_WRITE: Update, revoke, sign out and remove members. Inviting a member or changing a sign-in email or password needs full access.\n - API_SCOPE_TOKENS_READ: Read API tokens and their scopes, never their secrets.\n - API_SCOPE_TOKENS_WRITE: Create, update and delete API tokens, limited to the scopes the calling token holds.\n - API_SCOPE_BILLING_WRITE: Open checkout, credit top-up and billing portal sessions.\n - API_SCOPE_ASSISTANT_READ: Read the Assistant conversation.\n - API_SCOPE_ASSISTANT_WRITE: Send files to the Assistant, clear the conversation and contact support.",
              "enum": [
                "API_SCOPE_UNSPECIFIED",
                "API_SCOPE_LINKS_READ",
                "API_SCOPE_LINKS_WRITE",
                "API_SCOPE_WORKFLOWS_READ",
                "API_SCOPE_WORKFLOWS_WRITE",
                "API_SCOPE_QRCODES_READ",
                "API_SCOPE_QRCODES_WRITE",
                "API_SCOPE_PAGE_THEMES_READ",
                "API_SCOPE_PAGE_THEMES_WRITE",
                "API_SCOPE_MEDIA_READ",
                "API_SCOPE_MEDIA_WRITE",
                "API_SCOPE_DOMAINS_READ",
                "API_SCOPE_DOMAINS_WRITE",
                "API_SCOPE_VISITORS_READ",
                "API_SCOPE_VISITORS_WRITE",
                "API_SCOPE_ANALYTICS_READ",
                "API_SCOPE_ANALYTICS_WRITE",
                "API_SCOPE_WEBHOOKS_READ",
                "API_SCOPE_WEBHOOKS_WRITE",
                "API_SCOPE_INTEGRATIONS_READ",
                "API_SCOPE_INTEGRATIONS_WRITE",
                "API_SCOPE_WORKSPACE_READ",
                "API_SCOPE_WORKSPACE_WRITE",
                "API_SCOPE_MEMBERS_READ",
                "API_SCOPE_MEMBERS_WRITE",
                "API_SCOPE_TOKENS_READ",
                "API_SCOPE_TOKENS_WRITE",
                "API_SCOPE_BILLING_WRITE",
                "API_SCOPE_ASSISTANT_READ",
                "API_SCOPE_ASSISTANT_WRITE"
              ]
            },
            "readOnly": true,
            "type": "array"
          },
          "support": {
            "description": "True when Linkbreakers support issued the token to act on the workspace.\nIts calls do not count toward the workspace's API usage. Delete it to\nrevoke support's access.",
            "readOnly": true,
            "type": "boolean"
          },
          "updatedAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "The timestamp when the token was last updated",
            "type": "string"
          },
          "workspaceId": {
            "example": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0",
            "title": "The workspace ID the token belongs to (UUID)",
            "type": "string"
          }
        },
        "title": "WorkspaceToken",
        "type": "object"
      },
      "WorkspaceTokenKeyType": {
        "default": "WORKSPACE_TOKEN_KEY_TYPE_UNSPECIFIED",
        "description": "- WORKSPACE_TOKEN_KEY_TYPE_UNSPECIFIED: Default value (should not be used)\n - WORKSPACE_TOKEN_KEY_TYPE_SECRET: Secret key with full API access\n - WORKSPACE_TOKEN_KEY_TYPE_PUBLISHABLE: Publishable key with limited access",
        "enum": [
          "WORKSPACE_TOKEN_KEY_TYPE_UNSPECIFIED",
          "WORKSPACE_TOKEN_KEY_TYPE_SECRET",
          "WORKSPACE_TOKEN_KEY_TYPE_PUBLISHABLE"
        ],
        "title": "WorkspaceTokenKeyType defines the access level of a workspace token",
        "type": "string"
      },
      "WorkspaceTokensServiceUpdateBody": {
        "description": "UpdateWorkspaceTokenRequest renames a token or changes what it may access.",
        "properties": {
          "fullAccess": {
            "description": "Set to true to give the token full access again. Cannot be combined with scopes.",
            "type": "boolean"
          },
          "name": {
            "description": "New name for the token. Left unchanged when omitted.",
            "type": "string"
          },
          "scopes": {
            "description": "Replace the token's scopes with these. Cannot be combined with full_access.",
            "items": {
              "description": "ApiScope is one permission an API token or OAuth grant can hold.\n\nA write scope also grants the read scope of the same resource.\n\n - API_SCOPE_UNSPECIFIED: Not a scope. Rejected wherever a scope is expected.\n - API_SCOPE_LINKS_READ: Read links, their QR code images, tags, folders and link settings.\n - API_SCOPE_LINKS_WRITE: Create, update and delete links, tags, folders and link settings.\n - API_SCOPE_WORKFLOWS_READ: Read the workflow steps behind a link and validate them.\n - API_SCOPE_WORKFLOWS_WRITE: Create, connect, update, lay out and delete workflow steps.\n - API_SCOPE_QRCODES_READ: Read QR code designs and QR code templates.\n - API_SCOPE_QRCODES_WRITE: Change QR code designs and create, publish and delete QR code templates.\n - API_SCOPE_PAGE_THEMES_READ: Read page themes and page theme templates.\n - API_SCOPE_PAGE_THEMES_WRITE: Change page themes and create, publish and delete page theme templates.\n - API_SCOPE_MEDIA_READ: Read uploaded media.\n - API_SCOPE_MEDIA_WRITE: Upload and delete media.\n - API_SCOPE_DOMAINS_READ: Read custom domains and their DNS instructions.\n - API_SCOPE_DOMAINS_WRITE: Add, verify, update and delete custom domains.\n - API_SCOPE_VISITORS_READ: Read and search visitors and their attributes.\n - API_SCOPE_VISITORS_WRITE: Identify, update and delete visitors and their attributes.\n - API_SCOPE_ANALYTICS_READ: Read events, metrics, time series, analytics data and dashboards.\n - API_SCOPE_ANALYTICS_WRITE: Create, update and delete analytics dashboards and generate widget summaries.\n - API_SCOPE_WEBHOOKS_READ: Read webhooks.\n - API_SCOPE_WEBHOOKS_WRITE: Create, update and delete webhooks.\n - API_SCOPE_INTEGRATIONS_READ: Read the Slack and Google Forms integrations.\n - API_SCOPE_INTEGRATIONS_WRITE: Connect, configure, test, sync and disconnect the Slack and Google Forms integrations.\n - API_SCOPE_WORKSPACE_READ: Read the workspace and its settings.\n - API_SCOPE_WORKSPACE_WRITE: Update the workspace, request enrollment and delete the workspace.\n - API_SCOPE_MEMBERS_READ: Read workspace members.\n - API_SCOPE_MEMBERS_WRITE: Update, revoke, sign out and remove members. Inviting a member or changing a sign-in email or password needs full access.\n - API_SCOPE_TOKENS_READ: Read API tokens and their scopes, never their secrets.\n - API_SCOPE_TOKENS_WRITE: Create, update and delete API tokens, limited to the scopes the calling token holds.\n - API_SCOPE_BILLING_WRITE: Open checkout, credit top-up and billing portal sessions.\n - API_SCOPE_ASSISTANT_READ: Read the Assistant conversation.\n - API_SCOPE_ASSISTANT_WRITE: Send files to the Assistant, clear the conversation and contact support.",
              "enum": [
                "API_SCOPE_UNSPECIFIED",
                "API_SCOPE_LINKS_READ",
                "API_SCOPE_LINKS_WRITE",
                "API_SCOPE_WORKFLOWS_READ",
                "API_SCOPE_WORKFLOWS_WRITE",
                "API_SCOPE_QRCODES_READ",
                "API_SCOPE_QRCODES_WRITE",
                "API_SCOPE_PAGE_THEMES_READ",
                "API_SCOPE_PAGE_THEMES_WRITE",
                "API_SCOPE_MEDIA_READ",
                "API_SCOPE_MEDIA_WRITE",
                "API_SCOPE_DOMAINS_READ",
                "API_SCOPE_DOMAINS_WRITE",
                "API_SCOPE_VISITORS_READ",
                "API_SCOPE_VISITORS_WRITE",
                "API_SCOPE_ANALYTICS_READ",
                "API_SCOPE_ANALYTICS_WRITE",
                "API_SCOPE_WEBHOOKS_READ",
                "API_SCOPE_WEBHOOKS_WRITE",
                "API_SCOPE_INTEGRATIONS_READ",
                "API_SCOPE_INTEGRATIONS_WRITE",
                "API_SCOPE_WORKSPACE_READ",
                "API_SCOPE_WORKSPACE_WRITE",
                "API_SCOPE_MEMBERS_READ",
                "API_SCOPE_MEMBERS_WRITE",
                "API_SCOPE_TOKENS_READ",
                "API_SCOPE_TOKENS_WRITE",
                "API_SCOPE_BILLING_WRITE",
                "API_SCOPE_ASSISTANT_READ",
                "API_SCOPE_ASSISTANT_WRITE"
              ]
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "apiTag": {
        "description": "Provides lightweight segmentation metadata Linkbreakers attaches to links and analytics so teams can group campaigns\nand filter dashboards.",
        "externalDocs": {
          "description": "Learn more about tags in Linkbreakers.",
          "url": "https://linkbreakers.com/help/article/what-is-a-tag"
        },
        "properties": {
          "createdAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "When the tag was created",
            "type": "string"
          },
          "id": {
            "example": "d87a9b30-5c8b-4d4e-9fd3-5f5f5f5f5f5f",
            "title": "The unique identifier of the tag (UUID)",
            "type": "string"
          },
          "name": {
            "title": "The name of the tag",
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "readOnly": true,
            "title": "When the tag was last updated",
            "type": "string"
          }
        },
        "title": "Tag",
        "type": "object"
      },
      "googlerpcStatus": {
        "properties": {
          "code": {
            "format": "int32",
            "type": "integer"
          },
          "details": {
            "items": {
              "$ref": "#/components/schemas/protobufAny",
              "type": "object"
            },
            "type": "array"
          },
          "message": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "protobufAny": {
        "additionalProperties": {},
        "properties": {
          "@type": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "protobufNullValue": {
        "default": "NULL_VALUE",
        "description": "`NullValue` is a singleton enumeration to represent the null value for the\n`Value` type union.\n\nThe JSON representation for `NullValue` is JSON `null`.\n\n - NULL_VALUE: Null value.",
        "enum": [
          "NULL_VALUE"
        ],
        "type": "string"
      },
      "typeDate": {
        "description": "* A full date, with non-zero year, month, and day values\n* A month and day value, with a zero year, such as an anniversary\n* A year on its own, with zero month and day values\n* A year and month value, with a zero day, such as a credit card expiration\ndate\n\nRelated types are [google.type.TimeOfDay][google.type.TimeOfDay] and\n`google.protobuf.Timestamp`.",
        "properties": {
          "day": {
            "description": "Day of a month. Must be from 1 to 31 and valid for the year and month, or 0\nto specify a year by itself or a year and month where the day isn't\nsignificant.",
            "format": "int32",
            "type": "integer"
          },
          "month": {
            "description": "Month of a year. Must be from 1 to 12, or 0 to specify a year without a\nmonth and day.",
            "format": "int32",
            "type": "integer"
          },
          "year": {
            "description": "Year of the date. Must be from 1 to 9999, or 0 to specify a date without\na year.",
            "format": "int32",
            "type": "integer"
          }
        },
        "title": "Represents a whole or partial calendar date, such as a birthday. The time of\nday and time zone are either specified elsewhere or are insignificant. The\ndate is relative to the Gregorian Calendar. This can represent one of the\nfollowing:",
        "type": "object"
      }
    },
    "securitySchemes": {
      "bearerAuth": {
        "bearerFormat": "JWT",
        "description": "JWT Bearer token authentication. Use a workspace API token obtained from the Linkbreakers dashboard. When using the SDK, pass this token to the `accessToken` field in the Configuration constructor (not `apiKey`). A token has full access or a list of scopes; each operation lists the one scope it requires, and a write scope also grants the read scope of the same resource. GET /v1/api-scopes lists every scope.",
        "scheme": "bearer",
        "type": "http"
      },
      "oauth2": {
        "description": "OAuth 2.0 authorization code flow with PKCE and dynamic client registration. Request only the scopes you need. The scope names are the same ones workspace API tokens hold.",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://mcp.linkbreakers.com/oauth/authorize",
            "refreshUrl": "https://mcp.linkbreakers.com/oauth/token",
            "scopes": {
              "analytics:read": "Read events, metrics, time series, analytics data and dashboards.",
              "analytics:write": "Create, update and delete analytics dashboards and generate widget summaries.",
              "assistant:read": "Read the Assistant conversation.",
              "assistant:write": "Send files to the Assistant, clear the conversation and contact support.",
              "billing:write": "Open checkout, credit top-up and billing portal sessions.",
              "domains:read": "Read custom domains and their DNS instructions.",
              "domains:write": "Add, verify, update and delete custom domains.",
              "integrations:read": "Read the Slack and Google Forms integrations.",
              "integrations:write": "Connect, configure, test, sync and disconnect the Slack and Google Forms integrations.",
              "links:read": "Read links, their QR code images, tags, folders and link settings.",
              "links:write": "Create, update and delete links, tags, folders and link settings.",
              "mcp:tools": "Full access, including scopes added later.",
              "media:read": "Read uploaded media.",
              "media:write": "Upload and delete media.",
              "members:read": "Read workspace members.",
              "members:write": "Update, revoke, sign out and remove members. Inviting a member or changing a sign-in email or password needs full access.",
              "page_themes:read": "Read page themes and page theme templates.",
              "page_themes:write": "Change page themes and create, publish and delete page theme templates.",
              "qrcodes:read": "Read QR code designs and QR code templates.",
              "qrcodes:write": "Change QR code designs and create, publish and delete QR code templates.",
              "tokens:read": "Read API tokens and their scopes, never their secrets.",
              "tokens:write": "Create, update and delete API tokens, limited to the scopes the calling token holds.",
              "visitors:read": "Read and search visitors and their attributes.",
              "visitors:write": "Identify, update and delete visitors and their attributes.",
              "webhooks:read": "Read webhooks.",
              "webhooks:write": "Create, update and delete webhooks.",
              "workflows:read": "Read the workflow steps behind a link and validate them.",
              "workflows:write": "Create, connect, update, lay out and delete workflow steps.",
              "workspace:read": "Read the workspace and its settings.",
              "workspace:write": "Update the workspace, request enrollment and delete the workspace."
            },
            "tokenUrl": "https://mcp.linkbreakers.com/oauth/token"
          }
        },
        "type": "oauth2"
      }
    }
  },
  "info": {
    "contact": {
      "name": "Linkbreakers Support",
      "url": "https://app.linkbreakers.com"
    },
    "description": "This is a documentation of all the APIs of Linkbreakers\n\n## Entry points\n\n`GET https://api.linkbreakers.com/` and `GET https://api.linkbreakers.com/v1` answer without credentials with the API's name, version and links. This document is served at `https://api.linkbreakers.com/openapi.json`.\n\n## Rate limits\n\nEvery response describes where the caller stands in the IETF `RateLimit-Policy` and `RateLimit` header fields (draft-ietf-httpapi-ratelimit-headers), and in `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset` and `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` (a Unix timestamp) for clients that read those. A request past the limit gets `429 Too Many Requests` with `Retry-After` in seconds.\n\n- Workspace API token: 600 requests per 60 seconds, per token.\n- Dashboard session or OAuth token: 500 requests per 60 seconds, per token.\n- No credentials: 300 requests per 60 seconds, per client IP.\n\nEach plan also includes a number of API calls per billing cycle. Past it, calls answer `429` with the code `MAX_PUBLIC_API_QUERIED_REACHED` until the cycle renews or the plan changes.\n\n## Pagination\n\nEvery list pages with opaque cursors (AIP-158). Pass `pageSize`, then send the `nextPageToken` of each response back as `pageToken` (or its alias `cursor`) to get the next page. An empty or absent `nextPageToken` means the list is complete. Each list operation describes this in `x-pagination`.\n\n## Batches and background jobs\n\n`POST /v1/links/bulk` creates up to 250 links in one transactional request; `POST /v1/links/batch` takes the same links as a bare JSON array. `POST /v1/links/bulk/jobs` accepts the same batch and answers `202 Accepted` at once with a job and a `Location` header; poll `GET /v1/jobs/{id}` until `status` is `JOB_STATUS_SUCCEEDED` (the created link ids are in `linksBulkCreate.linkIds`) or `JOB_STATUS_FAILED` (`error` says why, and nothing was created). Jobs can be read for 24 hours after they finish.\n\n## Versioning and deprecation\n\nThe version is in the path: every operation lives under `/v1`. Within a version, changes are additive only: new operations, new optional request fields, new response fields and new enum values. Clients should ignore fields and enum values they do not know. Anything that would break an existing client ships under a new path version instead.\n\nAn operation is retired in two steps. First it is deprecated: it keeps working, is flagged `deprecated: true` in this document, and every response carries a `Deprecation` header field (RFC 9745) with the time it was deprecated and a `Link` with `rel=\"deprecation\"` to the policy. Then, at least 180 days later, it may be removed; that date is announced in advance in a `Sunset` header field (RFC 8594) and as `x-sunset` on the operation. The full policy: https://linkbreakers.com/help/article/api-versioning-and-deprecation-policy\n\n## Idempotent retries\n\nEvery POST, PUT and PATCH accepts an optional `Idempotency-Key` header (draft-ietf-httpapi-idempotency-key-header). Send a new unique value, such as a UUID, with each logical request and reuse it only to retry that request. A retry with the same key and the same request returns the first response, marked `Idempotent-Replayed: true`, instead of running again. Keys are scoped to the token and kept for 24 hours. The same key with a different request is refused with `422`, and a retry while the first request is still running gets `409` with `Retry-After`. Server errors (5xx) and refusals such as 401, 403 and 429 are not stored, so retrying them runs the request again.",
    "title": "Linkbreakers API",
    "version": "1.182.0",
    "x-api-versioning": {
      "compatibility": "additive changes only within a version",
      "currentVersion": "v1",
      "deprecationHeaders": [
        "Deprecation",
        "Sunset",
        "Link"
      ],
      "minimumNoticeDays": 180,
      "policy": "https://linkbreakers.com/help/article/api-versioning-and-deprecation-policy",
      "strategy": "url-path"
    }
  },
  "jsonSchemaDialect": "https://spec.openapis.org/oas/3.2/dialect/2025-09-17",
  "openapi": "3.2.0",
  "paths": {
    "/v1/agent-identity/claim/complete": {
      "post": {
        "description": "Check the code the agent handed over, attach the claim email with a password or a Google or Microsoft sign-in to the agent's workspace, and sign in. The email must not already have a Linkbreakers account. Afterwards the agent's token keeps working in the claimed workspace, and the agent can fetch a token with wider scopes from the claim grant.",
        "operationId": "AgentIdentityService_ClaimAgentWorkspace",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClaimAgentWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Member"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [],
        "summary": "Claim an agent's workspace",
        "tags": [
          "Agent Identity"
        ]
      }
    },
    "/v1/agent-identity/claim/lookup": {
      "post": {
        "description": "Return the email a claim link is bound to, whether it can still be used, and what the agent may do once the workspace is claimed. The claim_attempt_token is the secret: anyone holding it and the code can claim.",
        "operationId": "AgentIdentityService_GetAgentClaim",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetAgentClaimRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentClaim"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [],
        "summary": "Read an agent claim link",
        "tags": [
          "Agent Identity"
        ]
      }
    },
    "/v1/allowances": {
      "get": {
        "description": "Return every limit the workspace's plan sets with what has been used in the current cycle, when it resets and whether it has been reached.\n\nRequires the `workspace:read` scope.",
        "operationId": "AllowancesService_ListAllowances",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListAllowancesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workspace:read"
            ]
          },
          {
            "oauth2": [
              "workspace:read"
            ]
          }
        ],
        "summary": "List allowances",
        "tags": [
          "Allowances"
        ],
        "x-required-scope": "workspace:read"
      }
    },
    "/v1/allowances/dismiss": {
      "post": {
        "description": "Hide the over-limit notice for one limit, for the calling member, until the limit's next cycle. Only a member can dismiss; an API token gets a permission error.\n\nRequires the `workspace:write` scope.",
        "operationId": "AllowancesService_DismissAllowanceNotice",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DismissAllowanceNoticeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {},
                  "type": "object"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workspace:write"
            ]
          },
          {
            "oauth2": [
              "workspace:write"
            ]
          }
        ],
        "summary": "Dismiss an allowance notice",
        "tags": [
          "Allowances"
        ],
        "x-required-scope": "workspace:write"
      }
    },
    "/v1/analytics/attributes/distribution": {
      "post": {
        "description": "Returns how visitors are spread across the values of one attribute, for example how many gave each rating.\n\nRequires the `analytics:read` scope.",
        "operationId": "AnalyticsDataService_GetAttributeDistribution",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetAttributeDistributionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetAttributeDistributionResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "Get visitor attribute distribution",
        "tags": [
          "Analytics Data"
        ],
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/analytics/attributes/metric": {
      "post": {
        "description": "Returns count, average, minimum and maximum for a visitor attribute, plus how much of the audience carries it.\n\nRequires the `analytics:read` scope.",
        "operationId": "AnalyticsDataService_GetAttributeMetric",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetAttributeMetricRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetAttributeMetricResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "Get visitor attribute metric",
        "tags": [
          "Analytics Data"
        ],
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/analytics/attributes/values": {
      "post": {
        "description": "Returns the individual recorded values of one attribute, most recent first. Intended for free text such as comments.\n\nRequires the `analytics:read` scope.",
        "operationId": "AnalyticsDataService_GetAttributeValues",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetAttributeValuesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetAttributeValuesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "List visitor attribute values",
        "tags": [
          "Analytics Data"
        ],
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/analytics/breakdown": {
      "post": {
        "description": "Returns a ranked breakdown of events by any dimension (browser, platform, device type, country, city, visit type).\n\nRequires the `analytics:read` scope.",
        "operationId": "AnalyticsDataService_GetBreakdown",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetBreakdownRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetBreakdownResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "Get dimension breakdown",
        "tags": [
          "Analytics Data"
        ],
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/analytics/dashboards": {
      "get": {
        "description": "Requires the `analytics:read` scope.",
        "operationId": "AnalyticsDashboardService_ListDashboards",
        "parameters": [
          {
            "description": "Restricts the result to the dashboard scoped to this link.\nTakes precedence over scope when both are set.",
            "in": "query",
            "name": "linkId",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "default": "DASHBOARD_SCOPE_UNSPECIFIED",
            "description": "Restricts the result by scope. Unset returns every dashboard.\n\n - DASHBOARD_SCOPE_UNSPECIFIED: Every dashboard in the workspace, link-scoped or not.\n - DASHBOARD_SCOPE_WORKSPACE: Only the workspace-wide dashboard, the one with no link.\n - DASHBOARD_SCOPE_LINK: Only dashboards tied to a link.",
            "enum": [
              "DASHBOARD_SCOPE_UNSPECIFIED",
              "DASHBOARD_SCOPE_WORKSPACE",
              "DASHBOARD_SCOPE_LINK"
            ],
            "in": "query",
            "name": "scope",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Maximum number to return. Defaults to 100, capped at 1000.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Cursor from a previous response's next_page_token. Empty starts at the\nfirst page. Pages are ordered by (created_at, id), which never change, so a\nrecord cannot move between pages while a client is walking them.",
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListDashboardsResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "List analytics dashboards",
        "tags": [
          "Analytics Dashboard"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        },
        "x-required-scope": "analytics:read"
      },
      "post": {
        "description": "Requires the `analytics:write` scope.",
        "operationId": "AnalyticsDashboardService_CreateDashboard",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateDashboardRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateDashboardResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:write"
            ]
          },
          {
            "oauth2": [
              "analytics:write"
            ]
          }
        ],
        "summary": "Create analytics dashboard",
        "tags": [
          "Analytics Dashboard"
        ],
        "x-required-scope": "analytics:write"
      }
    },
    "/v1/analytics/dashboards/{dashboardId}/widgets/{widgetId}/summary": {
      "get": {
        "description": "Returns the last generated analysis, and whether the underlying values have changed since.\n\nRequires the `analytics:read` scope.",
        "operationId": "AnalyticsDashboardService_GetWidgetSummary",
        "parameters": [
          {
            "in": "path",
            "name": "dashboardId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "widgetId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetWidgetSummaryResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "Get a stored widget assistant summary",
        "tags": [
          "Analytics Dashboard"
        ],
        "x-required-scope": "analytics:read"
      },
      "post": {
        "description": "Analyses the widget's current values and stores the result. Consumes platform credits, so it runs only when requested.\n\nRequires the `analytics:write` scope.",
        "operationId": "AnalyticsDashboardService_GenerateWidgetSummary",
        "parameters": [
          {
            "description": "Dashboard holding the widget",
            "in": "path",
            "name": "dashboardId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Widget whose values should be analysed",
            "in": "path",
            "name": "widgetId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnalyticsDashboardServiceGenerateWidgetSummaryBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenerateWidgetSummaryResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:write"
            ]
          },
          {
            "oauth2": [
              "analytics:write"
            ]
          }
        ],
        "summary": "Generate a widget assistant summary",
        "tags": [
          "Analytics Dashboard"
        ],
        "x-required-scope": "analytics:write"
      }
    },
    "/v1/analytics/dashboards/{id}": {
      "delete": {
        "description": "Delete a dashboard and its associated assistant conversation.\n\nRequires the `analytics:write` scope.",
        "operationId": "AnalyticsDashboardService_DeleteDashboard",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeleteDashboardResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:write"
            ]
          },
          {
            "oauth2": [
              "analytics:write"
            ]
          }
        ],
        "summary": "Delete analytics dashboard",
        "tags": [
          "Analytics Dashboard"
        ],
        "x-required-scope": "analytics:write"
      },
      "put": {
        "description": "Requires the `analytics:write` scope.",
        "operationId": "AnalyticsDashboardService_UpdateDashboard",
        "parameters": [
          {
            "description": "ID of the dashboard to update.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnalyticsDashboardServiceUpdateDashboardBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateDashboardResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:write"
            ]
          },
          {
            "oauth2": [
              "analytics:write"
            ]
          }
        ],
        "summary": "Update analytics dashboard",
        "tags": [
          "Analytics Dashboard"
        ],
        "x-required-scope": "analytics:write"
      }
    },
    "/v1/analytics/devices": {
      "post": {
        "description": "Retrieve event distribution across device types.\n\nRequires the `analytics:read` scope.",
        "operationId": "AnalyticsDataService_GetDeviceDistribution",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetDeviceDistributionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetDeviceDistributionResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "Get device distribution",
        "tags": [
          "Analytics Data"
        ],
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/analytics/funnel": {
      "post": {
        "description": "Returns the workflow steps visitors reached, in distinct visitors, ordered from arrival to exit, with the conversion rate and drop-off at each step.\n\nRequires the `analytics:read` scope.",
        "operationId": "AnalyticsDataService_GetStepFunnel",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetStepFunnelRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetStepFunnelResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "Get workflow step funnel",
        "tags": [
          "Analytics Data"
        ],
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/analytics/geo": {
      "post": {
        "description": "Retrieve geographic distribution of events grouped by country or city.\n\nRequires the `analytics:read` scope.",
        "operationId": "AnalyticsDataService_GetGeoBreakdown",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetGeoBreakdownRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetGeoBreakdownResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "Get geographic breakdown",
        "tags": [
          "Analytics Data"
        ],
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/analytics/hours": {
      "post": {
        "description": "Retrieve event counts aggregated by hour of day for identifying peak activity times.\n\nRequires the `analytics:read` scope.",
        "operationId": "AnalyticsDataService_GetHourOfDayDistribution",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetHourOfDayDistributionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetHourOfDayDistributionResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "Get hour of day distribution",
        "tags": [
          "Analytics Data"
        ],
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/analytics/timeseries": {
      "post": {
        "description": "Retrieve time-bucketed event counts grouped by a dimension like country, city, device type, or visit type.\n\nRequires the `analytics:read` scope.",
        "operationId": "AnalyticsDataService_GetGroupedTimeSeries",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetGroupedTimeSeriesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetGroupedTimeSeriesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "Get grouped time series",
        "tags": [
          "Analytics Data"
        ],
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/analytics/top-links": {
      "post": {
        "description": "Retrieve links ranked by event count for identifying best performing QR codes and links.\n\nRequires the `analytics:read` scope.",
        "operationId": "AnalyticsDataService_GetTopLinks",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetTopLinksRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetTopLinksResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "Get top performing links",
        "tags": [
          "Analytics Data"
        ],
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/analytics/visitors": {
      "post": {
        "description": "Retrieve new vs returning visitor counts over time.\n\nRequires the `analytics:read` scope.",
        "operationId": "AnalyticsDataService_GetVisitorTrends",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetVisitorTrendsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetVisitorTrendsResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "Get visitor trends",
        "tags": [
          "Analytics Data"
        ],
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/api-scopes": {
      "get": {
        "description": "List every scope an API token or OAuth grant can hold, with the resource it covers and what it allows. Needs no authentication.",
        "operationId": "WorkspaceTokensService_ListApiScopes",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListApiScopesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [],
        "summary": "List API scopes",
        "tags": [
          "API Scopes"
        ]
      }
    },
    "/v1/assistant/conversation": {
      "delete": {
        "description": "Clear the conversation history for a specific context.\n\nRequires the `assistant:write` scope.",
        "operationId": "AssistantService_ClearConversation",
        "parameters": [
          {
            "default": "ASSISTANT_CONTEXT_TYPE_UNSPECIFIED",
            "description": " - ASSISTANT_CONTEXT_TYPE_LINK_ANALYTICS: Building a link's analytics dashboard. context_id is the LINK id, not a\ndashboard id — the dashboard does not exist yet while the user and the\nassistant are still agreeing on what it should show. Once it exists,\nediting it happens under ASSISTANT_CONTEXT_TYPE_ANALYTICS_DASHBOARD instead.\n - ASSISTANT_CONTEXT_TYPE_WORKSPACE: The workspace-wide assistant, with no resource selected. The context id is\nthe WORKSPACE id: this thread is not about any one link, dashboard or\ndesign, and every capability the resource-scoped assistants have is available\nfrom it. One conversation per workspace, so it survives navigation.",
            "enum": [
              "ASSISTANT_CONTEXT_TYPE_UNSPECIFIED",
              "ASSISTANT_CONTEXT_TYPE_ANALYTICS_DASHBOARD",
              "ASSISTANT_CONTEXT_TYPE_WORKFLOW",
              "ASSISTANT_CONTEXT_TYPE_LINK",
              "ASSISTANT_CONTEXT_TYPE_QRCODE_DESIGN",
              "ASSISTANT_CONTEXT_TYPE_PAGE_THEME",
              "ASSISTANT_CONTEXT_TYPE_LINK_ANALYTICS",
              "ASSISTANT_CONTEXT_TYPE_WORKSPACE"
            ],
            "in": "query",
            "name": "contextType",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "contextId",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssistantClearConversationResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "assistant:write"
            ]
          },
          {
            "oauth2": [
              "assistant:write"
            ]
          }
        ],
        "summary": "Clear assistant conversation",
        "tags": [
          "Assistant"
        ],
        "x-required-scope": "assistant:write"
      },
      "get": {
        "description": "Get the display-ready chat history for a specific context.\n\nRequires the `assistant:read` scope.",
        "operationId": "AssistantService_GetConversation",
        "parameters": [
          {
            "default": "ASSISTANT_CONTEXT_TYPE_UNSPECIFIED",
            "description": " - ASSISTANT_CONTEXT_TYPE_LINK_ANALYTICS: Building a link's analytics dashboard. context_id is the LINK id, not a\ndashboard id — the dashboard does not exist yet while the user and the\nassistant are still agreeing on what it should show. Once it exists,\nediting it happens under ASSISTANT_CONTEXT_TYPE_ANALYTICS_DASHBOARD instead.\n - ASSISTANT_CONTEXT_TYPE_WORKSPACE: The workspace-wide assistant, with no resource selected. The context id is\nthe WORKSPACE id: this thread is not about any one link, dashboard or\ndesign, and every capability the resource-scoped assistants have is available\nfrom it. One conversation per workspace, so it survives navigation.",
            "enum": [
              "ASSISTANT_CONTEXT_TYPE_UNSPECIFIED",
              "ASSISTANT_CONTEXT_TYPE_ANALYTICS_DASHBOARD",
              "ASSISTANT_CONTEXT_TYPE_WORKFLOW",
              "ASSISTANT_CONTEXT_TYPE_LINK",
              "ASSISTANT_CONTEXT_TYPE_QRCODE_DESIGN",
              "ASSISTANT_CONTEXT_TYPE_PAGE_THEME",
              "ASSISTANT_CONTEXT_TYPE_LINK_ANALYTICS",
              "ASSISTANT_CONTEXT_TYPE_WORKSPACE"
            ],
            "in": "query",
            "name": "contextType",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "contextId",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssistantGetConversationResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "assistant:read"
            ]
          },
          {
            "oauth2": [
              "assistant:read"
            ]
          }
        ],
        "summary": "Get assistant conversation",
        "tags": [
          "Assistant"
        ],
        "x-required-scope": "assistant:read"
      }
    },
    "/v1/assistant/conversation/read": {
      "post": {
        "description": "Record that the member has seen every assistant reply in this conversation. Call it when the thread is actually on screen, not when history is fetched.\n\nRequires the `assistant:write` scope.",
        "operationId": "AssistantService_MarkConversationRead",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssistantMarkConversationReadRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssistantMarkConversationReadResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "assistant:write"
            ]
          },
          {
            "oauth2": [
              "assistant:write"
            ]
          }
        ],
        "summary": "Mark assistant conversation read",
        "tags": [
          "Assistant"
        ],
        "x-required-scope": "assistant:write"
      }
    },
    "/v1/assistant/upload": {
      "post": {
        "description": "Upload a small file, base64 encoded, to attach to the next assistant message. Returns a temporary file ID. Larger files go through CreateAttachmentUpload.\n\nRequires the `assistant:write` scope.",
        "operationId": "AssistantService_UploadFile",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssistantUploadFileRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssistantUploadFileResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "assistant:write"
            ]
          },
          {
            "oauth2": [
              "assistant:write"
            ]
          }
        ],
        "summary": "Upload file for assistant chat",
        "tags": [
          "Assistant"
        ],
        "x-required-scope": "assistant:write"
      }
    },
    "/v1/assistant/uploads": {
      "post": {
        "description": "Reserve an attachment of up to 50 MB and get a presigned upload_url to PUT its bytes to, then call CompleteAttachmentUpload.\n\nRequires the `assistant:write` scope.",
        "operationId": "AssistantService_CreateAttachmentUpload",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssistantCreateAttachmentUploadRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssistantCreateAttachmentUploadResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "assistant:write"
            ]
          },
          {
            "oauth2": [
              "assistant:write"
            ]
          }
        ],
        "summary": "Start a direct attachment upload",
        "tags": [
          "Assistant"
        ],
        "x-required-scope": "assistant:write"
      }
    },
    "/v1/assistant/uploads/{fileId}:complete": {
      "post": {
        "description": "Check the file PUT to the upload_url and make the attachment ready to send with a message.\n\nRequires the `assistant:write` scope.",
        "operationId": "AssistantService_CompleteAttachmentUpload",
        "parameters": [
          {
            "description": "The attachment's id, from CreateAttachmentUpload",
            "in": "path",
            "name": "fileId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssistantServiceCompleteAttachmentUploadBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssistantCompleteAttachmentUploadResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "assistant:write"
            ]
          },
          {
            "oauth2": [
              "assistant:write"
            ]
          }
        ],
        "summary": "Complete a direct attachment upload",
        "tags": [
          "Assistant"
        ],
        "x-required-scope": "assistant:write"
      }
    },
    "/v1/custom-domains": {
      "get": {
        "description": "Retrieves the custom domains for your workspace\n\nRequires the `domains:read` scope.",
        "operationId": "CustomDomainsService_List",
        "parameters": [
          {
            "default": "STATUS_UNSPECIFIED",
            "description": "Filter by the status of the custom domains to list. Optional.\n\n - STATUS_UNSPECIFIED: The status is not specified\n - STATUS_INACTIVE: The domain is inactive. It was created but not checked yet.\n - STATUS_DOMAIN_PENDING: The domain is pending. Last time it was checked, it was not pointing to the correct Linkbreakers subdomain.\n - STATUS_VERIFICATION_PENDING: The domain is pending verification. Please verify through TXT record.\n - STATUS_CERTIFICATE_PENDING: The domain is pending certificate. The SSL certificate is not yet ready.\n - STATUS_ACTIVE: The domain is fully active\n - STATUS_RENEWAL_PENDING: The domain is still serving traffic on a valid certificate, but the renewal\nof that certificate cannot be validated. It stops working at certificate_expires_at.\n - STATUS_EXPIRED: The certificate expired or was withdrawn. The domain no longer serves HTTPS.",
            "enum": [
              "STATUS_UNSPECIFIED",
              "STATUS_INACTIVE",
              "STATUS_DOMAIN_PENDING",
              "STATUS_VERIFICATION_PENDING",
              "STATUS_CERTIFICATE_PENDING",
              "STATUS_ACTIVE",
              "STATUS_RENEWAL_PENDING",
              "STATUS_EXPIRED"
            ],
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Maximum number of custom domains to return. Defaults to 100, capped at 1000.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Cursor from a previous response's next_page_token. Empty starts at the\nfirst page. Pages are ordered by (created_at, id), which never change, so a\nrecord cannot move between pages while a client is walking them.",
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListCustomDomainsResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "domains:read"
            ]
          },
          {
            "oauth2": [
              "domains:read"
            ]
          }
        ],
        "summary": "List custom domains",
        "tags": [
          "Custom Domains"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        },
        "x-required-scope": "domains:read"
      },
      "post": {
        "description": "This endpoint allows users to register a new custom domain that can be used with their Linkbreakers workspace.\n\nRequires the `domains:write` scope.",
        "operationId": "CustomDomainsService_Create",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateCustomDomainRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateCustomDomainResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "domains:write"
            ]
          },
          {
            "oauth2": [
              "domains:write"
            ]
          }
        ],
        "summary": "Create a custom domain",
        "tags": [
          "Custom Domains"
        ],
        "x-required-scope": "domains:write"
      }
    },
    "/v1/custom-domains/{id}": {
      "delete": {
        "description": "Removes a custom domain from the workspace. This operation cannot be undone.\n\nRequires the `domains:write` scope.",
        "operationId": "CustomDomainsService_Delete",
        "parameters": [
          {
            "description": "The ID of the custom domain to delete (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeleteCustomDomainResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "204": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "Custom domain deleted successfully",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "domains:write"
            ]
          },
          {
            "oauth2": [
              "domains:write"
            ]
          }
        ],
        "summary": "Delete a custom domain",
        "tags": [
          "Custom Domains"
        ],
        "x-required-scope": "domains:write"
      },
      "get": {
        "description": "Retrieves information about a custom domain including its verification status and timestamps.\n\nRequires the `domains:read` scope.",
        "operationId": "CustomDomainsService_Get",
        "parameters": [
          {
            "description": "The ID of the custom domain to retrieve (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetCustomDomainResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "domains:read"
            ]
          },
          {
            "oauth2": [
              "domains:read"
            ]
          }
        ],
        "summary": "Get custom domain details",
        "tags": [
          "Custom Domains"
        ],
        "x-required-scope": "domains:read"
      },
      "patch": {
        "description": "Update settings for a custom domain, such as the root destination URL.\n\nRequires the `domains:write` scope.",
        "operationId": "CustomDomainsService_Update",
        "parameters": [
          {
            "description": "The ID of the custom domain to update (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomDomainsServiceUpdateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateCustomDomainResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "domains:write"
            ]
          },
          {
            "oauth2": [
              "domains:write"
            ]
          }
        ],
        "summary": "Update a custom domain",
        "tags": [
          "Custom Domains"
        ],
        "x-required-scope": "domains:write"
      }
    },
    "/v1/custom-domains/{id}/check": {
      "post": {
        "description": "Check a custom domain by looking up its DNS records and TLS status. This is automatically done when the domain is created. It will update the domain status.\n\nRequires the `domains:write` scope.",
        "operationId": "CustomDomainsService_Check",
        "parameters": [
          {
            "description": "The ID of the custom domain to retrieve (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckCustomDomainResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "domains:write"
            ]
          },
          {
            "oauth2": [
              "domains:write"
            ]
          }
        ],
        "summary": "Check a custom domain",
        "tags": [
          "Custom Domains"
        ],
        "x-required-scope": "domains:write"
      }
    },
    "/v1/custom-domains/{id}/setup-guide": {
      "get": {
        "description": "Detects which DNS provider manages the domain from its nameservers and returns\neverything needed to connect it: the provider's name and a link to its DNS\nsettings, the exact records to add (with the host written the way that\nprovider expects it), provider-specific hints, and a one-click setup URL when\nthe provider supports Domain Connect for Linkbreakers.\n\nRequires the `domains:read` scope.",
        "operationId": "CustomDomainsService_GetSetupGuide",
        "parameters": [
          {
            "description": "The ID of the custom domain (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetCustomDomainSetupGuideResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "domains:read"
            ]
          },
          {
            "oauth2": [
              "domains:read"
            ]
          }
        ],
        "summary": "Get the setup guide for a custom domain",
        "tags": [
          "Custom Domains"
        ],
        "x-required-scope": "domains:read"
      }
    },
    "/v1/custom-domains/{id}/validation_instructions": {
      "get": {
        "description": "Get the instructions for validating a custom domain. There may be a delay before the instructions are available.\n\nRequires the `domains:read` scope.",
        "operationId": "CustomDomainsService_ValidationInstructions",
        "parameters": [
          {
            "description": "The ID of the custom domain to retrieve (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationInstructionsCustomDomainResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "domains:read"
            ]
          },
          {
            "oauth2": [
              "domains:read"
            ]
          }
        ],
        "summary": "Get the validation instructions",
        "tags": [
          "Custom Domains"
        ],
        "x-required-scope": "domains:read"
      }
    },
    "/v1/directories": {
      "get": {
        "description": "List directories in the workspace with optional filtering by parent directory, search, and pagination.\n\nRequires the `links:read` scope.",
        "operationId": "DirectoriesService_List",
        "parameters": [
          {
            "description": "The maximum number of directories to return",
            "in": "query",
            "name": "pageSize",
            "required": true,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "The token for retrieving the next page of results\nIf not provided, the first page of results will be returned",
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Filter directories by parent. When empty, returns root-level directories.",
            "in": "query",
            "name": "parentDirectoryId",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Search query to filter directories by name\n\nSearch query to filter directories by name",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "When listing with parent_directory_id, also include root-level directories if true\n\nWhen listing with parent_directory_id, also include root-level directories.",
            "in": "query",
            "name": "includeRoot",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "When true, returns all directories recursively regardless of parent filter\nUseful for getting a complete flat list of all directories in the workspace (e.g., for directory pickers)\nWhen false (default), returns only immediate children based on parent_directory_id\n\nReturn all directories recursively. When true with empty parent_directory_id, returns all directories in workspace. When true with parent_directory_id set, returns all descendants of that directory.",
            "in": "query",
            "name": "recursive",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListDirectoriesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:read"
            ]
          },
          {
            "oauth2": [
              "links:read"
            ]
          }
        ],
        "summary": "List directories",
        "tags": [
          "Directories"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        },
        "x-required-scope": "links:read"
      },
      "post": {
        "description": "Create a new directory in the workspace. Optionally nest it under an existing directory.\n\nRequires the `links:write` scope.",
        "operationId": "DirectoriesService_Create",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateDirectoryRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateDirectoryResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:write"
            ]
          },
          {
            "oauth2": [
              "links:write"
            ]
          }
        ],
        "summary": "Create a directory",
        "tags": [
          "Directories"
        ],
        "x-required-scope": "links:write"
      }
    },
    "/v1/directories/{id}": {
      "delete": {
        "description": "Remove a directory from the workspace. This operation cannot be undone. A directory cannot be deleted while it still contains links or child directories; move or remove them first.\n\nRequires the `links:write` scope.",
        "operationId": "DirectoriesService_Delete",
        "parameters": [
          {
            "description": "The ID of the directory to delete. The directory must be empty before deletion; if it still contains links or child directories, the request fails.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeleteDirectoryResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "412": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "Directory cannot be deleted because it still contains links or child directories.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:write"
            ]
          },
          {
            "oauth2": [
              "links:write"
            ]
          }
        ],
        "summary": "Delete a directory",
        "tags": [
          "Directories"
        ],
        "x-required-scope": "links:write"
      },
      "get": {
        "description": "Retrieve a directory by its unique identifier.\n\nRequires the `links:read` scope.",
        "operationId": "DirectoriesService_Get",
        "parameters": [
          {
            "description": "The ID of the directory to retrieve (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetDirectoryResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:read"
            ]
          },
          {
            "oauth2": [
              "links:read"
            ]
          }
        ],
        "summary": "Get a directory",
        "tags": [
          "Directories"
        ],
        "x-required-scope": "links:read"
      },
      "patch": {
        "description": "Update a directory's name or move it under a different parent directory.\n\nRequires the `links:write` scope.",
        "operationId": "DirectoriesService_Update",
        "parameters": [
          {
            "description": "The ID of the directory to update (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DirectoriesServiceUpdateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateDirectoryResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:write"
            ]
          },
          {
            "oauth2": [
              "links:write"
            ]
          }
        ],
        "summary": "Update a directory",
        "tags": [
          "Directories"
        ],
        "x-required-scope": "links:write"
      }
    },
    "/v1/events": {
      "get": {
        "description": "Retrieves the workspace's event timeline, returning paginated JSON by default or CSV payloads for reporting exports. For workspaces on the free plan, events older than 2 weeks are restricted, and for light plan workspaces, events older than 3 months are restricted.\n\nRequires the `analytics:read` scope.",
        "operationId": "EventsService_ListEvents",
        "parameters": [
          {
            "description": "Filter events to a specific link (optional, UUID)\n\nOptional",
            "in": "query",
            "name": "linkId",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Inclusive start timestamp for the query window (workspace timezone aware).\nNote: For free plan workspaces, this will be automatically adjusted to not go back more than 2 weeks.\nFor light plan workspaces, this will be automatically adjusted to not go back more than 3 months.",
            "in": "query",
            "name": "startDate",
            "required": false,
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "description": "Inclusive end timestamp for the query window",
            "in": "query",
            "name": "endDate",
            "required": false,
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "default": "RESPONSE_FORMAT_UNSPECIFIED",
            "description": "Desired response format (defaults to RESPONSE_FORMAT_JSON; use RESPONSE_FORMAT_CSV for exports)\n\n - RESPONSE_FORMAT_UNSPECIFIED: Response format not specified\n - RESPONSE_FORMAT_JSON: Response format JSON\n - RESPONSE_FORMAT_CSV: Response format CSV",
            "enum": [
              "RESPONSE_FORMAT_UNSPECIFIED",
              "RESPONSE_FORMAT_JSON",
              "RESPONSE_FORMAT_CSV"
            ],
            "in": "query",
            "name": "responseFormat",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Maximum number of events to return (default: 100, max: 1000)\n\nMaximum number of events to return (default: 100, max: 1000)",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Cursor token to retrieve the next page of results\n\nCursor token to retrieve the next page of results",
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Optional list of relationships to include: visitor, device, link, workspace, journey\n\nOptional list of relationships to include: visitor, device, link, workspace, journey",
            "explode": true,
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "style": "form"
          },
          {
            "description": "Filter events to a specific visitor (optional, UUID)\n\nOptional",
            "in": "query",
            "name": "visitorId",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListEventsResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "List events",
        "tags": [
          "Events"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        },
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/events/{eventId}/traces": {
      "get": {
        "description": "Retrieves all workflow step traces for an event, ordered by completion time. Useful for analyzing user engagement and workflow progression.\n\nRequires the `analytics:read` scope.",
        "operationId": "EventsService_ListEventTraces",
        "parameters": [
          {
            "description": "Event ID to get traces for (UUID)",
            "in": "path",
            "name": "eventId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListEventTracesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "List event traces",
        "tags": [
          "Events"
        ],
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/google-forms-integrations": {
      "delete": {
        "description": "Disconnect and remove the Google Forms integration from the workspace.\n\nRequires the `integrations:write` scope.",
        "operationId": "GoogleFormsIntegrationsService_Delete",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {},
                  "type": "object"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "integrations:write"
            ]
          },
          {
            "oauth2": [
              "integrations:write"
            ]
          }
        ],
        "summary": "Disconnect Google Forms integration",
        "tags": [
          "Google Forms Integrations"
        ],
        "x-required-scope": "integrations:write"
      },
      "get": {
        "description": "Retrieve the Google Forms integration for the workspace.\n\nRequires the `integrations:read` scope.",
        "operationId": "GoogleFormsIntegrationsService_Get",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetGoogleFormsIntegrationResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "integrations:read"
            ]
          },
          {
            "oauth2": [
              "integrations:read"
            ]
          }
        ],
        "summary": "Get Google Forms integration",
        "tags": [
          "Google Forms Integrations"
        ],
        "x-required-scope": "integrations:read"
      },
      "patch": {
        "description": "Update the integration status (pause or resume syncing).\n\nRequires the `integrations:write` scope.",
        "operationId": "GoogleFormsIntegrationsService_Update",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateGoogleFormsIntegrationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateGoogleFormsIntegrationResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "integrations:write"
            ]
          },
          {
            "oauth2": [
              "integrations:write"
            ]
          }
        ],
        "summary": "Update Google Forms integration",
        "tags": [
          "Google Forms Integrations"
        ],
        "x-required-scope": "integrations:write"
      }
    },
    "/v1/google-forms-integrations/detected-forms": {
      "get": {
        "description": "Returns Google Forms auto-detected from workspace links that have a Google Form as their redirect destination.\n\nRequires the `integrations:read` scope.",
        "operationId": "GoogleFormsIntegrationsService_ListDetectedForms",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListDetectedGoogleFormsResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "integrations:read"
            ]
          },
          {
            "oauth2": [
              "integrations:read"
            ]
          }
        ],
        "summary": "List detected Google Forms",
        "tags": [
          "Google Forms Integrations"
        ],
        "x-required-scope": "integrations:read"
      }
    },
    "/v1/google-forms-integrations/oauth-url": {
      "get": {
        "description": "Returns the Google OAuth authorization URL to initiate the connection flow.\n\nRequires the `integrations:write` scope.",
        "operationId": "GoogleFormsIntegrationsService_GetOAuthURL",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetGoogleFormsOAuthURLResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "integrations:write"
            ]
          },
          {
            "oauth2": [
              "integrations:write"
            ]
          }
        ],
        "summary": "Get Google OAuth URL",
        "tags": [
          "Google Forms Integrations"
        ],
        "x-required-scope": "integrations:write"
      }
    },
    "/v1/google-forms-integrations/oauth/complete": {
      "post": {
        "description": "Exchanges the Google authorization code for tokens and creates the workspace integration.\n\nRequires the `integrations:write` scope.",
        "operationId": "GoogleFormsIntegrationsService_CompleteOAuth",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompleteGoogleFormsOAuthRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompleteGoogleFormsOAuthResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "integrations:write"
            ]
          },
          {
            "oauth2": [
              "integrations:write"
            ]
          }
        ],
        "summary": "Complete Google OAuth",
        "tags": [
          "Google Forms Integrations"
        ],
        "x-required-scope": "integrations:write"
      }
    },
    "/v1/google-forms-integrations/sync": {
      "post": {
        "description": "Trigger an immediate sync of new Google Forms responses from all detected forms.\n\nRequires the `integrations:write` scope.",
        "operationId": "GoogleFormsIntegrationsService_SyncNow",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SyncGoogleFormsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SyncGoogleFormsResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "integrations:write"
            ]
          },
          {
            "oauth2": [
              "integrations:write"
            ]
          }
        ],
        "summary": "Sync now",
        "tags": [
          "Google Forms Integrations"
        ],
        "x-required-scope": "integrations:write"
      }
    },
    "/v1/integrations/{slug}": {
      "post": {
        "operationId": "IntegrationsService_Track",
        "parameters": [
          {
            "description": "The slug identifying the integration being installed",
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {},
                  "type": "object"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [],
        "summary": "Track notifies when an integration installation is attempted",
        "tags": [
          "IntegrationsService"
        ]
      }
    },
    "/v1/jobs/{id}": {
      "get": {
        "description": "Returns the status of a long-running operation and, once it succeeded,\nits result. Poll this until the status is JOB_STATUS_SUCCEEDED or\nJOB_STATUS_FAILED.\n\nRequires the `links:read` scope.",
        "operationId": "JobsService_Get",
        "parameters": [
          {
            "description": "The job ID returned when the job was accepted.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Job"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:read"
            ]
          },
          {
            "oauth2": [
              "links:read"
            ]
          }
        ],
        "summary": "Get a job",
        "tags": [
          "Jobs"
        ],
        "x-required-scope": "links:read"
      }
    },
    "/v1/links": {
      "get": {
        "description": "Retrieves the shortened links for your workspace\n\nRequires the `links:read` scope.",
        "operationId": "LinksService_List",
        "parameters": [
          {
            "description": "The maximum number of links to return.",
            "in": "query",
            "name": "pageSize",
            "required": true,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "The token for retrieving the next page of results\nIf not provided, the first page of results will be returned",
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "List of related resources to include in the response.\nSupported values: \"customDomain\", \"qrcodeDesign\", \"qrcodeSignedUrl\", \"tags\", \"pageTheme\".\nUse \"qrcodeSignedUrl\" to fetch signed QR image URLs—they are omitted by default to keep requests fast.",
            "explode": true,
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "style": "form"
          },
          {
            "description": "Tags to filter links by (matches links containing any of the provided tags)",
            "explode": true,
            "in": "query",
            "name": "tags",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "style": "form"
          },
          {
            "description": "Search query to filter links by name or shortlink\n\nSearch query to filter links by name or shortlink",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "default": "LINK_SORT_FIELD_UNSPECIFIED",
            "description": "Field to sort links by (defaults to updated_at if not specified)\n\nField to sort links by\n\n - LINK_SORT_FIELD_UNSPECIFIED: Sort field not specified (defaults to updated_at)\n - LINK_SORT_FIELD_CREATED_AT: Sort by creation date\n - LINK_SORT_FIELD_UPDATED_AT: Sort by last update date\n - LINK_SORT_FIELD_SHORTLINK: Sort by shortlink name\n - LINK_SORT_FIELD_NAME: Sort by link name\n - LINK_SORT_FIELD_EVENT_COUNT: Sort by event count",
            "enum": [
              "LINK_SORT_FIELD_UNSPECIFIED",
              "LINK_SORT_FIELD_CREATED_AT",
              "LINK_SORT_FIELD_UPDATED_AT",
              "LINK_SORT_FIELD_SHORTLINK",
              "LINK_SORT_FIELD_NAME",
              "LINK_SORT_FIELD_EVENT_COUNT"
            ],
            "in": "query",
            "name": "sortBy",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "default": "SORT_DIRECTION_UNSPECIFIED",
            "description": "Sort direction (defaults to descending if not specified)\n\nSort direction (ascending or descending)\n\n - SORT_DIRECTION_UNSPECIFIED: Sort direction not specified (defaults to descending)\n - SORT_DIRECTION_ASC: Sort in ascending order\n - SORT_DIRECTION_DESC: Sort in descending order",
            "enum": [
              "SORT_DIRECTION_UNSPECIFIED",
              "SORT_DIRECTION_ASC",
              "SORT_DIRECTION_DESC"
            ],
            "in": "query",
            "name": "sortDirection",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "default": "LINK_VIEW_UNSPECIFIED",
            "description": "View mode. Default returns all links. LINK_VIEW_DIRECTORY scopes to a directory (or root when directory_id is empty).\n\n - LINK_VIEW_UNSPECIFIED: Return all links regardless of directory (default)\n - LINK_VIEW_DIRECTORY: Return links scoped to a directory.\nWhen directory_id is set, returns links in that directory.\nWhen directory_id is empty, returns root-level links (no directory).",
            "enum": [
              "LINK_VIEW_UNSPECIFIED",
              "LINK_VIEW_DIRECTORY"
            ],
            "in": "query",
            "name": "view",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Directory ID to scope to when view is LINK_VIEW_DIRECTORY. When empty with LINK_VIEW_DIRECTORY, returns root-level links.",
            "in": "query",
            "name": "directoryId",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListLinksResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:read"
            ]
          },
          {
            "oauth2": [
              "links:read"
            ]
          }
        ],
        "summary": "List links",
        "tags": [
          "Links"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        },
        "x-required-scope": "links:read"
      },
      "post": {
        "description": "This endpoint allows users to create a new shortened URL link in their Linkbreakers workspace.\nThe URL will be checked for malicious content before being shortened.\n\nRequires the `links:write` scope.",
        "operationId": "LinksService_Create",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateLinkRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateLinkResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:write"
            ]
          },
          {
            "oauth2": [
              "links:write"
            ]
          }
        ],
        "summary": "Create a new link",
        "tags": [
          "Links"
        ],
        "x-required-scope": "links:write"
      }
    },
    "/v1/links/batch": {
      "post": {
        "description": "Creates links in batch using the same per-link options as Create.\nThis operation is transactional: if one link fails validation or insertion,\nno links from the batch are created.\n\nRequires the `links:write` scope.",
        "operationId": "LinksService_CreateBatch",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "items": {
                  "$ref": "#/components/schemas/CreateLinkRequest",
                  "type": "object"
                },
                "type": "array"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateBulkLinksResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:write"
            ]
          },
          {
            "oauth2": [
              "links:write"
            ]
          }
        ],
        "summary": "Create multiple links in a single request",
        "tags": [
          "Links"
        ],
        "x-required-scope": "links:write"
      }
    },
    "/v1/links/bulk": {
      "post": {
        "description": "Creates links in batch using the same per-link options as Create.\nThis operation is transactional: if one link fails validation or insertion,\nno links from the batch are created.\n\nRequires the `links:write` scope.",
        "operationId": "LinksService_CreateBulk",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateBulkLinksRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateBulkLinksResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:write"
            ]
          },
          {
            "oauth2": [
              "links:write"
            ]
          }
        ],
        "summary": "Create multiple links in a single request",
        "tags": [
          "Links"
        ],
        "x-required-scope": "links:write"
      }
    },
    "/v1/links/bulk/jobs": {
      "post": {
        "description": "Accepts the same batch as POST /v1/links/bulk, answers 202 Accepted at\nonce with a job and a Location header, and creates the links in the\nbackground. Poll GET /v1/jobs/{id} for the result. The batch is\ntransactional: when the job fails, no link was created.\n\nRequires the `links:write` scope.",
        "operationId": "LinksService_CreateBulkAsync",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateBulkLinksRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Job"
                }
              }
            },
            "description": "Accepted. The links are being created; poll the job at the Location header (GET /v1/jobs/{id}).",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "Location": {
                "description": "Where to poll the job: GET this path until its status is JOB_STATUS_SUCCEEDED or JOB_STATUS_FAILED.",
                "schema": {
                  "example": "/v1/jobs/0b5c7a52-4e0d-4f8a-9a39-5f1f3c0d2e11",
                  "type": "string"
                }
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:write"
            ]
          },
          {
            "oauth2": [
              "links:write"
            ]
          }
        ],
        "summary": "Create links in bulk in the background",
        "tags": [
          "Links"
        ],
        "x-async": {
          "idField": "id",
          "statusField": "status",
          "statusPath": "/v1/jobs/{id}",
          "terminal": [
            "JOB_STATUS_SUCCEEDED",
            "JOB_STATUS_FAILED"
          ]
        },
        "x-required-scope": "links:write"
      }
    },
    "/v1/links/contact": {
      "post": {
        "description": "This endpoint allows users to create a new vCard contact link in their Linkbreakers workspace.\nThe link will generate a vCard file for contact information sharing.\n\nRequires the `links:write` scope.",
        "operationId": "LinksService_CreateContactLink",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateContactLinkRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateContactLinkResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:write"
            ]
          },
          {
            "oauth2": [
              "links:write"
            ]
          }
        ],
        "summary": "Create a new contact card link",
        "tags": [
          "Links"
        ],
        "x-required-scope": "links:write"
      }
    },
    "/v1/links/open-media": {
      "post": {
        "description": "Creates a link, and its QR code, that hands visitors one piece of media from the media\nlibrary: a PDF (a menu or brochure), an image (PNG, JPEG, WebP, SVG) or an MP4 video. Upload\nthe media first (POST /v1/media, or a direct upload for media over 3 MB; no usage is needed),\nthen pass its media_id. Any media of the library can be opened. The Open media step is the exit step. Swap the media later by\npointing the step at another media item.\n\nRequires the `links:write` scope.",
        "operationId": "LinksService_CreateOpenMediaLink",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateOpenMediaLinkRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateOpenMediaLinkResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:write"
            ]
          },
          {
            "oauth2": [
              "links:write"
            ]
          }
        ],
        "summary": "Create a new media link",
        "tags": [
          "Links"
        ],
        "x-required-scope": "links:write"
      }
    },
    "/v1/links/qrcode-images:resolve": {
      "post": {
        "description": "Return freshly signed QR code image URLs for the given links. The URLs expire, so callers fetch them when they need to render rather than storing them.\n\nRequires the `links:read` scope.",
        "operationId": "LinksService_ResolveQrcodeImages",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResolveQrcodeImagesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResolveQrcodeImagesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:read"
            ]
          },
          {
            "oauth2": [
              "links:read"
            ]
          }
        ],
        "summary": "Resolve QR code image URLs",
        "tags": [
          "Links"
        ],
        "x-required-scope": "links:read"
      }
    },
    "/v1/links/shortlink-availability": {
      "get": {
        "description": "Checks if a shortlink is available for use to create a new link. A custom domain can be provided to check against.\nIt typically checks the shortlink slugs and shortlink IDs already present within the system.\n\nRequires the `links:read` scope.",
        "operationId": "LinksService_ShortlinkAvailability",
        "parameters": [
          {
            "description": "The shortlink to check availability for.",
            "in": "query",
            "name": "shortlink",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The ID of the custom domain to check against (UUID)\nIf not provided, checks against the default domain",
            "in": "query",
            "name": "customDomainId",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ShortlinkAvailabilityResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:read"
            ]
          },
          {
            "oauth2": [
              "links:read"
            ]
          }
        ],
        "summary": "Check shortlink availability",
        "tags": [
          "Links"
        ],
        "x-required-scope": "links:read"
      }
    },
    "/v1/links/shortlink-random": {
      "get": {
        "description": "Generates a random availableshortlink for a new link.\n\nRequires the `links:read` scope.",
        "operationId": "LinksService_ShortlinkRandom",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ShortlinkRandomResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:read"
            ]
          },
          {
            "oauth2": [
              "links:read"
            ]
          }
        ],
        "summary": "Get a random shortlink",
        "tags": [
          "Links"
        ],
        "x-required-scope": "links:read"
      }
    },
    "/v1/links/thank-you": {
      "post": {
        "description": "This endpoint allows users to create a new link with a thank you page as the exit step.\n\nRequires the `links:write` scope.",
        "operationId": "LinksService_CreateThankYouLink",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateThankYouLinkRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateThankYouLinkResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:write"
            ]
          },
          {
            "oauth2": [
              "links:write"
            ]
          }
        ],
        "summary": "Create a new thank you page link",
        "tags": [
          "Links"
        ],
        "x-required-scope": "links:write"
      }
    },
    "/v1/links/{id}": {
      "delete": {
        "description": "Removes a shortened link from the workspace. This operation cannot be undone.\n\nRequires the `links:write` scope.",
        "operationId": "LinksService_Delete",
        "parameters": [
          {
            "description": "The ID of the link to delete (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeleteLinkResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:write"
            ]
          },
          {
            "oauth2": [
              "links:write"
            ]
          }
        ],
        "summary": "Delete a link",
        "tags": [
          "Links"
        ],
        "x-required-scope": "links:write"
      },
      "get": {
        "description": "Retrieves information about a shortened link including its metadata and metrics.\n\nRequires the `links:read` scope.",
        "operationId": "LinksService_Get",
        "parameters": [
          {
            "description": "The ID of the link to retrieve (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "List of related resources to include in the response.\nSupported values: \"customDomain\", \"qrcodeDesign\", \"qrcodeSignedUrl\", \"tags\", \"pageTheme\".\nUse \"qrcodeSignedUrl\" to fetch signed QR image URLs—they are omitted by default to keep requests fast.",
            "explode": true,
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "style": "form"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetLinkResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:read"
            ]
          },
          {
            "oauth2": [
              "links:read"
            ]
          }
        ],
        "summary": "Get link details",
        "tags": [
          "Links"
        ],
        "x-required-scope": "links:read"
      },
      "patch": {
        "description": "Updates an existing shortened link in your Linkbreakers workspace.\n\nRequires the `links:write` scope.",
        "operationId": "LinksService_Update",
        "parameters": [
          {
            "description": "The ID of the link to update (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinksServiceUpdateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateLinkResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:write"
            ]
          },
          {
            "oauth2": [
              "links:write"
            ]
          }
        ],
        "summary": "Update a link",
        "tags": [
          "Links"
        ],
        "x-required-scope": "links:write"
      }
    },
    "/v1/links/{linkId}/workflow-steps": {
      "get": {
        "description": "Retrieves all workflow steps for a specific link\n\nRequires the `workflows:read` scope.",
        "operationId": "WorkflowStepsService_List",
        "parameters": [
          {
            "description": "The ID of the link to list workflow steps for (UUID)",
            "in": "path",
            "name": "linkId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The maximum number of workflow steps to return (optional)",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "The token for retrieving the next page of results (optional)",
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListWorkflowStepsResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workflows:read"
            ]
          },
          {
            "oauth2": [
              "workflows:read"
            ]
          }
        ],
        "summary": "List workflow steps for a link",
        "tags": [
          "Workflow Steps"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        },
        "x-required-scope": "workflows:read"
      },
      "post": {
        "description": "This endpoint allows users to create a new workflow step for a link.\nWorkflow steps define the behavior of links, such as redirection destinations.\n\nRequires the `workflows:write` scope.",
        "operationId": "WorkflowStepsService_Create",
        "parameters": [
          {
            "description": "The ID of the link to create the workflow step for (UUID)",
            "in": "path",
            "name": "linkId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowStepsServiceCreateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateWorkflowStepResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workflows:write"
            ]
          },
          {
            "oauth2": [
              "workflows:write"
            ]
          }
        ],
        "summary": "Create a new workflow step",
        "tags": [
          "Workflow Steps"
        ],
        "x-required-scope": "workflows:write"
      }
    },
    "/v1/links/{linkId}/workflow-steps/auto-layout": {
      "post": {
        "description": "Arranges all workflow steps in a clean left-to-right DAG layout.\nUseful after building a workflow from scratch.\n\nRequires the `workflows:write` scope.",
        "operationId": "WorkflowStepsService_AutoLayoutWorkflow",
        "parameters": [
          {
            "in": "path",
            "name": "linkId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowStepsServiceAutoLayoutWorkflowBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AutoLayoutWorkflowResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workflows:write"
            ]
          },
          {
            "oauth2": [
              "workflows:write"
            ]
          }
        ],
        "summary": "Auto-layout workflow",
        "tags": [
          "Workflow Steps"
        ],
        "x-required-scope": "workflows:write"
      }
    },
    "/v1/links/{linkId}/workflow-steps/validate": {
      "get": {
        "description": "Requires the `workflows:read` scope.",
        "operationId": "WorkflowStepsService_ValidateWorkflow",
        "parameters": [
          {
            "in": "path",
            "name": "linkId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidateWorkflowResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workflows:read"
            ]
          },
          {
            "oauth2": [
              "workflows:read"
            ]
          }
        ],
        "tags": [
          "Workflow Steps"
        ],
        "x-required-scope": "workflows:read"
      }
    },
    "/v1/links/{linkId}/workflow-steps/{id}": {
      "delete": {
        "description": "Removes a workflow step from the link. This operation cannot be undone.\n\nRequires the `workflows:write` scope.",
        "operationId": "WorkflowStepsService_Delete",
        "parameters": [
          {
            "description": "The ID of the link (UUID)",
            "in": "path",
            "name": "linkId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The ID of the workflow step to delete (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeleteWorkflowStepResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workflows:write"
            ]
          },
          {
            "oauth2": [
              "workflows:write"
            ]
          }
        ],
        "summary": "Delete a workflow step",
        "tags": [
          "Workflow Steps"
        ],
        "x-required-scope": "workflows:write"
      },
      "get": {
        "description": "Retrieves information about a specific workflow step.\n\nRequires the `workflows:read` scope.",
        "operationId": "WorkflowStepsService_Get",
        "parameters": [
          {
            "description": "The ID of the link (UUID)",
            "in": "path",
            "name": "linkId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The ID of the workflow step to retrieve (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetWorkflowStepResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workflows:read"
            ]
          },
          {
            "oauth2": [
              "workflows:read"
            ]
          }
        ],
        "summary": "Get workflow step details",
        "tags": [
          "Workflow Steps"
        ],
        "x-required-scope": "workflows:read"
      },
      "patch": {
        "description": "Updates an existing workflow step for a link.\n\nRequires the `workflows:write` scope.",
        "operationId": "WorkflowStepsService_Update",
        "parameters": [
          {
            "description": "The ID of the link (UUID)",
            "in": "path",
            "name": "linkId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The ID of the workflow step to update (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowStepsServiceUpdateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateWorkflowStepResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workflows:write"
            ]
          },
          {
            "oauth2": [
              "workflows:write"
            ]
          }
        ],
        "summary": "Update a workflow step",
        "tags": [
          "Workflow Steps"
        ],
        "x-required-scope": "workflows:write"
      }
    },
    "/v1/links/{linkId}/workflow-steps/{stepId}/branches/{branchId}/connection": {
      "delete": {
        "description": "Leaves the branch with no destination. Clearing a branch that is already\nclear succeeds. See ConnectStep for what a branch id is.\n\nRequires the `workflows:write` scope.",
        "operationId": "WorkflowStepsService_DisconnectStep",
        "parameters": [
          {
            "description": "The ID of the link (UUID)",
            "in": "path",
            "name": "linkId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The ID of the step the connection leaves from (UUID)",
            "in": "path",
            "name": "stepId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Which exit of that step to clear. See ConnectWorkflowStepRequest.branch_id.",
            "in": "path",
            "name": "branchId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DisconnectWorkflowStepResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workflows:write"
            ]
          },
          {
            "oauth2": [
              "workflows:write"
            ]
          }
        ],
        "summary": "Clear one exit of a workflow step",
        "tags": [
          "Workflow Steps"
        ],
        "x-required-scope": "workflows:write"
      },
      "put": {
        "description": "Every workflow step is connected the same way: name the branch it leaves\nfrom, and the step it leads to.\n\nAtomic steps (redirect, password, form, message page) have exactly one\nbranch, \"next\". Composite steps (multi-link, conditions) have one branch\nper button, option or range, plus \"else\" for a condition's fallback. Exit\nsteps end the journey and have no branches at all.\n\nRead a step to see its branches, their ids and their current destinations.\nIdempotent: connecting a branch to the step it already leads to is a no-op.\n\nRequires the `workflows:write` scope.",
        "operationId": "WorkflowStepsService_ConnectStep",
        "parameters": [
          {
            "description": "The ID of the link (UUID)",
            "in": "path",
            "name": "linkId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The ID of the step the connection leaves from (UUID)",
            "in": "path",
            "name": "stepId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Which exit of that step to connect. \"next\" for atomic steps, or a button\nid, option id, range id, country code, or \"else\" for composite steps.",
            "in": "path",
            "name": "branchId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowStepsServiceConnectStepBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConnectWorkflowStepResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workflows:write"
            ]
          },
          {
            "oauth2": [
              "workflows:write"
            ]
          }
        ],
        "summary": "Connect one exit of a workflow step to another step",
        "tags": [
          "Workflow Steps"
        ],
        "x-required-scope": "workflows:write"
      }
    },
    "/v1/links/{linkId}/workflow-steps/{stepId}/resolve-collisions": {
      "post": {
        "description": "Pushes overlapping steps away from a given anchor step using iterative\nradial repulsion. The anchor step stays fixed. Use after adding or moving\nindividual steps to preserve the existing layout.\n\nRequires the `workflows:write` scope.",
        "operationId": "WorkflowStepsService_ResolveStepCollisions",
        "parameters": [
          {
            "in": "path",
            "name": "linkId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "stepId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowStepsServiceResolveStepCollisionsBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResolveStepCollisionsResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workflows:write"
            ]
          },
          {
            "oauth2": [
              "workflows:write"
            ]
          }
        ],
        "summary": "Resolve step collisions",
        "tags": [
          "Workflow Steps"
        ],
        "x-required-scope": "workflows:write"
      }
    },
    "/v1/media": {
      "get": {
        "description": "Retrieves the workspace's ready media files, newest first, optionally narrowed to one kind or\nto where they were uploaded from. total_count is every item matching the filters across all\npages. Each item lists its references: where it is used.\n\nRequires the `media:read` scope.",
        "operationId": "MediaService_List",
        "parameters": [
          {
            "description": "The maximum number of media files to return.",
            "in": "query",
            "name": "pageSize",
            "required": true,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "The token for retrieving the next page of results\nIf not provided, the first page of results will be returned",
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "default": "USAGE_UNSPECIFIED",
            "description": "Deprecated: filter by uploaded_from instead. Still matches the value recorded at upload, which\nsays nothing about where the media is used.\n\n - USAGE_UNSPECIFIED: Not set\n - USAGE_CENTRAL_QRCODE_IMAGE: The logo in the center of a QR code\n - USAGE_BACKGROUND_COVER: A page theme's background cover\n - USAGE_BADGE: A page theme's badge image\n - USAGE_FOOTER_LOGO: A page theme's footer logo\n - USAGE_OPEN_MEDIA: Media an Open media workflow step hands to visitors: a PDF menu or brochure, an image or an MP4 video",
            "enum": [
              "USAGE_UNSPECIFIED",
              "USAGE_CENTRAL_QRCODE_IMAGE",
              "USAGE_BACKGROUND_COVER",
              "USAGE_BADGE",
              "USAGE_FOOTER_LOGO",
              "USAGE_OPEN_MEDIA"
            ],
            "in": "query",
            "name": "usage",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "default": "KIND_UNSPECIFIED",
            "description": "Only media of this kind. Unset lists every kind.\n\n - KIND_UNSPECIFIED: Not set\n - KIND_IMAGE: A PNG, JPEG, WebP or SVG image\n - KIND_DOCUMENT: A PDF document\n - KIND_VIDEO: An MP4 video",
            "enum": [
              "KIND_UNSPECIFIED",
              "KIND_IMAGE",
              "KIND_DOCUMENT",
              "KIND_VIDEO"
            ],
            "in": "query",
            "name": "kind",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "default": "UPLOAD_ORIGIN_UNSPECIFIED",
            "description": "Only media uploaded from this place. Unset lists media from everywhere. Where media was uploaded from\nsays nothing about where it can be used: read references for that.\n\n - UPLOAD_ORIGIN_UNSPECIFIED: Not set. Uploads that do not say where they come from are recorded as UPLOAD_ORIGIN_MEDIA_LIBRARY.\n - UPLOAD_ORIGIN_MEDIA_LIBRARY: Uploaded from the media library itself\n - UPLOAD_ORIGIN_QR_CODE_LOGO: Uploaded while picking a QR code's logo\n - UPLOAD_ORIGIN_BACKGROUND_COVER: Uploaded while picking a page theme's background cover\n - UPLOAD_ORIGIN_BADGE: Uploaded while picking a page theme's badge\n - UPLOAD_ORIGIN_FOOTER_LOGO: Uploaded while picking a page theme's footer logo\n - UPLOAD_ORIGIN_OPEN_MEDIA: Uploaded while picking the media an Open media step opens\n - UPLOAD_ORIGIN_ASSISTANT: Imported by the Assistant, from a file attached to a conversation or a URL",
            "enum": [
              "UPLOAD_ORIGIN_UNSPECIFIED",
              "UPLOAD_ORIGIN_MEDIA_LIBRARY",
              "UPLOAD_ORIGIN_QR_CODE_LOGO",
              "UPLOAD_ORIGIN_BACKGROUND_COVER",
              "UPLOAD_ORIGIN_BADGE",
              "UPLOAD_ORIGIN_FOOTER_LOGO",
              "UPLOAD_ORIGIN_OPEN_MEDIA",
              "UPLOAD_ORIGIN_ASSISTANT"
            ],
            "in": "query",
            "name": "uploadedFrom",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListMediaResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "media:read"
            ]
          },
          {
            "oauth2": [
              "media:read"
            ]
          }
        ],
        "summary": "List media files",
        "tags": [
          "Media"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        },
        "x-required-scope": "media:read"
      },
      "post": {
        "description": "Uploads a file sent in the request itself, base64 encoded over HTTP, up to 3 MB.\nLarger files (a PDF brochure, a video) are uploaded straight to storage instead:\nCreateUpload, a PUT of the file to the returned upload_url, then CompleteUpload.\nA media item only has a kind, read from its bytes: images (PNG, JPEG, WebP, SVG) up to 10 MB,\nPDF documents up to 25 MB and MP4 videos up to 50 MB. Nothing about where it will be used is\nneeded at upload: any image can then be a QR code logo, a background cover, a badge or a footer\nlogo (up to 3 MB for those), and any media can be opened by an Open media step.\n\nA workspace holds each file once. A file whose bytes (SHA-256) match media the workspace already\nhas is refused with 409 MEDIA_ALREADY_EXISTS; the error's metadata names that media in\nexistingMediaId and existingFileName. Use that media instead of uploading the file again.\n\nRequires the `media:write` scope.",
        "operationId": "MediaService_Create",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateMediaRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateMediaResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "media:write"
            ]
          },
          {
            "oauth2": [
              "media:write"
            ]
          }
        ],
        "summary": "Upload a media file",
        "tags": [
          "Media"
        ],
        "x-required-scope": "media:write"
      }
    },
    "/v1/media/uploads": {
      "post": {
        "description": "Reserves a media item for a file uploaded straight to storage, so large files never pass\nthrough the API. Declare the file's name, MIME type and exact size in bytes; they are checked\nagainst the limit for the file's kind (images up to 10 MB, PDF documents up to 25 MB, MP4\nvideos up to 50 MB) and against the workspace's storage allowance now, and against the\nuploaded bytes on completion. Then PUT the file's bytes to upload_url with the\nupload_headers (and a Content-Length equal to size) before upload_expires_at, and call\nCompleteUpload. Until completed the media is PENDING: it is not listed and cannot be used.\nAn upload not completed within an hour is discarded.\n\nA workspace holds each file once. Optionally declare sha256, the file's SHA-256 as hex: a file the\nworkspace already holds is then refused here, before any upload, with 409 MEDIA_ALREADY_EXISTS,\nwhose metadata names that media in existingMediaId and existingFileName (use it instead), and\nstorage refuses bytes that do not match the hash, so the PUT must send the x-amz-checksum-sha256\nheader from upload_headers. Without sha256 the duplicate is caught on completion instead.\n\nRequires the `media:write` scope.",
        "operationId": "MediaService_CreateUpload",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateMediaUploadRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateMediaUploadResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "media:write"
            ]
          },
          {
            "oauth2": [
              "media:write"
            ]
          }
        ],
        "summary": "Start a direct media upload",
        "tags": [
          "Media"
        ],
        "x-required-scope": "media:write"
      }
    },
    "/v1/media/{id}": {
      "delete": {
        "description": "Removes a media file from the workspace and frees its storage. This operation cannot be undone.\nMedia still opened by an Open media step, or shown by a page theme as its background cover,\nbadge or footer logo (of a link or of a page theme template), is refused with MEDIA_IN_USE,\nnaming what uses it (metadata linkIds and pageThemeTemplateIds): point those at other media or\nremove it from them first. Deleting an image a QR code design uses as its logo is allowed: the\nQR code keeps its own copy of the logo, and its link to the media is cleared.\n\nRequires the `media:write` scope.",
        "operationId": "MediaService_Delete",
        "parameters": [
          {
            "description": "The ID of the media file to delete (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeleteMediaResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "204": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "Media file deleted successfully",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "media:write"
            ]
          },
          {
            "oauth2": [
              "media:write"
            ]
          }
        ],
        "summary": "Delete a media file",
        "tags": [
          "Media"
        ],
        "x-required-scope": "media:write"
      },
      "get": {
        "description": "Retrieves information about a media file including its metadata and URL.\nExample: Getting details for media with ID \"med_123\".\n\nRequires the `media:read` scope.",
        "operationId": "MediaService_Get",
        "parameters": [
          {
            "description": "The ID of the media file to retrieve (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetMediaResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "media:read"
            ]
          },
          {
            "oauth2": [
              "media:read"
            ]
          }
        ],
        "summary": "Get media file details",
        "tags": [
          "Media"
        ],
        "x-required-scope": "media:read"
      }
    },
    "/v1/media/{id}/replace-uploads": {
      "post": {
        "description": "Starts replacing the file of an existing media item with a new one uploaded straight to storage.\nThe media keeps its id, so everything using it follows: Open media steps hand out the new file and\npage themes show it as their background cover, badge or footer logo from the next visit. Declare the\nnew file's name, MIME type and exact size in bytes, and optionally its sha256. Then PUT its bytes to\nupload_url with the upload_headers before upload_expires_at, and call CompleteReplace with the\nreplacement_id. Until then the media is unchanged; a replacement not completed within an hour is\ndiscarded.\n\nThe new file must be acceptable to every use rendered from the media's file: a page theme cover,\nbadge or footer logo takes an image of at most 3 MB, an Open media step takes any media. When one\nrefuses it, the replacement is refused with MEDIA_REPLACE_NOT_ALLOWED, whose message names each\nrefusing use and why, and whose metadata lists them in refusals (a JSON array). Media used only by\nOpen media steps may change kind, a PDF for an MP4 video for example. A QR code design keeps its own\ncopy of its logo: it never refuses a replacement, keeps its current logo, and is detached from the\nmedia when the replacement completes.\n\nA file another media item of the workspace holds is refused with 409 MEDIA_ALREADY_EXISTS (metadata\nexistingMediaId and existingFileName). Declaring the media's own file returns unchanged true and no\nupload_url: there is nothing to replace. Only the difference in size counts against the workspace's\nstorage allowance.\n\nRequires the `media:write` scope.",
        "operationId": "MediaService_CreateReplaceUpload",
        "parameters": [
          {
            "description": "The ID of the media item whose file is replaced (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaServiceCreateReplaceUploadBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateMediaReplaceUploadResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "media:write"
            ]
          },
          {
            "oauth2": [
              "media:write"
            ]
          }
        ],
        "summary": "Start replacing a media file",
        "tags": [
          "Media"
        ],
        "x-required-scope": "media:write"
      }
    },
    "/v1/media/{id}/replace-uploads/{replacementId}:complete": {
      "post": {
        "description": "Checks the new file PUT to the replacement's upload_url like CompleteUpload does (its size, its real\nformat read from its first bytes, its SHA-256 established by the server), checks again that every\nuse rendered from the media accepts it and that it fits the storage allowance, then swaps it in. The\nmedia keeps its id and takes the new file's name, MIME type, kind, size and sha256; its old file is\ndeleted. QR code designs that used the media as their logo keep their current logo and are detached\nfrom it; they are returned in detached_references. On any refusal the new file is discarded and the\nmedia keeps its current file. A new file identical to the media's own changes nothing and returns\nunchanged true.\n\nRequires the `media:write` scope.",
        "operationId": "MediaService_CompleteReplace",
        "parameters": [
          {
            "description": "The ID of the media item whose file is replaced (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The replacement's id (UUID), from CreateReplaceUpload",
            "in": "path",
            "name": "replacementId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaServiceCompleteReplaceBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompleteMediaReplaceResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "media:write"
            ]
          },
          {
            "oauth2": [
              "media:write"
            ]
          }
        ],
        "summary": "Complete replacing a media file",
        "tags": [
          "Media"
        ],
        "x-required-scope": "media:write"
      }
    },
    "/v1/media/{id}/replace:import": {
      "post": {
        "description": "Replaces the file of an existing media item with one fetched server-side, from a public https url or\na file the caller attached to their own Assistant conversation, in one call. The same checks as\nCompleteReplace apply, with the same limits and URL rules as Import: every use rendered from the\nmedia must accept the new file (MEDIA_REPLACE_NOT_ALLOWED lists each refusing use and why), a file\nanother media item holds is refused with MEDIA_ALREADY_EXISTS, and only the size difference counts\nagainst the storage allowance. The media keeps its id; QR code designs using it as a logo keep their\ncurrent logo and are detached from it. A file identical to the media's own returns unchanged true.\n\nRequires the `media:write` scope.",
        "operationId": "MediaService_ReplaceImport",
        "parameters": [
          {
            "description": "The ID of the media item whose file is replaced (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaServiceReplaceImportBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReplaceMediaImportResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "media:write"
            ]
          },
          {
            "oauth2": [
              "media:write"
            ]
          }
        ],
        "summary": "Replace a media file from a URL",
        "tags": [
          "Media"
        ],
        "x-required-scope": "media:write"
      }
    },
    "/v1/media/{id}:complete": {
      "post": {
        "description": "Checks the file PUT to the upload_url: its size, its real format read from its first bytes,\nand the storage allowance. When it matches what CreateUpload declared, the media becomes READY\nand is returned with a signed URL. When it does not, the file and the media are discarded and\nthe error says why; start a new upload. Completing a media item that is already READY returns it.\n\nThe server always establishes the file's SHA-256 itself, from the checksum storage verified or by\nreading the file back. A file the workspace already holds is discarded with 409\nMEDIA_ALREADY_EXISTS; the error's metadata names the existing media in existingMediaId and\nexistingFileName. Use that media instead.\n\nRequires the `media:write` scope.",
        "operationId": "MediaService_CompleteUpload",
        "parameters": [
          {
            "description": "The ID of the pending media item (UUID), from CreateUpload",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaServiceCompleteUploadBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompleteMediaUploadResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "media:write"
            ]
          },
          {
            "oauth2": [
              "media:write"
            ]
          }
        ],
        "summary": "Complete a direct media upload",
        "tags": [
          "Media"
        ],
        "x-required-scope": "media:write"
      }
    },
    "/v1/media:import": {
      "post": {
        "description": "Fetches a file server-side and stores it as a READY media item, so a file that is already\nonline, or one attached to an Assistant conversation, never has to be downloaded and uploaded\nagain. Give exactly one source: url, a public https address the file is downloaded from, or\nassistant_attachment_id, a file the caller attached to their own Assistant conversation. The\nkind is read from the file's bytes, never from its name or a Content-Type header, and the same\nlimits as every upload apply: images (PNG, JPEG, WebP, SVG) up to 10 MB, PDF documents up to\n25 MB and MP4 videos up to 50 MB, within the workspace's media storage allowance. A URL must\nbe https on port 443 and resolve to a public address; redirects are followed only to other\nsuch URLs, at most five.\n\nA workspace holds each file once. A file whose bytes (SHA-256) match media the workspace already\nhas is refused with 409 MEDIA_ALREADY_EXISTS; the error's metadata names that media in\nexistingMediaId and existingFileName. Use that media instead of uploading the file again.\n\nRequires the `media:write` scope.",
        "operationId": "MediaService_Import",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImportMediaRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportMediaResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "media:write"
            ]
          },
          {
            "oauth2": [
              "media:write"
            ]
          }
        ],
        "summary": "Import a media file from a URL",
        "tags": [
          "Media"
        ],
        "x-required-scope": "media:write"
      }
    },
    "/v1/member": {
      "get": {
        "description": "Return the member information associated with the authenticated caller.\n\nRequires the `members:read` scope.",
        "operationId": "MembersService_GetMyself",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Member"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "members:read"
            ]
          },
          {
            "oauth2": [
              "members:read"
            ]
          }
        ],
        "summary": "Get the current member",
        "tags": [
          "Members"
        ],
        "x-required-scope": "members:read"
      },
      "put": {
        "description": "Let the signed-in member update their own profile or credentials.\n\nRequires the `members:write` scope.",
        "operationId": "MembersService_UpdateMyself",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Member"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "members:write"
            ]
          },
          {
            "oauth2": [
              "members:write"
            ]
          }
        ],
        "summary": "Update the current member",
        "tags": [
          "Members"
        ],
        "x-required-scope": "members:write"
      }
    },
    "/v1/members": {
      "get": {
        "description": "Retrieve a paginated list of members in the current workspace.\n\nRequires the `members:read` scope.",
        "operationId": "MembersService_List",
        "parameters": [
          {
            "description": "Maximum number of members to return. Defaults to 100, capped at 1000.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Cursor from a previous response's next_page_token. Empty starts at the\nfirst page. Pages are ordered by (created_at, id), which never change, so a\nrecord cannot move between pages while a client is walking them.",
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "Members listed successfully",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "members:read"
            ]
          },
          {
            "oauth2": [
              "members:read"
            ]
          }
        ],
        "summary": "List members",
        "tags": [
          "Members"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        },
        "x-required-scope": "members:read"
      }
    },
    "/v1/members/invite": {
      "post": {
        "description": "Create a pending member and dispatch an invitation email. A person who already has a Linkbreakers account is added to the workspace right away and told by email; inviting someone already in the workspace fails with MEMBER_ALREADY_IN_WORKSPACE.\n\nRequires the `members:write` scope.",
        "operationId": "MembersService_Invite",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InviteMemberRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Member"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "Member invited successfully",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "members:write"
            ]
          },
          {
            "oauth2": [
              "members:write"
            ]
          }
        ],
        "summary": "Invite a new member",
        "tags": [
          "Members"
        ],
        "x-required-scope": "members:write"
      }
    },
    "/v1/members/{id}": {
      "delete": {
        "description": "Permanently remove a member from the workspace roster.\n\nRequires the `members:write` scope.",
        "operationId": "MembersService_Delete",
        "parameters": [
          {
            "description": "Member identifier (UUID) to delete",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {},
                  "type": "object"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "members:write"
            ]
          },
          {
            "oauth2": [
              "members:write"
            ]
          }
        ],
        "summary": "Delete a member",
        "tags": [
          "Members"
        ],
        "x-required-scope": "members:write"
      },
      "get": {
        "description": "Fetch a single workspace member by the provided identifier.\n\nRequires the `members:read` scope.",
        "operationId": "MembersService_Get",
        "parameters": [
          {
            "description": "Member identifier (UUID) to retrieve",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Member"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "members:read"
            ]
          },
          {
            "oauth2": [
              "members:read"
            ]
          }
        ],
        "summary": "Get a member by ID",
        "tags": [
          "Members"
        ],
        "x-required-scope": "members:read"
      },
      "put": {
        "description": "Modify profile details or role assignments for an existing member.\n\nRequires the `members:write` scope.",
        "operationId": "MembersService_Update",
        "parameters": [
          {
            "description": "Member identifier (UUID) to update",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MembersServiceUpdateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Member"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "members:write"
            ]
          },
          {
            "oauth2": [
              "members:write"
            ]
          }
        ],
        "summary": "Update a member",
        "tags": [
          "Members"
        ],
        "x-required-scope": "members:write"
      }
    },
    "/v1/members/{id}/allow": {
      "post": {
        "description": "Restore workspace access for a previously suspended member.\n\nRequires the `members:write` scope.",
        "operationId": "MembersService_AllowAccess",
        "parameters": [
          {
            "description": "Member identifier (UUID) whose access should be restored",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MembersServiceAllowAccessBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Member"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "members:write"
            ]
          },
          {
            "oauth2": [
              "members:write"
            ]
          }
        ],
        "summary": "Allow access for a member",
        "tags": [
          "Members"
        ],
        "x-required-scope": "members:write"
      }
    },
    "/v1/members/{id}/revoke": {
      "post": {
        "description": "Suspend a member's access without removing their account.\n\nRequires the `members:write` scope.",
        "operationId": "MembersService_RevokeAccess",
        "parameters": [
          {
            "description": "Member identifier (UUID) whose access should be suspended",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MembersServiceRevokeAccessBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Member"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "members:write"
            ]
          },
          {
            "oauth2": [
              "members:write"
            ]
          }
        ],
        "summary": "Revoke access for a member",
        "tags": [
          "Members"
        ],
        "x-required-scope": "members:write"
      }
    },
    "/v1/members/{id}/signout": {
      "post": {
        "description": "Terminate all active sessions for the specified member.\n\nRequires the `members:write` scope.",
        "operationId": "MembersService_ForceSignout",
        "parameters": [
          {
            "description": "Member identifier (UUID) to sign out of all sessions",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MembersServiceForceSignoutBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Member"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "members:write"
            ]
          },
          {
            "oauth2": [
              "members:write"
            ]
          }
        ],
        "summary": "Force a member to sign out",
        "tags": [
          "Members"
        ],
        "x-required-scope": "members:write"
      }
    },
    "/v1/metrics/events": {
      "get": {
        "description": "Retrieve aggregated event analytics for the provided time window and optional link filter.\n\nRequires the `analytics:read` scope.",
        "operationId": "MetricsService_GetEventsMetric",
        "parameters": [
          {
            "description": "Inclusive start timestamp for the aggregation",
            "in": "query",
            "name": "startDate",
            "required": false,
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "description": "Inclusive end timestamp for the aggregation",
            "in": "query",
            "name": "endDate",
            "required": false,
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "description": "Optional link filter (UUID); when omitted aggregates workspace-wide\n\nUUID format",
            "in": "query",
            "name": "linkId",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventsMetric"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "Get events metric",
        "tags": [
          "Workspace Metrics"
        ],
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/metrics/workspace": {
      "get": {
        "description": "Return high-level workspace totals covering members, links, and activity volume.\n\nRequires the `analytics:read` scope.",
        "operationId": "MetricsService_GetWorkspaceMetric",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkspaceMetric"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "Get workspace metric",
        "tags": [
          "Workspace Metrics"
        ],
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/metrics/workspace/insight": {
      "get": {
        "description": "Return workspace usage insights including the preferred link type based on historical link creation patterns.\n\nRequires the `analytics:read` scope.",
        "operationId": "MetricsService_GetWorkspaceInsight",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkspaceInsight"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "Get workspace insight",
        "tags": [
          "Workspace Metrics"
        ],
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/myself/workspaces": {
      "get": {
        "description": "Return every workspace the signed-in person belongs to, with their role, when they last used it and whether it is the one the token acts in. An API token sees only its own workspace.\n\nRequires the `members:read` scope.",
        "operationId": "MembersService_ListMyWorkspaces",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListMyWorkspacesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "members:read"
            ]
          },
          {
            "oauth2": [
              "members:read"
            ]
          }
        ],
        "summary": "List my workspaces",
        "tags": [
          "Members"
        ],
        "x-required-scope": "members:read"
      }
    },
    "/v1/myself/workspaces/{workspaceId}:switch": {
      "post": {
        "description": "Issue an access token for another workspace the signed-in person belongs to. Needs a dashboard session or a full-access token of a member; a workspace token or a token limited to scopes is refused. When the workspace enforces MFA, the first call emails a code and answers MFA_REQUIRED; repeat it with mfa_code.\n\nRequires the `members:write` scope.",
        "operationId": "MembersService_SwitchWorkspace",
        "parameters": [
          {
            "description": "Workspace to switch to (UUID). The caller must be a member of it.",
            "in": "path",
            "name": "workspaceId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MembersServiceSwitchWorkspaceBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SwitchWorkspaceResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "members:write"
            ]
          },
          {
            "oauth2": [
              "members:write"
            ]
          }
        ],
        "summary": "Switch workspace",
        "tags": [
          "Members"
        ],
        "x-required-scope": "members:write"
      }
    },
    "/v1/page-theme-templates": {
      "get": {
        "description": "Retrieve page theme templates that belong to the authenticated caller's workspace.\n\nRequires the `page_themes:read` scope.",
        "operationId": "PageThemeTemplatesService_ListPageThemeTemplates",
        "parameters": [
          {
            "explode": true,
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "style": "form"
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "default": "PAGE_THEME_TEMPLATE_SCOPE_UNSPECIFIED",
            "description": "Which templates to return. WORKSPACE (default) returns only templates owned by the caller's workspace. AVAILABLE also returns built-in templates and templates other workspaces have published, ordered by the workspace's own usage first, then its own templates, then the rest.\n\n - PAGE_THEME_TEMPLATE_SCOPE_UNSPECIFIED: Defaults to PAGE_THEME_TEMPLATE_SCOPE_WORKSPACE.\n - PAGE_THEME_TEMPLATE_SCOPE_WORKSPACE: Only templates owned by the caller's workspace.\n - PAGE_THEME_TEMPLATE_SCOPE_AVAILABLE: Every template the workspace may use: its own, built-in ones, and\ntemplates published by other workspaces.",
            "enum": [
              "PAGE_THEME_TEMPLATE_SCOPE_UNSPECIFIED",
              "PAGE_THEME_TEMPLATE_SCOPE_WORKSPACE",
              "PAGE_THEME_TEMPLATE_SCOPE_AVAILABLE"
            ],
            "in": "query",
            "name": "scope",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListPageThemeTemplatesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "page_themes:read"
            ]
          },
          {
            "oauth2": [
              "page_themes:read"
            ]
          }
        ],
        "summary": "List my page theme templates",
        "tags": [
          "Page Theme Templates"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        },
        "x-required-scope": "page_themes:read"
      },
      "post": {
        "description": "Create a page theme template by copying the styling of an existing page theme into a fresh detached theme owned by the template.\n\nRequires the `page_themes:write` scope.",
        "operationId": "PageThemeTemplatesService_CreatePageThemeTemplate",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePageThemeTemplateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreatePageThemeTemplateResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "page_themes:write"
            ]
          },
          {
            "oauth2": [
              "page_themes:write"
            ]
          }
        ],
        "summary": "Create a new page theme template",
        "tags": [
          "Page Theme Templates"
        ],
        "x-required-scope": "page_themes:write"
      }
    },
    "/v1/page-theme-templates/images:resolve": {
      "post": {
        "description": "Return freshly signed thumbnail, cover, badge and footer logo URLs for the given templates. The URLs expire, so callers fetch them when they need to render rather than storing them.\n\nRequires the `page_themes:read` scope.",
        "operationId": "PageThemeTemplatesService_ResolvePageThemeTemplateImages",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResolvePageThemeTemplateImagesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResolvePageThemeTemplateImagesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "page_themes:read"
            ]
          },
          {
            "oauth2": [
              "page_themes:read"
            ]
          }
        ],
        "summary": "Resolve page theme template images",
        "tags": [
          "Page Theme Templates"
        ],
        "x-required-scope": "page_themes:read"
      }
    },
    "/v1/page-theme-templates/import": {
      "post": {
        "description": "Import a public page theme template into your workspace by slug. Creates a private copy owned by your workspace.\n\nRequires the `page_themes:write` scope.",
        "operationId": "PageThemeTemplatesService_ImportPageThemeTemplate",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImportPageThemeTemplateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportPageThemeTemplateResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "page_themes:write"
            ]
          },
          {
            "oauth2": [
              "page_themes:write"
            ]
          }
        ],
        "summary": "Import a public page theme template",
        "tags": [
          "Page Theme Templates"
        ],
        "x-required-scope": "page_themes:write"
      }
    },
    "/v1/page-theme-templates/{id}": {
      "delete": {
        "description": "Remove a page theme template belonging to the authenticated caller's workspace. Pages already styled from it are unaffected.\n\nRequires the `page_themes:write` scope.",
        "operationId": "PageThemeTemplatesService_DeletePageThemeTemplate",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeletePageThemeTemplateResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "204": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "Page theme template deleted successfully",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "page_themes:write"
            ]
          },
          {
            "oauth2": [
              "page_themes:write"
            ]
          }
        ],
        "summary": "Delete a workspace page theme template",
        "tags": [
          "Page Theme Templates"
        ],
        "x-required-scope": "page_themes:write"
      },
      "get": {
        "description": "Retrieve a page theme template that belongs to the authenticated caller's workspace.\n\nRequires the `page_themes:read` scope.",
        "operationId": "PageThemeTemplatesService_GetPageThemeTemplate",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "explode": true,
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "style": "form"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageThemeTemplate"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "page_themes:read"
            ]
          },
          {
            "oauth2": [
              "page_themes:read"
            ]
          }
        ],
        "summary": "Get a workspace page theme template",
        "tags": [
          "Page Theme Templates"
        ],
        "x-required-scope": "page_themes:read"
      },
      "patch": {
        "description": "Modify the metadata of a page theme template owned by the authenticated workspace.\n\nRequires the `page_themes:write` scope.",
        "operationId": "PageThemeTemplatesService_UpdatePageThemeTemplate",
        "parameters": [
          {
            "description": "The ID of the page theme template to update (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PageThemeTemplatesServiceUpdatePageThemeTemplateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdatePageThemeTemplateResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "page_themes:write"
            ]
          },
          {
            "oauth2": [
              "page_themes:write"
            ]
          }
        ],
        "summary": "Update a workspace page theme template",
        "tags": [
          "Page Theme Templates"
        ],
        "x-required-scope": "page_themes:write"
      }
    },
    "/v1/page-theme-templates/{id}/publish": {
      "post": {
        "description": "Publish a page theme template to make it available in the public gallery. Requires workspace to be public and template to have slug, description, and name.\n\nRequires the `page_themes:write` scope.",
        "operationId": "PageThemeTemplatesService_PublishPageThemeTemplate",
        "parameters": [
          {
            "description": "The ID of the page theme template to publish (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PageThemeTemplatesServicePublishPageThemeTemplateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublishPageThemeTemplateResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "page_themes:write"
            ]
          },
          {
            "oauth2": [
              "page_themes:write"
            ]
          }
        ],
        "summary": "Publish a workspace page theme template",
        "tags": [
          "Page Theme Templates"
        ],
        "x-required-scope": "page_themes:write"
      }
    },
    "/v1/page-theme-templates/{id}/styling": {
      "patch": {
        "description": "Edit the colours, typography, container and media of a page theme template. Queues a thumbnail regeneration.\n\nRequires the `page_themes:write` scope.",
        "operationId": "PageThemeTemplatesService_UpdatePageThemeTemplateStyling",
        "parameters": [
          {
            "description": "The ID of the page theme template whose styling to update (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PageThemeTemplatesServiceUpdatePageThemeTemplateStylingBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdatePageThemeTemplateStylingResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "page_themes:write"
            ]
          },
          {
            "oauth2": [
              "page_themes:write"
            ]
          }
        ],
        "summary": "Update a page theme template's styling",
        "tags": [
          "Page Theme Templates"
        ],
        "x-required-scope": "page_themes:write"
      }
    },
    "/v1/page-themes": {
      "get": {
        "description": "Retrieves all page themes belonging to the caller's workspace.\n\nRequires the `page_themes:read` scope.",
        "operationId": "PageThemesService_ListPageThemes",
        "parameters": [
          {
            "description": "Maximum number of page themes to return. Defaults to 100, capped at 1000.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Cursor from a previous response's next_page_token. Empty starts at the\nfirst page. Pages are ordered by (created_at, id), which never change, so a\nrecord cannot move between pages while a client is walking them.",
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListPageThemesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "page_themes:read"
            ]
          },
          {
            "oauth2": [
              "page_themes:read"
            ]
          }
        ],
        "summary": "List page themes for the current workspace",
        "tags": [
          "Page Themes"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        },
        "x-required-scope": "page_themes:read"
      }
    },
    "/v1/page-themes/apply-template": {
      "post": {
        "description": "Copies a template's styling into the link's own page theme. The link keeps its\nown theme row, so the template can later be edited or deleted without changing\nany page that was styled from it. Cover, badge and footer logo media are copied into the\ncaller's workspace when the template carries them.\n\nRequires the `page_themes:write` scope.",
        "operationId": "PageThemesService_ApplyPageThemeTemplate",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApplyPageThemeTemplateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApplyPageThemeTemplateResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "The requested resource doesn't exist.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "page_themes:write"
            ]
          },
          {
            "oauth2": [
              "page_themes:write"
            ]
          }
        ],
        "summary": "Apply a page theme template to a link",
        "tags": [
          "Page Themes"
        ],
        "x-required-scope": "page_themes:write"
      }
    },
    "/v1/page-themes/matching-template": {
      "get": {
        "description": "Returns the page theme template available to the workspace whose styling is identical to the link's current page theme, if one exists. Saving the theme as a template again would only duplicate it.\n\nRequires the `page_themes:read` scope.",
        "operationId": "PageThemeTemplatesService_FindMatchingPageThemeTemplate",
        "parameters": [
          {
            "description": "Link whose current page theme should be matched",
            "in": "query",
            "name": "linkId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FindMatchingPageThemeTemplateResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "page_themes:read"
            ]
          },
          {
            "oauth2": [
              "page_themes:read"
            ]
          }
        ],
        "summary": "Find a page theme template matching a link's styling",
        "tags": [
          "Page Themes"
        ],
        "x-required-scope": "page_themes:read"
      }
    },
    "/v1/page-themes/{id}": {
      "get": {
        "description": "Retrieves a specific page theme by ID.\n\nRequires the `page_themes:read` scope.",
        "operationId": "PageThemesService_GetPageTheme",
        "parameters": [
          {
            "description": "Page theme ID to retrieve",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPageThemeResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "The requested resource doesn't exist.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "page_themes:read"
            ]
          },
          {
            "oauth2": [
              "page_themes:read"
            ]
          }
        ],
        "summary": "Get a page theme",
        "tags": [
          "Page Themes"
        ],
        "x-required-scope": "page_themes:read"
      },
      "patch": {
        "description": "Updates an existing page theme. Cannot update page themes that are currently attached to links.\n\nRequires the `page_themes:write` scope.",
        "operationId": "PageThemesService_UpdatePageTheme",
        "parameters": [
          {
            "description": "Page theme ID to update",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PageThemesServiceUpdatePageThemeBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdatePageThemeResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "The request was unacceptable, often due to missing a required parameter.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "The requested resource doesn't exist.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "page_themes:write"
            ]
          },
          {
            "oauth2": [
              "page_themes:write"
            ]
          }
        ],
        "summary": "Update a page theme",
        "tags": [
          "Page Themes"
        ],
        "x-required-scope": "page_themes:write"
      }
    },
    "/v1/pricing/plans": {
      "get": {
        "description": "Retrieve every plan with its prices, limits and features. Public, no authentication required.",
        "operationId": "PricingService_ListPricingPlans",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListPricingPlansResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [],
        "summary": "List pricing plans",
        "tags": [
          "Pricing"
        ]
      }
    },
    "/v1/public/page-theme-templates": {
      "get": {
        "description": "Retrieve available public page theme templates, optionally filtered by search terms.",
        "operationId": "PageThemeTemplatesService_PublicListPageThemeTemplates",
        "parameters": [
          {
            "description": "Related objects to include in the response\n\nList of related objects to include. Supported values: 'workspace'",
            "explode": true,
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "style": "form"
          },
          {
            "description": "Search query applied to template name/description",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Maximum number of templates to return (defaults to 20)",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Cursor token to retrieve the next page of results",
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Optional workspace ID to filter templates by workspace\n\nFilter public templates by workspace. Only published templates for that workspace will be returned.",
            "in": "query",
            "name": "workspaceId",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicListPageThemeTemplatesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [],
        "summary": "List page theme templates",
        "tags": [
          "Page Theme Templates"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        }
      }
    },
    "/v1/public/page-theme-templates/{slug}": {
      "get": {
        "description": "Retrieve a single published page theme template that is visible in the public gallery.",
        "operationId": "PageThemeTemplatesService_PublicGetPageThemeTemplate",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Related objects to include in the response\n\nList of related objects to include. Supported values: 'workspace'",
            "explode": true,
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "style": "form"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicPageThemeTemplate"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [],
        "summary": "Get a public page theme template",
        "tags": [
          "Page Theme Templates"
        ]
      }
    },
    "/v1/public/qrcode-designs": {
      "post": {
        "description": "Provision a QR code styling preset that can be reused across links or templates.",
        "operationId": "QrcodeDesignService_PublicCreate",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicCreateQrcodeDesignRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicCreateQrcodeDesignResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "QR code design created successfully",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [],
        "summary": "Create a new QR code design",
        "tags": [
          "QR Code Designs"
        ]
      }
    },
    "/v1/public/qrcode-templates": {
      "get": {
        "description": "Retrieve available QR code templates, optionally filtered by search terms or link destination.",
        "operationId": "QrcodeTemplatesService_PublicListQrcodeTemplates",
        "parameters": [
          {
            "description": "Related objects to include in the response\n\nList of related objects to include. Supported values: 'workspace'",
            "explode": true,
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "style": "form"
          },
          {
            "description": "Search query applied to template name/description",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Maximum number of templates to return (defaults to 20)",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Cursor token to retrieve the next page of results",
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Optional workspace ID to filter templates by workspace\n\nFilter public templates by workspace. Only published templates for that workspace will be returned.",
            "in": "query",
            "name": "workspaceId",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicListQrcodeTemplatesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [],
        "summary": "List QR code templates",
        "tags": [
          "QR Code Templates"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        }
      }
    },
    "/v1/public/qrcode-templates/{slug}": {
      "get": {
        "description": "Retrieve a single published QR code template that is visible in the public gallery.",
        "operationId": "QrcodeTemplatesService_PublicGetQrcodeTemplate",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Related objects to include in the response\n\nList of related objects to include. Supported values: 'workspace'",
            "explode": true,
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "style": "form"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicQrcodeTemplate"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [],
        "summary": "Get a public QR code template",
        "tags": [
          "QR Code Templates"
        ]
      }
    },
    "/v1/public/workspaces/{slug}": {
      "get": {
        "description": "Retrieve public information about a workspace that has been published.",
        "operationId": "WorkspacesService_PublicGetWorkspace",
        "parameters": [
          {
            "description": "Workspace slug to retrieve",
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicWorkspace"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [],
        "summary": "Get a public workspace by slug",
        "tags": [
          "Workspaces"
        ]
      }
    },
    "/v1/qrcode-designs/apply-template": {
      "post": {
        "description": "Copy all design settings from a community QR code template to an existing link's QR code design. This replaces the current design with the template's styling.\n\nRequires the `qrcodes:write` scope.",
        "operationId": "QrcodeDesignService_ApplyTemplate",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApplyQrcodeTemplateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApplyQrcodeTemplateResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "qrcodes:write"
            ]
          },
          {
            "oauth2": [
              "qrcodes:write"
            ]
          }
        ],
        "summary": "Apply a QR code template to a link",
        "tags": [
          "QR Code Designs"
        ],
        "x-required-scope": "qrcodes:write"
      }
    },
    "/v1/qrcode-designs/{id}": {
      "delete": {
        "description": "Remove a QR code design that is no longer in use by any assets.\n\nRequires the `qrcodes:write` scope.",
        "operationId": "QrcodeDesignService_Delete",
        "parameters": [
          {
            "description": "The ID of the QR code design to delete",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeleteQrcodeDesignResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "204": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "QR code design deleted successfully",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "qrcodes:write"
            ]
          },
          {
            "oauth2": [
              "qrcodes:write"
            ]
          }
        ],
        "summary": "Delete a QR code design",
        "tags": [
          "QR Code Designs"
        ],
        "x-required-scope": "qrcodes:write"
      },
      "get": {
        "description": "Fetch a QR code design by its identifier including computed metadata.\n\nRequires the `qrcodes:read` scope.",
        "operationId": "QrcodeDesignService_Get",
        "parameters": [
          {
            "description": "The ID of the QR code design to get (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetQrcodeDesignResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "qrcodes:read"
            ]
          },
          {
            "oauth2": [
              "qrcodes:read"
            ]
          }
        ],
        "summary": "Get a QR code design",
        "tags": [
          "QR Code Designs"
        ],
        "x-required-scope": "qrcodes:read"
      },
      "patch": {
        "description": "Apply styling tweaks or media changes to an existing QR code design.\n\nRequires the `qrcodes:write` scope.",
        "operationId": "QrcodeDesignService_Update",
        "parameters": [
          {
            "description": "The ID of the QR code design to update (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QrcodeDesignServiceUpdateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateQrcodeDesignResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "qrcodes:write"
            ]
          },
          {
            "oauth2": [
              "qrcodes:write"
            ]
          }
        ],
        "summary": "Update a QR code design",
        "tags": [
          "QR Code Designs"
        ],
        "x-required-scope": "qrcodes:write"
      }
    },
    "/v1/qrcode-templates": {
      "get": {
        "description": "Retrieve QR code templates that belong to the authenticated caller's workspace.\n\nRequires the `qrcodes:read` scope.",
        "operationId": "QrcodeTemplatesService_ListQrcodeTemplates",
        "parameters": [
          {
            "explode": true,
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "style": "form"
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "default": "QRCODE_TEMPLATE_SCOPE_UNSPECIFIED",
            "description": "Which templates to return. WORKSPACE (default) returns only templates owned by the caller's workspace. AVAILABLE also returns built-in templates and templates other workspaces have published, ordered by the workspace's own usage first, then its own templates, then the rest.\n\n - QRCODE_TEMPLATE_SCOPE_UNSPECIFIED: Defaults to QRCODE_TEMPLATE_SCOPE_WORKSPACE.\n - QRCODE_TEMPLATE_SCOPE_WORKSPACE: Only templates owned by the caller's workspace.\n - QRCODE_TEMPLATE_SCOPE_AVAILABLE: Every template the workspace may use: its own, built-in ones, and\ntemplates published by other workspaces.",
            "enum": [
              "QRCODE_TEMPLATE_SCOPE_UNSPECIFIED",
              "QRCODE_TEMPLATE_SCOPE_WORKSPACE",
              "QRCODE_TEMPLATE_SCOPE_AVAILABLE"
            ],
            "in": "query",
            "name": "scope",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListQrcodeTemplatesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "qrcodes:read"
            ]
          },
          {
            "oauth2": [
              "qrcodes:read"
            ]
          }
        ],
        "summary": "List my QR code templates",
        "tags": [
          "QR Code Templates"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        },
        "x-required-scope": "qrcodes:read"
      },
      "post": {
        "description": "Create a new QR code template using a fresh design. The design must not be used by any other links or templates.\n\nRequires the `qrcodes:write` scope.",
        "operationId": "QrcodeTemplatesService_CreateQrcodeTemplate",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateQrcodeTemplateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateQrcodeTemplateResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "qrcodes:write"
            ]
          },
          {
            "oauth2": [
              "qrcodes:write"
            ]
          }
        ],
        "summary": "Create a new QR code template",
        "tags": [
          "QR Code Templates"
        ],
        "x-required-scope": "qrcodes:write"
      }
    },
    "/v1/qrcode-templates/images:resolve": {
      "post": {
        "description": "Return freshly signed thumbnail URLs for the given templates. The URLs expire, so callers fetch them when they need to render rather than storing them.\n\nRequires the `qrcodes:read` scope.",
        "operationId": "QrcodeTemplatesService_ResolveQrcodeTemplateImages",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResolveQrcodeTemplateImagesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResolveQrcodeTemplateImagesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "qrcodes:read"
            ]
          },
          {
            "oauth2": [
              "qrcodes:read"
            ]
          }
        ],
        "summary": "Resolve QR code template thumbnails",
        "tags": [
          "QR Code Templates"
        ],
        "x-required-scope": "qrcodes:read"
      }
    },
    "/v1/qrcode-templates/import": {
      "post": {
        "description": "Import a public QR code template into your workspace by slug. Creates a private copy owned by your workspace.\n\nRequires the `qrcodes:write` scope.",
        "operationId": "QrcodeTemplatesService_ImportQrcodeTemplate",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImportQrcodeTemplateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportQrcodeTemplateResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "qrcodes:write"
            ]
          },
          {
            "oauth2": [
              "qrcodes:write"
            ]
          }
        ],
        "summary": "Import a public QR code template",
        "tags": [
          "QR Code Templates"
        ],
        "x-required-scope": "qrcodes:write"
      }
    },
    "/v1/qrcode-templates/{id}": {
      "delete": {
        "description": "Remove a QR code template belonging to the authenticated caller's workspace.\n\nRequires the `qrcodes:write` scope.",
        "operationId": "QrcodeTemplatesService_DeleteQrcodeTemplate",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeleteQrcodeTemplateResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "204": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "QR code template deleted successfully",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "qrcodes:write"
            ]
          },
          {
            "oauth2": [
              "qrcodes:write"
            ]
          }
        ],
        "summary": "Delete a workspace QR code template",
        "tags": [
          "QR Code Templates"
        ],
        "x-required-scope": "qrcodes:write"
      },
      "get": {
        "description": "Retrieve a QR code template that belongs to the authenticated caller's workspace.\n\nRequires the `qrcodes:read` scope.",
        "operationId": "QrcodeTemplatesService_GetQrcodeTemplate",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "explode": true,
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "style": "form"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QrcodeTemplate"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "qrcodes:read"
            ]
          },
          {
            "oauth2": [
              "qrcodes:read"
            ]
          }
        ],
        "summary": "Get a workspace QR code template",
        "tags": [
          "QR Code Templates"
        ],
        "x-required-scope": "qrcodes:read"
      },
      "patch": {
        "description": "Modify the name or description of a QR code template owned by the authenticated workspace.\n\nRequires the `qrcodes:write` scope.",
        "operationId": "QrcodeTemplatesService_UpdateQrcodeTemplate",
        "parameters": [
          {
            "description": "The ID of the QR code template to update (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QrcodeTemplatesServiceUpdateQrcodeTemplateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateQrcodeTemplateResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "qrcodes:write"
            ]
          },
          {
            "oauth2": [
              "qrcodes:write"
            ]
          }
        ],
        "summary": "Update a workspace QR code template",
        "tags": [
          "QR Code Templates"
        ],
        "x-required-scope": "qrcodes:write"
      }
    },
    "/v1/qrcode-templates/{id}/publish": {
      "post": {
        "description": "Publish a QR code template to make it available in the public gallery. Requires workspace to be public and template to have slug, description, and name.\n\nRequires the `qrcodes:write` scope.",
        "operationId": "QrcodeTemplatesService_PublishQrcodeTemplate",
        "parameters": [
          {
            "description": "The ID of the QR code template to publish (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QrcodeTemplatesServicePublishQrcodeTemplateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublishQrcodeTemplateResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "qrcodes:write"
            ]
          },
          {
            "oauth2": [
              "qrcodes:write"
            ]
          }
        ],
        "summary": "Publish a workspace QR code template",
        "tags": [
          "QR Code Templates"
        ],
        "x-required-scope": "qrcodes:write"
      }
    },
    "/v1/sandboxes": {
      "get": {
        "description": "List the sandbox workspaces this workspace created, newest first, with when each one expires.\n\nRequires the `tokens:read` scope.",
        "operationId": "SandboxesService_List",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListSandboxesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "tokens:read"
            ]
          },
          {
            "oauth2": [
              "tokens:read"
            ]
          }
        ],
        "summary": "List sandboxes",
        "tags": [
          "Sandboxes"
        ],
        "x-required-scope": "tokens:read"
      },
      "post": {
        "description": "Create an API-only sandbox workspace and return its first token. The token starts with `lb_test_`, holds the scopes of the credential that created it, and is shown only once. Call this with a live workspace credential; a sandbox cannot create sandboxes.\n\nRequires the `tokens:write` scope.",
        "operationId": "SandboxesService_Create",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateSandboxRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateSandboxResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "tokens:write"
            ]
          },
          {
            "oauth2": [
              "tokens:write"
            ]
          }
        ],
        "summary": "Create a sandbox",
        "tags": [
          "Sandboxes"
        ],
        "x-required-scope": "tokens:write"
      }
    },
    "/v1/sandboxes/{id}": {
      "delete": {
        "description": "Delete a sandbox workspace now, with its links, visitors, events and tokens. Sandboxes are also deleted automatically 30 days after creation.\n\nRequires the `tokens:write` scope.",
        "operationId": "SandboxesService_Delete",
        "parameters": [
          {
            "description": "The sandbox to delete (UUID), with everything in it.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {},
                  "type": "object"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "tokens:write"
            ]
          },
          {
            "oauth2": [
              "tokens:write"
            ]
          }
        ],
        "summary": "Delete a sandbox",
        "tags": [
          "Sandboxes"
        ],
        "x-required-scope": "tokens:write"
      }
    },
    "/v1/settings/link-setting/{id}": {
      "get": {
        "description": "Retrieve the current visitor data collection configuration for a link.\n\nRequires the `links:read` scope.",
        "operationId": "SettingsService_GetLinkSetting",
        "parameters": [
          {
            "description": "Identifier of the link setting profile (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetLinkSettingResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:read"
            ]
          },
          {
            "oauth2": [
              "links:read"
            ]
          }
        ],
        "summary": "Get a link setting",
        "tags": [
          "Link Settings"
        ],
        "x-required-scope": "links:read"
      },
      "put": {
        "description": "Adjust the data collection policy associated with a specific link.\n\nRequires the `links:write` scope.",
        "operationId": "SettingsService_UpdateLinkSetting",
        "parameters": [
          {
            "description": "The ID of the link setting to update (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SettingsServiceUpdateLinkSettingBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateLinkSettingResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:write"
            ]
          },
          {
            "oauth2": [
              "links:write"
            ]
          }
        ],
        "summary": "Update a link setting",
        "tags": [
          "Link Settings"
        ],
        "x-required-scope": "links:write"
      }
    },
    "/v1/slack-integrations": {
      "delete": {
        "description": "Disconnect and remove the Slack integration from the workspace.\n\nRequires the `integrations:write` scope.",
        "operationId": "SlackIntegrationsService_Delete",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {},
                  "type": "object"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "integrations:write"
            ]
          },
          {
            "oauth2": [
              "integrations:write"
            ]
          }
        ],
        "summary": "Disconnect Slack integration",
        "tags": [
          "Slack Integrations"
        ],
        "x-required-scope": "integrations:write"
      },
      "get": {
        "description": "Retrieve the Slack integration configuration for the workspace.\n\nRequires the `integrations:read` scope.",
        "operationId": "SlackIntegrationsService_Get",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetSlackIntegrationResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "integrations:read"
            ]
          },
          {
            "oauth2": [
              "integrations:read"
            ]
          }
        ],
        "summary": "Get Slack integration",
        "tags": [
          "Slack Integrations"
        ],
        "x-required-scope": "integrations:read"
      },
      "patch": {
        "description": "Update the Slack integration configuration (channel, triggers, status).\n\nRequires the `integrations:write` scope.",
        "operationId": "SlackIntegrationsService_Update",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSlackIntegrationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateSlackIntegrationResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "integrations:write"
            ]
          },
          {
            "oauth2": [
              "integrations:write"
            ]
          }
        ],
        "summary": "Update Slack integration",
        "tags": [
          "Slack Integrations"
        ],
        "x-required-scope": "integrations:write"
      }
    },
    "/v1/slack-integrations/channels": {
      "get": {
        "description": "List available Slack channels the bot can send notifications to.\n\nRequires the `integrations:read` scope.",
        "operationId": "SlackIntegrationsService_ListChannels",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListSlackChannelsResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "integrations:read"
            ]
          },
          {
            "oauth2": [
              "integrations:read"
            ]
          }
        ],
        "summary": "List Slack channels",
        "tags": [
          "Slack Integrations"
        ],
        "x-required-scope": "integrations:read"
      }
    },
    "/v1/slack-integrations/oauth-url": {
      "get": {
        "description": "Returns the Slack OAuth authorization URL to initiate the Add to Slack flow.\n\nRequires the `integrations:write` scope.",
        "operationId": "SlackIntegrationsService_GetOAuthURL",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetSlackOAuthURLResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "integrations:write"
            ]
          },
          {
            "oauth2": [
              "integrations:write"
            ]
          }
        ],
        "summary": "Get Slack OAuth URL",
        "tags": [
          "Slack Integrations"
        ],
        "x-required-scope": "integrations:write"
      }
    },
    "/v1/slack-integrations/oauth/complete": {
      "post": {
        "description": "Exchanges the Slack authorization code for a bot token and creates the workspace integration.\n\nRequires the `integrations:write` scope.",
        "operationId": "SlackIntegrationsService_CompleteOAuth",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompleteSlackOAuthRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompleteSlackOAuthResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "integrations:write"
            ]
          },
          {
            "oauth2": [
              "integrations:write"
            ]
          }
        ],
        "summary": "Complete Slack OAuth",
        "tags": [
          "Slack Integrations"
        ],
        "x-required-scope": "integrations:write"
      }
    },
    "/v1/slack-integrations/test": {
      "post": {
        "description": "Send a test notification to verify the Slack integration is working.\n\nRequires the `integrations:write` scope.",
        "operationId": "SlackIntegrationsService_Test",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TestSlackIntegrationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestSlackIntegrationResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "integrations:write"
            ]
          },
          {
            "oauth2": [
              "integrations:write"
            ]
          }
        ],
        "summary": "Test Slack integration",
        "tags": [
          "Slack Integrations"
        ],
        "x-required-scope": "integrations:write"
      }
    },
    "/v1/tags": {
      "delete": {
        "description": "Remove a tag by name so it no longer appears for links or analytics filters.\n\nRequires the `links:write` scope.",
        "operationId": "TagsService_Delete",
        "parameters": [
          {
            "description": "Tag name to remove (must exactly match an existing tag within the workspace)",
            "in": "query",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeleteTagResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:write"
            ]
          },
          {
            "oauth2": [
              "links:write"
            ]
          }
        ],
        "summary": "Delete tags",
        "tags": [
          "Tags"
        ],
        "x-required-scope": "links:write"
      },
      "get": {
        "description": "Search workspace tags by name and paginate through matching results.\n\nRequires the `links:read` scope.",
        "operationId": "TagsService_List",
        "parameters": [
          {
            "description": "The search query to filter tags by name",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The maximum number of tags to return",
            "in": "query",
            "name": "pageSize",
            "required": true,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "The token for retrieving the next page of results\nIf not provided, the first page of results will be returned",
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListTagsResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "links:read"
            ]
          },
          {
            "oauth2": [
              "links:read"
            ]
          }
        ],
        "summary": "List tags",
        "tags": [
          "Tags"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        },
        "x-required-scope": "links:read"
      }
    },
    "/v1/timeseries/events": {
      "post": {
        "description": "Requires the `analytics:read` scope.",
        "operationId": "TimeSeriesService_GetEventsTimeSeries",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetEventsTimeSeriesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetEventsTimeSeriesResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "analytics:read"
            ]
          },
          {
            "oauth2": [
              "analytics:read"
            ]
          }
        ],
        "summary": "Get events time series",
        "tags": [
          "Time Series"
        ],
        "x-required-scope": "analytics:read"
      }
    },
    "/v1/visitor/devices/{id}/update": {},
    "/v1/visitor/identify": {
      "post": {
        "description": "Identifies a visitor from an LBID. Anonymous visitors (created at scan time) are promoted or merged into existing identified visitors. If the identity matches an existing visitor, devices and events converge into that source-of-truth record.\n\nRequires the `visitors:write` scope.",
        "operationId": "VisitorsService_Identify",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IdentifyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IdentifyResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "visitors:write"
            ]
          },
          {
            "oauth2": [
              "visitors:write"
            ]
          }
        ],
        "summary": "Identify visitor",
        "tags": [
          "Visitors"
        ],
        "x-required-scope": "visitors:write"
      }
    },
    "/v1/visitors": {
      "get": {
        "description": "Returns a paginated collection of visitors with optional filters, includes, and CSV export. To filter on visitor attributes, use POST /v1/visitors/search, which takes the same parameters as a JSON body.\n\nRequires the `visitors:read` scope.",
        "operationId": "VisitorsService_List",
        "parameters": [
          {
            "description": "Maximum number of visitors to return (default 50, max 200)",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Cursor token to retrieve the next page of results",
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "optional exact match filter",
            "in": "query",
            "name": "email",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "optional fuzzy search across known fields",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "explode": true,
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "style": "form"
          },
          {
            "description": "optional filter by link ID (UUID; visitors who have interacted with this link)",
            "in": "query",
            "name": "linkId",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "default": "RESPONSE_FORMAT_UNSPECIFIED",
            "description": " - RESPONSE_FORMAT_UNSPECIFIED: Response format not specified\n - RESPONSE_FORMAT_JSON: Response format JSON\n - RESPONSE_FORMAT_CSV: Response format CSV",
            "enum": [
              "RESPONSE_FORMAT_UNSPECIFIED",
              "RESPONSE_FORMAT_JSON",
              "RESPONSE_FORMAT_CSV"
            ],
            "in": "query",
            "name": "responseFormat",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "default": "VISITOR_SORT_FIELD_UNSPECIFIED",
            "description": "Field to sort by. Defaults to created_at (newest first).\n\n - VISITOR_SORT_FIELD_UNSPECIFIED: Sort field not specified (defaults to created_at)\n - VISITOR_SORT_FIELD_CREATED_AT: Sort by the date the visitor was first seen\n - VISITOR_SORT_FIELD_VISIT_COUNT: Sort by total number of visits (events)\n - VISITOR_SORT_FIELD_DEVICE_COUNT: Sort by number of attributed devices\n - VISITOR_SORT_FIELD_QRCODE_COUNT: Sort by number of distinct QR codes interacted with",
            "enum": [
              "VISITOR_SORT_FIELD_UNSPECIFIED",
              "VISITOR_SORT_FIELD_CREATED_AT",
              "VISITOR_SORT_FIELD_VISIT_COUNT",
              "VISITOR_SORT_FIELD_DEVICE_COUNT",
              "VISITOR_SORT_FIELD_QRCODE_COUNT"
            ],
            "in": "query",
            "name": "sortField",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "default": "SORT_DIRECTION_UNSPECIFIED",
            "description": "Sort direction. Defaults to descending.\n\n - SORT_DIRECTION_UNSPECIFIED: Sort direction not specified (defaults to descending)\n - SORT_DIRECTION_ASC: Sort in ascending order\n - SORT_DIRECTION_DESC: Sort in descending order",
            "enum": [
              "SORT_DIRECTION_UNSPECIFIED",
              "SORT_DIRECTION_ASC",
              "SORT_DIRECTION_DESC"
            ],
            "in": "query",
            "name": "sortDirection",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListVisitorsResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "visitors:read"
            ]
          },
          {
            "oauth2": [
              "visitors:read"
            ]
          }
        ],
        "summary": "List visitors",
        "tags": [
          "Visitors"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        },
        "x-required-scope": "visitors:read"
      }
    },
    "/v1/visitors/attributes": {
      "get": {
        "description": "Returns the distinct visitor attribute keys available in the workspace or scoped to a single link.\n\nRequires the `visitors:read` scope.",
        "operationId": "VisitorsService_ListAttributeKeys",
        "parameters": [
          {
            "description": "Optional link identifier (UUID). When set, returns keys observed on visitors who interacted with this link.",
            "in": "query",
            "name": "linkId",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListVisitorAttributeKeysResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "visitors:read"
            ]
          },
          {
            "oauth2": [
              "visitors:read"
            ]
          }
        ],
        "summary": "List visitor attribute keys",
        "tags": [
          "Visitors"
        ],
        "x-required-scope": "visitors:read"
      }
    },
    "/v1/visitors/search": {
      "post": {
        "description": "Same as List visitors, with the parameters sent as a JSON body so they can include attributeFilters. Every filter must match, for example budget at least 800000 and timeline equal to under_6_months.\n\nRequires the `visitors:read` scope.",
        "operationId": "VisitorsService_Search",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ListVisitorsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListVisitorsResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "visitors:read"
            ]
          },
          {
            "oauth2": [
              "visitors:read"
            ]
          }
        ],
        "summary": "Search visitors",
        "tags": [
          "Visitors"
        ],
        "x-required-scope": "visitors:read"
      }
    },
    "/v1/visitors/{id}": {
      "delete": {
        "description": "Removes a visitor profile and its stored attributes from the workspace.\n\nRequires the `visitors:write` scope.",
        "operationId": "VisitorsService_Delete",
        "parameters": [
          {
            "description": "Visitor identifier to remove (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeleteVisitorResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "visitors:write"
            ]
          },
          {
            "oauth2": [
              "visitors:write"
            ]
          }
        ],
        "summary": "Delete a visitor",
        "tags": [
          "Visitors"
        ],
        "x-required-scope": "visitors:write"
      },
      "get": {
        "description": "Retrieves a visitor profile by ID with optional devices, events, or links included.\n\nRequires the `visitors:read` scope.",
        "operationId": "VisitorsService_Get",
        "parameters": [
          {
            "description": "Visitor identifier (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Optional relationships to hydrate (\"devices\", \"events\", \"links\")",
            "explode": true,
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "style": "form"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Visitor"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "visitors:read"
            ]
          },
          {
            "oauth2": [
              "visitors:read"
            ]
          }
        ],
        "summary": "Get a visitor",
        "tags": [
          "Visitors"
        ],
        "x-required-scope": "visitors:read"
      },
      "patch": {
        "description": "Applies partial attribute updates to an existing visitor profile.\n\nRequires the `visitors:write` scope.",
        "operationId": "VisitorsService_Update",
        "parameters": [
          {
            "description": "Visitor identifier (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VisitorsServiceUpdateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Visitor"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "visitors:write"
            ]
          },
          {
            "oauth2": [
              "visitors:write"
            ]
          }
        ],
        "summary": "Update a visitor",
        "tags": [
          "Visitors"
        ],
        "x-required-scope": "visitors:write"
      }
    },
    "/v1/visitors/{id}/attributes/{attributeKey}": {
      "delete": {
        "description": "Deletes a single attribute from the visitor profile without affecting other data.\n\nRequires the `visitors:write` scope.",
        "operationId": "VisitorsService_DeleteAttribute",
        "parameters": [
          {
            "description": "Visitor identifier whose attribute should be removed (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Attribute key to delete (without \"$\" prefix)",
            "in": "path",
            "name": "attributeKey",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeleteAttributeResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "visitors:write"
            ]
          },
          {
            "oauth2": [
              "visitors:write"
            ]
          }
        ],
        "summary": "Delete a visitor attribute",
        "tags": [
          "Visitors"
        ],
        "x-required-scope": "visitors:write"
      }
    },
    "/v1/webhooks": {
      "get": {
        "description": "Enumerate all webhooks for the workspace to manage event integrations.\n\nRequires the `webhooks:read` scope.",
        "operationId": "WebhooksService_List",
        "parameters": [
          {
            "default": "WEBHOOK_STATUS_UNSPECIFIED",
            "description": "Filter by webhook status (optional)\n\n - WEBHOOK_STATUS_UNSPECIFIED: Webhook status not specified\n - WEBHOOK_STATUS_ACTIVE: Webhook is active and receiving events\n - WEBHOOK_STATUS_DISABLED: Webhook is disabled due to repeated failures\n - WEBHOOK_STATUS_PAUSED: Webhook is paused by user action",
            "enum": [
              "WEBHOOK_STATUS_UNSPECIFIED",
              "WEBHOOK_STATUS_ACTIVE",
              "WEBHOOK_STATUS_DISABLED",
              "WEBHOOK_STATUS_PAUSED"
            ],
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Maximum number of webhooks to return. Defaults to 100, capped at 1000.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Cursor from a previous response's next_page_token. Empty starts at the\nfirst page. Pages are ordered by (created_at, id), which never change, so a\nrecord cannot move between pages while a client is walking them.",
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListWebhooksResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "webhooks:read"
            ]
          },
          {
            "oauth2": [
              "webhooks:read"
            ]
          }
        ],
        "summary": "List webhooks",
        "tags": [
          "Webhooks"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        },
        "x-required-scope": "webhooks:read"
      },
      "post": {
        "description": "Create a new webhook endpoint to receive event notifications when workflow steps complete.\n\nRequires the `webhooks:write` scope.",
        "operationId": "WebhooksService_Create",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateWebhookRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateWebhookResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "webhooks:write"
            ]
          },
          {
            "oauth2": [
              "webhooks:write"
            ]
          }
        ],
        "summary": "Create a webhook",
        "tags": [
          "Webhooks"
        ],
        "x-required-scope": "webhooks:write"
      }
    },
    "/v1/webhooks/{id}": {
      "delete": {
        "description": "Remove a webhook endpoint so it no longer receives event notifications.\n\nRequires the `webhooks:write` scope.",
        "operationId": "WebhooksService_Delete",
        "parameters": [
          {
            "description": "Identifier of the webhook to delete (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {},
                  "type": "object"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "webhooks:write"
            ]
          },
          {
            "oauth2": [
              "webhooks:write"
            ]
          }
        ],
        "summary": "Delete a webhook",
        "tags": [
          "Webhooks"
        ],
        "x-required-scope": "webhooks:write"
      },
      "get": {
        "description": "Retrieve details for a specific webhook endpoint.\n\nRequires the `webhooks:read` scope.",
        "operationId": "WebhooksService_Get",
        "parameters": [
          {
            "description": "Identifier of the desired webhook (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetWebhookResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "webhooks:read"
            ]
          },
          {
            "oauth2": [
              "webhooks:read"
            ]
          }
        ],
        "summary": "Get a webhook",
        "tags": [
          "Webhooks"
        ],
        "x-required-scope": "webhooks:read"
      },
      "patch": {
        "description": "Modify an existing webhook endpoint configuration.\n\nRequires the `webhooks:write` scope.",
        "operationId": "WebhooksService_Update",
        "parameters": [
          {
            "description": "Identifier of the webhook to update (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhooksServiceUpdateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateWebhookResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "webhooks:write"
            ]
          },
          {
            "oauth2": [
              "webhooks:write"
            ]
          }
        ],
        "summary": "Update a webhook",
        "tags": [
          "Webhooks"
        ],
        "x-required-scope": "webhooks:write"
      }
    },
    "/v1/websocket/contract": {},
    "/v1/workspace": {
      "delete": {
        "description": "Soft-delete the workspace associated with the authenticated member's session. This operation can be reversed by contacting support.\n\nRequires the `workspace:write` scope.",
        "operationId": "WorkspacesService_Delete",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {},
                  "type": "object"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workspace:write"
            ]
          },
          {
            "oauth2": [
              "workspace:write"
            ]
          }
        ],
        "summary": "Delete workspace",
        "tags": [
          "Workspaces"
        ],
        "x-required-scope": "workspace:write"
      },
      "get": {
        "description": "Return the workspace associated with the authenticated member's current session.\n\nRequires the `workspace:read` scope.",
        "operationId": "WorkspacesService_GetMyWorkspace",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Workspace"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workspace:read"
            ]
          },
          {
            "oauth2": [
              "workspace:read"
            ]
          }
        ],
        "summary": "Get my workspace",
        "tags": [
          "Workspaces"
        ],
        "x-required-scope": "workspace:read"
      },
      "put": {
        "description": "Modify workspace settings such as the display name and MFA enforcement policy.\n\nRequires the `workspace:write` scope.",
        "operationId": "WorkspacesService_Update",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWorkspaceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Workspace"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workspace:write"
            ]
          },
          {
            "oauth2": [
              "workspace:write"
            ]
          }
        ],
        "summary": "Update a workspace",
        "tags": [
          "Workspaces"
        ],
        "x-required-scope": "workspace:write"
      }
    },
    "/v1/workspace-tokens": {
      "get": {
        "description": "Enumerate all active workspace tokens for auditing and management.\n\nRequires the `tokens:read` scope.",
        "operationId": "WorkspaceTokensService_List",
        "parameters": [
          {
            "description": "Maximum number to return. Defaults to 100, capped at 1000.",
            "in": "query",
            "name": "pageSize",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Cursor from a previous response's next_page_token. Empty starts at the\nfirst page. Pages are ordered by (created_at, id), which never change, so a\nrecord cannot move between pages while a client is walking them.",
            "in": "query",
            "name": "pageToken",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListWorkspaceTokensResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "tokens:read"
            ]
          },
          {
            "oauth2": [
              "tokens:read"
            ]
          }
        ],
        "summary": "List workspace tokens",
        "tags": [
          "Workspace Tokens"
        ],
        "x-pagination": {
          "cursorAlias": "cursor",
          "cursorParam": "pageToken",
          "endOfList": "nextPageToken is empty or absent",
          "nextCursorField": "nextPageToken",
          "pageSizeParam": "pageSize",
          "type": "cursor"
        },
        "x-required-scope": "tokens:read"
      },
      "post": {
        "description": "Generate a new long-lived API token and return the one-time access secret.\n\nRequires the `tokens:write` scope.",
        "operationId": "WorkspaceTokensService_Create",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateWorkspaceTokenRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateWorkspaceTokenResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "tokens:write"
            ]
          },
          {
            "oauth2": [
              "tokens:write"
            ]
          }
        ],
        "summary": "Create a workspace token",
        "tags": [
          "Workspace Tokens"
        ],
        "x-required-scope": "tokens:write"
      }
    },
    "/v1/workspace-tokens/{id}": {
      "delete": {
        "description": "Revoke a workspace token immediately so it can no longer authenticate.\n\nRequires the `tokens:write` scope.",
        "operationId": "WorkspaceTokensService_Delete",
        "parameters": [
          {
            "description": "Identifier of the token to revoke (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {},
                  "type": "object"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "tokens:write"
            ]
          },
          {
            "oauth2": [
              "tokens:write"
            ]
          }
        ],
        "summary": "Delete a workspace token",
        "tags": [
          "Workspace Tokens"
        ],
        "x-required-scope": "tokens:write"
      },
      "get": {
        "description": "Retrieve metadata for a specific workspace token without revealing its secret.\n\nRequires the `tokens:read` scope.",
        "operationId": "WorkspaceTokensService_Get",
        "parameters": [
          {
            "description": "Identifier of the desired token (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetWorkspaceTokenResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "tokens:read"
            ]
          },
          {
            "oauth2": [
              "tokens:read"
            ]
          }
        ],
        "summary": "Get a workspace token",
        "tags": [
          "Workspace Tokens"
        ],
        "x-required-scope": "tokens:read"
      },
      "patch": {
        "description": "Rename a workspace token or change its scopes. Changes reach every request within 30 seconds. A token can only grant scopes it holds itself.\n\nRequires the `tokens:write` scope.",
        "operationId": "WorkspaceTokensService_Update",
        "parameters": [
          {
            "description": "Identifier of the token to update (UUID)",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkspaceTokensServiceUpdateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateWorkspaceTokenResponse"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "tokens:write"
            ]
          },
          {
            "oauth2": [
              "tokens:write"
            ]
          }
        ],
        "summary": "Update a workspace token",
        "tags": [
          "Workspace Tokens"
        ],
        "x-required-scope": "tokens:write"
      }
    },
    "/v1/workspace/origin-inquiry": {
      "post": {
        "description": "Persist how a workspace discovered Linkbreakers without exposing the value to other workspace APIs.\n\nRequires the `workspace:write` scope.",
        "operationId": "WorkspacesService_UpdateOriginInquiry",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWorkspaceOriginInquiryRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {},
                  "type": "object"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workspace:write"
            ]
          },
          {
            "oauth2": [
              "workspace:write"
            ]
          }
        ],
        "summary": "Update workspace origin inquiry",
        "tags": [
          "Workspaces"
        ],
        "x-required-scope": "workspace:write"
      }
    },
    "/v1/workspace/origin-purpose": {
      "post": {
        "description": "Persist what the workspace wants to build with Linkbreakers for AI assistance without exposing the value to other workspace APIs.\n\nRequires the `workspace:write` scope.",
        "operationId": "WorkspacesService_UpdateOriginPurpose",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWorkspaceOriginPurposeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {},
                  "type": "object"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workspace:write"
            ]
          },
          {
            "oauth2": [
              "workspace:write"
            ]
          }
        ],
        "summary": "Update workspace origin purpose",
        "tags": [
          "Workspaces"
        ],
        "x-required-scope": "workspace:write"
      }
    },
    "/v1/workspace/request-enrollment": {
      "post": {
        "description": "Submit a request for workspace enrollment, setting the enroll_requested_at timestamp.\n\nRequires the `workspace:write` scope.",
        "operationId": "WorkspacesService_RequestEnrollment",
        "parameters": [
          {
            "description": "Makes retrying this request safe. See components.parameters.IdempotencyKey.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RequestWorkspaceEnrollmentRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {},
                  "type": "object"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workspace:write"
            ]
          },
          {
            "oauth2": [
              "workspace:write"
            ]
          }
        ],
        "summary": "Request workspace enrollment",
        "tags": [
          "Workspaces"
        ],
        "x-required-scope": "workspace:write"
      }
    },
    "/v1/workspaces/{id}": {
      "get": {
        "description": "Retrieve workspace details for the provided identifier, typically for internal tooling.\n\nRequires the `workspace:read` scope.",
        "operationId": "WorkspacesService_GetWorkspace",
        "parameters": [
          {
            "description": "Workspace identifier (UUID) to retrieve",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Workspace"
                }
              }
            },
            "description": "Everything worked as expected.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "description": "Unexpected error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": [
              "workspace:read"
            ]
          },
          {
            "oauth2": [
              "workspace:read"
            ]
          }
        ],
        "summary": "Get a workspace by ID",
        "tags": [
          "Workspaces"
        ],
        "x-required-scope": "workspace:read"
      }
    }
  },
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "servers": [
    {
      "url": "https://api.linkbreakers.com"
    }
  ],
  "tags": [
    {
      "description": "Claiming a workspace an AI agent registered for itself. An agent registers at the authorization server (https://mcp.linkbreakers.com/agent/identity, see https://linkbreakers.com/auth.md) and hands a person a claim link and a 6-digit code; these endpoints are the person's side of that ceremony.",
      "name": "Agent Identity"
    },
    {
      "description": "What the workspace has used of each limit its plan sets, read from the same counters that enforce them.",
      "name": "Allowances"
    },
    {
      "description": "Endpoints for managing analytics dashboards with flexible, config-driven widgets. Each widget defines its own data source and visualization.",
      "name": "Analytics Dashboard"
    },
    {
      "description": "Endpoints for retrieving aggregated analytics data for dashboard widgets including geographic breakdown, device distribution, and visitor trends.",
      "name": "Analytics Data"
    },
    {
      "description": "The permissions an API token or OAuth grant can hold. Every authenticated endpoint requires exactly one scope, declared on the operation.",
      "name": "API Scopes"
    },
    {
      "description": "Context-aware assistant that delegates to specialized sub-assistants based on the resource being edited.",
      "name": "Assistant"
    },
    {
      "description": "Endpoints for managing custom domains in Linkbreakers. These endpoints allow you to register, verify, and manage custom domains for your workspace.",
      "name": "Custom Domains"
    },
    {
      "description": "Endpoints for managing directories in Linkbreakers. Directories let you organize links and other directories into a hierarchical folder structure.",
      "name": "Directories"
    },
    {
      "description": "Endpoints for managing events in Linkbreakers. These endpoints allow you to collect data and list events.",
      "name": "Events"
    },
    {
      "description": "Connect your Google account to automatically sync form responses from links that redirect to Google Forms.",
      "name": "Google Forms Integrations"
    },
    {
      "description": "Long-running operations. An endpoint that works in the background answers 202 Accepted with a job and a Location header; poll GET /v1/jobs/{id} until the status is JOB_STATUS_SUCCEEDED or JOB_STATUS_FAILED. Jobs can be read for 24 hours after they finish.",
      "name": "Jobs"
    },
    {
      "description": "Endpoints for managing shortened links in Linkbreakers. These endpoints allow you to create, retrieve, list, and delete shortened links for your workspace.",
      "name": "Links"
    },
    {
      "description": "Endpoints for managing media files in Linkbreakers. These endpoints allow you to upload, retrieve, list, and delete media files for your workspace.",
      "name": "Media"
    },
    {
      "description": "Endpoints for managing members in Linkbreakers. These endpoints allow you to invite, retrieve, update, and delete members.",
      "name": "Members"
    },
    {
      "description": "Endpoints for analyzing workspace activity within Linkbreakers, covering rolling event totals, audience reach, and calendar heatmaps.",
      "name": "Workspace Metrics"
    },
    {
      "description": "Endpoints for managing Page Theme Templates in Linkbreakers. These endpoints allow you to create, retrieve, update, publish, import, and delete reusable page styling.",
      "name": "Page Theme Templates"
    },
    {
      "description": "Endpoints for managing page visual themes. These endpoints allow you to create, read, and update themes for canvas, cover, badge, container, typography, footer logo, and interactive elements.",
      "name": "Page Themes"
    },
    {
      "description": "Public pricing catalog: the plans, what each costs and what each allows. Prices come from the billing provider and limits from the code that enforces them.",
      "name": "Pricing"
    },
    {
      "description": "Endpoints for managing QR Code Designs in Linkbreakers. These endpoints allow you to create, retrieve, update, and delete QR Code Designs.",
      "name": "QR Code Designs"
    },
    {
      "description": "Endpoints for managing QR Code Templates in Linkbreakers. These endpoints allow you to create, retrieve, update, and delete QR Code Templates.",
      "name": "QR Code Templates"
    },
    {
      "description": "Sandbox workspaces for testing an integration without touching live data. A sandbox is a separate, API-only workspace created from your live workspace. Its tokens start with `lb_test_`, and the API refuses a `lb_test_` prefix on a live token. Sandbox usage is never billed and does not count toward your plan: a sandbox has its own monthly caps (1,000 API calls, 500 counted scans and credits for 50 links) and allows no custom domains, members or credit top-ups. Links resolve and webhooks fire normally; a scan of a sandbox link answers with `X-Linkbreakers-Sandbox: true` and `X-Robots-Tag: noindex`. A sandbox and everything in it is deleted 30 days after it was created. A workspace holds at most 3 sandboxes.",
      "name": "Sandboxes"
    },
    {
      "description": "Endpoints for managing link-level data collection settings in Linkbreakers.",
      "name": "Link Settings"
    },
    {
      "description": "Endpoints for managing the Slack integration. Connect your Slack workspace to receive real-time notifications when events occur on your links.",
      "name": "Slack Integrations"
    },
    {
      "description": "Endpoints for managing tags in Linkbreakers. These endpoints allow you to search for tags in a workspace.",
      "name": "Tags"
    },
    {
      "description": "Endpoints for managing time series in Linkbreakers. These endpoints allow you to get events time series.",
      "name": "Times Series"
    },
    {
      "description": "Identify and manage visitors. Accepts system fields like $email, $phone and arbitrary key/value attributes.",
      "name": "Visitors"
    },
    {
      "description": "Endpoints for managing webhooks in Linkbreakers. These endpoints allow you to create, list, and delete webhooks for event notifications.",
      "name": "Webhooks"
    },
    {
      "description": "Not part of the public API.",
      "name": "Internal"
    },
    {
      "description": "Endpoints for managing workflow steps in Linkbreakers. Workflow steps define the behavior of links, such as redirection destinations and data collection flows.",
      "name": "Workflow Steps"
    },
    {
      "description": "Endpoints for managing workspace tokens in Linkbreakers. These endpoints allow you to create, list, and delete workspace tokens for authentication.",
      "name": "Workspace Tokens"
    },
    {
      "description": "Endpoints for managing workspaces in Linkbreakers. These endpoints allow you to update and get workspaces.",
      "name": "Workspaces"
    }
  ]
}