{
  "openapi": "3.1.0",
  "paths": {
    "/v1/storefront/config": {
      "get": {
        "operationId": "getStorefrontConfig",
        "parameters": [
          {
            "name": "accept-language",
            "required": true,
            "in": "header",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ShopConfigDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "storefront"
        ],
        "summary": "Get storefront configuration"
      }
    },
    "/v1/shop": {
      "get": {
        "operationId": "getShop",
        "parameters": [],
        "responses": {
          "default": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ShopDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Get shop overview"
      }
    },
    "/v1/shop/embed-status": {
      "get": {
        "operationId": "getEmbedStatus",
        "parameters": [],
        "responses": {
          "default": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmbedStatusDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Check the theme app embed"
      }
    },
    "/v1/shop/settings": {
      "patch": {
        "operationId": "updateShopSettings",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSettingsBodyDto"
              }
            }
          }
        },
        "responses": {
          "default": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ShopSettingsDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Update shop settings"
      }
    },
    "/v1/keys": {
      "get": {
        "operationId": "listApiKeys",
        "parameters": [],
        "responses": {
          "default": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ApiKeyDto_Output"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "List API keys"
      },
      "post": {
        "operationId": "createApiKey",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateKeyBodyDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateKeyResponseDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Create an API key"
      }
    },
    "/v1/keys/{id}": {
      "delete": {
        "operationId": "revokeApiKey",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Revoke an API key"
      }
    },
    "/v1/storefront/wishlist": {
      "get": {
        "operationId": "getWishlist",
        "parameters": [
          {
            "name": "aid",
            "required": false,
            "in": "query",
            "description": "Anonymous id. Ignored when the caller is an authenticated customer.",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WishlistDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "storefront"
        ],
        "summary": "Get the shopper's wishlist"
      }
    },
    "/v1/storefront/wishlist/toggle": {
      "post": {
        "operationId": "toggleWishlistItem",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToggleItemBodyDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToggleItemResponseDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "storefront"
        ],
        "summary": "Toggle an item"
      }
    },
    "/v1/storefront/wishlist/items": {
      "post": {
        "operationId": "addWishlistItem",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddItemBodyDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListItemDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "storefront"
        ],
        "summary": "Add an item"
      },
      "delete": {
        "operationId": "removeWishlistItem",
        "parameters": [
          {
            "name": "itemId",
            "required": false,
            "in": "query",
            "description": "Opaque list item id.",
            "schema": {
              "pattern": "^itm_[A-Za-z0-9]+$",
              "example": "itm_ckv1a2b3c4d5e6f7g8h9",
              "type": "string"
            }
          },
          {
            "name": "aid",
            "required": false,
            "in": "query",
            "description": "UUIDv4 minted by the SDK. An opaque capability, never an identity.",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RemoveItemBodyDto"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "storefront"
        ],
        "summary": "Remove an item"
      }
    },
    "/v1/storefront/wishlist/share": {
      "post": {
        "operationId": "shareWishlist",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ShareResponseDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "storefront"
        ],
        "summary": "Create a share link"
      }
    },
    "/v1/storefront/lists/{shareToken}": {
      "get": {
        "operationId": "getSharedList",
        "parameters": [
          {
            "name": "shareToken",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedListDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "storefront"
        ],
        "summary": "Get a shared list"
      }
    },
    "/v1/lists": {
      "get": {
        "operationId": "listLists",
        "parameters": [
          {
            "name": "cursor",
            "required": false,
            "in": "query",
            "description": "Opaque cursor from `pageInfo.nextCursor`.",
            "schema": {
              "minLength": 1,
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 100,
              "default": 50,
              "type": "integer"
            }
          },
          {
            "name": "customerId",
            "required": false,
            "in": "query",
            "schema": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^\\d+$",
                  "description": "Shopify 64-bit id, serialized as a decimal string.",
                  "example": "8123456789"
                },
                {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                }
              ]
            }
          }
        ],
        "responses": {
          "default": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListsResponseDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Browse lists"
      }
    },
    "/v1/lists/{id}": {
      "get": {
        "operationId": "getList",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListDetailDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Get a list"
      }
    },
    "/v1/webhooks": {
      "get": {
        "operationId": "listWebhooks",
        "parameters": [],
        "responses": {
          "default": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/WebhookDto_Output"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "List webhook endpoints"
      },
      "post": {
        "operationId": "createWebhook",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateWebhookBodyDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateWebhookResponseDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Create a webhook endpoint"
      }
    },
    "/v1/webhooks/{id}": {
      "delete": {
        "operationId": "deleteWebhook",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Delete a webhook endpoint"
      }
    },
    "/v1/webhooks/{id}/test": {
      "post": {
        "operationId": "testWebhook",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "202": {
            "description": ""
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Send a test delivery"
      }
    },
    "/v1/storefront/identify": {
      "post": {
        "operationId": "identify",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IdentifyBodyDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "storefront"
        ],
        "summary": "Merge a guest list into a customer's"
      }
    },
    "/v1/exports": {
      "post": {
        "operationId": "createExport",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateExportBodyDto"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobAcceptedDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Start an export"
      },
      "get": {
        "operationId": "listExports",
        "parameters": [
          {
            "name": "cursor",
            "required": false,
            "in": "query",
            "description": "Opaque cursor from `pageInfo.nextCursor`.",
            "schema": {
              "minLength": 1,
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 100,
              "default": 50,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransferJobsDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "List export jobs"
      }
    },
    "/v1/exports/{jobId}": {
      "get": {
        "operationId": "getExport",
        "parameters": [
          {
            "name": "jobId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransferJobDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Get an export job"
      }
    },
    "/v1/imports/upload": {
      "post": {
        "operationId": "createImportUpload",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadTargetBodyDto"
              }
            }
          }
        },
        "responses": {
          "default": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UploadTargetDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Get an import upload URL"
      }
    },
    "/v1/imports": {
      "post": {
        "operationId": "createImport",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateImportBodyDto"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobAcceptedDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Start an import"
      }
    },
    "/v1/imports/{jobId}": {
      "get": {
        "operationId": "getImport",
        "parameters": [
          {
            "name": "jobId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransferJobDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Get an import job"
      }
    },
    "/v1/analytics/top-products": {
      "get": {
        "operationId": "getTopProducts",
        "parameters": [
          {
            "name": "range",
            "required": false,
            "in": "query",
            "schema": {
              "default": "30d",
              "type": "string",
              "enum": [
                "7d",
                "30d",
                "90d"
              ]
            }
          }
        ],
        "responses": {
          "default": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TopProductsDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Top wishlisted products"
      }
    },
    "/v1/analytics/activity": {
      "get": {
        "operationId": "getActivity",
        "parameters": [
          {
            "name": "range",
            "required": false,
            "in": "query",
            "schema": {
              "default": "30d",
              "type": "string",
              "enum": [
                "7d",
                "30d",
                "90d"
              ]
            }
          }
        ],
        "responses": {
          "default": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActivityDto_Output"
                }
              }
            }
          }
        },
        "tags": [
          "private"
        ],
        "summary": "Wishlist activity over time"
      }
    }
  },
  "info": {
    "title": "Envie API",
    "description": "Wishlist infrastructure for Shopify.\n\n**Authentication** — three modes:\n- `proxy`: Shopify App Proxy signature, for Liquid storefronts. No key.\n- `public`: `X-Envie-Shop` + `X-Envie-Public-Key`. Browser-safe, anonymous scope only — it cannot act as a customer.\n- `private`: `Authorization: Bearer env_sk_…`. Server-side only, full shop scope.\n\n**Conventions** — 64-bit Shopify ids are decimal **strings**, never JSON numbers. Internal record ids carry a type prefix (`lst_`, `itm_`). Times are ISO-8601 UTC. Cursor pagination via `?cursor=&limit=` (max 100).\n\n**Errors** — RFC 9457 `application/problem+json`. Every `type` is a stable, resolvable URL: fetch it for an explanation of that specific failure and how to fix it. `429` carries `Retry-After`.\n\n**Idempotency** — send `Idempotency-Key` on any POST; retries within 24 h return the original result.\n\n**Stability** — additive-only within v1: fields are never removed or repurposed, deprecations ship a `Deprecation` header at least 90 days ahead, and breaking changes go to `/v2`.\n\nMachine-readable docs index: https://docs.getenvie.com/llms.txt",
    "version": "1",
    "contact": {
      "name": "Envie",
      "url": "https://docs.getenvie.com",
      "email": "support@getenvie.com"
    }
  },
  "tags": [
    {
      "name": "storefront",
      "description": "App proxy / public-key / private-key surface used by storefronts."
    },
    {
      "name": "private",
      "description": "Server-side surface: browse, analytics, transfers, webhooks, keys."
    }
  ],
  "servers": [
    {
      "url": "https://api.getenvie.com",
      "description": "Production"
    }
  ],
  "components": {
    "securitySchemes": {
      "privateKey": {
        "scheme": "bearer",
        "bearerFormat": "env_sk",
        "type": "http",
        "description": "Private key (env_sk_…)."
      },
      "publicKey": {
        "type": "apiKey",
        "in": "header",
        "name": "X-Envie-Public-Key"
      }
    },
    "schemas": {
      "ShopConfigDto_Output": {
        "type": "object",
        "properties": {
          "shop": {
            "type": "string"
          },
          "plan": {
            "type": "string",
            "enum": [
              "FREE",
              "GROWTH",
              "PLUS"
            ]
          },
          "guestEnabled": {
            "type": "boolean"
          },
          "shareEnabled": {
            "type": "boolean"
          },
          "strings": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "string"
            },
            "description": "Resolved for the requested locale."
          },
          "itemLimit": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "Free-plan saved-items cap. null = unlimited."
          }
        },
        "required": [
          "shop",
          "plan",
          "guestEnabled",
          "shareEnabled",
          "strings",
          "itemLimit"
        ],
        "additionalProperties": false
      },
      "ShopDto_Output": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          },
          "plan": {
            "type": "string",
            "enum": [
              "FREE",
              "GROWTH",
              "PLUS"
            ]
          },
          "planUpdatedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "installedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          },
          "settings": {
            "type": "object",
            "properties": {
              "guestEnabled": {
                "default": true,
                "description": "Allow anonymous (not logged-in) wishlists.",
                "type": "boolean"
              },
              "shareEnabled": {
                "default": true,
                "description": "Allow share-link creation.",
                "type": "boolean"
              },
              "sharePath": {
                "default": "/pages/wishlist",
                "description": "Shop page a share link points at; the token is appended as `?list=`. Merchants name that page freely, so it is a setting rather than a hardcoded path.",
                "example": "/pages/wishlist",
                "type": "string",
                "pattern": "^\\/(?!\\/)[^?#]*$"
              },
              "metafieldSyncEnabled": {
                "default": false,
                "description": "Mirror customer wishlists into a customer metafield.",
                "type": "boolean"
              },
              "klaviyoConfigured": {
                "default": false,
                "description": "Read-only echo — the key itself is encrypted at rest and never returned.",
                "type": "boolean"
              },
              "strings": {
                "default": {},
                "description": "locale → key → string overrides for the storefront components.",
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {
                    "type": "string"
                  }
                }
              },
              "headlessOrigins": {
                "default": [],
                "description": "CORS allow-list for `public` mode.",
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uri"
                }
              }
            },
            "required": [
              "guestEnabled",
              "shareEnabled",
              "sharePath",
              "metafieldSyncEnabled",
              "klaviyoConfigured",
              "strings",
              "headlessOrigins"
            ],
            "additionalProperties": false
          },
          "publicKey": {
            "type": "string"
          },
          "usage": {
            "type": "object",
            "properties": {
              "lists": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "items": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "lists",
              "items"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "domain",
          "plan",
          "planUpdatedAt",
          "installedAt",
          "settings",
          "publicKey",
          "usage"
        ],
        "additionalProperties": false
      },
      "EmbedStatusDto_Output": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "enabled",
              "disabled",
              "unsupported",
              "unknown"
            ]
          },
          "themeName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "status",
          "themeName"
        ],
        "additionalProperties": false
      },
      "UpdateSettingsBodyDto": {
        "type": "object",
        "properties": {
          "guestEnabled": {
            "default": true,
            "description": "Allow anonymous (not logged-in) wishlists.",
            "type": "boolean"
          },
          "shareEnabled": {
            "default": true,
            "description": "Allow share-link creation.",
            "type": "boolean"
          },
          "sharePath": {
            "default": "/pages/wishlist",
            "description": "Shop page a share link points at; the token is appended as `?list=`. Merchants name that page freely, so it is a setting rather than a hardcoded path.",
            "example": "/pages/wishlist",
            "type": "string",
            "pattern": "^\\/(?!\\/)[^?#]*$"
          },
          "metafieldSyncEnabled": {
            "default": false,
            "description": "Mirror customer wishlists into a customer metafield.",
            "type": "boolean"
          },
          "klaviyoConfigured": {
            "default": false,
            "description": "Read-only echo — the key itself is encrypted at rest and never returned.",
            "type": "boolean"
          },
          "strings": {
            "default": {},
            "description": "locale → key → string overrides for the storefront components.",
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {
                "type": "string"
              }
            }
          },
          "headlessOrigins": {
            "default": [],
            "description": "CORS allow-list for `public` mode.",
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri"
            }
          },
          "klaviyoKey": {
            "description": "Write-only. Encrypted at rest; `null` disconnects Klaviyo.",
            "anyOf": [
              {
                "type": "string",
                "minLength": 1
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "ShopSettingsDto_Output": {
        "type": "object",
        "properties": {
          "guestEnabled": {
            "type": "boolean",
            "default": true,
            "description": "Allow anonymous (not logged-in) wishlists."
          },
          "shareEnabled": {
            "type": "boolean",
            "default": true,
            "description": "Allow share-link creation."
          },
          "sharePath": {
            "type": "string",
            "default": "/pages/wishlist",
            "description": "Shop page a share link points at; the token is appended as `?list=`. Merchants name that page freely, so it is a setting rather than a hardcoded path.",
            "example": "/pages/wishlist",
            "pattern": "^\\/(?!\\/)[^?#]*$"
          },
          "metafieldSyncEnabled": {
            "type": "boolean",
            "default": false,
            "description": "Mirror customer wishlists into a customer metafield."
          },
          "klaviyoConfigured": {
            "type": "boolean",
            "default": false,
            "description": "Read-only echo — the key itself is encrypted at rest and never returned."
          },
          "strings": {
            "type": "object",
            "default": {},
            "description": "locale → key → string overrides for the storefront components.",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {
                "type": "string"
              }
            }
          },
          "headlessOrigins": {
            "type": "array",
            "default": [],
            "description": "CORS allow-list for `public` mode.",
            "items": {
              "type": "string",
              "format": "uri"
            }
          }
        },
        "required": [
          "guestEnabled",
          "shareEnabled",
          "sharePath",
          "metafieldSyncEnabled",
          "klaviyoConfigured",
          "strings",
          "headlessOrigins"
        ],
        "additionalProperties": false
      },
      "ApiKeyDto_Output": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1
          },
          "label": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "private",
              "internal"
            ]
          },
          "lastUsedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "revokedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          }
        },
        "required": [
          "id",
          "label",
          "kind",
          "lastUsedAt",
          "revokedAt",
          "createdAt"
        ],
        "additionalProperties": false
      },
      "CreateKeyBodyDto": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "kind": {
            "default": "private",
            "type": "string",
            "enum": [
              "private",
              "internal"
            ]
          }
        },
        "required": [
          "label"
        ]
      },
      "CreateKeyResponseDto_Output": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1
          },
          "label": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "private",
              "internal"
            ]
          },
          "lastUsedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "revokedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          },
          "secret": {
            "type": "string",
            "minLength": 1,
            "description": "`env_sk_…` — shown once, stored sha256-hashed."
          }
        },
        "required": [
          "id",
          "label",
          "kind",
          "lastUsedAt",
          "revokedAt",
          "createdAt",
          "secret"
        ],
        "additionalProperties": false
      },
      "WishlistDto_Output": {
        "type": "object",
        "properties": {
          "id": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^lst_[A-Za-z0-9]+$",
                "description": "Opaque list id.",
                "example": "lst_ckv1a2b3c4d5e6f7g8h9"
              },
              {
                "type": "null"
              }
            ],
            "description": "null until the first save — no list resource exists yet."
          },
          "owner": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "customer"
                  },
                  "customerId": {
                    "type": "string",
                    "pattern": "^\\d+$",
                    "description": "Shopify 64-bit id, serialized as a decimal string.",
                    "example": "8123456789"
                  }
                },
                "required": [
                  "type",
                  "customerId"
                ],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "anonymous"
                  },
                  "anonymousId": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                    "description": "UUIDv4 minted by the SDK. An opaque capability, never an identity."
                  }
                },
                "required": [
                  "type",
                  "anonymousId"
                ],
                "additionalProperties": false
              }
            ]
          },
          "name": {
            "type": "string",
            "minLength": 1
          },
          "default": {
            "type": "boolean"
          },
          "count": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "pattern": "^itm_[A-Za-z0-9]+$",
                  "description": "Opaque list item id.",
                  "example": "itm_ckv1a2b3c4d5e6f7g8h9"
                },
                "productId": {
                  "type": "string",
                  "pattern": "^\\d+$",
                  "description": "Shopify 64-bit id, serialized as a decimal string.",
                  "example": "8123456789"
                },
                "variantId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "pattern": "^\\d+$",
                      "description": "Shopify 64-bit id, serialized as a decimal string.",
                      "example": "8123456789"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "null = product-level save."
                },
                "handle": {
                  "type": "string",
                  "minLength": 1,
                  "description": "Product handle snapshot — fetch presentation data from the shop."
                },
                "titleSnapshot": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Best effort, for exports and emails only."
                },
                "addedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                }
              },
              "required": [
                "id",
                "productId",
                "variantId",
                "handle",
                "titleSnapshot",
                "addedAt"
              ],
              "additionalProperties": false
            }
          },
          "share": {
            "type": "object",
            "properties": {
              "enabled": {
                "type": "boolean",
                "description": "Whether sharing is enabled for this shop."
              },
              "token": {
                "anyOf": [
                  {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9_-]{32}$",
                    "description": "Revocable share capability (24 random bytes, base64url)."
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "enabled",
              "token"
            ],
            "additionalProperties": false
          },
          "updatedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "owner",
          "name",
          "default",
          "count",
          "items",
          "share",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "ToggleItemBodyDto": {
        "type": "object",
        "properties": {
          "productId": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d+$",
                "description": "Shopify 64-bit id, serialized as a decimal string.",
                "example": "8123456789"
              },
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            ]
          },
          "variantId": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d+$",
                "description": "Shopify 64-bit id, serialized as a decimal string.",
                "example": "8123456789"
              },
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            ]
          },
          "handle": {
            "type": "string",
            "minLength": 1,
            "description": "Product handle. Required — storefronts fetch presentation data with it."
          },
          "anonymousId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "description": "UUIDv4 minted by the SDK. An opaque capability, never an identity."
          }
        },
        "required": [
          "productId",
          "handle"
        ]
      },
      "ToggleItemResponseDto_Output": {
        "type": "object",
        "properties": {
          "added": {
            "type": "boolean"
          },
          "count": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "itemId": {
            "type": "string",
            "description": "Present when `added` is true.",
            "pattern": "^itm_[A-Za-z0-9]+$",
            "example": "itm_ckv1a2b3c4d5e6f7g8h9"
          }
        },
        "required": [
          "added",
          "count"
        ],
        "additionalProperties": false
      },
      "AddItemBodyDto": {
        "type": "object",
        "properties": {
          "productId": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d+$",
                "description": "Shopify 64-bit id, serialized as a decimal string.",
                "example": "8123456789"
              },
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            ]
          },
          "variantId": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d+$",
                "description": "Shopify 64-bit id, serialized as a decimal string.",
                "example": "8123456789"
              },
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            ]
          },
          "handle": {
            "type": "string",
            "minLength": 1,
            "description": "Product handle. Required — storefronts fetch presentation data with it."
          },
          "anonymousId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "description": "UUIDv4 minted by the SDK. An opaque capability, never an identity."
          }
        },
        "required": [
          "productId",
          "handle"
        ]
      },
      "ListItemDto_Output": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^itm_[A-Za-z0-9]+$",
            "description": "Opaque list item id.",
            "example": "itm_ckv1a2b3c4d5e6f7g8h9"
          },
          "productId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Shopify 64-bit id, serialized as a decimal string.",
            "example": "8123456789"
          },
          "variantId": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d+$",
                "description": "Shopify 64-bit id, serialized as a decimal string.",
                "example": "8123456789"
              },
              {
                "type": "null"
              }
            ],
            "description": "null = product-level save."
          },
          "handle": {
            "type": "string",
            "minLength": 1,
            "description": "Product handle snapshot — fetch presentation data from the shop."
          },
          "titleSnapshot": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Best effort, for exports and emails only."
          },
          "addedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          }
        },
        "required": [
          "id",
          "productId",
          "variantId",
          "handle",
          "titleSnapshot",
          "addedAt"
        ],
        "additionalProperties": false
      },
      "RemoveItemBodyDto": {
        "type": "object",
        "properties": {
          "productId": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d+$",
                "description": "Shopify 64-bit id, serialized as a decimal string.",
                "example": "8123456789"
              },
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            ]
          },
          "variantId": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d+$",
                "description": "Shopify 64-bit id, serialized as a decimal string.",
                "example": "8123456789"
              },
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            ]
          },
          "anonymousId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "description": "UUIDv4 minted by the SDK. An opaque capability, never an identity."
          }
        }
      },
      "ShareResponseDto_Output": {
        "type": "object",
        "properties": {
          "shareToken": {
            "type": "string",
            "pattern": "^[A-Za-z0-9_-]{32}$",
            "description": "Revocable share capability (24 random bytes, base64url)."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Canonical share URL on the shop domain."
          }
        },
        "required": [
          "shareToken",
          "url"
        ],
        "additionalProperties": false
      },
      "SharedListDto_Output": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^lst_[A-Za-z0-9]+$",
            "description": "Opaque list id.",
            "example": "lst_ckv1a2b3c4d5e6f7g8h9"
          },
          "name": {
            "type": "string",
            "minLength": 1
          },
          "default": {
            "type": "boolean"
          },
          "count": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "pattern": "^itm_[A-Za-z0-9]+$",
                  "description": "Opaque list item id.",
                  "example": "itm_ckv1a2b3c4d5e6f7g8h9"
                },
                "productId": {
                  "type": "string",
                  "pattern": "^\\d+$",
                  "description": "Shopify 64-bit id, serialized as a decimal string.",
                  "example": "8123456789"
                },
                "variantId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "pattern": "^\\d+$",
                      "description": "Shopify 64-bit id, serialized as a decimal string.",
                      "example": "8123456789"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "null = product-level save."
                },
                "handle": {
                  "type": "string",
                  "minLength": 1,
                  "description": "Product handle snapshot — fetch presentation data from the shop."
                },
                "titleSnapshot": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Best effort, for exports and emails only."
                },
                "addedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                }
              },
              "required": [
                "id",
                "productId",
                "variantId",
                "handle",
                "titleSnapshot",
                "addedAt"
              ],
              "additionalProperties": false
            }
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          }
        },
        "required": [
          "id",
          "name",
          "default",
          "count",
          "items",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "ListsResponseDto_Output": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "pattern": "^lst_[A-Za-z0-9]+$",
                  "description": "Opaque list id.",
                  "example": "lst_ckv1a2b3c4d5e6f7g8h9"
                },
                "owner": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "const": "customer"
                        },
                        "customerId": {
                          "type": "string",
                          "pattern": "^\\d+$",
                          "description": "Shopify 64-bit id, serialized as a decimal string.",
                          "example": "8123456789"
                        }
                      },
                      "required": [
                        "type",
                        "customerId"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "const": "anonymous"
                        },
                        "anonymousId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                          "description": "UUIDv4 minted by the SDK. An opaque capability, never an identity."
                        }
                      },
                      "required": [
                        "type",
                        "anonymousId"
                      ],
                      "additionalProperties": false
                    }
                  ]
                },
                "name": {
                  "type": "string",
                  "minLength": 1
                },
                "default": {
                  "type": "boolean"
                },
                "count": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "share": {
                  "type": "object",
                  "properties": {
                    "enabled": {
                      "type": "boolean",
                      "description": "Whether sharing is enabled for this shop."
                    },
                    "token": {
                      "anyOf": [
                        {
                          "type": "string",
                          "pattern": "^[A-Za-z0-9_-]{32}$",
                          "description": "Revocable share capability (24 random bytes, base64url)."
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "enabled",
                    "token"
                  ],
                  "additionalProperties": false
                },
                "updatedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                }
              },
              "required": [
                "id",
                "owner",
                "name",
                "default",
                "count",
                "share",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "pageInfo": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "null when this is the last page."
              }
            },
            "required": [
              "nextCursor"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pageInfo"
        ],
        "additionalProperties": false
      },
      "ListDetailDto_Output": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^lst_[A-Za-z0-9]+$",
            "description": "Opaque list id.",
            "example": "lst_ckv1a2b3c4d5e6f7g8h9"
          },
          "owner": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "customer"
                  },
                  "customerId": {
                    "type": "string",
                    "pattern": "^\\d+$",
                    "description": "Shopify 64-bit id, serialized as a decimal string.",
                    "example": "8123456789"
                  }
                },
                "required": [
                  "type",
                  "customerId"
                ],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "anonymous"
                  },
                  "anonymousId": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                    "description": "UUIDv4 minted by the SDK. An opaque capability, never an identity."
                  }
                },
                "required": [
                  "type",
                  "anonymousId"
                ],
                "additionalProperties": false
              }
            ]
          },
          "name": {
            "type": "string",
            "minLength": 1
          },
          "default": {
            "type": "boolean"
          },
          "count": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "pattern": "^itm_[A-Za-z0-9]+$",
                  "description": "Opaque list item id.",
                  "example": "itm_ckv1a2b3c4d5e6f7g8h9"
                },
                "productId": {
                  "type": "string",
                  "pattern": "^\\d+$",
                  "description": "Shopify 64-bit id, serialized as a decimal string.",
                  "example": "8123456789"
                },
                "variantId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "pattern": "^\\d+$",
                      "description": "Shopify 64-bit id, serialized as a decimal string.",
                      "example": "8123456789"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "null = product-level save."
                },
                "handle": {
                  "type": "string",
                  "minLength": 1,
                  "description": "Product handle snapshot — fetch presentation data from the shop."
                },
                "titleSnapshot": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Best effort, for exports and emails only."
                },
                "addedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                }
              },
              "required": [
                "id",
                "productId",
                "variantId",
                "handle",
                "titleSnapshot",
                "addedAt"
              ],
              "additionalProperties": false
            }
          },
          "share": {
            "type": "object",
            "properties": {
              "enabled": {
                "type": "boolean",
                "description": "Whether sharing is enabled for this shop."
              },
              "token": {
                "anyOf": [
                  {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9_-]{32}$",
                    "description": "Revocable share capability (24 random bytes, base64url)."
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "enabled",
              "token"
            ],
            "additionalProperties": false
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          }
        },
        "required": [
          "id",
          "owner",
          "name",
          "default",
          "count",
          "items",
          "share",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "WebhookDto_Output": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "item.added",
                "item.removed",
                "list.merged",
                "list.shared"
              ]
            }
          },
          "disabledAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "failCount": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          }
        },
        "required": [
          "id",
          "url",
          "events",
          "disabledAt",
          "failCount",
          "createdAt"
        ],
        "additionalProperties": false
      },
      "CreateWebhookBodyDto": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri"
          },
          "events": {
            "minItems": 1,
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "item.added",
                "item.removed",
                "list.merged",
                "list.shared"
              ]
            }
          }
        },
        "required": [
          "url",
          "events"
        ]
      },
      "CreateWebhookResponseDto_Output": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "item.added",
                "item.removed",
                "list.merged",
                "list.shared"
              ]
            }
          },
          "disabledAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "failCount": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          },
          "secret": {
            "type": "string",
            "minLength": 1,
            "description": "Shown once. Sign verification secret for X-Envie-Signature."
          }
        },
        "required": [
          "id",
          "url",
          "events",
          "disabledAt",
          "failCount",
          "createdAt",
          "secret"
        ],
        "additionalProperties": false
      },
      "IdentifyBodyDto": {
        "type": "object",
        "properties": {
          "anonymousId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "description": "UUIDv4 minted by the SDK. An opaque capability, never an identity."
          },
          "customerId": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d+$",
                "description": "Shopify 64-bit id, serialized as a decimal string.",
                "example": "8123456789"
              },
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            ]
          }
        },
        "required": [
          "anonymousId"
        ]
      },
      "ListDto_Output": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^lst_[A-Za-z0-9]+$",
            "description": "Opaque list id.",
            "example": "lst_ckv1a2b3c4d5e6f7g8h9"
          },
          "owner": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "customer"
                  },
                  "customerId": {
                    "type": "string",
                    "pattern": "^\\d+$",
                    "description": "Shopify 64-bit id, serialized as a decimal string.",
                    "example": "8123456789"
                  }
                },
                "required": [
                  "type",
                  "customerId"
                ],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "const": "anonymous"
                  },
                  "anonymousId": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                    "description": "UUIDv4 minted by the SDK. An opaque capability, never an identity."
                  }
                },
                "required": [
                  "type",
                  "anonymousId"
                ],
                "additionalProperties": false
              }
            ]
          },
          "name": {
            "type": "string",
            "minLength": 1
          },
          "default": {
            "type": "boolean"
          },
          "count": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "pattern": "^itm_[A-Za-z0-9]+$",
                  "description": "Opaque list item id.",
                  "example": "itm_ckv1a2b3c4d5e6f7g8h9"
                },
                "productId": {
                  "type": "string",
                  "pattern": "^\\d+$",
                  "description": "Shopify 64-bit id, serialized as a decimal string.",
                  "example": "8123456789"
                },
                "variantId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "pattern": "^\\d+$",
                      "description": "Shopify 64-bit id, serialized as a decimal string.",
                      "example": "8123456789"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "null = product-level save."
                },
                "handle": {
                  "type": "string",
                  "minLength": 1,
                  "description": "Product handle snapshot — fetch presentation data from the shop."
                },
                "titleSnapshot": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Best effort, for exports and emails only."
                },
                "addedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                }
              },
              "required": [
                "id",
                "productId",
                "variantId",
                "handle",
                "titleSnapshot",
                "addedAt"
              ],
              "additionalProperties": false
            }
          },
          "share": {
            "type": "object",
            "properties": {
              "enabled": {
                "type": "boolean",
                "description": "Whether sharing is enabled for this shop."
              },
              "token": {
                "anyOf": [
                  {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9_-]{32}$",
                    "description": "Revocable share capability (24 random bytes, base64url)."
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "enabled",
              "token"
            ],
            "additionalProperties": false
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          }
        },
        "required": [
          "id",
          "owner",
          "name",
          "default",
          "count",
          "items",
          "share",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "CreateExportBodyDto": {
        "type": "object",
        "properties": {
          "format": {
            "type": "string",
            "enum": [
              "csv",
              "json"
            ]
          }
        },
        "required": [
          "format"
        ]
      },
      "JobAcceptedDto_Output": {
        "type": "object",
        "properties": {
          "jobId": {
            "type": "string",
            "minLength": 1
          }
        },
        "required": [
          "jobId"
        ],
        "additionalProperties": false
      },
      "TransferJobsDto_Output": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "jobId": {
                  "type": "string",
                  "minLength": 1
                },
                "kind": {
                  "type": "string"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "queued",
                    "running",
                    "done",
                    "failed"
                  ]
                },
                "resultUrl": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uri"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Signed URL, 24 h expiry. Present when status = done."
                },
                "error": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                },
                "updatedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                }
              },
              "required": [
                "jobId",
                "kind",
                "status",
                "resultUrl",
                "error",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "pageInfo": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "null when this is the last page."
              }
            },
            "required": [
              "nextCursor"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pageInfo"
        ],
        "additionalProperties": false
      },
      "TransferJobDto_Output": {
        "type": "object",
        "properties": {
          "jobId": {
            "type": "string",
            "minLength": 1
          },
          "kind": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "running",
              "done",
              "failed"
            ]
          },
          "resultUrl": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri"
              },
              {
                "type": "null"
              }
            ],
            "description": "Signed URL, 24 h expiry. Present when status = done."
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          }
        },
        "required": [
          "jobId",
          "kind",
          "status",
          "resultUrl",
          "error",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "UploadTargetBodyDto": {
        "type": "object",
        "properties": {
          "filename": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "contentType": {
            "default": "text/csv",
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          }
        },
        "required": [
          "filename"
        ]
      },
      "UploadTargetDto_Output": {
        "type": "object",
        "properties": {
          "uploadUrl": {
            "type": "string",
            "format": "uri",
            "description": "PUT the file here. Expires in 15 minutes."
          },
          "fileUrl": {
            "type": "string",
            "format": "uri",
            "description": "Pass this back as `fileUrl` on POST /v1/imports."
          }
        },
        "required": [
          "uploadUrl",
          "fileUrl"
        ],
        "additionalProperties": false
      },
      "CreateImportBodyDto": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string",
            "enum": [
              "swym",
              "swish",
              "csv"
            ]
          },
          "fileUrl": {
            "type": "string",
            "format": "uri",
            "description": "HTTPS URL we fetch. 50 MB cap."
          },
          "dryRun": {
            "default": false,
            "description": "Parse and report without writing. Always run this first on a competitor export — the report tells you what would be skipped while it is still free to fix.",
            "type": "boolean"
          }
        },
        "required": [
          "source",
          "fileUrl"
        ]
      },
      "TopProductsDto_Output": {
        "type": "object",
        "properties": {
          "range": {
            "type": "string",
            "default": "30d",
            "enum": [
              "7d",
              "30d",
              "90d"
            ]
          },
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "productId": {
                  "type": "string",
                  "pattern": "^\\d+$",
                  "description": "Shopify 64-bit id, serialized as a decimal string.",
                  "example": "8123456789"
                },
                "handle": {
                  "type": "string"
                },
                "titleSnapshot": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "saves": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                }
              },
              "required": [
                "productId",
                "handle",
                "titleSnapshot",
                "saves"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "range",
          "data"
        ],
        "additionalProperties": false
      },
      "ActivityDto_Output": {
        "type": "object",
        "properties": {
          "range": {
            "type": "string",
            "default": "30d",
            "enum": [
              "7d",
              "30d",
              "90d"
            ]
          },
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "date": {
                  "type": "string",
                  "format": "date",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
                },
                "added": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "removed": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                }
              },
              "required": [
                "date",
                "added",
                "removed"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "range",
          "data"
        ],
        "additionalProperties": false
      }
    }
  },
  "externalDocs": {
    "description": "Guides, quickstarts and the error catalogue",
    "url": "https://docs.getenvie.com"
  }
}
