{
  "openapi": "3.1.0",
  "info": {
    "title": "Abandonware Storefront API",
    "version": "2026-10-22",
    "summary": "Public catalog, cart and agent endpoints for abandonware.online.",
    "description": "Abandonware (https://abandonware.online) sells hats, shirts and stickers based on retro games and software. The store runs on Shopify, so this document describes the HTTP endpoints every visitor and agent can already use on this domain.\n\n* **Catalog and search** (`/products.json`, `/products/{handle}.js`, `/search/suggest.json`, ...) are public and read-only.\n* **Cart** endpoints (`/cart.js`, `/cart/add.js`, ...) act on the cart tied to the `cart` cookie. Nothing is charged until a person completes checkout at `/checkout`.\n* **Storefront GraphQL** works without a token for catalog and cart queries; a Storefront token raises the limits.\n* **Agent endpoints** speak MCP (JSON-RPC 2.0): UCP catalog and cart tools at `/api/ucp/mcp`, store policies and FAQs at `/api/mcp`.\n* **Customer data** (orders, profile, addresses) is only reachable through the Customer Account API with an OAuth 2.0 token the customer grants. Its scopes are declared under `components.securitySchemes`.\n\nHuman-readable docs, quickstart and contact details: https://abandonware.online/developers",
    "termsOfService": "https://abandonware.online/policies/terms-of-service",
    "contact": {
      "name": "Abandonware support",
      "email": "support@abandonware.online",
      "url": "https://abandonware.online/pages/contact"
    }
  },
  "externalDocs": {
    "description": "Developer docs and quickstart",
    "url": "https://abandonware.online/developers"
  },
  "servers": [
    {
      "url": "https://abandonware.online",
      "description": "Production storefront"
    }
  ],
  "tags": [
    {
      "name": "Catalog",
      "description": "Products, collections, search and recommendations. Public, read-only."
    },
    {
      "name": "Cart",
      "description": "The visitor's cart, keyed by the `cart` cookie. Carts are per session and nothing is charged until checkout is completed by a person."
    },
    {
      "name": "Storefront GraphQL",
      "description": "Shopify Storefront API for this store."
    },
    {
      "name": "Agents",
      "description": "Model Context Protocol (JSON-RPC 2.0) endpoints for AI agents."
    },
    {
      "name": "Customer accounts",
      "description": "Customer-authorized access to orders and profile data, via OAuth 2.0 with PKCE."
    }
  ],
  "paths": {
    "/products.json": {
      "get": {
        "tags": [
          "Catalog"
        ],
        "operationId": "listProducts",
        "summary": "List products",
        "description": "Every product published to the online store, newest first. Prices are decimal strings in USD.",
        "security": [],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Products per page.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 250,
              "default": 30
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "1-based page number.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of products.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "products": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/CatalogProduct"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/collections/{handle}/products.json": {
      "get": {
        "tags": [
          "Catalog"
        ],
        "operationId": "listCollectionProducts",
        "summary": "List products in a collection",
        "description": "Same shape as `/products.json`, limited to one collection. Use `all` for the full catalog.",
        "security": [],
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "description": "Collection handle, for example `shirts` or `windows-95-to-xp`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 250,
              "default": 30
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of products.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "products": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/CatalogProduct"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No collection with that handle."
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/products/{handle}.js": {
      "get": {
        "tags": [
          "Catalog"
        ],
        "operationId": "getProduct",
        "summary": "Get one product",
        "description": "A product with its variants and options. Prices are integers in cents (USD). Use a variant `id` with the cart endpoints.",
        "security": [],
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "description": "Product handle, the last part of its URL.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The product.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Product"
                }
              }
            }
          },
          "404": {
            "description": "No product with that handle."
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/search/suggest.json": {
      "get": {
        "tags": [
          "Catalog"
        ],
        "operationId": "searchProducts",
        "summary": "Search products",
        "description": "Predictive search over products (and optionally collections, pages and articles).",
        "security": [],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "Search terms.",
            "schema": {
              "type": "string"
            },
            "example": "clippy"
          },
          {
            "name": "resources[type]",
            "in": "query",
            "description": "Comma-separated resource types.",
            "schema": {
              "type": "string",
              "default": "product"
            },
            "example": "product"
          },
          {
            "name": "resources[limit]",
            "in": "query",
            "description": "Results per type.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10,
              "default": 10
            }
          },
          {
            "name": "resources[options][unavailable_products]",
            "in": "query",
            "description": "Where sold-out products appear.",
            "schema": {
              "type": "string",
              "enum": [
                "show",
                "hide",
                "last"
              ],
              "default": "last"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Search results grouped by resource type.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "resources": {
                      "type": "object",
                      "properties": {
                        "results": {
                          "type": "object",
                          "properties": {
                            "products": {
                              "type": "array",
                              "items": {
                                "$ref": "#/components/schemas/SearchProduct"
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/recommendations/products.json": {
      "get": {
        "tags": [
          "Catalog"
        ],
        "operationId": "getRecommendations",
        "summary": "Product recommendations",
        "security": [],
        "parameters": [
          {
            "name": "product_id",
            "in": "query",
            "required": true,
            "description": "Numeric product ID.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10,
              "default": 10
            }
          },
          {
            "name": "intent",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "related",
                "complementary"
              ],
              "default": "related"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Recommended products.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "intent": {
                      "type": "string"
                    },
                    "products": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Product"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/cart.js": {
      "get": {
        "tags": [
          "Cart"
        ],
        "operationId": "getCart",
        "summary": "Get the cart",
        "description": "The cart for the current `cart` cookie. An empty cart is returned when there is none.",
        "security": [],
        "responses": {
          "200": {
            "description": "The cart.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Cart"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/cart/add.js": {
      "post": {
        "tags": [
          "Cart"
        ],
        "operationId": "addToCart",
        "summary": "Add items to the cart",
        "description": "Adds variants to the cart and sets the `cart` cookie if there was none. Send the cookie back on later cart calls.",
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "items"
                ],
                "properties": {
                  "items": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "type": "object",
                      "required": [
                        "id",
                        "quantity"
                      ],
                      "properties": {
                        "id": {
                          "type": "integer",
                          "description": "Variant ID."
                        },
                        "quantity": {
                          "type": "integer",
                          "minimum": 1
                        },
                        "properties": {
                          "type": "object",
                          "additionalProperties": {
                            "type": "string"
                          },
                          "description": "Optional line item properties."
                        }
                      }
                    }
                  }
                }
              },
              "example": {
                "items": [
                  {
                    "id": 12345678901234,
                    "quantity": 1
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The line items that were added.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/LineItem"
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "The variant is sold out or does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CartError"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/cart/change.js": {
      "post": {
        "tags": [
          "Cart"
        ],
        "operationId": "changeCartLine",
        "summary": "Change one cart line",
        "description": "Sets the quantity of one line. A quantity of 0 removes it. Identify the line by its `key` (preferred) or by its 1-based `line` index.",
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "quantity"
                ],
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Line item key from the cart."
                  },
                  "line": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "1-based line index."
                  },
                  "quantity": {
                    "type": "integer",
                    "minimum": 0
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated cart.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Cart"
                }
              }
            }
          },
          "400": {
            "description": "The line does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CartError"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/cart/update.js": {
      "post": {
        "tags": [
          "Cart"
        ],
        "operationId": "updateCart",
        "summary": "Update several lines, the note or attributes",
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "updates": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "description": "Map of variant ID or line key to new quantity."
                  },
                  "note": {
                    "type": "string"
                  },
                  "attributes": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated cart.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Cart"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/cart/clear.js": {
      "post": {
        "tags": [
          "Cart"
        ],
        "operationId": "clearCart",
        "summary": "Empty the cart",
        "security": [],
        "responses": {
          "200": {
            "description": "The now-empty cart.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Cart"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/2026-10/graphql.json": {
      "post": {
        "tags": [
          "Storefront GraphQL"
        ],
        "operationId": "storefrontGraphql",
        "summary": "Storefront API (GraphQL)",
        "description": "Shopify's Storefront API for this store. Catalog, search and cart queries work without a token at a lower query-complexity limit. A public Storefront token (`X-Shopify-Storefront-Access-Token`) raises the limits; ask support@abandonware.online if you need one. Schema reference: https://shopify.dev/docs/api/storefront/2026-10",
        "security": [
          {},
          {
            "storefrontToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GraphqlRequest"
              },
              "example": {
                "query": "{ products(first: 3) { nodes { handle title } } }"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "GraphQL response. Check `errors` as well as `data`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GraphqlResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/ucp/mcp": {
      "post": {
        "tags": [
          "Agents"
        ],
        "operationId": "ucpMcp",
        "summary": "UCP catalog and cart tools (MCP)",
        "description": "Streamable-HTTP MCP endpoint run by Shopify that implements the Universal Commerce Protocol for this store. Tools include `search_catalog`, `lookup_catalog` and `get_product`, plus cart tools when the agent declares the cart capability. Every request must identify the agent with a UCP agent profile URL. Call `tools/list` for live schemas. Docs: https://shopify.dev/docs/agents/catalog/storefront-catalog",
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JsonRpcRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "JSON-RPC response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JsonRpcResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/mcp": {
      "post": {
        "tags": [
          "Agents"
        ],
        "operationId": "storefrontMcp",
        "summary": "Store policies and FAQs (MCP)",
        "description": "Streamable-HTTP MCP endpoint run by Shopify. Exposes `search_shop_policies_and_faqs` for shipping, returns and other store policies. Call `tools/list` for live schemas.",
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JsonRpcRequest"
              },
              "example": {
                "jsonrpc": "2.0",
                "id": 1,
                "method": "tools/list"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "JSON-RPC response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JsonRpcResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/.well-known/openid-configuration": {
      "get": {
        "tags": [
          "Customer accounts"
        ],
        "operationId": "getOpenIdConfiguration",
        "summary": "OpenID Connect discovery",
        "description": "Authorization, token and logout endpoints for the Customer Account API, plus supported scopes. This is the authoritative source for the OAuth URLs in `components.securitySchemes`.",
        "security": [],
        "responses": {
          "200": {
            "description": "OpenID Connect discovery document.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/.well-known/customer-account-api": {
      "get": {
        "tags": [
          "Customer accounts"
        ],
        "operationId": "getCustomerAccountApiConfiguration",
        "summary": "Customer Account API discovery",
        "description": "The live GraphQL (`graphql_api`) and MCP (`mcp_api`) endpoints of the Customer Account API for this store.",
        "security": [],
        "responses": {
          "200": {
            "description": "Customer Account API endpoints.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "graphql_api": {
                      "type": "string",
                      "format": "uri"
                    },
                    "mcp_api": {
                      "type": "string",
                      "format": "uri"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/account/customer/api/2026-10/graphql": {
      "servers": [
        {
          "url": "https://shopify.com/84917780767",
          "description": "Default Customer Account API host for this store. Prefer the `graphql_api` URL from /.well-known/customer-account-api."
        }
      ],
      "post": {
        "tags": [
          "Customer accounts"
        ],
        "operationId": "customerAccountGraphql",
        "summary": "Customer Account API (GraphQL)",
        "description": "Reads and updates the signed-in customer's own orders, profile and addresses. Needs an access token from the OAuth 2.0 authorization code flow with PKCE, granted by the customer. Clients must be registered by the store; contact support@abandonware.online. Schema reference: https://shopify.dev/docs/api/customer/2026-10",
        "security": [
          {
            "customerAccountOAuth": [
              "openid",
              "email",
              "customer-account-api:full"
            ]
          },
          {
            "customerAccountOpenId": [
              "openid",
              "email",
              "customer-account-api:full"
            ]
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GraphqlRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "GraphQL response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GraphqlResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing, expired or insufficiently scoped access token."
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "storefrontToken": {
        "type": "apiKey",
        "in": "header",
        "name": "X-Shopify-Storefront-Access-Token",
        "description": "Optional public Storefront API token. Each token is limited to the Storefront API access scopes it was issued with (for example `unauthenticated_read_product_listings`). Not needed for basic catalog and cart queries."
      },
      "customerAccountOAuth": {
        "type": "oauth2",
        "description": "Customer Account API. OAuth 2.0 authorization code flow; public clients must use PKCE (S256). Request only the scopes you need. The authorization and token URLs below are the defaults; /.well-known/openid-configuration is authoritative.",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://shopify.com/authentication/84917780767/oauth/authorize",
            "tokenUrl": "https://shopify.com/authentication/84917780767/oauth/token",
            "scopes": {
              "openid": "Sign the customer in and receive an ID token (OpenID Connect).",
              "email": "Read the signed-in customer's email address.",
              "customer-account-api:full": "Read and update the signed-in customer's own orders, profile and addresses through the Customer Account API."
            }
          }
        }
      },
      "customerAccountOpenId": {
        "type": "openIdConnect",
        "openIdConnectUrl": "https://abandonware.online/.well-known/openid-configuration",
        "description": "The same Customer Account API authorization, described by OpenID Connect discovery."
      }
    },
    "schemas": {
      "CatalogProduct": {
        "type": "object",
        "description": "Product as returned by `/products.json`. Prices are decimal strings.",
        "properties": {
          "id": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "handle": {
            "type": "string"
          },
          "body_html": {
            "type": [
              "string",
              "null"
            ]
          },
          "vendor": {
            "type": "string"
          },
          "product_type": {
            "type": "string"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "published_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "variants": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer"
                },
                "title": {
                  "type": "string"
                },
                "price": {
                  "type": "string",
                  "example": "28.00"
                },
                "compare_at_price": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "available": {
                  "type": "boolean"
                },
                "sku": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "option1": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "option2": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "option3": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              }
            }
          },
          "images": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "src": {
                  "type": "string",
                  "format": "uri"
                },
                "width": {
                  "type": "integer"
                },
                "height": {
                  "type": "integer"
                }
              }
            }
          },
          "options": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductOption"
            }
          }
        }
      },
      "Product": {
        "type": "object",
        "description": "Product as returned by `/products/{handle}.js`. Prices are integers in cents.",
        "properties": {
          "id": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "handle": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "description": "HTML."
          },
          "vendor": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "available": {
            "type": "boolean"
          },
          "price": {
            "type": "integer",
            "description": "Lowest variant price in cents."
          },
          "price_min": {
            "type": "integer"
          },
          "price_max": {
            "type": "integer"
          },
          "compare_at_price": {
            "type": [
              "integer",
              "null"
            ]
          },
          "featured_image": {
            "type": [
              "string",
              "null"
            ]
          },
          "images": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "options": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductOption"
            }
          },
          "variants": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Variant"
            }
          }
        }
      },
      "ProductOption": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "example": "Size"
          },
          "position": {
            "type": "integer"
          },
          "values": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "Variant": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Pass this to the cart endpoints."
          },
          "title": {
            "type": "string"
          },
          "public_title": {
            "type": [
              "string",
              "null"
            ]
          },
          "options": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "price": {
            "type": "integer",
            "description": "Cents."
          },
          "compare_at_price": {
            "type": [
              "integer",
              "null"
            ]
          },
          "available": {
            "type": "boolean"
          },
          "sku": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "SearchProduct": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "handle": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "price": {
            "type": "string",
            "description": "Decimal string."
          },
          "available": {
            "type": "boolean"
          },
          "image": {
            "type": [
              "string",
              "null"
            ]
          },
          "vendor": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        }
      },
      "Cart": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string"
          },
          "note": {
            "type": [
              "string",
              "null"
            ]
          },
          "attributes": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "item_count": {
            "type": "integer"
          },
          "total_price": {
            "type": "integer",
            "description": "Cents."
          },
          "items_subtotal_price": {
            "type": "integer",
            "description": "Cents."
          },
          "total_discount": {
            "type": "integer",
            "description": "Cents."
          },
          "currency": {
            "type": "string",
            "example": "USD"
          },
          "requires_shipping": {
            "type": "boolean"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LineItem"
            }
          }
        }
      },
      "LineItem": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "description": "Use with `/cart/change.js`."
          },
          "id": {
            "type": "integer",
            "description": "Variant ID."
          },
          "variant_id": {
            "type": "integer"
          },
          "product_id": {
            "type": "integer"
          },
          "handle": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "product_title": {
            "type": "string"
          },
          "variant_title": {
            "type": [
              "string",
              "null"
            ]
          },
          "quantity": {
            "type": "integer"
          },
          "price": {
            "type": "integer",
            "description": "Cents."
          },
          "final_line_price": {
            "type": "integer",
            "description": "Cents."
          },
          "image": {
            "type": [
              "string",
              "null"
            ]
          },
          "properties": {
            "type": [
              "object",
              "null"
            ]
          }
        }
      },
      "CartError": {
        "type": "object",
        "properties": {
          "status": {
            "type": [
              "integer",
              "string"
            ]
          },
          "message": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        }
      },
      "GraphqlRequest": {
        "type": "object",
        "required": [
          "query"
        ],
        "properties": {
          "query": {
            "type": "string"
          },
          "variables": {
            "type": "object"
          },
          "operationName": {
            "type": "string"
          }
        }
      },
      "GraphqlResponse": {
        "type": "object",
        "properties": {
          "data": {
            "type": [
              "object",
              "null"
            ]
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "extensions": {
            "type": "object"
          }
        }
      },
      "JsonRpcRequest": {
        "type": "object",
        "required": [
          "jsonrpc",
          "method"
        ],
        "properties": {
          "jsonrpc": {
            "const": "2.0"
          },
          "id": {
            "type": [
              "integer",
              "string"
            ]
          },
          "method": {
            "type": "string",
            "examples": [
              "initialize",
              "tools/list",
              "tools/call"
            ]
          },
          "params": {
            "type": "object"
          }
        }
      },
      "JsonRpcResponse": {
        "type": "object",
        "properties": {
          "jsonrpc": {
            "const": "2.0"
          },
          "id": {
            "type": [
              "integer",
              "string",
              "null"
            ]
          },
          "result": {},
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "integer"
              },
              "message": {
                "type": "string"
              },
              "data": {}
            }
          }
        }
      }
    },
    "responses": {
      "TooManyRequests": {
        "description": "Rate limited by Shopify. Wait for the number of seconds in `Retry-After` before retrying.",
        "headers": {
          "Retry-After": {
            "schema": {
              "type": "integer"
            },
            "description": "Seconds to wait."
          }
        }
      }
    }
  }
}
