{
  "openapi": "3.1.0",
  "info": {
    "title": "Eternal QR External API",
    "version": "1.0.0",
    "summary": "Create and manage permanent QR codes through Connect-RPC over HTTP/JSON.",
    "description": "The Eternal QR External API is a server-to-server API for workspace-scoped\nQR management and analytics. It uses Connect-RPC unary endpoints with\nordinary JSON request and response bodies.\n\n[Create an API key](https://app.eqr.link/api-keys), grant only the scopes\nthe integration needs, and send it as a Bearer token. Full keys are\ndisplayed once and must be stored in a secret manager.\n\n[Download the OpenAPI document](/openapi.json) or read the\n[Connect error format](https://connectrpc.com/docs/protocol/#error-end-stream).\n",
    "termsOfService": "https://eqr.link/terms",
    "contact": {
      "name": "Eternal QR",
      "url": "https://eqr.link"
    }
  },
  "servers": [
    {
      "url": "https://api.eqr.link",
      "description": "Production"
    }
  ],
  "security": [
    {
      "apiKey": []
    }
  ],
  "components": {
    "securitySchemes": {
      "apiKey": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "eqr_live_<prefix>_<secret>",
        "description": "Workspace-scoped API key created in the Eternal QR dashboard."
      }
    },
    "schemas": {
      "connect-protocol-version": {
        "type": "number",
        "title": "Connect-Protocol-Version",
        "enum": [
          1
        ],
        "description": "Define the version of the Connect protocol",
        "const": 1
      },
      "connect-timeout-header": {
        "type": "number",
        "title": "Connect-Timeout-Ms",
        "description": "Define the timeout, in ms"
      },
      "connect.error": {
        "type": "object",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "invalid_argument",
              "failed_precondition",
              "unauthenticated",
              "permission_denied",
              "not_found",
              "resource_exhausted",
              "unavailable"
            ],
            "description": "Stable machine-readable Connect error code."
          },
          "message": {
            "type": "string",
            "description": "Developer-facing error message."
          },
          "details": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Optional structured error details."
          }
        },
        "additionalProperties": false,
        "description": "Error returned by Connect. See the [Connect error format](https://connectrpc.com/docs/protocol/#error-end-stream)."
      },
      "eternalqr.v1.ABRoutingConfig": {
        "type": "object",
        "properties": {
          "variants": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/eternalqr.v1.ABRoutingConfig.Variant"
            },
            "title": "variants"
          }
        },
        "title": "ABRoutingConfig",
        "additionalProperties": false
      },
      "eternalqr.v1.ABRoutingConfig.Variant": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "title": "url"
          },
          "weight": {
            "type": "integer",
            "title": "weight",
            "format": "int32",
            "description": "Weight as percentage (e.g. 50 = 50%)"
          },
          "name": {
            "type": "string",
            "title": "name",
            "description": "Optional label: \"Control\", \"Variant A\""
          }
        },
        "title": "Variant",
        "additionalProperties": false
      },
      "eternalqr.v1.AdvancedAnalyticsSummary": {
        "type": "object",
        "properties": {
          "totalScans": {
            "type": "integer",
            "title": "total_scans",
            "format": "int32"
          },
          "dailyScans": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/eternalqr.v1.DailyScanPoint"
            },
            "title": "daily_scans"
          },
          "devices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/eternalqr.v1.DeviceCount"
            },
            "title": "devices"
          },
          "osBreakdown": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/eternalqr.v1.OSCount"
            },
            "title": "os_breakdown"
          },
          "uniqueVisitors": {
            "type": "integer",
            "title": "unique_visitors",
            "format": "int32"
          },
          "browsers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/eternalqr.v1.BrowserCount"
            },
            "title": "browsers"
          },
          "countries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/eternalqr.v1.CountryCount"
            },
            "title": "countries"
          },
          "topReferers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/eternalqr.v1.RefererCount"
            },
            "title": "top_referers"
          },
          "hourlyDistribution": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/eternalqr.v1.HourlyScanPoint"
            },
            "title": "hourly_distribution"
          }
        },
        "title": "AdvancedAnalyticsSummary",
        "additionalProperties": false
      },
      "eternalqr.v1.ArchiveQRRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          }
        },
        "title": "ArchiveQRRequest",
        "additionalProperties": false
      },
      "eternalqr.v1.ArchiveQRResponse": {
        "type": "object",
        "properties": {
          "qrCode": {
            "title": "qr_code",
            "$ref": "#/components/schemas/eternalqr.v1.QRCode"
          }
        },
        "title": "ArchiveQRResponse",
        "additionalProperties": false
      },
      "eternalqr.v1.BrowserCount": {
        "type": "object",
        "properties": {
          "browserName": {
            "type": "string",
            "title": "browser_name",
            "description": "\"Chrome\", \"Safari\", \"Firefox\", \"Edge\", \"Opera\", \"Samsung\", \"Other\""
          },
          "count": {
            "type": "integer",
            "title": "count",
            "format": "int32"
          }
        },
        "title": "BrowserCount",
        "additionalProperties": false
      },
      "eternalqr.v1.CountryCount": {
        "type": "object",
        "properties": {
          "countryCode": {
            "type": "string",
            "title": "country_code",
            "description": "ISO 3166-1 alpha-2 (e.g. \"US\", \"DE\", \"FR\")"
          },
          "count": {
            "type": "integer",
            "title": "count",
            "format": "int32"
          }
        },
        "title": "CountryCount",
        "additionalProperties": false
      },
      "eternalqr.v1.CreateQRCodeRequest": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "title": "url"
          },
          "isDynamic": {
            "type": "boolean",
            "title": "is_dynamic"
          },
          "slug": {
            "type": [
              "string",
              "null"
            ],
            "title": "slug"
          }
        },
        "title": "CreateQRCodeRequest",
        "additionalProperties": false
      },
      "eternalqr.v1.CreateQRCodeResponse": {
        "type": "object",
        "properties": {
          "qrCode": {
            "title": "qr_code",
            "$ref": "#/components/schemas/eternalqr.v1.QRCode"
          }
        },
        "title": "CreateQRCodeResponse",
        "additionalProperties": false
      },
      "eternalqr.v1.DailyScanPoint": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "title": "date",
            "description": "YYYY-MM-DD"
          },
          "count": {
            "type": "integer",
            "title": "count",
            "format": "int32"
          }
        },
        "title": "DailyScanPoint",
        "additionalProperties": false
      },
      "eternalqr.v1.DeviceCount": {
        "type": "object",
        "properties": {
          "deviceType": {
            "type": "string",
            "title": "device_type",
            "description": "\"mobile\", \"desktop\", \"tablet\", \"other\""
          },
          "count": {
            "type": "integer",
            "title": "count",
            "format": "int32"
          }
        },
        "title": "DeviceCount",
        "additionalProperties": false
      },
      "eternalqr.v1.GeoRoutingConfig": {
        "type": "object",
        "properties": {
          "rules": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/eternalqr.v1.GeoRoutingConfig.GeoRule"
            },
            "title": "rules"
          },
          "fallbackUrl": {
            "type": "string",
            "title": "fallback_url",
            "description": "Default URL when no geo rule matches"
          }
        },
        "title": "GeoRoutingConfig",
        "additionalProperties": false
      },
      "eternalqr.v1.GeoRoutingConfig.GeoRule": {
        "type": "object",
        "properties": {
          "countryCode": {
            "type": "string",
            "title": "country_code",
            "description": "ISO 3166-1 alpha-2 (e.g. \"US\", \"DE\")"
          },
          "url": {
            "type": "string",
            "title": "url"
          }
        },
        "title": "GeoRule",
        "additionalProperties": false
      },
      "eternalqr.v1.GetAdvancedAnalyticsRequest": {
        "type": "object",
        "properties": {
          "qrId": {
            "type": "string",
            "title": "qr_id",
            "description": "Optional: empty means account-wide"
          },
          "timeRange": {
            "type": "string",
            "title": "time_range",
            "description": "e.g. \"7d\", \"30d\", \"all\""
          }
        },
        "title": "GetAdvancedAnalyticsRequest",
        "additionalProperties": false
      },
      "eternalqr.v1.GetAdvancedAnalyticsResponse": {
        "type": "object",
        "properties": {
          "summary": {
            "title": "summary",
            "$ref": "#/components/schemas/eternalqr.v1.AdvancedAnalyticsSummary"
          }
        },
        "title": "GetAdvancedAnalyticsResponse",
        "additionalProperties": false
      },
      "eternalqr.v1.GetQRAnalyticsRequest": {
        "type": "object",
        "properties": {
          "qrId": {
            "type": "string",
            "title": "qr_id"
          }
        },
        "title": "GetQRAnalyticsRequest",
        "additionalProperties": false
      },
      "eternalqr.v1.GetQRAnalyticsResponse": {
        "type": "object",
        "properties": {
          "totalScans": {
            "type": "integer",
            "title": "total_scans",
            "format": "int32"
          },
          "dailyScans": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/eternalqr.v1.DailyScanPoint"
            },
            "title": "daily_scans"
          },
          "devices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/eternalqr.v1.DeviceCount"
            },
            "title": "devices"
          },
          "osBreakdown": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/eternalqr.v1.OSCount"
            },
            "title": "os_breakdown"
          }
        },
        "title": "GetQRAnalyticsResponse",
        "additionalProperties": false
      },
      "eternalqr.v1.GetQRRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          }
        },
        "title": "GetQRRequest",
        "additionalProperties": false
      },
      "eternalqr.v1.GetQRResponse": {
        "type": "object",
        "properties": {
          "qr": {
            "title": "qr",
            "$ref": "#/components/schemas/eternalqr.v1.QRCode"
          },
          "scanCount": {
            "type": [
              "integer",
              "string"
            ],
            "title": "scan_count",
            "format": "int64"
          },
          "currentDestination": {
            "type": "string",
            "title": "current_destination",
            "description": "current_destination is the decrypted active destination URL for the QR.\n For dynamic QRs it equals the routing target; for static QRs it equals qr.url."
          }
        },
        "title": "GetQRResponse",
        "additionalProperties": false
      },
      "eternalqr.v1.HourlyScanPoint": {
        "type": "object",
        "properties": {
          "hour": {
            "type": "integer",
            "title": "hour",
            "format": "int32",
            "description": "0-23"
          },
          "count": {
            "type": "integer",
            "title": "count",
            "format": "int32"
          }
        },
        "title": "HourlyScanPoint",
        "additionalProperties": false
      },
      "eternalqr.v1.ListQRCodesRequest": {
        "type": "object",
        "title": "ListQRCodesRequest",
        "additionalProperties": false,
        "description": "empty"
      },
      "eternalqr.v1.ListQRCodesResponse": {
        "type": "object",
        "properties": {
          "qrCodes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/eternalqr.v1.QRCode"
            },
            "title": "qr_codes"
          }
        },
        "title": "ListQRCodesResponse",
        "additionalProperties": false
      },
      "eternalqr.v1.OSCount": {
        "type": "object",
        "properties": {
          "osName": {
            "type": "string",
            "title": "os_name",
            "description": "\"iOS\", \"Android\", \"Windows\", \"Mac\", \"other\""
          },
          "count": {
            "type": "integer",
            "title": "count",
            "format": "int32"
          }
        },
        "title": "OSCount",
        "additionalProperties": false
      },
      "eternalqr.v1.PauseQRRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          }
        },
        "title": "PauseQRRequest",
        "additionalProperties": false
      },
      "eternalqr.v1.PauseQRResponse": {
        "type": "object",
        "properties": {
          "qrCode": {
            "title": "qr_code",
            "$ref": "#/components/schemas/eternalqr.v1.QRCode"
          }
        },
        "title": "PauseQRResponse",
        "additionalProperties": false
      },
      "eternalqr.v1.QRCode": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "url": {
            "type": "string",
            "title": "url"
          },
          "ownerId": {
            "type": "string",
            "title": "owner_id"
          },
          "createdAt": {
            "type": "string",
            "title": "created_at"
          },
          "modules": {
            "title": "modules",
            "$ref": "#/components/schemas/eternalqr.v1.QRCodeModules"
          },
          "isDynamic": {
            "type": "boolean",
            "title": "is_dynamic"
          },
          "updatedAt": {
            "type": "string",
            "title": "updated_at"
          },
          "txHash": {
            "type": [
              "string",
              "null"
            ],
            "title": "tx_hash",
            "description": "Base transaction hash. Present only on paid Eternal records whose anchoring write has landed. Absent means the record was never written to Base, which is the permanent state of every Basic record."
          },
          "status": {
            "type": "string",
            "title": "status",
            "description": "Anchoring status, for example 'pending' or 'active'."
          },
          "lifecycleStatus": {
            "type": "string",
            "title": "lifecycle_status",
            "description": "Lifecycle: 'active', 'archived', 'paused'"
          },
          "slug": {
            "type": "string",
            "title": "slug",
            "description": "Vanity slug / custom short path (optional)"
          },
          "workspaceId": {
            "type": [
              "string",
              "null"
            ],
            "title": "workspace_id",
            "description": "Optional workspace the QR code belongs to"
          },
          "tier": {
            "type": "string",
            "title": "tier",
            "description": "Paid tier of the record: 'basic' (hosted only) or 'eternal' (anchored on Base, recovery key). The Dynamic upgrade is a separate axis carried by isDynamic."
          },
          "isEternal": {
            "type": "boolean",
            "title": "is_eternal",
            "description": "True when the record holds a consumed Eternal anchor slot. Equivalent to tier == \"eternal\"; do not infer it from txHash or status, both of which lag the decision."
          }
        },
        "title": "QRCode",
        "additionalProperties": false
      },
      "eternalqr.v1.QRCodeModules": {
        "type": "object",
        "properties": {
          "customDomain": {
            "type": [
              "string",
              "null"
            ],
            "title": "custom_domain"
          },
          "analyticsEnabled": {
            "type": "boolean",
            "title": "analytics_enabled"
          },
          "pixelId": {
            "type": [
              "string",
              "null"
            ],
            "title": "pixel_id"
          },
          "deviceRoutingEnabled": {
            "type": "boolean",
            "title": "device_routing_enabled"
          },
          "passwordProtected": {
            "type": "boolean",
            "title": "password_protected"
          },
          "expiresAt": {
            "type": [
              "string",
              "null"
            ],
            "title": "expires_at"
          },
          "scanLimit": {
            "type": [
              "integer",
              "null"
            ],
            "title": "scan_limit",
            "format": "int32"
          },
          "iosUrl": {
            "type": [
              "string",
              "null"
            ],
            "title": "ios_url"
          },
          "androidUrl": {
            "type": [
              "string",
              "null"
            ],
            "title": "android_url"
          },
          "timeRouting": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/eternalqr.v1.TimeRoutingConfig"
              },
              {
                "type": "null"
              }
            ],
            "title": "time_routing"
          },
          "password": {
            "type": [
              "string",
              "null"
            ],
            "title": "password",
            "writeOnly": true,
            "description": "Plaintext password accepted only when configuring password protection. It is never returned."
          },
          "abRouting": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/eternalqr.v1.ABRoutingConfig"
              },
              {
                "type": "null"
              }
            ],
            "title": "ab_routing"
          },
          "geoRouting": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/eternalqr.v1.GeoRoutingConfig"
              },
              {
                "type": "null"
              }
            ],
            "title": "geo_routing"
          },
          "scanAlertThreshold": {
            "type": [
              "integer",
              "null"
            ],
            "title": "scan_alert_threshold",
            "format": "int32"
          },
          "scanAlertEmail": {
            "type": [
              "string",
              "null"
            ],
            "title": "scan_alert_email"
          }
        },
        "title": "QRCodeModules",
        "additionalProperties": false
      },
      "eternalqr.v1.RefererCount": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string",
            "title": "domain",
            "description": "e.g. \"google.com\", \"twitter.com\""
          },
          "count": {
            "type": "integer",
            "title": "count",
            "format": "int32"
          }
        },
        "title": "RefererCount",
        "additionalProperties": false
      },
      "eternalqr.v1.RestoreQRRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          }
        },
        "title": "RestoreQRRequest",
        "additionalProperties": false
      },
      "eternalqr.v1.RestoreQRResponse": {
        "type": "object",
        "properties": {
          "qrCode": {
            "title": "qr_code",
            "$ref": "#/components/schemas/eternalqr.v1.QRCode"
          }
        },
        "title": "RestoreQRResponse",
        "additionalProperties": false
      },
      "eternalqr.v1.SetSlugRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id",
            "description": "QR code ID"
          },
          "slug": {
            "type": "string",
            "title": "slug",
            "description": "Desired slug (3-30 chars, lowercase alphanumeric + hyphens)"
          }
        },
        "title": "SetSlugRequest",
        "additionalProperties": false
      },
      "eternalqr.v1.SetSlugResponse": {
        "type": "object",
        "properties": {
          "qrCode": {
            "title": "qr_code",
            "$ref": "#/components/schemas/eternalqr.v1.QRCode"
          }
        },
        "title": "SetSlugResponse",
        "additionalProperties": false
      },
      "eternalqr.v1.TimeRoutingConfig": {
        "type": "object",
        "properties": {
          "slots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/eternalqr.v1.TimeRoutingConfig.TimeSlot"
            },
            "title": "slots"
          }
        },
        "title": "TimeRoutingConfig",
        "additionalProperties": false
      },
      "eternalqr.v1.TimeRoutingConfig.TimeSlot": {
        "type": "object",
        "properties": {
          "startHour": {
            "type": "integer",
            "title": "start_hour",
            "format": "int32"
          },
          "endHour": {
            "type": "integer",
            "title": "end_hour",
            "format": "int32"
          },
          "url": {
            "type": "string",
            "title": "url"
          }
        },
        "title": "TimeSlot",
        "additionalProperties": false
      },
      "eternalqr.v1.UpdateModulesRequest": {
        "type": "object",
        "properties": {
          "qrId": {
            "type": "string",
            "title": "qr_id"
          },
          "modules": {
            "title": "modules",
            "$ref": "#/components/schemas/eternalqr.v1.QRCodeModules"
          }
        },
        "title": "UpdateModulesRequest",
        "additionalProperties": false
      },
      "eternalqr.v1.UpdateModulesResponse": {
        "type": "object",
        "properties": {
          "qrCode": {
            "title": "qr_code",
            "$ref": "#/components/schemas/eternalqr.v1.QRCode"
          }
        },
        "title": "UpdateModulesResponse",
        "additionalProperties": false
      },
      "eternalqr.v1.UpdateUrlRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id"
          },
          "url": {
            "type": "string",
            "title": "url"
          },
          "slug": {
            "type": [
              "string",
              "null"
            ],
            "title": "slug"
          }
        },
        "title": "UpdateUrlRequest",
        "additionalProperties": false
      },
      "eternalqr.v1.UpdateUrlResponse": {
        "type": "object",
        "properties": {
          "qrCode": {
            "title": "qr_code",
            "$ref": "#/components/schemas/eternalqr.v1.QRCode"
          },
          "txHash": {
            "type": [
              "string",
              "null"
            ],
            "title": "tx_hash",
            "description": "Set only when the update was re-anchored, i.e. the record is Dynamic AND\n Eternal. Absent for every non-Eternal update, which never reaches Base.\n Workspace approval holds carry the \"pending_approval\" sentinel instead of a\n hash; read qr_code.status rather than parsing this field."
          }
        },
        "title": "UpdateUrlResponse",
        "additionalProperties": false
      },
      "eternalqr.v1.UpgradeToDynamicRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "id",
            "description": "QR code ID to upgrade"
          }
        },
        "title": "UpgradeToDynamicRequest",
        "additionalProperties": false,
        "description": "--- Upgrade Static → Dynamic ---"
      },
      "eternalqr.v1.UpgradeToDynamicResponse": {
        "type": "object",
        "properties": {
          "qrCode": {
            "title": "qr_code",
            "$ref": "#/components/schemas/eternalqr.v1.QRCode"
          }
        },
        "title": "UpgradeToDynamicResponse",
        "additionalProperties": false
      }
    }
  },
  "paths": {
    "/eternalqr.v1.QRCodeService/Create": {
      "post": {
        "tags": [
          "QR codes"
        ],
        "summary": "Create a QR code",
        "operationId": "Create",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": "1"
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/eternalqr.v1.CreateQRCodeRequest"
              },
              "example": {
                "url": "https://example.com/landing",
                "isDynamic": true
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/eternalqr.v1.CreateQRCodeResponse"
                }
              }
            }
          },
          "400": {
            "description": "Connect error: invalid_argument or failed_precondition",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "invalid_argument": {
                    "summary": "invalid_argument",
                    "value": {
                      "code": "invalid_argument",
                      "message": "The request contains an invalid field."
                    }
                  },
                  "failed_precondition": {
                    "summary": "failed_precondition",
                    "value": {
                      "code": "failed_precondition",
                      "message": "The QR code is not in a state that permits this operation."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Connect error: unauthenticated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unauthenticated": {
                    "summary": "unauthenticated",
                    "value": {
                      "code": "unauthenticated",
                      "message": "A valid API key is required."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Connect error: permission_denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "permission_denied": {
                    "summary": "permission_denied",
                    "value": {
                      "code": "permission_denied",
                      "message": "The API key lacks the required scope or workspace access."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Connect error: not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "not_found": {
                    "summary": "not_found",
                    "value": {
                      "code": "not_found",
                      "message": "The QR code was not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Connect error: resource_exhausted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "resource_exhausted": {
                    "summary": "resource_exhausted",
                    "value": {
                      "code": "resource_exhausted",
                      "message": "The API key rate limit or QR quota was exceeded."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Connect error: unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unavailable": {
                    "summary": "unavailable",
                    "value": {
                      "code": "unavailable",
                      "message": "The service is temporarily unavailable. Retry with backoff."
                    }
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          }
        },
        "description": "Creates a static or dynamic QR code in the API key workspace.\n\nRequired API-key scope: `qr:write`.",
        "security": [
          {
            "apiKey": []
          }
        ]
      }
    },
    "/eternalqr.v1.QRCodeService/UpdateUrl": {
      "post": {
        "tags": [
          "QR codes"
        ],
        "summary": "Update a dynamic QR destination",
        "operationId": "UpdateUrl",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": "1"
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/eternalqr.v1.UpdateUrlRequest"
              },
              "example": {
                "id": "abc123",
                "url": "https://example.com/new-landing"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/eternalqr.v1.UpdateUrlResponse"
                }
              }
            }
          },
          "400": {
            "description": "Connect error: invalid_argument or failed_precondition",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "invalid_argument": {
                    "summary": "invalid_argument",
                    "value": {
                      "code": "invalid_argument",
                      "message": "The request contains an invalid field."
                    }
                  },
                  "failed_precondition": {
                    "summary": "failed_precondition",
                    "value": {
                      "code": "failed_precondition",
                      "message": "The QR code is not in a state that permits this operation."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Connect error: unauthenticated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unauthenticated": {
                    "summary": "unauthenticated",
                    "value": {
                      "code": "unauthenticated",
                      "message": "A valid API key is required."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Connect error: permission_denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "permission_denied": {
                    "summary": "permission_denied",
                    "value": {
                      "code": "permission_denied",
                      "message": "The API key lacks the required scope or workspace access."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Connect error: not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "not_found": {
                    "summary": "not_found",
                    "value": {
                      "code": "not_found",
                      "message": "The QR code was not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Connect error: resource_exhausted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "resource_exhausted": {
                    "summary": "resource_exhausted",
                    "value": {
                      "code": "resource_exhausted",
                      "message": "The API key rate limit or QR quota was exceeded."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Connect error: unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unavailable": {
                    "summary": "unavailable",
                    "value": {
                      "code": "unavailable",
                      "message": "The service is temporarily unavailable. Retry with backoff."
                    }
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          }
        },
        "description": "Changes the destination of a dynamic QR code without changing its printed URL.\n\nRequired API-key scope: `qr:write`.",
        "security": [
          {
            "apiKey": []
          }
        ]
      }
    },
    "/eternalqr.v1.QRCodeService/UpdateModules": {
      "post": {
        "tags": [
          "QR codes"
        ],
        "summary": "Update QR modules",
        "operationId": "UpdateModules",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": "1"
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/eternalqr.v1.UpdateModulesRequest"
              },
              "example": {
                "id": "abc123",
                "modules": {
                  "analyticsEnabled": true
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/eternalqr.v1.UpdateModulesResponse"
                }
              }
            }
          },
          "400": {
            "description": "Connect error: invalid_argument or failed_precondition",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "invalid_argument": {
                    "summary": "invalid_argument",
                    "value": {
                      "code": "invalid_argument",
                      "message": "The request contains an invalid field."
                    }
                  },
                  "failed_precondition": {
                    "summary": "failed_precondition",
                    "value": {
                      "code": "failed_precondition",
                      "message": "The QR code is not in a state that permits this operation."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Connect error: unauthenticated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unauthenticated": {
                    "summary": "unauthenticated",
                    "value": {
                      "code": "unauthenticated",
                      "message": "A valid API key is required."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Connect error: permission_denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "permission_denied": {
                    "summary": "permission_denied",
                    "value": {
                      "code": "permission_denied",
                      "message": "The API key lacks the required scope or workspace access."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Connect error: not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "not_found": {
                    "summary": "not_found",
                    "value": {
                      "code": "not_found",
                      "message": "The QR code was not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Connect error: resource_exhausted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "resource_exhausted": {
                    "summary": "resource_exhausted",
                    "value": {
                      "code": "resource_exhausted",
                      "message": "The API key rate limit or QR quota was exceeded."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Connect error: unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unavailable": {
                    "summary": "unavailable",
                    "value": {
                      "code": "unavailable",
                      "message": "The service is temporarily unavailable. Retry with backoff."
                    }
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          }
        },
        "description": "Configures optional routing, analytics, expiry, password, and scan-limit modules.\n\nRequired API-key scope: `qr:write`.",
        "security": [
          {
            "apiKey": []
          }
        ]
      }
    },
    "/eternalqr.v1.QRCodeService/List": {
      "post": {
        "tags": [
          "QR codes"
        ],
        "summary": "List workspace QR codes",
        "operationId": "List",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": "1"
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/eternalqr.v1.ListQRCodesRequest"
              },
              "example": {}
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/eternalqr.v1.ListQRCodesResponse"
                }
              }
            }
          },
          "400": {
            "description": "Connect error: invalid_argument or failed_precondition",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "invalid_argument": {
                    "summary": "invalid_argument",
                    "value": {
                      "code": "invalid_argument",
                      "message": "The request contains an invalid field."
                    }
                  },
                  "failed_precondition": {
                    "summary": "failed_precondition",
                    "value": {
                      "code": "failed_precondition",
                      "message": "The QR code is not in a state that permits this operation."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Connect error: unauthenticated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unauthenticated": {
                    "summary": "unauthenticated",
                    "value": {
                      "code": "unauthenticated",
                      "message": "A valid API key is required."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Connect error: permission_denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "permission_denied": {
                    "summary": "permission_denied",
                    "value": {
                      "code": "permission_denied",
                      "message": "The API key lacks the required scope or workspace access."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Connect error: not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "not_found": {
                    "summary": "not_found",
                    "value": {
                      "code": "not_found",
                      "message": "The QR code was not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Connect error: resource_exhausted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "resource_exhausted": {
                    "summary": "resource_exhausted",
                    "value": {
                      "code": "resource_exhausted",
                      "message": "The API key rate limit or QR quota was exceeded."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Connect error: unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unavailable": {
                    "summary": "unavailable",
                    "value": {
                      "code": "unavailable",
                      "message": "The service is temporarily unavailable. Retry with backoff."
                    }
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          }
        },
        "description": "Lists QR codes visible to the API key workspace.\n\nRequired API-key scope: `qr:read`.",
        "security": [
          {
            "apiKey": []
          }
        ]
      }
    },
    "/eternalqr.v1.QRCodeService/GetQR": {
      "post": {
        "tags": [
          "QR codes"
        ],
        "summary": "Get a QR code and scan count",
        "operationId": "GetQR",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": "1"
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/eternalqr.v1.GetQRRequest"
              },
              "example": {
                "id": "abc123"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/eternalqr.v1.GetQRResponse"
                }
              }
            }
          },
          "400": {
            "description": "Connect error: invalid_argument or failed_precondition",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "invalid_argument": {
                    "summary": "invalid_argument",
                    "value": {
                      "code": "invalid_argument",
                      "message": "The request contains an invalid field."
                    }
                  },
                  "failed_precondition": {
                    "summary": "failed_precondition",
                    "value": {
                      "code": "failed_precondition",
                      "message": "The QR code is not in a state that permits this operation."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Connect error: unauthenticated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unauthenticated": {
                    "summary": "unauthenticated",
                    "value": {
                      "code": "unauthenticated",
                      "message": "A valid API key is required."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Connect error: permission_denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "permission_denied": {
                    "summary": "permission_denied",
                    "value": {
                      "code": "permission_denied",
                      "message": "The API key lacks the required scope or workspace access."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Connect error: not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "not_found": {
                    "summary": "not_found",
                    "value": {
                      "code": "not_found",
                      "message": "The QR code was not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Connect error: resource_exhausted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "resource_exhausted": {
                    "summary": "resource_exhausted",
                    "value": {
                      "code": "resource_exhausted",
                      "message": "The API key rate limit or QR quota was exceeded."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Connect error: unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unavailable": {
                    "summary": "unavailable",
                    "value": {
                      "code": "unavailable",
                      "message": "The service is temporarily unavailable. Retry with backoff."
                    }
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          }
        },
        "description": "Returns a QR code, its current decrypted destination, and aggregate scan count.\n\nRequired API-key scope: `qr:read`.",
        "security": [
          {
            "apiKey": []
          }
        ]
      }
    },
    "/eternalqr.v1.QRCodeService/ArchiveQR": {
      "post": {
        "tags": [
          "QR codes"
        ],
        "summary": "Archive a QR code",
        "operationId": "ArchiveQR",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": "1"
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/eternalqr.v1.ArchiveQRRequest"
              },
              "example": {
                "id": "abc123"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/eternalqr.v1.ArchiveQRResponse"
                }
              }
            }
          },
          "400": {
            "description": "Connect error: invalid_argument or failed_precondition",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "invalid_argument": {
                    "summary": "invalid_argument",
                    "value": {
                      "code": "invalid_argument",
                      "message": "The request contains an invalid field."
                    }
                  },
                  "failed_precondition": {
                    "summary": "failed_precondition",
                    "value": {
                      "code": "failed_precondition",
                      "message": "The QR code is not in a state that permits this operation."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Connect error: unauthenticated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unauthenticated": {
                    "summary": "unauthenticated",
                    "value": {
                      "code": "unauthenticated",
                      "message": "A valid API key is required."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Connect error: permission_denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "permission_denied": {
                    "summary": "permission_denied",
                    "value": {
                      "code": "permission_denied",
                      "message": "The API key lacks the required scope or workspace access."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Connect error: not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "not_found": {
                    "summary": "not_found",
                    "value": {
                      "code": "not_found",
                      "message": "The QR code was not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Connect error: resource_exhausted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "resource_exhausted": {
                    "summary": "resource_exhausted",
                    "value": {
                      "code": "resource_exhausted",
                      "message": "The API key rate limit or QR quota was exceeded."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Connect error: unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unavailable": {
                    "summary": "unavailable",
                    "value": {
                      "code": "unavailable",
                      "message": "The service is temporarily unavailable. Retry with backoff."
                    }
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          }
        },
        "description": "Archives a QR code. Archiving does not release its purchased slot.\n\nRequired API-key scope: `qr:write`.",
        "security": [
          {
            "apiKey": []
          }
        ]
      }
    },
    "/eternalqr.v1.QRCodeService/RestoreQR": {
      "post": {
        "tags": [
          "QR codes"
        ],
        "summary": "Restore a QR code",
        "operationId": "RestoreQR",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": "1"
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/eternalqr.v1.RestoreQRRequest"
              },
              "example": {
                "id": "abc123"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/eternalqr.v1.RestoreQRResponse"
                }
              }
            }
          },
          "400": {
            "description": "Connect error: invalid_argument or failed_precondition",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "invalid_argument": {
                    "summary": "invalid_argument",
                    "value": {
                      "code": "invalid_argument",
                      "message": "The request contains an invalid field."
                    }
                  },
                  "failed_precondition": {
                    "summary": "failed_precondition",
                    "value": {
                      "code": "failed_precondition",
                      "message": "The QR code is not in a state that permits this operation."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Connect error: unauthenticated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unauthenticated": {
                    "summary": "unauthenticated",
                    "value": {
                      "code": "unauthenticated",
                      "message": "A valid API key is required."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Connect error: permission_denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "permission_denied": {
                    "summary": "permission_denied",
                    "value": {
                      "code": "permission_denied",
                      "message": "The API key lacks the required scope or workspace access."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Connect error: not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "not_found": {
                    "summary": "not_found",
                    "value": {
                      "code": "not_found",
                      "message": "The QR code was not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Connect error: resource_exhausted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "resource_exhausted": {
                    "summary": "resource_exhausted",
                    "value": {
                      "code": "resource_exhausted",
                      "message": "The API key rate limit or QR quota was exceeded."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Connect error: unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unavailable": {
                    "summary": "unavailable",
                    "value": {
                      "code": "unavailable",
                      "message": "The service is temporarily unavailable. Retry with backoff."
                    }
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          }
        },
        "description": "Restores a paused or archived QR code to active lifecycle status.\n\nRequired API-key scope: `qr:write`.",
        "security": [
          {
            "apiKey": []
          }
        ]
      }
    },
    "/eternalqr.v1.QRCodeService/PauseQR": {
      "post": {
        "tags": [
          "QR codes"
        ],
        "summary": "Pause a QR code",
        "operationId": "PauseQR",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": "1"
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/eternalqr.v1.PauseQRRequest"
              },
              "example": {
                "id": "abc123"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/eternalqr.v1.PauseQRResponse"
                }
              }
            }
          },
          "400": {
            "description": "Connect error: invalid_argument or failed_precondition",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "invalid_argument": {
                    "summary": "invalid_argument",
                    "value": {
                      "code": "invalid_argument",
                      "message": "The request contains an invalid field."
                    }
                  },
                  "failed_precondition": {
                    "summary": "failed_precondition",
                    "value": {
                      "code": "failed_precondition",
                      "message": "The QR code is not in a state that permits this operation."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Connect error: unauthenticated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unauthenticated": {
                    "summary": "unauthenticated",
                    "value": {
                      "code": "unauthenticated",
                      "message": "A valid API key is required."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Connect error: permission_denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "permission_denied": {
                    "summary": "permission_denied",
                    "value": {
                      "code": "permission_denied",
                      "message": "The API key lacks the required scope or workspace access."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Connect error: not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "not_found": {
                    "summary": "not_found",
                    "value": {
                      "code": "not_found",
                      "message": "The QR code was not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Connect error: resource_exhausted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "resource_exhausted": {
                    "summary": "resource_exhausted",
                    "value": {
                      "code": "resource_exhausted",
                      "message": "The API key rate limit or QR quota was exceeded."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Connect error: unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unavailable": {
                    "summary": "unavailable",
                    "value": {
                      "code": "unavailable",
                      "message": "The service is temporarily unavailable. Retry with backoff."
                    }
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          }
        },
        "description": "Temporarily prevents a QR code from resolving.\n\nRequired API-key scope: `qr:write`.",
        "security": [
          {
            "apiKey": []
          }
        ]
      }
    },
    "/eternalqr.v1.QRCodeService/SetSlug": {
      "post": {
        "tags": [
          "QR codes"
        ],
        "summary": "Set a custom QR slug",
        "operationId": "SetSlug",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": "1"
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/eternalqr.v1.SetSlugRequest"
              },
              "example": {
                "id": "abc123",
                "slug": "spring-campaign"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/eternalqr.v1.SetSlugResponse"
                }
              }
            }
          },
          "400": {
            "description": "Connect error: invalid_argument or failed_precondition",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "invalid_argument": {
                    "summary": "invalid_argument",
                    "value": {
                      "code": "invalid_argument",
                      "message": "The request contains an invalid field."
                    }
                  },
                  "failed_precondition": {
                    "summary": "failed_precondition",
                    "value": {
                      "code": "failed_precondition",
                      "message": "The QR code is not in a state that permits this operation."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Connect error: unauthenticated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unauthenticated": {
                    "summary": "unauthenticated",
                    "value": {
                      "code": "unauthenticated",
                      "message": "A valid API key is required."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Connect error: permission_denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "permission_denied": {
                    "summary": "permission_denied",
                    "value": {
                      "code": "permission_denied",
                      "message": "The API key lacks the required scope or workspace access."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Connect error: not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "not_found": {
                    "summary": "not_found",
                    "value": {
                      "code": "not_found",
                      "message": "The QR code was not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Connect error: resource_exhausted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "resource_exhausted": {
                    "summary": "resource_exhausted",
                    "value": {
                      "code": "resource_exhausted",
                      "message": "The API key rate limit or QR quota was exceeded."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Connect error: unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unavailable": {
                    "summary": "unavailable",
                    "value": {
                      "code": "unavailable",
                      "message": "The service is temporarily unavailable. Retry with backoff."
                    }
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          }
        },
        "description": "Assigns a custom public slug. The key creator must have the custom_slug feature.\n\nRequired API-key scope: `qr:write`.",
        "security": [
          {
            "apiKey": []
          }
        ]
      }
    },
    "/eternalqr.v1.QRCodeService/UpgradeToDynamic": {
      "post": {
        "tags": [
          "QR codes"
        ],
        "summary": "Upgrade a static QR to dynamic",
        "operationId": "UpgradeToDynamic",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": "1"
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/eternalqr.v1.UpgradeToDynamicRequest"
              },
              "example": {
                "id": "abc123"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/eternalqr.v1.UpgradeToDynamicResponse"
                }
              }
            }
          },
          "400": {
            "description": "Connect error: invalid_argument or failed_precondition",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "invalid_argument": {
                    "summary": "invalid_argument",
                    "value": {
                      "code": "invalid_argument",
                      "message": "The request contains an invalid field."
                    }
                  },
                  "failed_precondition": {
                    "summary": "failed_precondition",
                    "value": {
                      "code": "failed_precondition",
                      "message": "The QR code is not in a state that permits this operation."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Connect error: unauthenticated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unauthenticated": {
                    "summary": "unauthenticated",
                    "value": {
                      "code": "unauthenticated",
                      "message": "A valid API key is required."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Connect error: permission_denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "permission_denied": {
                    "summary": "permission_denied",
                    "value": {
                      "code": "permission_denied",
                      "message": "The API key lacks the required scope or workspace access."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Connect error: not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "not_found": {
                    "summary": "not_found",
                    "value": {
                      "code": "not_found",
                      "message": "The QR code was not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Connect error: resource_exhausted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "resource_exhausted": {
                    "summary": "resource_exhausted",
                    "value": {
                      "code": "resource_exhausted",
                      "message": "The API key rate limit or QR quota was exceeded."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Connect error: unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unavailable": {
                    "summary": "unavailable",
                    "value": {
                      "code": "unavailable",
                      "message": "The service is temporarily unavailable. Retry with backoff."
                    }
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          }
        },
        "description": "Consumes a dynamic slot owned by the API key creator and upgrades their QR.\n\nRequired API-key scope: `qr:write`.",
        "security": [
          {
            "apiKey": []
          }
        ]
      }
    },
    "/eternalqr.v1.QRCodeService/GetQRAnalytics": {
      "post": {
        "tags": [
          "QR codes"
        ],
        "summary": "Get QR analytics",
        "operationId": "GetQRAnalytics",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": "1"
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/eternalqr.v1.GetQRAnalyticsRequest"
              },
              "example": {
                "qrId": "abc123"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/eternalqr.v1.GetQRAnalyticsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Connect error: invalid_argument or failed_precondition",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "invalid_argument": {
                    "summary": "invalid_argument",
                    "value": {
                      "code": "invalid_argument",
                      "message": "The request contains an invalid field."
                    }
                  },
                  "failed_precondition": {
                    "summary": "failed_precondition",
                    "value": {
                      "code": "failed_precondition",
                      "message": "The QR code is not in a state that permits this operation."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Connect error: unauthenticated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unauthenticated": {
                    "summary": "unauthenticated",
                    "value": {
                      "code": "unauthenticated",
                      "message": "A valid API key is required."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Connect error: permission_denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "permission_denied": {
                    "summary": "permission_denied",
                    "value": {
                      "code": "permission_denied",
                      "message": "The API key lacks the required scope or workspace access."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Connect error: not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "not_found": {
                    "summary": "not_found",
                    "value": {
                      "code": "not_found",
                      "message": "The QR code was not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Connect error: resource_exhausted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "resource_exhausted": {
                    "summary": "resource_exhausted",
                    "value": {
                      "code": "resource_exhausted",
                      "message": "The API key rate limit or QR quota was exceeded."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Connect error: unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unavailable": {
                    "summary": "unavailable",
                    "value": {
                      "code": "unavailable",
                      "message": "The service is temporarily unavailable. Retry with backoff."
                    }
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          }
        },
        "description": "Returns aggregate, daily, device, and operating-system scan analytics.\n\nRequired API-key scope: `analytics:read`.",
        "security": [
          {
            "apiKey": []
          }
        ]
      }
    },
    "/eternalqr.v1.QRCodeService/GetAdvancedAnalytics": {
      "post": {
        "tags": [
          "QR codes"
        ],
        "summary": "Get advanced QR analytics",
        "operationId": "GetAdvancedAnalytics",
        "parameters": [
          {
            "name": "Connect-Protocol-Version",
            "in": "header",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/connect-protocol-version"
            },
            "example": "1"
          },
          {
            "name": "Connect-Timeout-Ms",
            "in": "header",
            "schema": {
              "$ref": "#/components/schemas/connect-timeout-header"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/eternalqr.v1.GetAdvancedAnalyticsRequest"
              },
              "example": {
                "qrId": "abc123",
                "timeRange": "30d"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/eternalqr.v1.GetAdvancedAnalyticsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Connect error: invalid_argument or failed_precondition",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "invalid_argument": {
                    "summary": "invalid_argument",
                    "value": {
                      "code": "invalid_argument",
                      "message": "The request contains an invalid field."
                    }
                  },
                  "failed_precondition": {
                    "summary": "failed_precondition",
                    "value": {
                      "code": "failed_precondition",
                      "message": "The QR code is not in a state that permits this operation."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Connect error: unauthenticated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unauthenticated": {
                    "summary": "unauthenticated",
                    "value": {
                      "code": "unauthenticated",
                      "message": "A valid API key is required."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Connect error: permission_denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "permission_denied": {
                    "summary": "permission_denied",
                    "value": {
                      "code": "permission_denied",
                      "message": "The API key lacks the required scope or workspace access."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Connect error: not_found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "not_found": {
                    "summary": "not_found",
                    "value": {
                      "code": "not_found",
                      "message": "The QR code was not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Connect error: resource_exhausted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "resource_exhausted": {
                    "summary": "resource_exhausted",
                    "value": {
                      "code": "resource_exhausted",
                      "message": "The API key rate limit or QR quota was exceeded."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Connect error: unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                },
                "examples": {
                  "unavailable": {
                    "summary": "unavailable",
                    "value": {
                      "code": "unavailable",
                      "message": "The service is temporarily unavailable. Retry with backoff."
                    }
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/connect.error"
                }
              }
            }
          }
        },
        "description": "Returns detailed scan analytics for a supported time range.\n\nRequired API-key scope: `analytics:read`.",
        "security": [
          {
            "apiKey": []
          }
        ]
      }
    }
  },
  "tags": [
    {
      "name": "QR codes",
      "description": "Workspace-scoped QR lifecycle, destination, module, and analytics operations."
    }
  ],
  "x-tagGroups": [
    {
      "name": "External API",
      "tags": [
        "QR codes"
      ]
    }
  ]
}
